diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md
new file mode 100644
index 00000000..de564e58
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Bug_report.md
@@ -0,0 +1,30 @@
+---
+name: Bug report
+about: Report a bug for this project
+
+---
+
+**README and remove me**
+For community support and other discussion, you are welcome to visit and stay with us @ Freenode, #mailcow
+Answering can take a few seconds up to many hours, please be patient.
+Commercial support, including a ticket system, can be found @ https://www.servercow.de/mailcow#support - we are also available via Telegram. \o/
+
+**Describe the bug, try to make it reproducible**
+A clear and concise description of what the bug is. How can it be reproduced?
+If applicable, add screenshots to help explain your problem. Very useful for bugs in mailcow UI.
+
+**System information and quick debugging**
+General logs:
+- Please take a look at the [documentation](https://mailcow.github.io/mailcow-dockerized-docs/debug-logs/).
+
+Further information (where applicable):
+ - Your OS (is Apparmor or SELinux active?)
+ - Your virtualization technology (KVM/QEMU, Xen, VMware, VirtualBox etc.)
+ - Your server/VM specifications (Memory, CPU Cores)
+ - Don't try to run mailcow on a Synology or QNAP NAS, do you?
+ - Docker and Docker Compose versions
+ - Output of `git diff origin/master`, any other changes to the code?
+ - All third-party firewalls and custom iptables rules are unsupported. Please check the Docker docs about how to use Docker with your own ruleset. Nevertheless, iptabels output can help _us_ to help _you_: `iptables -L -vn`, `ip6tables -L -vn`, `iptables -L -vn -t nat` and `ip6tables -L -vn -t nat `
+ - Reverse proxy? If you think this problem is related to your reverse proxy, please post your configuration.
+ - Browser (if it's a Web UI issue) - please clean your browser cache and try again, problem persists?
+ - Check `docker exec -it $(docker ps -qf name=acme-mailcow) dig +short stackoverflow.com @172.22.1.254` (set the IP accordingly, if you changed the internal mailcow network) and `docker exec -it $(docker ps -qf name=acme-mailcow) dig +short stackoverflow.com @1.1.1.1` - output? Timeout?
diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md
new file mode 100644
index 00000000..860ab66b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Feature_request.md
@@ -0,0 +1,14 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Additional context**
+Add any other context or screenshots about the feature request here or remove this section
diff --git a/.github/stale.yml b/.github/stale.yml
new file mode 100644
index 00000000..24db8c03
--- /dev/null
+++ b/.github/stale.yml
@@ -0,0 +1,18 @@
+# Number of days of inactivity before an issue becomes stale
+daysUntilStale: 60
+# Number of days of inactivity before a stale issue is closed
+daysUntilClose: 7
+# Issues with these labels will never be considered stale
+exemptLabels:
+ - pinned
+ - security
+ - enhancement
+# Label to use when marking an issue as stale
+staleLabel: dunno
+# Comment to post when marking an issue as stale. Set to `false` to disable
+markComment: >
+ This issue has been automatically marked as stale because it has not had
+ recent activity. It will be closed if no further activity occurs. Thank you
+ for your contributions.
+# Comment to post when closing a stale issue. Set to `false` to disable
+closeComment: false
diff --git a/.gitignore b/.gitignore
index e535c710..5fd3c0f2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,17 +1,20 @@
rebuild-images.sh
data/conf/sogo/sieve.creds
+data/conf/phpfpm/sogo-sso/sogo-sso.pass
data/conf/dovecot/dovecot-master.passwd
+data/conf/dovecot/dovecot-master.userdb
mailcow.conf
mailcow.conf_backup
data/conf/nginx/*.active
data/conf/postfix/sql
+data/conf/postfix/allow_mailcow_local.regexp
data/conf/dovecot/sql
data/conf/nextcloud-*.bak
data/web/inc/vars.local.inc.php
data/assets/ssl/*
.vscode/*
data/web/.well-known/acme-challenge
-data/web/nextcloud/
+data/web/nextcloud*/
data/conf/rspamd/local.d/*
data/conf/rspamd/override.d/*
!data/conf/nginx/dynmaps.conf
@@ -20,4 +23,14 @@ data/conf/rspamd/override.d/*
data/conf/nginx/*.conf
data/conf/nginx/*.custom
data/conf/nginx/*.bak
+data/conf/dovecot/acl_anyone
+data/conf/dovecot/mail_plugins*
+data/conf/dovecot/sogo-sso.conf
data/conf/dovecot/extra.conf
+data/conf/rspamd/custom/*
+data/conf/portainer/
+data/gitea/
+data/gogs/
+data/conf/sogo/plist_ldap
+.github/
+docker-compose.override.yml
diff --git a/README.md b/README.md
index 42b2a3f1..ec500d9c 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,12 @@
# mailcow: dockerized - ๐ฎ + ๐ = ๐
-[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JWBSYHF4SMC68)
+## Want to support mailcow?
-**mailcow Bitcoin donations:** 1E5rgzgA1sS3QH7r1ToWxRC3GEavfsGMrx
+Donate via **PayPal** [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JWBSYHF4SMC68) or via **Liberapay** [![Liberapay.com](https://mailcow.email/img/lp.png)](https://liberapay.com/mailcow)
+
+Or just spread the word: moo.
+
+## Info and documentation
Please see [the official documentation](https://mailcow.github.io/mailcow-dockerized-docs/) for instructions.
diff --git a/data/Dockerfiles/acme/Dockerfile b/data/Dockerfiles/acme/Dockerfile
index ce3fc171..a17064fe 100644
--- a/data/Dockerfiles/acme/Dockerfile
+++ b/data/Dockerfiles/acme/Dockerfile
@@ -1,10 +1,9 @@
-FROM alpine:3.6
+FROM alpine:3.9
LABEL maintainer "Andre Peters "
RUN apk add --update --no-cache \
bash \
- acme-client \
curl \
openssl \
bind-tools \
@@ -12,7 +11,10 @@ RUN apk add --update --no-cache \
mariadb-client \
redis \
tini \
- tzdata
+ tzdata \
+ py-pip \
+ && pip install --upgrade pip \
+ && pip install acme-tiny
COPY docker-entrypoint.sh /srv/docker-entrypoint.sh
COPY expand6.sh /srv/expand6.sh
diff --git a/data/Dockerfiles/acme/docker-entrypoint.sh b/data/Dockerfiles/acme/docker-entrypoint.sh
index c9a91dfa..e79ef977 100755
--- a/data/Dockerfiles/acme/docker-entrypoint.sh
+++ b/data/Dockerfiles/acme/docker-entrypoint.sh
@@ -5,6 +5,16 @@ exec 5>&1
# Thanks to https://github.com/cvmiller -> https://github.com/cvmiller/expand6
source /srv/expand6.sh
+# Skipping IP check when we like to live dangerously
+if [[ "${SKIP_IP_CHECK}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+ SKIP_IP_CHECK=y
+fi
+
+# Skipping HTTP check when we like to live dangerously
+if [[ "${SKIP_HTTP_VERIFICATION}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+ SKIP_HTTP_VERIFICATION=y
+fi
+
log_f() {
if [[ ${2} == "no_nl" ]]; then
echo -n "$(date) - ${1}"
@@ -13,8 +23,12 @@ log_f() {
elif [[ ${2} != "redis_only" ]]; then
echo "$(date) - ${1}"
fi
- redis-cli -h redis LPUSH ACME_LOG "{\"time\":\"$(date +%s)\",\"message\":\"$(printf '%s' "${1}" | \
- tr '%&;$"_[]{}-\r\n' ' ')\"}" > /dev/null
+ if [[ ${3} == "b64" ]]; then
+ redis-cli -h redis LPUSH ACME_LOG "{\"time\":\"$(date +%s)\",\"message\":\"base64,$(printf '%s' "${1}")\"}" > /dev/null
+ else
+ redis-cli -h redis LPUSH ACME_LOG "{\"time\":\"$(date +%s)\",\"message\":\"$(printf '%s' "${1}" | \
+ tr '%&;$"[]{}-\r\n' ' ')\"}" > /dev/null
+ fi
}
if [[ "${SKIP_LETS_ENCRYPT}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
@@ -32,12 +46,34 @@ log_f "OK" no_date
ACME_BASE=/var/lib/acme
SSL_EXAMPLE=/var/lib/ssl-example
-mkdir -p ${ACME_BASE}/acme/private
+mkdir -p ${ACME_BASE}/acme
-restart_containers(){
+# Migrate
+[[ -f ${ACME_BASE}/acme/private/privkey.pem ]] && mv ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/acme/key.pem
+[[ -f ${ACME_BASE}/acme/private/account.key ]] && mv ${ACME_BASE}/acme/private/account.key ${ACME_BASE}/acme/account.pem
+
+reload_configurations(){
+ # Reading container IDs
+ # Wrapping as array to ensure trimmed content when calling $NGINX etc.
+ local NGINX=($(curl --silent --insecure https://dockerapi/containers/json | jq -r '.[] | {name: .Config.Labels["com.docker.compose.service"], id: .Id}' | jq -rc 'select( .name | tostring | contains("nginx-mailcow")) | .id' | tr "\n" " "))
+ local DOVECOT=($(curl --silent --insecure https://dockerapi/containers/json | jq -r '.[] | {name: .Config.Labels["com.docker.compose.service"], id: .Id}' | jq -rc 'select( .name | tostring | contains("dovecot-mailcow")) | .id' | tr "\n" " "))
+ local POSTFIX=($(curl --silent --insecure https://dockerapi/containers/json | jq -r '.[] | {name: .Config.Labels["com.docker.compose.service"], id: .Id}' | jq -rc 'select( .name | tostring | contains("postfix-mailcow")) | .id' | tr "\n" " "))
+ # Reloading
+ echo "Reloading Nginx..."
+ NGINX_RELOAD_RET=$(curl -X POST --insecure https://dockerapi/containers/${NGINX}/exec -d '{"cmd":"reload", "task":"nginx"}' --silent -H 'Content-type: application/json' | jq -r .type)
+ [[ ${NGINX_RELOAD_RET} != 'success' ]] && { echo "Could not reload Nginx, restarting container..."; restart_container ${NGINX} ; }
+ echo "Reloading Dovecot..."
+ DOVECOT_RELOAD_RET=$(curl -X POST --insecure https://dockerapi/containers/${DOVECOT}/exec -d '{"cmd":"reload", "task":"dovecot"}' --silent -H 'Content-type: application/json' | jq -r .type)
+ [[ ${DOVECOT_RELOAD_RET} != 'success' ]] && { echo "Could not reload Dovecot, restarting container..."; restart_container ${DOVECOT} ; }
+ echo "Reloading Postfix..."
+ POSTFIX_RELOAD_RET=$(curl -X POST --insecure https://dockerapi/containers/${POSTFIX}/exec -d '{"cmd":"reload", "task":"postfix"}' --silent -H 'Content-type: application/json' | jq -r .type)
+ [[ ${POSTFIX_RELOAD_RET} != 'success' ]] && { echo "Could not reload Postfix, restarting container..."; restart_container ${POSTFIX} ; }
+}
+
+restart_container(){
for container in $*; do
log_f "Restarting ${container}..." no_nl
- C_REST_OUT=$(curl -X POST http://dockerapi:8080/containers/${container}/restart | jq -r '.msg')
+ C_REST_OUT=$(curl -X POST --insecure https://dockerapi/containers/${container}/restart | jq -r '.msg')
log_f "${C_REST_OUT}" no_date
done
}
@@ -90,28 +126,37 @@ get_ipv6(){
echo ${IPV6}
}
+verify_challenge_path(){
+ # verify_challenge_path URL 4|6
+ RAND_FILE=${RANDOM}${RANDOM}${RANDOM}
+ touch /var/www/acme/${RAND_FILE}
+ if [[ ${SKIP_HTTP_VERIFICATION} == "y" ]]; then
+ echo '(skipping check, returning 0)'
+ return 0
+ elif [[ "$(curl -${2} http://${1}/.well-known/acme-challenge/${RAND_FILE} --write-out %{http_code} --silent --output /dev/null)" =~ ^(2|3) ]]; then
+ rm /var/www/acme/${RAND_FILE}
+ return 0
+ else
+ rm /var/www/acme/${RAND_FILE}
+ return 1
+ fi
+}
+
[[ ! -f ${ACME_BASE}/dhparams.pem ]] && cp ${SSL_EXAMPLE}/dhparams.pem ${ACME_BASE}/dhparams.pem
if [[ -f ${ACME_BASE}/cert.pem ]] && [[ -f ${ACME_BASE}/key.pem ]]; then
ISSUER=$(openssl x509 -in ${ACME_BASE}/cert.pem -noout -issuer)
- if [[ ${ISSUER} != *"Let's Encrypt"* && ${ISSUER} != *"mailcow"* ]]; then
+ if [[ ${ISSUER} != *"Let's Encrypt"* && ${ISSUER} != *"mailcow"* && ${ISSUER} != *"Fake LE Intermediate"* ]]; then
log_f "Found certificate with issuer other than mailcow snake-oil CA and Let's Encrypt, skipping ACME client..."
sleep 3650d
exec $(readlink -f "$0")
- else
- declare -a SAN_ARRAY_NOW
- SAN_NAMES=$(openssl x509 -noout -text -in ${ACME_BASE}/cert.pem | awk '/X509v3 Subject Alternative Name/ {getline;gsub(/ /, "", $0); print}' | tr -d "DNS:")
- if [[ ! -z ${SAN_NAMES} ]]; then
- IFS=',' read -a SAN_ARRAY_NOW <<< ${SAN_NAMES}
- log_f "Found Let's Encrypt or mailcow snake-oil CA issued certificate with SANs: ${SAN_ARRAY_NOW[*]}"
- fi
fi
else
- if [[ -f ${ACME_BASE}/acme/fullchain.pem ]] && [[ -f ${ACME_BASE}/acme/private/privkey.pem ]]; then
- if verify_hash_match ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/acme/private/privkey.pem; then
+ if [[ -f ${ACME_BASE}/acme/cert.pem ]] && [[ -f ${ACME_BASE}/acme/key.pem ]]; then
+ if verify_hash_match ${ACME_BASE}/acme/cert.pem ${ACME_BASE}/acme/key.pem; then
log_f "Restoring previous acme certificate and restarting script..."
- cp ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/key.pem
+ cp ${ACME_BASE}/acme/cert.pem ${ACME_BASE}/cert.pem
+ cp ${ACME_BASE}/acme/key.pem ${ACME_BASE}/key.pem
# Restarting with env var set to trigger a restart,
exec env TRIGGER_RESTART=1 $(readlink -f "$0")
fi
@@ -123,25 +168,80 @@ else
exec env TRIGGER_RESTART=1 $(readlink -f "$0")
fi
fi
+chmod 600 ${ACME_BASE}/key.pem
-log_f "Waiting for database... "
-while ! mysqladmin ping --host mysql -u${DBUSER} -p${DBPASS} --silent; do
+log_f "Waiting for database... " no_nl
+while ! mysqladmin status --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do
sleep 2
done
+log_f "OK" no_date
+
+log_f "Waiting for Nginx... " no_nl
+until $(curl --output /dev/null --silent --head --fail http://nginx:8081); do
+ sleep 2
+done
+log_f "OK" no_date
+
+# Waiting for domain table
+log_f "Waiting for domain table... " no_nl
+while [[ -z ${DOMAIN_TABLE} ]]; do
+ curl --silent http://nginx/ >/dev/null 2>&1
+ DOMAIN_TABLE=$(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SHOW TABLES LIKE 'domain'" -Bs)
+ [[ -z ${DOMAIN_TABLE} ]] && sleep 10
+done
+log_f "OK" no_date
+
log_f "Initializing, please wait... "
-
while true; do
- if [[ "${SKIP_IP_CHECK}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
- SKIP_IP_CHECK=y
+
+ # Re-using previous acme-mailcow account and domain keys
+ if [[ ! -f ${ACME_BASE}/acme/key.pem ]]; then
+ log_f "Generating missing domain private key..."
+ openssl genrsa 4096 > ${ACME_BASE}/acme/key.pem
+ else
+ log_f "Using existing domain key ${ACME_BASE}/acme/key.pem"
fi
+ if [[ ! -f ${ACME_BASE}/acme/account.pem ]]; then
+ log_f "Generating missing Lets Encrypt account key..."
+ openssl genrsa 4096 > ${ACME_BASE}/acme/account.pem
+ else
+ log_f "Using existing Lets Encrypt account key ${ACME_BASE}/acme/account.pem"
+ fi
+
+ chmod 600 ${ACME_BASE}/acme/key.pem
+ chmod 600 ${ACME_BASE}/acme/account.pem
+
+ # Cleaning up and init validation arrays
unset SQL_DOMAIN_ARR
unset VALIDATED_CONFIG_DOMAINS
unset ADDITIONAL_VALIDATED_SAN
+ unset ADDITIONAL_WC_ARR
+ unset ADDITIONAL_SAN_ARR
+ unset SAN_CHANGE
+ unset SAN_ARRAY_NOW
+ unset ORPHANED_SAN
+ unset ADDED_SAN
+ SAN_CHANGE=0
+ declare -a SAN_ARRAY_NOW
+ declare -a ORPHANED_SAN
+ declare -a ADDED_SAN
declare -a SQL_DOMAIN_ARR
declare -a VALIDATED_CONFIG_DOMAINS
declare -a ADDITIONAL_VALIDATED_SAN
- IFS=',' read -r -a ADDITIONAL_SAN_ARR <<< "${ADDITIONAL_SAN}"
+ declare -a ADDITIONAL_WC_ARR
+ declare -a ADDITIONAL_SAN_ARR
+ IFS=',' read -r -a TMP_ARR <<< "${ADDITIONAL_SAN}"
+ for i in "${TMP_ARR[@]}" ; do
+ if [[ "$i" =~ \.\*$ ]]; then
+ ADDITIONAL_WC_ARR+=(${i::-2})
+ else
+ ADDITIONAL_SAN_ARR+=($i)
+ fi
+ done
+ ADDITIONAL_WC_ARR+=('autodiscover')
+
+ # Start IP detection
log_f "Detecting IP addresses... " no_nl
IPV4=$(get_ipv4)
IPV6=$(get_ipv6)
@@ -160,73 +260,50 @@ while true; do
fi
fi
- # Container ids may have changed
- CONTAINERS_RESTART=($(curl --silent http://dockerapi:8080/containers/json | jq -r '.[] | {name: .Config.Labels["com.docker.compose.service"], id: .Id}' | jq -rc 'select( .name | tostring | contains("nginx-mailcow") or contains("postfix-mailcow") or contains("dovecot-mailcow")) | .id' | tr "\n" " "))
-
- log_f "Waiting for domain table... " no_nl
- while [[ -z ${DOMAIN_TABLE} ]]; do
- curl --silent http://nginx/ >/dev/null 2>&1
- DOMAIN_TABLE=$(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SHOW TABLES LIKE 'domain'" -Bs)
- [[ -z ${DOMAIN_TABLE} ]] && sleep 10
- done
- log_f "OK" no_date
-
+ #########################################
+ # IP and webroot challenge verification #
while read domains; do
SQL_DOMAIN_ARR+=("${domains}")
- done < <(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain WHERE backupmx=0 UNION SELECT alias_domain FROM alias_domain" -Bs)
+ done < <(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain WHERE backupmx=0" -Bs)
for SQL_DOMAIN in "${SQL_DOMAIN_ARR[@]}"; do
- A_CONFIG=$(dig A autoconfig.${SQL_DOMAIN} +short | tail -n 1)
- AAAA_CONFIG=$(dig AAAA autoconfig.${SQL_DOMAIN} +short | tail -n 1)
- # Check if CNAME without v6 enabled target
- if [[ ! -z ${AAAA_CONFIG} ]] && [[ -z $(echo ${AAAA_CONFIG} | grep "^\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}$") ]]; then
- AAAA_CONFIG=
- fi
- if [[ ! -z ${AAAA_CONFIG} ]]; then
- log_f "Found AAAA record for autoconfig.${SQL_DOMAIN}: ${AAAA_CONFIG} - skipping A record check"
- if [[ $(expand ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}) == $(expand ${AAAA_CONFIG}) ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed AAAA record autoconfig.${SQL_DOMAIN}"
- VALIDATED_CONFIG_DOMAINS+=("autoconfig.${SQL_DOMAIN}")
- else
- log_f "Cannot match your IP ${IPV6:-NO_IPV6_LINK} against hostname autoconfig.${SQL_DOMAIN} ($(expand ${AAAA_CONFIG}))"
+ for SUBDOMAIN in "${ADDITIONAL_WC_ARR[@]}"; do
+ if [[ "${SUBDOMAIN}.${SQL_DOMAIN}" != "${MAILCOW_HOSTNAME}" ]]; then
+ A_SUBDOMAIN=$(dig A ${SUBDOMAIN}.${SQL_DOMAIN} +short | tail -n 1)
+ AAAA_SUBDOMAIN=$(dig AAAA ${SUBDOMAIN}.${SQL_DOMAIN} +short | tail -n 1)
+ # Check if CNAME without v6 enabled target
+ if [[ ! -z ${AAAA_SUBDOMAIN} ]] && [[ -z $(echo ${AAAA_SUBDOMAIN} | grep "^\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}$") ]]; then
+ AAAA_SUBDOMAIN=
+ fi
+ if [[ ! -z ${AAAA_SUBDOMAIN} ]]; then
+ log_f "Found AAAA record for ${SUBDOMAIN}.${SQL_DOMAIN}: ${AAAA_SUBDOMAIN} - skipping A record check"
+ if [[ $(expand ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}) == $(expand ${AAAA_SUBDOMAIN}) ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
+ if verify_challenge_path "${SUBDOMAIN}.${SQL_DOMAIN}" 6; then
+ log_f "Confirmed AAAA record ${AAAA_SUBDOMAIN}"
+ VALIDATED_CONFIG_DOMAINS+=("${SUBDOMAIN}.${SQL_DOMAIN}")
+ else
+ log_f "Confirmed AAAA record ${AAAA_SUBDOMAIN}, but HTTP validation failed"
+ fi
+ else
+ log_f "Cannot match your IP ${IPV6:-NO_IPV6_LINK} against hostname ${SUBDOMAIN}.${SQL_DOMAIN} ($(expand ${AAAA_SUBDOMAIN}))"
+ fi
+ elif [[ ! -z ${A_SUBDOMAIN} ]]; then
+ log_f "Found A record for ${SUBDOMAIN}.${SQL_DOMAIN}: ${A_SUBDOMAIN}"
+ if [[ ${IPV4:-ERR} == ${A_SUBDOMAIN} ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
+ if verify_challenge_path "${SUBDOMAIN}.${SQL_DOMAIN}" 4; then
+ log_f "Confirmed A record ${A_SUBDOMAIN}"
+ VALIDATED_CONFIG_DOMAINS+=("${SUBDOMAIN}.${SQL_DOMAIN}")
+ else
+ log_f "Confirmed AAAA record ${A_SUBDOMAIN}, but HTTP validation failed"
+ fi
+ else
+ log_f "Cannot match your IP ${IPV4} against hostname ${SUBDOMAIN}.${SQL_DOMAIN} (${A_SUBDOMAIN})"
+ fi
+ else
+ log_f "No A or AAAA record found for hostname ${SUBDOMAIN}.${SQL_DOMAIN}"
+ fi
fi
- elif [[ ! -z ${A_CONFIG} ]]; then
- log_f "Found A record for autoconfig.${SQL_DOMAIN}: ${A_CONFIG}"
- if [[ ${IPV4:-ERR} == ${A_CONFIG} ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed A record autoconfig.${SQL_DOMAIN}"
- VALIDATED_CONFIG_DOMAINS+=("autoconfig.${SQL_DOMAIN}")
- else
- log_f "Cannot match your IP ${IPV4} against hostname autoconfig.${SQL_DOMAIN} (${A_CONFIG})"
- fi
- else
- log_f "No A or AAAA record found for hostname autoconfig.${SQL_DOMAIN}"
- fi
-
- A_DISCOVER=$(dig A autodiscover.${SQL_DOMAIN} +short | tail -n 1)
- AAAA_DISCOVER=$(dig AAAA autodiscover.${SQL_DOMAIN} +short | tail -n 1)
- # Check if CNAME without v6 enabled target
- if [[ ! -z ${AAAA_DISCOVER} ]] && [[ -z $(echo ${AAAA_DISCOVER} | grep "^\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}$") ]]; then
- AAAA_DISCOVER=
- fi
- if [[ ! -z ${AAAA_DISCOVER} ]]; then
- log_f "Found AAAA record for autodiscover.${SQL_DOMAIN}: ${AAAA_DISCOVER} - skipping A record check"
- if [[ $(expand ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}) == $(expand ${AAAA_DISCOVER}) ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed AAAA record autodiscover.${SQL_DOMAIN}"
- VALIDATED_CONFIG_DOMAINS+=("autodiscover.${SQL_DOMAIN}")
- else
- log_f "Cannot match your IP ${IPV6:-NO_IPV6_LINK} against hostname autodiscover.${SQL_DOMAIN} ($(expand ${AAAA_DISCOVER}))"
- fi
- elif [[ ! -z ${A_DISCOVER} ]]; then
- log_f "Found A record for autodiscover.${SQL_DOMAIN}: ${A_DISCOVER}"
- if [[ ${IPV4:-ERR} == ${A_DISCOVER} ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed A record autodiscover.${SQL_DOMAIN}"
- VALIDATED_CONFIG_DOMAINS+=("autodiscover.${SQL_DOMAIN}")
- else
- log_f "Cannot match your IP ${IPV4} against hostname autodiscover.${SQL_DOMAIN} (${A_DISCOVER})"
- fi
- else
- log_f "No A or AAAA record found for hostname autodiscover.${SQL_DOMAIN}"
- fi
+ done
done
A_MAILCOW_HOSTNAME=$(dig A ${MAILCOW_HOSTNAME} +short | tail -n 1)
@@ -238,16 +315,24 @@ while true; do
if [[ ! -z ${AAAA_MAILCOW_HOSTNAME} ]]; then
log_f "Found AAAA record for ${MAILCOW_HOSTNAME}: ${AAAA_MAILCOW_HOSTNAME} - skipping A record check"
if [[ $(expand ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}) == $(expand ${AAAA_MAILCOW_HOSTNAME}) ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed AAAA record ${MAILCOW_HOSTNAME}"
- VALIDATED_MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
+ if verify_challenge_path "${MAILCOW_HOSTNAME}" 6; then
+ log_f "Confirmed AAAA record ${AAAA_MAILCOW_HOSTNAME}"
+ VALIDATED_MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
+ else
+ log_f "Confirmed AAAA record ${A_MAILCOW_HOSTNAME}, but HTTP validation failed"
+ fi
else
log_f "Cannot match your IP ${IPV6:-NO_IPV6_LINK} against hostname ${MAILCOW_HOSTNAME} ($(expand ${AAAA_MAILCOW_HOSTNAME}))"
fi
elif [[ ! -z ${A_MAILCOW_HOSTNAME} ]]; then
log_f "Found A record for ${MAILCOW_HOSTNAME}: ${A_MAILCOW_HOSTNAME}"
if [[ ${IPV4:-ERR} == ${A_MAILCOW_HOSTNAME} ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed A record ${A_MAILCOW_HOSTNAME}"
- VALIDATED_MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
+ if verify_challenge_path "${MAILCOW_HOSTNAME}" 4; then
+ log_f "Confirmed A record ${A_MAILCOW_HOSTNAME}"
+ VALIDATED_MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
+ else
+ log_f "Confirmed A record ${A_MAILCOW_HOSTNAME}, but HTTP validation failed"
+ fi
else
log_f "Cannot match your IP ${IPV4} against hostname ${MAILCOW_HOSTNAME} (${A_MAILCOW_HOSTNAME})"
fi
@@ -279,16 +364,24 @@ while true; do
if [[ ! -z ${AAAA_SAN} ]]; then
log_f "Found AAAA record for ${SAN}: ${AAAA_SAN} - skipping A record check"
if [[ $(expand ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}) == $(expand ${AAAA_SAN}) ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed AAAA record ${SAN}"
- ADDITIONAL_VALIDATED_SAN+=("${SAN}")
+ if verify_challenge_path "${SAN}" 6; then
+ log_f "Confirmed AAAA record ${AAAA_SAN}"
+ ADDITIONAL_VALIDATED_SAN+=("${SAN}")
+ else
+ log_f "Confirmed AAAA record ${AAAA_SAN}, but HTTP validation failed"
+ fi
else
log_f "Cannot match your IP ${IPV6:-NO_IPV6_LINK} against hostname ${SAN} ($(expand ${AAAA_SAN}))"
fi
elif [[ ! -z ${A_SAN} ]]; then
log_f "Found A record for ${SAN}: ${A_SAN}"
if [[ ${IPV4:-ERR} == ${A_SAN} ]] || [[ ${SKIP_IP_CHECK} == "y" ]]; then
- log_f "Confirmed A record ${A_SAN}"
- ADDITIONAL_VALIDATED_SAN+=("${SAN}")
+ if verify_challenge_path "${SAN}" 4; then
+ log_f "Confirmed A record ${A_SAN}"
+ ADDITIONAL_VALIDATED_SAN+=("${SAN}")
+ else
+ log_f "Confirmed A record ${A_SAN}, but HTTP validation failed"
+ fi
else
log_f "Cannot match your IP ${IPV4} against hostname ${SAN} (${A_SAN})"
fi
@@ -306,113 +399,98 @@ while true; do
exec $(readlink -f "$0")
fi
- array_diff ORPHANED_SAN SAN_ARRAY_NOW ALL_VALIDATED
- if [[ ! -z ${ORPHANED_SAN[*]} ]] && [[ ${ISSUER} != *"mailcow"* ]]; then
- DATE=$(date +%Y-%m-%d_%H_%M_%S)
- log_f "Found orphaned SAN ${ORPHANED_SAN[*]} in certificate, moving old files to ${ACME_BASE}/acme/private/${DATE}.bak/, keeping key file..."
- mkdir -p ${ACME_BASE}/acme/private/${DATE}.bak/
- [[ -f ${ACME_BASE}/acme/private/account.key ]] && mv ${ACME_BASE}/acme/private/account.key ${ACME_BASE}/acme/private/${DATE}.bak/
- [[ -f ${ACME_BASE}/acme/fullchain.pem ]] && mv ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/acme/private/${DATE}.bak/
- [[ -f ${ACME_BASE}/acme/cert.pem ]] && mv ${ACME_BASE}/acme/cert.pem ${ACME_BASE}/acme/private/${DATE}.bak/
- cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/acme/private/${DATE}.bak/ # Keep key for TLSA 3 1 1 records
+ # Collecting SANs from active certificate
+ SAN_NAMES=$(openssl x509 -noout -text -in ${ACME_BASE}/cert.pem | awk '/X509v3 Subject Alternative Name/ {getline;gsub(/ /, "", $0); print}' | tr -d "DNS:")
+ if [[ ! -z ${SAN_NAMES} ]]; then
+ IFS=',' read -a SAN_ARRAY_NOW <<< ${SAN_NAMES}
fi
- ACME_RESPONSE=$(acme-client \
- -v -e -b -N -n \
- -a 'https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf' \
- -f ${ACME_BASE}/acme/private/account.key \
- -k ${ACME_BASE}/acme/private/privkey.pem \
- -c ${ACME_BASE}/acme \
- ${ALL_VALIDATED[*]} 2>&1 | tee /dev/fd/5)
+ # Finding difference in SAN array now vs. SAN array by current configuration
+ array_diff ORPHANED_SAN SAN_ARRAY_NOW ALL_VALIDATED
+ if [[ ! -z ${ORPHANED_SAN[*]} ]]; then
+ log_f "Found orphaned SANs ${ORPHANED_SAN[*]}"
+ SAN_CHANGE=1
+ fi
+ array_diff ADDED_SAN ALL_VALIDATED SAN_ARRAY_NOW
+ if [[ ! -z ${ADDED_SAN[*]} ]]; then
+ log_f "Found new SANs ${ADDED_SAN[*]}"
+ SAN_CHANGE=1
+ fi
+
+ if [[ ${SAN_CHANGE} == 0 ]]; then
+ # Certificate did not change but could be due for renewal (4 weeks)
+ if ! openssl x509 -checkend 1209600 -noout -in ${ACME_BASE}/cert.pem; then
+ log_f "Certificate is due for renewal (< 2 weeks)"
+ else
+ log_f "Certificate validation done, neither changed nor due for renewal, sleeping for another day."
+ sleep 1d
+ continue
+ fi
+ fi
+
+ DATE=$(date +%Y-%m-%d_%H_%M_%S)
+ log_f "Creating backups in ${ACME_BASE}/backups/${DATE}/ ..."
+ mkdir -p ${ACME_BASE}/backups/${DATE}/
+ [[ -f ${ACME_BASE}/acme/acme.csr ]] && cp ${ACME_BASE}/acme/acme.csr ${ACME_BASE}/backups/${DATE}/
+ [[ -f ${ACME_BASE}/acme/cert.pem ]] && cp ${ACME_BASE}/acme/cert.pem ${ACME_BASE}/backups/${DATE}/
+ [[ -f ${ACME_BASE}/acme/key.pem ]] && cp ${ACME_BASE}/acme/key.pem ${ACME_BASE}/backups/${DATE}/
+ [[ -f ${ACME_BASE}/acme/account.pem ]] && cp ${ACME_BASE}/acme/account.pem ${ACME_BASE}/backups/${DATE}/
+
+ # Generating CSR
+ printf "[SAN]\nsubjectAltName=" > /tmp/_SAN
+ printf "DNS:%s," "${ALL_VALIDATED[@]}" >> /tmp/_SAN
+ sed -i '$s/,$//' /tmp/_SAN
+ openssl req -new -sha256 -key ${ACME_BASE}/acme/key.pem -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf /tmp/_SAN) > ${ACME_BASE}/acme/acme.csr
+
+ if [[ "${LE_STAGING}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+ log_f "Using Let's Encrypt staging servers"
+ STAGING_PARAMETER='--directory-url https://acme-staging-v02.api.letsencrypt.org/directory'
+ else
+ STAGING_PARAMETER=
+ fi
+
+ # acme-tiny writes info to stderr and ceritifcate to stdout
+ # The redirects will do the following:
+ # - redirect stdout to temp certificate file
+ # - redirect acme-tiny stderr to stdout (logs to variable ACME_RESPONSE)
+ # - tee stderr to get live output and log to dockerd
+
+ ACME_RESPONSE=$(acme-tiny ${STAGING_PARAMETER} \
+ --account-key ${ACME_BASE}/acme/account.pem \
+ --disable-check \
+ --csr ${ACME_BASE}/acme/acme.csr \
+ --acme-dir /var/www/acme/ 2>&1 > /tmp/_cert.pem | tee /dev/fd/5)
case "$?" in
- 0) # new certs
- log_f "${ACME_RESPONSE}" redis_only
- # cp the new certificates and keys
- cp ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/key.pem
-
- # restart docker containers
- if ! verify_hash_match ${ACME_BASE}/cert.pem ${ACME_BASE}/key.pem; then
- log_f "Certificate was successfully requested, but key and certificate have non-matching hashes, restoring mailcow snake-oil and restarting containers..."
- cp ${SSL_EXAMPLE}/cert.pem ${ACME_BASE}/cert.pem
- cp ${SSL_EXAMPLE}/key.pem ${ACME_BASE}/key.pem
- fi
- restart_containers ${CONTAINERS_RESTART[*]}
- ;;
- 1) # failure
- log_f "${ACME_RESPONSE}" redis_only
- if [[ $ACME_RESPONSE =~ "No registration exists" ]]; then
- log_f "Registration keys are invalid, deleting old keys and restarting..."
- rm ${ACME_BASE}/acme/private/account.key
+ 0) # cert requested
+ ACME_RESPONSE_B64=$(echo "${ACME_RESPONSE}" | openssl enc -e -A -base64)
+ log_f "${ACME_RESPONSE_B64}" redis_only b64
+ log_f "Deploying..."
+ # Deploy the new certificate and key
+ # Moving temp cert to acme/cert.pem
+ if verify_hash_match /tmp/_cert.pem ${ACME_BASE}/acme/key.pem; then
+ mv /tmp/_cert.pem ${ACME_BASE}/acme/cert.pem
+ cp ${ACME_BASE}/acme/cert.pem ${ACME_BASE}/cert.pem
+ cp ${ACME_BASE}/acme/key.pem ${ACME_BASE}/key.pem
+ reload_configurations
+ rm /var/www/acme/*
+ log_f "Certificate successfully deployed, removing backup, sleeping 1d"
+ sleep 1d
+ else
+ log_f "Certificate was successfully requested, but key and certificate have non-matching hashes, ignoring certificate"
+ log_f "Retrying in 30 minutes..."
+ sleep 30m
exec $(readlink -f "$0")
fi
- if [[ -f ${ACME_BASE}/acme/private/${DATE}.bak/fullchain.pem ]] && [[ -f ${ACME_BASE}/acme/private/${DATE}.bak/privkey.pem ]]; then
- log_f "Error requesting certificate, restoring previous certificate from backup and restarting containers...."
- cp ${ACME_BASE}/acme/private/${DATE}.bak/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/${DATE}.bak/privkey.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- elif [[ -f ${ACME_BASE}/acme/fullchain.pem ]] && [[ -f ${ACME_BASE}/acme/private/privkey.pem ]]; then
- log_f "Error requesting certificate, restoring from previous acme request and restarting containers..."
- cp ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- fi
- if ! verify_hash_match ${ACME_BASE}/cert.pem ${ACME_BASE}/key.pem; then
- log_f "Error verifying certificates, restoring mailcow snake-oil and restarting containers..."
- cp ${SSL_EXAMPLE}/cert.pem ${ACME_BASE}/cert.pem
- cp ${SSL_EXAMPLE}/key.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- fi
- [[ ${TRIGGER_RESTART} == 1 ]] && restart_containers ${CONTAINERS_RESTART[*]}
- log_f "Retrying in 30 minutes..."
- sleep 30m
- exec $(readlink -f "$0")
;;
- 2) # no change
- log_f "${ACME_RESPONSE}" redis_only
- if ! diff ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem; then
- log_f "Certificate was not changed, but active certificate does not match the verified certificate, fixing and restarting containers..."
- cp ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- fi
- if ! verify_hash_match ${ACME_BASE}/cert.pem ${ACME_BASE}/key.pem; then
- log_f "Certificate was not changed, but hashes do not match, restoring from previous acme request and restarting containers..."
- cp ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- fi
- log_f "Certificate was not changed"
- [[ ${TRIGGER_RESTART} == 1 ]] && restart_containers ${CONTAINERS_RESTART[*]}
- ;;
- *) # unspecified
- log_f "${ACME_RESPONSE}" redis_only
- if [[ -f ${ACME_BASE}/acme/private/${DATE}.bak/fullchain.pem ]] && [[ -f ${ACME_BASE}/acme/private/${DATE}.bak/privkey.pem ]]; then
- log_f "Error requesting certificate, restoring previous certificate from backup and restarting containers...."
- cp ${ACME_BASE}/acme/private/${DATE}.bak/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/${DATE}.bak/privkey.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- elif [[ -f ${ACME_BASE}/acme/fullchain.pem ]] && [[ -f ${ACME_BASE}/acme/private/privkey.pem ]]; then
- log_f "Error requesting certificate, restoring from previous acme request and restarting containers..."
- cp ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem
- cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- fi
- if ! verify_hash_match ${ACME_BASE}/cert.pem ${ACME_BASE}/key.pem; then
- log_f "Error verifying certificates, restoring mailcow snake-oil..."
- cp ${SSL_EXAMPLE}/cert.pem ${ACME_BASE}/cert.pem
- cp ${SSL_EXAMPLE}/key.pem ${ACME_BASE}/key.pem
- TRIGGER_RESTART=1
- fi
- [[ ${TRIGGER_RESTART} == 1 ]] && restart_containers ${CONTAINERS_RESTART[*]}
+ *) # non-zero is non-fun
+ ACME_RESPONSE_B64=$(echo "${ACME_RESPONSE}" | openssl enc -e -A -base64)
+ log_f "${ACME_RESPONSE_B64}" redis_only b64
log_f "Retrying in 30 minutes..."
+ redis-cli -h redis SET ACME_FAIL_TIME "$(date +%s)"
sleep 30m
exec $(readlink -f "$0")
;;
esac
- log_f "ACME certificate validation done. Sleeping for another day."
- sleep 1d
-
done
diff --git a/data/Dockerfiles/clamd/Dockerfile b/data/Dockerfiles/clamd/Dockerfile
index fc6f0a1f..f5a3903b 100644
--- a/data/Dockerfiles/clamd/Dockerfile
+++ b/data/Dockerfiles/clamd/Dockerfile
@@ -1,24 +1,37 @@
-FROM alpine:3.8
+FROM debian:stretch-slim
LABEL maintainer "Andrรฉ Peters "
-# Add scripts
-COPY dl_files.sh bootstrap.sh ./
-
# Installation
-ENV CLAMAV 0.100.1
+ENV CLAMAV 0.101.1
-RUN apk add --no-cache --virtual build-dependencies alpine-sdk ncurses-dev zlib-dev bzip2-dev pcre-dev linux-headers fts-dev libxml2-dev libressl-dev \
- && apk add --no-cache curl bash tini libxml2 libbz2 pcre fts libressl tzdata \
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ ca-certificates \
+ zlib1g-dev \
+ libncurses5-dev \
+ libzip-dev \
+ libpcre2-dev \
+ libxml2-dev \
+ libssl-dev \
+ build-essential \
+ libjson-c-dev \
+ curl \
+ bash \
+ wget \
+ tzdata \
+ dnsutils \
+ rsync \
+ dos2unix \
+ netcat \
+ && rm -rf /var/lib/apt/lists/* \
&& wget -O - https://www.clamav.net/downloads/production/clamav-${CLAMAV}.tar.gz | tar xfvz - \
&& cd clamav-${CLAMAV} \
- && LIBS=-lfts ./configure \
+ && ./configure \
--prefix=/usr \
--libdir=/usr/lib \
--sysconfdir=/etc/clamav \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
- --without-iconv \
--disable-llvm \
--with-user=clamav \
--with-group=clamav \
@@ -30,18 +43,19 @@ RUN apk add --no-cache --virtual build-dependencies alpine-sdk ncurses-dev zlib-
&& make install \
&& make clean \
&& cd .. && rm -rf clamav-${CLAMAV} \
- && apk del build-dependencies \
- && addgroup -S clamav \
- && adduser -S -D -h /var/lib/clamav -s /sbin/nologin -G clamav -g clamav clamav \
- && adduser clamav tty \
- && mkdir -p /run/clamav \
- && chown clamav:clamav /run/clamav \
- && chmod +x /dl_files.sh \
- && set -ex; /bin/bash /dl_files.sh \
- && chmod 750 /run/clamav
+ && apt-get -y --auto-remove purge build-essential \
+ && apt-get -y purge zlib1g-dev \
+ libncurses5-dev \
+ libzip-dev \
+ libpcre2-dev \
+ libxml2-dev \
+ libssl-dev \
+ libjson-c-dev \
+ && addgroup --system --gid 700 clamav \
+ && adduser --system --no-create-home --home /var/lib/clamav --uid 700 --gid 700 --disabled-login clamav \
+ && rm -rf /tmp/* /var/tmp/*
-# Port provision
-EXPOSE 3310
+COPY bootstrap.sh ./
+COPY tini /sbin/tini
-# AV daemon bootstrapping
CMD ["/sbin/tini", "-g", "--", "/bootstrap.sh"]
diff --git a/data/Dockerfiles/clamd/bootstrap.sh b/data/Dockerfiles/clamd/bootstrap.sh
index ba1cee85..1d49cd20 100755
--- a/data/Dockerfiles/clamd/bootstrap.sh
+++ b/data/Dockerfiles/clamd/bootstrap.sh
@@ -6,16 +6,30 @@ if [[ "${SKIP_CLAMD}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
exit 0
fi
-# Create log pipes
-mkdir -p /var/log/clamav
-touch /var/log/clamav/clamd.log /var/log/clamav/freshclam.log
-chown -R clamav:clamav /var/log/clamav/
-chown root:tty /dev/console
-chmod g+rw /dev/console
+# Prepare whitelist
+
+mkdir -p /run/clamav /var/lib/clamav
+
+if [[ -s /etc/clamav/whitelist.ign2 ]]; then
+ echo "Copying non-empty whitelist.ign2 to /var/lib/clamav/whitelist.ign2"
+ cp /etc/clamav/whitelist.ign2 /var/lib/clamav/whitelist.ign2
+fi
+if [[ ! -f /var/lib/clamav/whitelist.ign2 ]]; then
+ echo "Creating /var/lib/clamav/whitelist.ign2"
+ echo "Example-Signature.Ignore-1" > /var/lib/clamav/whitelist.ign2
+fi
+
+chown clamav:clamav -R /var/lib/clamav /run/clamav
+
+chmod 755 /var/lib/clamav
+chmod 644 -R /var/lib/clamav/*
+chmod 750 /run/clamav
+
+echo "Stating whitelist.ign2"
+stat /var/lib/clamav/whitelist.ign2
-# Prepare
-[[ ! -f /var/lib/clamav/whitelist.ign2 ]] && touch /var/lib/clamav/whitelist.ign2
dos2unix /var/lib/clamav/whitelist.ign2
+
sed -i '/^\s*$/d' /var/lib/clamav/whitelist.ign2
BACKGROUND_TASKS=()
@@ -29,7 +43,35 @@ done
) &
BACKGROUND_TASKS+=($!)
-clamd &
+(
+while true; do
+ sleep 2m
+ SANE_MIRRORS="$(dig +ignore +short rsync.sanesecurity.net)"
+ for sane_mirror in ${SANE_MIRRORS}; do
+ rsync -avp --chown=clamav:clamav --chmod=Du=rwx,Dgo=rx,Fu=rw,Fog=r --timeout=5 rsync://${sane_mirror}/sanesecurity/ \
+ --include 'blurl.ndb' \
+ --include 'junk.ndb' \
+ --include 'jurlbl.ndb' \
+ --include 'jurbla.ndb' \
+ --include 'phishtank.ndb' \
+ --include 'phish.ndb' \
+ --include 'spamimg.hdb' \
+ --include 'scam.ndb' \
+ --include 'rogue.hdb' \
+ --include 'sanesecurity.ftm' \
+ --include 'sigwhitelist.ign2' \
+ --exclude='*' /var/lib/clamav/
+ if [ $? -eq 0 ]; then
+ echo RELOAD | nc localhost 3310
+ break
+ fi
+ done
+ sleep 30h
+done
+) &
+BACKGROUND_TASKS+=($!)
+
+nice -n10 clamd &
BACKGROUND_TASKS+=($!)
while true; do
diff --git a/data/Dockerfiles/clamd/dl_files.sh b/data/Dockerfiles/clamd/dl_files.sh
deleted file mode 100755
index 09d61241..00000000
--- a/data/Dockerfiles/clamd/dl_files.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-
-declare -a DB_MIRRORS=(
- "switch.clamav.net"
- "clamavdb.heanet.ie"
- "clamav.iol.cz"
- "clamav.univ-nantes.fr"
- "clamav.easynet.fr"
- "clamav.begi.net"
-)
-declare -a DB_MIRRORS=( $(shuf -e "${DB_MIRRORS[@]}") )
-
-DB_FILES=(
- "bytecode.cvd"
- "daily.cvd"
- "main.cvd"
-)
-
-for i in "${DB_MIRRORS[@]}"; do
- for j in "${DB_FILES[@]}"; do
- [[ -f "/var/lib/clamav/${j}" && -s "/var/lib/clamav/${j}" ]] && continue;
- if [[ $(curl -o /dev/null --connect-timeout 1 \
- --max-time 1 \
- --silent \
- --head \
- --write-out "%{http_code}\n" "${i}/${j}") == 200 ]]; then
- curl "${i}/${j}" -o "/var/lib/clamav/${j}" -#
- fi
- done
-done
-
-chown clamav:clamav /var/lib/clamav/*.cvd
diff --git a/data/Dockerfiles/clamd/tini b/data/Dockerfiles/clamd/tini
new file mode 100755
index 00000000..03af82f0
Binary files /dev/null and b/data/Dockerfiles/clamd/tini differ
diff --git a/data/Dockerfiles/dockerapi/Dockerfile b/data/Dockerfiles/dockerapi/Dockerfile
index 78389c4f..67bb6b07 100644
--- a/data/Dockerfiles/dockerapi/Dockerfile
+++ b/data/Dockerfiles/dockerapi/Dockerfile
@@ -1,8 +1,11 @@
-FROM python:2-alpine
+FROM alpine:3.9
LABEL maintainer "Andre Peters "
-RUN apk add -U --no-cache iptables ip6tables tzdata
-RUN pip install docker==3.0.1 flask flask-restful
+RUN apk add -U --no-cache python2 python-dev py-pip gcc musl-dev tzdata openssl-dev libffi-dev \
+ && pip2 install --upgrade pip \
+ && pip2 install --upgrade docker==3.0.1 flask flask-restful pyOpenSSL \
+ && apk del python-dev py2-pip gcc
COPY server.py /
+
CMD ["python2", "-u", "/server.py"]
diff --git a/data/Dockerfiles/dockerapi/server.py b/data/Dockerfiles/dockerapi/server.py
index e66cf238..d38775db 100644
--- a/data/Dockerfiles/dockerapi/server.py
+++ b/data/Dockerfiles/dockerapi/server.py
@@ -1,14 +1,19 @@
from flask import Flask
from flask_restful import Resource, Api
from flask import jsonify
+from flask import Response
from flask import request
from threading import Thread
+from OpenSSL import crypto
import docker
+import uuid
import signal
import time
import os
import re
import sys
+import ssl
+import socket
docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock', version='auto')
app = Flask(__name__)
@@ -62,65 +67,228 @@ class container_post(Resource):
except Exception as e:
return jsonify(type='danger', msg=str(e))
+ elif post_action == 'top':
+ try:
+ for container in docker_client.containers.list(all=True, filters={"id": container_id}):
+ return jsonify(type='success', msg=container.top())
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+
+ elif post_action == 'stats':
+ try:
+ for container in docker_client.containers.list(all=True, filters={"id": container_id}):
+ return jsonify(type='success', msg=container.stats(decode=True, stream=False))
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+
elif post_action == 'exec':
if not request.json or not 'cmd' in request.json:
return jsonify(type='danger', msg='cmd is missing')
- if request.json['cmd'] == 'df' and request.json['dir']:
- try:
- for container in docker_client.containers.list(filters={"id": container_id}):
- # Should be changed to be able to validate a path
- directory = re.sub('[^0-9a-zA-Z/]+', '', request.json['dir'])
- df_return = container.exec_run(["/bin/bash", "-c", "/bin/df -H " + directory + " | /usr/bin/tail -n1 | /usr/bin/tr -s [:blank:] | /usr/bin/tr ' ' ','"], user='nobody')
- if df_return.exit_code == 0:
- return df_return.output.rstrip()
- else:
- return "0,0,0,0,0,0"
- except Exception as e:
- return jsonify(type='danger', msg=str(e))
- elif request.json['cmd'] == 'sieve_list' and request.json['username']:
- try:
- for container in docker_client.containers.list(filters={"id": container_id}):
- sieve_return = container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve list -u '" + request.json['username'].replace("'", "'\\''") + "'"], user='vmail')
- return sieve_return.output
- except Exception as e:
- return jsonify(type='danger', msg=str(e))
- elif request.json['cmd'] == 'sieve_print' and request.json['script_name'] and request.json['username']:
- try:
- for container in docker_client.containers.list(filters={"id": container_id}):
- sieve_return = container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve get -u '" + request.json['username'].replace("'", "'\\''") + "' '" + request.json['script_name'].replace("'", "'\\''") + "'"], user='vmail')
- return sieve_return.output
- except Exception as e:
- return jsonify(type='danger', msg=str(e))
- elif request.json['cmd'] == 'worker_password' and request.json['raw']:
- try:
- for container in docker_client.containers.list(filters={"id": container_id}):
- hash = container.exec_run(["/bin/bash", "-c", "/usr/bin/rspamadm pw -e -p '" + request.json['raw'].replace("'", "'\\''") + "' 2> /dev/null"], user='_rspamd')
- if hash.exit_code == 0:
- hash_stdout = str(hash.output)
- for line in hash_stdout.split("\n"):
- if '$2$' in line:
- hash = line.strip()
- f = open("/access.inc", "w")
- f.write('enable_password = "' + re.sub('[^0-9a-zA-Z\$]+', '', hash.rstrip()) + '";\n')
- f.close()
- container.restart()
- return jsonify(type='success', msg='command completed successfully')
- else:
- return jsonify(type='danger', msg='command did not complete, exit code was ' + int(hash.exit_code))
- except Exception as e:
- return jsonify(type='danger', msg=str(e))
- elif request.json['cmd'] == 'mailman_password' and request.json['email'] and request.json['passwd']:
- try:
- for container in docker_client.containers.list(filters={"id": container_id}):
- add_su = container.exec_run(["/bin/bash", "-c", "/opt/mm_web/add_su.py '" + request.json['passwd'].replace("'", "'\\''") + "' '" + request.json['email'].replace("'", "'\\''") + "'"], user='mailman')
- if add_su.exit_code == 0:
- return jsonify(type='success', msg='command completed successfully')
- else:
- return jsonify(type='danger', msg='command did not complete, exit code was ' + int(add_su.exit_code))
- except Exception as e:
- return jsonify(type='danger', msg=str(e))
+ if request.json['cmd'] == 'mailq':
+ if 'items' in request.json:
+ r = re.compile("^[0-9a-fA-F]+$")
+ filtered_qids = filter(r.match, request.json['items'])
+ if filtered_qids:
+ if request.json['task'] == 'delete':
+ flagged_qids = ['-d %s' % i for i in filtered_qids]
+ sanitized_string = str(' '.join(flagged_qids));
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ postsuper_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postsuper " + sanitized_string])
+ return exec_run_handler('generic', postsuper_r)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ if request.json['task'] == 'hold':
+ flagged_qids = ['-h %s' % i for i in filtered_qids]
+ sanitized_string = str(' '.join(flagged_qids));
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ postsuper_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postsuper " + sanitized_string])
+ return exec_run_handler('generic', postsuper_r)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ if request.json['task'] == 'unhold':
+ flagged_qids = ['-H %s' % i for i in filtered_qids]
+ sanitized_string = str(' '.join(flagged_qids));
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ postsuper_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postsuper " + sanitized_string])
+ return exec_run_handler('generic', postsuper_r)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ if request.json['task'] == 'deliver':
+ flagged_qids = ['-i %s' % i for i in filtered_qids]
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ for i in flagged_qids:
+ postqueue_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postqueue " + i], user='postfix')
+ # todo: check each exit code
+ return jsonify(type='success', msg=str("Scheduled immediate delivery"))
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ elif request.json['task'] == 'list':
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ mailq_return = container.exec_run(["/usr/sbin/postqueue", "-j"], user='postfix')
+ return exec_run_handler('utf8_text_only', mailq_return)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ elif request.json['task'] == 'flush':
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ postqueue_r = container.exec_run(["/usr/sbin/postqueue", "-f"], user='postfix')
+ return exec_run_handler('generic', postqueue_r)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ elif request.json['task'] == 'super_delete':
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ postsuper_r = container.exec_run(["/usr/sbin/postsuper", "-d", "ALL"])
+ return exec_run_handler('generic', postsuper_r)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+
+ elif request.json['cmd'] == 'system':
+ if request.json['task'] == 'fts_rescan':
+ if 'username' in request.json:
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ rescan_return = container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm fts rescan -u '" + request.json['username'].replace("'", "'\\''") + "'"], user='vmail')
+ if rescan_return.exit_code == 0:
+ return jsonify(type='success', msg='fts_rescan: rescan triggered')
+ else:
+ return jsonify(type='warning', msg='fts_rescan error')
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ if 'all' in request.json:
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ rescan_return = container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm fts rescan -A"], user='vmail')
+ if rescan_return.exit_code == 0:
+ return jsonify(type='success', msg='fts_rescan: rescan triggered')
+ else:
+ return jsonify(type='warning', msg='fts_rescan error')
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ elif request.json['task'] == 'df':
+ if 'dir' in request.json:
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ df_return = container.exec_run(["/bin/bash", "-c", "/bin/df -H '" + request.json['dir'].replace("'", "'\\''") + "' | /usr/bin/tail -n1 | /usr/bin/tr -s [:blank:] | /usr/bin/tr ' ' ','"], user='nobody')
+ if df_return.exit_code == 0:
+ return df_return.output.rstrip()
+ else:
+ return "0,0,0,0,0,0"
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ elif request.json['task'] == 'mysql_upgrade':
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ sql_shell = container.exec_run(["/bin/bash"], stdin=True, socket=True, user='mysql')
+ upgrade_cmd = "/usr/bin/mysql_upgrade -uroot -p'" + os.environ['DBROOT'].replace("'", "'\\''") + "'\n"
+ sql_socket = sql_shell.output;
+ try :
+ sql_socket.sendall(upgrade_cmd.encode('utf-8'))
+ sql_socket.shutdown(socket.SHUT_WR)
+ except socket.error:
+ return jsonify(type='danger', msg=str('socket error'))
+ worker_response = recv_socket_data(sql_socket)
+ matched = False
+ for line in worker_response.split("\n"):
+ if 'is already upgraded to' in line:
+ matched = True
+ if matched:
+ return jsonify(type='success', msg='mysql_upgrade: already upgraded')
+ else:
+ container.restart()
+ return jsonify(type='warning', msg='mysql_upgrade: upgrade was applied')
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+
+ elif request.json['cmd'] == 'reload':
+ if request.json['task'] == 'dovecot':
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ reload_return = container.exec_run(["/bin/bash", "-c", "/usr/local/sbin/dovecot reload"])
+ return exec_run_handler('generic', reload_return)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ if request.json['task'] == 'postfix':
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ reload_return = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postfix reload"])
+ return exec_run_handler('generic', reload_return)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ if request.json['task'] == 'nginx':
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ reload_return = container.exec_run(["/bin/sh", "-c", "/usr/sbin/nginx -s reload"])
+ return exec_run_handler('generic', reload_return)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+
+ elif request.json['cmd'] == 'sieve':
+ if request.json['task'] == 'list':
+ if 'username' in request.json:
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ sieve_return = container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve list -u '" + request.json['username'].replace("'", "'\\''") + "'"])
+ return exec_run_handler('utf8_text_only', sieve_return)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+ elif request.json['task'] == 'print':
+ if 'username' in request.json and 'script_name' in request.json:
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ sieve_return = container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve get -u '" + request.json['username'].replace("'", "'\\''") + "' '" + request.json['script_name'].replace("'", "'\\''") + "'"])
+ return exec_run_handler('utf8_text_only', sieve_return)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+
+ elif request.json['cmd'] == 'maildir':
+ if request.json['task'] == 'cleanup':
+ if 'maildir' in request.json:
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ sane_name = re.sub(r'\W+', '', request.json['maildir'])
+ maildir_cleanup = container.exec_run(["/bin/bash", "-c", "if [[ -d '/var/vmail/" + request.json['maildir'].replace("'", "'\\''") + "' ]]; then /bin/mv '/var/vmail/" + request.json['maildir'].replace("'", "'\\''") + "' '/var/vmail/_garbage/" + str(int(time.time())) + "_" + sane_name + "'; fi"], user='vmail')
+ return exec_run_handler('generic', maildir_cleanup)
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
+
+ elif request.json['cmd'] == 'rspamd':
+ if request.json['task'] == 'worker_password':
+ if 'raw' in request.json:
+ try:
+ for container in docker_client.containers.list(filters={"id": container_id}):
+ worker_shell = container.exec_run(["/bin/bash"], stdin=True, socket=True, user='_rspamd')
+ worker_cmd = "/usr/bin/rspamadm pw -e -p '" + request.json['raw'].replace("'", "'\\''") + "' 2> /dev/null\n"
+ worker_socket = worker_shell.output;
+ try :
+ worker_socket.sendall(worker_cmd.encode('utf-8'))
+ worker_socket.shutdown(socket.SHUT_WR)
+ except socket.error:
+ return jsonify(type='danger', msg=str('socket error'))
+ worker_response = recv_socket_data(worker_socket)
+ matched = False
+ for line in worker_response.split("\n"):
+ if '$2$' in line:
+ matched = True
+ hash = line.strip()
+ hash_out = re.search('\$2\$.+$', hash).group(0)
+ f = open("/access.inc", "w")
+ f.write('enable_password = "' + re.sub('[^0-9a-zA-Z\$]+', '', hash_out.rstrip()) + '";\n')
+ f.close()
+ container.restart()
+ if matched:
+ return jsonify(type='success', msg='command completed successfully')
+ else:
+ return jsonify(type='danger', msg='command did not complete')
+ except Exception as e:
+ return jsonify(type='danger', msg=str(e))
else:
return jsonify(type='danger', msg='Unknown command')
@@ -137,11 +305,84 @@ class GracefulKiller:
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
- def exit_gracefully(self,signum, frame):
+ def exit_gracefully(self, signum, frame):
self.kill_now = True
def startFlaskAPI():
- app.run(debug=False, host='0.0.0.0', port=8080, threaded=True)
+ create_self_signed_cert()
+ try:
+ ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
+ ctx.check_hostname = False
+ ctx.load_cert_chain(certfile='/cert.pem', keyfile='/key.pem')
+ except:
+ print "Cannot initialize TLS, retrying in 5s..."
+ time.sleep(5)
+ app.run(debug=False, host='0.0.0.0', port=443, threaded=True, ssl_context=ctx)
+
+def recv_socket_data(c_socket, timeout=10):
+ c_socket.setblocking(0)
+ total_data=[];
+ data='';
+ begin=time.time()
+ while True:
+ if total_data and time.time()-begin > timeout:
+ break
+ elif time.time()-begin > timeout*2:
+ break
+ try:
+ data = c_socket.recv(8192)
+ if data:
+ total_data.append(data)
+ #change the beginning time for measurement
+ begin=time.time()
+ else:
+ #sleep for sometime to indicate a gap
+ time.sleep(0.1)
+ break
+ except:
+ pass
+ return ''.join(total_data)
+
+def exec_run_handler(type, output):
+ if type == 'generic':
+ if output.exit_code == 0:
+ return jsonify(type='success', msg='command completed successfully')
+ else:
+ return jsonify(type='danger', msg='command failed: ' + output.output)
+ if type == 'utf8_text_only':
+ r = Response(response=output.output, status=200, mimetype="text/plain")
+ r.headers["Content-Type"] = "text/plain; charset=utf-8"
+ return r
+
+def create_self_signed_cert():
+ success = False
+ while not success:
+ try:
+ pkey = crypto.PKey()
+ pkey.generate_key(crypto.TYPE_RSA, 2048)
+ cert = crypto.X509()
+ cert.get_subject().O = "mailcow"
+ cert.get_subject().CN = "dockerapi"
+ cert.set_serial_number(int(uuid.uuid4()))
+ cert.gmtime_adj_notBefore(0)
+ cert.gmtime_adj_notAfter(10*365*24*60*60)
+ cert.set_issuer(cert.get_subject())
+ cert.set_pubkey(pkey)
+ cert.sign(pkey, 'sha512')
+ cert = crypto.dump_certificate(crypto.FILETYPE_PEM, cert)
+ pkey = crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)
+ with os.fdopen(os.open('/cert.pem', os.O_WRONLY | os.O_CREAT, 0o644), 'w') as handle:
+ handle.write(cert)
+ with os.fdopen(os.open('/key.pem', os.O_WRONLY | os.O_CREAT, 0o600), 'w') as handle:
+ handle.write(pkey)
+ success = True
+ except:
+ time.sleep(1)
+ try:
+ os.remove('/cert.pem')
+ os.remove('/key.pem')
+ except OSError:
+ pass
api.add_resource(containers_get, '/containers/json')
api.add_resource(container_get, '/containers//json')
diff --git a/data/Dockerfiles/dovecot/Dockerfile b/data/Dockerfiles/dovecot/Dockerfile
index 03323914..c5517499 100644
--- a/data/Dockerfiles/dovecot/Dockerfile
+++ b/data/Dockerfiles/dovecot/Dockerfile
@@ -3,8 +3,8 @@ LABEL maintainer "Andre Peters "
ARG DEBIAN_FRONTEND=noninteractive
ENV LC_ALL C
-ENV DOVECOT_VERSION 2.3.2.1
-ENV PIGEONHOLE_VERSION 0.5.2
+ENV DOVECOT_VERSION 2.3.5.1
+ENV PIGEONHOLE_VERSION 0.5.5
RUN apt-get update && apt-get -y --no-install-recommends install \
automake \
@@ -14,6 +14,9 @@ RUN apt-get update && apt-get -y --no-install-recommends install \
cpanminus \
curl \
default-libmysqlclient-dev \
+ dnsutils \
+ gettext \
+ jq \
libjson-webtoken-perl \
libcgi-pm-perl \
libcrypt-openssl-rsa-perl \
@@ -38,6 +41,7 @@ RUN apt-get update && apt-get -y --no-install-recommends install \
libio-socket-ssl-perl \
libio-tee-perl \
libipc-run-perl \
+ libldap2-dev \
liblockfile-simple-perl \
liblz-dev \
liblz4-dev \
@@ -60,6 +64,10 @@ RUN apt-get update && apt-get -y --no-install-recommends install \
libregexp-common-perl \
liburi-perl \
lzma-dev \
+ python-html2text \
+ python-jinja2 \
+ python-mysql.connector \
+ python-redis \
make \
mysql-client \
procps \
@@ -69,11 +77,10 @@ RUN apt-get update && apt-get -y --no-install-recommends install \
syslog-ng \
syslog-ng-core \
syslog-ng-mod-redis \
- && rm -rf /var/lib/apt/lists/*
-
-RUN curl https://www.dovecot.org/releases/2.3/dovecot-$DOVECOT_VERSION.tar.gz | tar xvz \
+ && rm -rf /var/lib/apt/lists/* \
+ && curl https://www.dovecot.org/releases/2.3/dovecot-$DOVECOT_VERSION.tar.gz | tar xvz \
&& cd dovecot-$DOVECOT_VERSION \
- && ./configure --with-solr --with-mysql --with-lzma --with-lz4 --with-ssl=openssl --with-notify=inotify --with-storages=mdbox,sdbox,maildir,mbox,imapc,pop3c --with-bzlib --with-zlib \
+ && ./configure --with-solr --with-mysql --with-ldap --with-lzma --with-lz4 --with-ssl=openssl --with-notify=inotify --with-storages=mdbox,sdbox,maildir,mbox,imapc,pop3c --with-bzlib --with-zlib --enable-hardening \
&& make -j3 \
&& make install \
&& make clean \
@@ -85,12 +92,18 @@ RUN curl https://www.dovecot.org/releases/2.3/dovecot-$DOVECOT_VERSION.tar.gz |
&& make install \
&& make clean \
&& cd .. \
- && rm -rf dovecot-2.3-pigeonhole-$PIGEONHOLE_VERSION
-
-RUN cpanm Data::Uniqid Mail::IMAPClient String::Util
-RUN echo '* * * * * root /usr/local/bin/imapsync_cron.pl' > /etc/cron.d/imapsync
-RUN echo '30 3 * * * vmail /usr/local/bin/doveadm quota recalc -A' > /etc/cron.d/dovecot-sync
-RUN echo '* * * * * root /usr/local/bin/trim_logs.sh >> /dev/stdout 2>&1' > /etc/cron.d/trim_logs
+ && rm -rf dovecot-2.3-pigeonhole-$PIGEONHOLE_VERSION \
+ && cpanm Data::Uniqid Mail::IMAPClient String::Util \
+ && groupadd -g 5000 vmail \
+ && groupadd -g 401 dovecot \
+ && groupadd -g 402 dovenull \
+ && useradd -g vmail -u 5000 vmail -d /var/vmail \
+ && useradd -c "Dovecot unprivileged user" -d /dev/null -u 401 -g dovecot -s /bin/false dovecot \
+ && useradd -c "Dovecot login user" -d /dev/null -u 402 -g dovenull -s /bin/false dovenull \
+ && touch /etc/default/locale \
+ && apt-get purge -y build-essential automake autotools-dev default-libmysqlclient-dev libbz2-dev libcurl4-openssl-dev libexpat1-dev liblz-dev liblz4-dev liblzma-dev libpam-dev libssl-dev lzma-dev \
+ && apt-get autoremove --purge -y \
+ && rm -rf /tmp/* /var/tmp/*
COPY trim_logs.sh /usr/local/bin/trim_logs.sh
COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
@@ -101,31 +114,13 @@ COPY report-spam.sieve /usr/local/lib/dovecot/sieve/report-spam.sieve
COPY report-ham.sieve /usr/local/lib/dovecot/sieve/report-ham.sieve
COPY rspamd-pipe-ham /usr/local/lib/dovecot/sieve/rspamd-pipe-ham
COPY rspamd-pipe-spam /usr/local/lib/dovecot/sieve/rspamd-pipe-spam
+COPY sa-rules.sh /usr/local/bin/sa-rules.sh
+COPY maildir_gc.sh /usr/local/bin/maildir_gc.sh
COPY docker-entrypoint.sh /
COPY supervisord.conf /etc/supervisor/supervisord.conf
-
-RUN chmod +x /usr/local/lib/dovecot/sieve/rspamd-pipe-ham \
- /usr/local/lib/dovecot/sieve/rspamd-pipe-spam \
- /usr/local/bin/imapsync_cron.pl \
- /usr/local/bin/postlogin.sh \
- /usr/local/bin/imapsync \
- /usr/local/bin/trim_logs.sh
-
-RUN groupadd -g 5000 vmail \
- && groupadd -g 401 dovecot \
- && groupadd -g 402 dovenull \
- && useradd -g vmail -u 5000 vmail -d /var/vmail \
- && useradd -c "Dovecot unprivileged user" -d /dev/null -u 401 -g dovecot -s /bin/false dovecot \
- && useradd -c "Dovecot login user" -d /dev/null -u 402 -g dovenull -s /bin/false dovenull
-
-RUN touch /etc/default/locale
-RUN apt-get purge -y build-essential automake autotools-dev default-libmysqlclient-dev libbz2-dev libcurl4-openssl-dev libexpat1-dev liblz-dev liblz4-dev liblzma-dev libpam-dev libssl-dev lzma-dev \
- && apt-get autoremove --purge -y
+COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh
+COPY quarantine_notify.py /usr/local/bin/quarantine_notify.py
+COPY quota_notify.py /usr/local/bin/quota_notify.py
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
-
-RUN rm -rf \
- /tmp/* \
- /var/tmp/*
-
diff --git a/data/Dockerfiles/dovecot/docker-entrypoint.sh b/data/Dockerfiles/dovecot/docker-entrypoint.sh
index 50e91a12..7034fc08 100755
--- a/data/Dockerfiles/dovecot/docker-entrypoint.sh
+++ b/data/Dockerfiles/dovecot/docker-entrypoint.sh
@@ -2,28 +2,35 @@
set -e
# Wait for MySQL to warm-up
-while ! mysqladmin ping --host mysql -u${DBUSER} -p${DBPASS} --silent; do
+while ! mysqladmin status --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do
echo "Waiting for database to come up..."
sleep 2
done
-# Hard-code env vars to scripts due to cron not passing them to the perl script
-sed -i "/^\$DBUSER/c\\\$DBUSER='${DBUSER}';" /usr/local/bin/imapsync_cron.pl
-sed -i "/^\$DBPASS/c\\\$DBPASS='${DBPASS}';" /usr/local/bin/imapsync_cron.pl
-sed -i "/^\$DBNAME/c\\\$DBNAME='${DBNAME}';" /usr/local/bin/imapsync_cron.pl
-sed -i "s/LOG_LINES/${LOG_LINES}/g" /usr/local/bin/trim_logs.sh
+# Hard-code env vars to scripts due to cron not passing them to the scripts
+sed -i "s/__DBUSER__/${DBUSER}/g" /usr/local/bin/imapsync_cron.pl
+sed -i "s/__DBPASS__/${DBPASS}/g" /usr/local/bin/imapsync_cron.pl
+sed -i "s/__DBNAME__/${DBNAME}/g" /usr/local/bin/imapsync_cron.pl
+
+sed -i "s/__DBUSER__/${DBUSER}/g" /usr/local/bin/quarantine_notify.py
+sed -i "s/__DBPASS__/${DBPASS}/g" /usr/local/bin/quarantine_notify.py
+sed -i "s/__DBNAME__/${DBNAME}/g" /usr/local/bin/quarantine_notify.py
+
+sed -i "s/__LOG_LINES__/${LOG_LINES}/g" /usr/local/bin/trim_logs.sh
# Create missing directories
[[ ! -d /usr/local/etc/dovecot/sql/ ]] && mkdir -p /usr/local/etc/dovecot/sql/
+[[ ! -d /var/vmail/_garbage ]] && mkdir -p /var/vmail/_garbage
[[ ! -d /var/vmail/sieve ]] && mkdir -p /var/vmail/sieve
[[ ! -d /etc/sogo ]] && mkdir -p /etc/sogo
+[[ ! -d /var/volatile ]] && mkdir -p /var/volatile
# Set Dovecot sql config parameters, escape " in db password
DBPASS=$(echo ${DBPASS} | sed 's/"/\\"/g')
# Create quota dict for Dovecot
cat < /usr/local/etc/dovecot/sql/dovecot-dict-sql-quota.conf
-connect = "host=mysql dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
+connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
map {
pattern = priv/quota/storage
table = quota2
@@ -40,7 +47,7 @@ EOF
# Create dict used for sieve pre and postfilters
cat < /usr/local/etc/dovecot/sql/dovecot-dict-sql-sieve_before.conf
-connect = "host=mysql dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
+connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
map {
pattern = priv/sieve/name/\$script_name
table = sieve_before
@@ -62,7 +69,7 @@ map {
EOF
cat < /usr/local/etc/dovecot/sql/dovecot-dict-sql-sieve_after.conf
-connect = "host=mysql dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
+connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
map {
pattern = priv/sieve/name/\$script_name
table = sieve_after
@@ -83,39 +90,72 @@ map {
}
EOF
+echo -n ${ACL_ANYONE} > /usr/local/etc/dovecot/acl_anyone
+
+if [[ "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+echo -n 'quota acl zlib listescape mail_crypt mail_crypt_acl mail_log notify' > /usr/local/etc/dovecot/mail_plugins
+echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve listescape mail_crypt mail_crypt_acl notify mail_log' > /usr/local/etc/dovecot/mail_plugins_imap
+echo -n 'quota sieve acl zlib listescape mail_crypt mail_crypt_acl' > /usr/local/etc/dovecot/mail_plugins_lmtp
+else
+echo -n 'quota acl zlib listescape mail_crypt mail_crypt_acl mail_log notify fts fts_solr' > /usr/local/etc/dovecot/mail_plugins
+echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve listescape mail_crypt mail_crypt_acl notify mail_log fts fts_solr' > /usr/local/etc/dovecot/mail_plugins_imap
+echo -n 'quota sieve acl zlib listescape mail_crypt mail_crypt_acl fts fts_solr' > /usr/local/etc/dovecot/mail_plugins_lmtp
+fi
+chmod 644 /usr/local/etc/dovecot/mail_plugins /usr/local/etc/dovecot/mail_plugins_imap /usr/local/etc/dovecot/mail_plugins_lmtp /templates/quarantine.tpl
-# Create userdb dict for Dovecot
cat < /usr/local/etc/dovecot/sql/dovecot-dict-sql-userdb.conf
driver = mysql
-connect = "host=mysql dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
-user_query = SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, 5000 AS uid, 5000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
+connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
+user_query = SELECT CONCAT(JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.mailbox_format')), mailbox_path_prefix, '%d/%n/${MAILDIR_SUB}:VOLATILEDIR=/var/volatile/%u') AS mail, 5000 AS uid, 5000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT username FROM mailbox WHERE active='1';
EOF
# Create pass dict for Dovecot
cat < /usr/local/etc/dovecot/sql/dovecot-dict-sql-passdb.conf
driver = mysql
-connect = "host=mysql dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
+connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
default_pass_scheme = SSHA256
-password_query = SELECT password FROM mailbox WHERE username = '%u' AND domain IN (SELECT domain FROM domain WHERE domain='%d' AND active='1') AND JSON_EXTRACT(attributes, '$.force_pw_update') NOT LIKE '%%1%%'
+password_query = SELECT password FROM mailbox WHERE active = '1' AND username = '%u' AND domain IN (SELECT domain FROM domain WHERE domain='%d' AND active='1') AND JSON_EXTRACT(attributes, '$.force_pw_update') NOT LIKE '%%1%%'
EOF
# Create global sieve_after script
cat /usr/local/etc/dovecot/sieve_after > /var/vmail/sieve/global.sieve
-# Check permissions of vmail directory.
+# Check permissions of vmail/attachments directory.
# Do not do this every start-up, it may take a very long time. So we use a stat check here.
if [[ $(stat -c %U /var/vmail/) != "vmail" ]] ; then chown -R vmail:vmail /var/vmail ; fi
+if [[ $(stat -c %U /var/vmail/_garbage) != "vmail" ]] ; then chown -R vmail:vmail /var/vmail/_garbage ; fi
+if [[ $(stat -c %U /var/attachments) != "vmail" ]] ; then chown -R vmail:vmail /var/attachments ; fi
+
+# Cleanup random user maildirs
+rm -rf /var/vmail/mailcow.local/*
+
# Create random master for SOGo sieve features
RAND_USER=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 16 | head -n 1)
RAND_PASS=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 24 | head -n 1)
-echo ${RAND_USER}@mailcow.local:$(doveadm pw -s SHA1 -p ${RAND_PASS}) > /usr/local/etc/dovecot/dovecot-master.passwd
+echo ${RAND_USER}@mailcow.local:{SHA1}$(echo -n ${RAND_PASS} | sha1sum | awk '{print $1}') > /usr/local/etc/dovecot/dovecot-master.passwd
+echo ${RAND_USER}@mailcow.local::5000:5000:::: > /usr/local/etc/dovecot/dovecot-master.userdb
echo ${RAND_USER}@mailcow.local:${RAND_PASS} > /etc/sogo/sieve.creds
+if [[ "${ALLOW_ADMIN_EMAIL_LOGIN}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+ # Create random master Password for SOGo 'login as user' via proxy auth
+ RAND_PASS=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 32 | head -n 1)
+ echo -n ${RAND_PASS} > /etc/phpfpm/sogo-sso.pass
+ cat < /usr/local/etc/dovecot/sogo-sso.conf
+passdb {
+ driver = static
+ args = allow_real_nets=${IPV4_NETWORK}.248/32 password={plain}${RAND_PASS}
+}
+EOF
+else
+ rm -f /usr/local/etc/dovecot/sogo-sso.pass
+ rm -f /usr/local/etc/dovecot/sogo-sso.conf
+fi
+
# 401 is user dovecot
-if [[ ! -f /mail_crypt/ecprivkey.pem || ! -f /mail_crypt/ecpubkey.pem ]]; then
+if [[ ! -s /mail_crypt/ecprivkey.pem || ! -s /mail_crypt/ecpubkey.pem ]]; then
openssl ecparam -name prime256v1 -genkey | openssl pkey -out /mail_crypt/ecprivkey.pem
openssl pkey -in /mail_crypt/ecprivkey.pem -pubout -out /mail_crypt/ecpubkey.pem
chown 401 /mail_crypt/ecprivkey.pem /mail_crypt/ecpubkey.pem
@@ -129,7 +169,32 @@ sievec /usr/local/lib/dovecot/sieve/report-spam.sieve
sievec /usr/local/lib/dovecot/sieve/report-ham.sieve
# Fix permissions
+chown root:root /usr/local/etc/dovecot/sql/*.conf
+chown root:dovecot /usr/local/etc/dovecot/sql/dovecot-dict-sql-sieve* /usr/local/etc/dovecot/sql/dovecot-dict-sql-quota*
+chmod 640 /usr/local/etc/dovecot/sql/*.conf
chown -R vmail:vmail /var/vmail/sieve
+chown -R vmail:vmail /var/volatile
+adduser vmail tty
+chmod g+rw /dev/console
+chmod +x /usr/local/lib/dovecot/sieve/rspamd-pipe-ham \
+ /usr/local/lib/dovecot/sieve/rspamd-pipe-spam \
+ /usr/local/bin/imapsync_cron.pl \
+ /usr/local/bin/postlogin.sh \
+ /usr/local/bin/imapsync \
+ /usr/local/bin/trim_logs.sh \
+ /usr/local/bin/sa-rules.sh \
+ /usr/local/bin/maildir_gc.sh \
+ /usr/local/sbin/stop-supervisor.sh \
+ /usr/local/bin/quota_notify.py
+
+# Setup cronjobs
+echo '* * * * * root /usr/local/bin/imapsync_cron.pl 2>&1 | /usr/bin/logger' > /etc/cron.d/imapsync
+echo '30 3 * * * vmail /usr/local/bin/doveadm quota recalc -A' > /etc/cron.d/dovecot-sync
+echo '* * * * * vmail /usr/local/bin/trim_logs.sh >> /dev/console 2>&1' > /etc/cron.d/trim_logs
+echo '25 * * * * vmail /usr/local/bin/maildir_gc.sh >> /dev/console 2>&1' > /etc/cron.d/maildir_gc
+echo '30 1 * * * root /usr/local/bin/sa-rules.sh >> /dev/console 2>&1' > /etc/cron.d/sa-rules
+echo '0 2 * * * root /usr/bin/curl http://solr:8983/solr/dovecot-fts/update?optimize=true >> /dev/console 2>&1' > /etc/cron.d/solr-optimize
+echo '*/20 * * * * vmail /usr/local/bin/quarantine_notify.py >> /dev/console 2>&1' > /etc/cron.d/quarantine_notify
# Fix more than 1 hardlink issue
touch /etc/crontab /etc/cron.*/*
@@ -139,7 +204,13 @@ touch /etc/crontab /etc/cron.*/*
# Clean stopped imapsync jobs
rm -f /tmp/imapsync_busy.lock
-IMAPSYNC_TABLE=$(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SHOW TABLES LIKE 'imapsync'" -Bs)
-[[ ! -z ${IMAPSYNC_TABLE} ]] && mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "UPDATE imapsync SET is_running='0'"
+IMAPSYNC_TABLE=$(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SHOW TABLES LIKE 'imapsync'" -Bs)
+[[ ! -z ${IMAPSYNC_TABLE} ]] && mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "UPDATE imapsync SET is_running='0'"
+
+# Envsubst maildir_gc
+echo "$(envsubst < /usr/local/bin/maildir_gc.sh)" > /usr/local/bin/maildir_gc.sh
+
+# Collect SA rules once now
+/usr/local/bin/sa-rules.sh
exec "$@"
diff --git a/data/Dockerfiles/dovecot/imapsync_cron.pl b/data/Dockerfiles/dovecot/imapsync_cron.pl
index be5cb411..4fad97ab 100755
--- a/data/Dockerfiles/dovecot/imapsync_cron.pl
+++ b/data/Dockerfiles/dovecot/imapsync_cron.pl
@@ -18,18 +18,20 @@ if ($imapsync_running eq 1)
exit;
}
-sub qqw($) { split /\s+/, $_[0] }
-
-$DBNAME = '';
-$DBUSER = '';
-$DBPASS = '';
+sub qqw($) {
+ my @values = split('(?=--)', $_[0]);
+ foreach my $val (@values) {
+ $val=trim($val);
+ }
+ return @values
+}
$run_dir="/tmp";
-$dsn = "DBI:mysql:database=" . $DBNAME . ";host=mysql";
+$dsn = 'DBI:mysql:database=__DBNAME__;mysql_socket=/var/run/mysqld/mysqld.sock';
$lock_file = $run_dir . "/imapsync_busy";
$lockmgr = LockFile::Simple->make(-autoclean => 1, -max => 1);
$lockmgr->lock($lock_file) || die "can't lock ${lock_file}";
-$dbh = DBI->connect($dsn, $DBUSER, $DBPASS, {
+$dbh = DBI->connect($dsn, '__DBUSER__', '__DBPASS__', {
mysql_auto_reconnect => 1,
mysql_enable_utf8mb4 => 1
});
diff --git a/data/Dockerfiles/dovecot/maildir_gc.sh b/data/Dockerfiles/dovecot/maildir_gc.sh
new file mode 100755
index 00000000..24c1e461
--- /dev/null
+++ b/data/Dockerfiles/dovecot/maildir_gc.sh
@@ -0,0 +1,2 @@
+#/bin/bash
+[ -d /var/vmail/_garbage/ ] && /usr/bin/find /var/vmail/_garbage/ -mindepth 1 -maxdepth 1 -type d -cmin +${MAILDIR_GC_TIME} -exec rm -r {} \;
diff --git a/data/Dockerfiles/dovecot/postlogin.sh b/data/Dockerfiles/dovecot/postlogin.sh
index 343910ff..01a45f31 100755
--- a/data/Dockerfiles/dovecot/postlogin.sh
+++ b/data/Dockerfiles/dovecot/postlogin.sh
@@ -1,4 +1,3 @@
#!/bin/sh
-
export MASTER_USER=$USER
exec "$@"
diff --git a/data/Dockerfiles/dovecot/quarantine_notify.py b/data/Dockerfiles/dovecot/quarantine_notify.py
new file mode 100755
index 00000000..28a7aabe
--- /dev/null
+++ b/data/Dockerfiles/dovecot/quarantine_notify.py
@@ -0,0 +1,125 @@
+#!/usr/bin/python
+
+import smtplib
+import os
+import mysql.connector
+from email.MIMEMultipart import MIMEMultipart
+from email.MIMEText import MIMEText
+from email.Utils import COMMASPACE, formatdate
+import cgi
+import jinja2
+from jinja2 import Template
+import json
+import redis
+import time
+import html2text
+import socket
+
+while True:
+ try:
+ r = redis.StrictRedis(host='redis', decode_responses=True, port=6379, db=0)
+ r.ping()
+ except Exception as ex:
+ print '%s - trying again...' % (ex)
+ time.sleep(3)
+ else:
+ break
+
+time_now = int(time.time())
+
+def query_mysql(query, headers = True, update = False):
+ while True:
+ try:
+ cnx = mysql.connector.connect(unix_socket = '/var/run/mysqld/mysqld.sock', user='__DBUSER__', passwd='__DBPASS__', database='__DBNAME__', charset="utf8")
+ except Exception as ex:
+ print '%s - trying again...' % (ex)
+ time.sleep(3)
+ else:
+ break
+ cur = cnx.cursor()
+ cur.execute(query)
+ if not update:
+ result = []
+ columns = tuple( [d[0].decode('utf8') for d in cur.description] )
+ for row in cur:
+ if headers:
+ result.append(dict(zip(columns, row)))
+ else:
+ result.append(row)
+ cur.close()
+ cnx.close()
+ return result
+ else:
+ cnx.commit()
+ cur.close()
+ cnx.close()
+
+def notify_rcpt(rcpt, msg_count, quarantine_acl):
+ meta_query = query_mysql('SELECT SHA2(CONCAT(id, qid), 256) AS qhash, id, subject, score, sender, created FROM quarantine WHERE notified = 0 AND rcpt = "%s"' % (rcpt))
+ if r.get('Q_HTML'):
+ try:
+ template = Template(r.get('Q_HTML'))
+ except:
+ print "Error: Cannot parse quarantine template, falling back to default template."
+ with open('/templates/quarantine.tpl') as file_:
+ template = Template(file_.read())
+ else:
+ with open('/templates/quarantine.tpl') as file_:
+ template = Template(file_.read())
+ html = template.render(meta=meta_query, counter=msg_count, hostname=socket.gethostname(), quarantine_acl=quarantine_acl)
+ text = html2text.html2text(html)
+ count = 0
+ while count < 15:
+ try:
+ server = smtplib.SMTP('postfix', 590, 'quarantine')
+ server.ehlo()
+ msg = MIMEMultipart('alternative')
+ msg['From'] = r.get('Q_SENDER') or "quarantine@localhost"
+ msg['Subject'] = r.get('Q_SUBJ') or "Spam Quarantine Notification"
+ msg['Date'] = formatdate(localtime = True)
+ text_part = MIMEText(text, 'plain', 'utf-8')
+ html_part = MIMEText(html, 'html', 'utf-8')
+ msg.attach(text_part)
+ msg.attach(html_part)
+ msg['To'] = str(rcpt)
+ text = msg.as_string()
+ server.sendmail(msg['From'], msg['To'], text)
+ server.quit()
+ for res in meta_query:
+ query_mysql('UPDATE quarantine SET notified = 1 WHERE id = "%d"' % (res['id']), update = True)
+ r.hset('Q_LAST_NOTIFIED', record['rcpt'], time_now)
+ break
+ except Exception as ex:
+ print '%s' % (ex)
+ time.sleep(3)
+
+records = query_mysql('SELECT IFNULL(user_acl.quarantine, 0) AS quarantine_acl, count(id) AS counter, rcpt FROM quarantine LEFT OUTER JOIN user_acl ON user_acl.username = rcpt WHERE notified = 0 AND rcpt in (SELECT username FROM mailbox) GROUP BY rcpt')
+
+for record in records:
+ attrs = ''
+ attrs_json = ''
+ try:
+ last_notification = int(r.hget('Q_LAST_NOTIFIED', record['rcpt']))
+ if last_notification > time_now:
+ print 'Last notification is > time now, assuming never'
+ last_notification = 0
+ except Exception as ex:
+ print 'Could not determine last notification for %s, assuming never' % (record['rcpt'])
+ last_notification = 0
+ attrs_json = query_mysql('SELECT attributes FROM mailbox WHERE username = "%s"' % (record['rcpt']))
+ attrs = json.loads(str(attrs_json[0]['attributes']))
+ if attrs['quarantine_notification'] not in ('hourly', 'daily', 'weekly', 'never'):
+ print 'Abnormal quarantine_notification value'
+ continue
+ if attrs['quarantine_notification'] == 'hourly':
+ if last_notification == 0 or (last_notification + 3600) < time_now:
+ print "Notifying %s about %d new items in quarantine" % (record['rcpt'], record['counter'])
+ notify_rcpt(record['rcpt'], record['counter'], record['quarantine_acl'])
+ elif attrs['quarantine_notification'] == 'daily':
+ if last_notification == 0 or (last_notification + 86400) < time_now:
+ print "Notifying %s about %d new items in quarantine" % (record['rcpt'], record['counter'])
+ notify_rcpt(record['rcpt'], record['counter'], record['quarantine_acl'])
+ elif attrs['quarantine_notification'] == 'weekly':
+ if last_notification == 0 or (last_notification + 604800) < time_now:
+ print "Notifying %s about %d new items in quarantine" % (record['rcpt'], record['counter'])
+ notify_rcpt(record['rcpt'], record['counter'], record['quarantine_acl'])
diff --git a/data/Dockerfiles/dovecot/quota_notify.py b/data/Dockerfiles/dovecot/quota_notify.py
new file mode 100755
index 00000000..f5df7639
--- /dev/null
+++ b/data/Dockerfiles/dovecot/quota_notify.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+
+import smtplib
+import os
+from email.MIMEMultipart import MIMEMultipart
+from email.MIMEText import MIMEText
+from email.Utils import COMMASPACE, formatdate
+import jinja2
+from jinja2 import Template
+import redis
+import time
+import sys
+import html2text
+from subprocess import Popen, PIPE, STDOUT
+
+if len(sys.argv) > 2:
+ percent = int(sys.argv[1])
+ username = str(sys.argv[2])
+else:
+ print "Args missing"
+ sys.exit(1)
+
+while True:
+ try:
+ r = redis.StrictRedis(host='redis', decode_responses=True, port=6379, db=0)
+ r.ping()
+ except Exception as ex:
+ print '%s - trying again...' % (ex)
+ time.sleep(3)
+ else:
+ break
+
+if r.get('QW_HTML'):
+ try:
+ template = Template(r.get('QW_HTML'))
+ except:
+ print "Error: Cannot parse quarantine template, falling back to default template."
+ with open('/templates/quota.tpl') as file_:
+ template = Template(file_.read())
+else:
+ with open('/templates/quota.tpl') as file_:
+ template = Template(file_.read())
+
+html = template.render(username=username, percent=percent)
+text = html2text.html2text(html)
+
+try:
+ msg = MIMEMultipart('alternative')
+ msg['From'] = r.get('QW_SENDER') or "quota-warning@localhost"
+ msg['Subject'] = r.get('QW_SUBJ') or "Quota warning"
+ msg['Date'] = formatdate(localtime = True)
+ text_part = MIMEText(text, 'plain', 'utf-8')
+ html_part = MIMEText(html, 'html', 'utf-8')
+ msg.attach(text_part)
+ msg.attach(html_part)
+ msg['To'] = username
+ p = Popen(['/usr/local/libexec/dovecot/dovecot-lda', '-d', username, '-o', '"plugin/quota=maildir:User quota:noenforcing"'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
+ p.communicate(input=msg.as_string())
+
+except Exception as ex:
+ print 'Failed to send quota notification: %s' % (ex)
+ sys.exit(1)
+
+try:
+ sys.stdout.close()
+except:
+ pass
+
+try:
+ sys.stderr.close()
+except:
+ pass
diff --git a/data/Dockerfiles/dovecot/rspamd-pipe-ham b/data/Dockerfiles/dovecot/rspamd-pipe-ham
index 9d961be0..9b26817c 100755
--- a/data/Dockerfiles/dovecot/rspamd-pipe-ham
+++ b/data/Dockerfiles/dovecot/rspamd-pipe-ham
@@ -3,7 +3,7 @@ FILE=/tmp/mail$$
cat > $FILE
trap "/bin/rm -f $FILE" 0 1 2 3 13 15
-cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/learnham
-cat ${FILE} | /usr/bin/curl -H "Flag: 13" -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/fuzzyadd
+cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/learnham
+cat ${FILE} | /usr/bin/curl -H "Flag: 13" -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/fuzzyadd
exit 0
diff --git a/data/Dockerfiles/dovecot/rspamd-pipe-spam b/data/Dockerfiles/dovecot/rspamd-pipe-spam
index 3b9e3497..d06aa919 100755
--- a/data/Dockerfiles/dovecot/rspamd-pipe-spam
+++ b/data/Dockerfiles/dovecot/rspamd-pipe-spam
@@ -3,7 +3,7 @@ FILE=/tmp/mail$$
cat > $FILE
trap "/bin/rm -f $FILE" 0 1 2 3 13 15
-cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/learnspam
-cat ${FILE} | /usr/bin/curl -H "Flag: 11" -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/fuzzyadd
+cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/learnspam
+cat ${FILE} | /usr/bin/curl -H "Flag: 11" -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/fuzzyadd
exit 0
diff --git a/data/Dockerfiles/dovecot/sa-rules.sh b/data/Dockerfiles/dovecot/sa-rules.sh
new file mode 100755
index 00000000..0cea240c
--- /dev/null
+++ b/data/Dockerfiles/dovecot/sa-rules.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+[[ ! -d /tmp/sa-rules-heinlein ]] && mkdir -p /tmp/sa-rules-heinlein
+if [[ ! -f /etc/rspamd/custom/sa-rules-heinlein ]]; then
+ HASH_SA_RULES=0
+else
+ HASH_SA_RULES=$(cat /etc/rspamd/custom/sa-rules-heinlein | md5sum | cut -d' ' -f1)
+fi
+
+curl --connect-timeout 15 --max-time 30 http://www.spamassassin.heinlein-support.de/$(dig txt 1.4.3.spamassassin.heinlein-support.de +short | tr -d '"').tar.gz --output /tmp/sa-rules.tar.gz
+if [[ -f /tmp/sa-rules.tar.gz ]]; then
+ tar xfvz /tmp/sa-rules.tar.gz -C /tmp/sa-rules-heinlein
+ # create complete list of rules in a single file
+ cat /tmp/sa-rules-heinlein/*cf > /etc/rspamd/custom/sa-rules-heinlein
+ # Only restart rspamd-mailcow when rules changed
+ if [[ $(cat /etc/rspamd/custom/sa-rules-heinlein | md5sum | cut -d' ' -f1) != ${HASH_SA_RULES} ]]; then
+ CONTAINER_NAME=rspamd-mailcow
+ CONTAINER_ID=$(curl --silent --insecure https://dockerapi/containers/json | \
+ jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], id: .Id}" | \
+ jq -rc "select( .name | tostring | contains(\"${CONTAINER_NAME}\")) | .id")
+ if [[ ! -z ${CONTAINER_ID} ]]; then
+ curl --silent --insecure -XPOST --connect-timeout 15 --max-time 120 https://dockerapi/containers/${CONTAINER_ID}/restart
+ fi
+ fi
+fi
+rm -rf /tmp/sa-rules-heinlein /tmp/sa-rules.tar.gz
diff --git a/data/Dockerfiles/dovecot/stop-supervisor.sh b/data/Dockerfiles/dovecot/stop-supervisor.sh
new file mode 100755
index 00000000..5394490c
--- /dev/null
+++ b/data/Dockerfiles/dovecot/stop-supervisor.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+printf "READY\n";
+
+while read line; do
+ echo "Processing Event: $line" >&2;
+ kill -3 $(cat "/var/run/supervisord.pid")
+done < /dev/stdin
diff --git a/data/Dockerfiles/dovecot/supervisord.conf b/data/Dockerfiles/dovecot/supervisord.conf
index f517c388..2e3026a0 100644
--- a/data/Dockerfiles/dovecot/supervisord.conf
+++ b/data/Dockerfiles/dovecot/supervisord.conf
@@ -1,6 +1,7 @@
[supervisord]
nodaemon=true
user=root
+pidfile=/var/run/supervisord.pid
[program:syslog-ng]
command=/usr/sbin/syslog-ng --foreground --no-caps
@@ -17,3 +18,7 @@ autorestart=true
[program:cron]
command=/usr/sbin/cron -f
autorestart=true
+
+[eventlistener:processes]
+command=/usr/local/sbin/stop-supervisor.sh
+events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL
diff --git a/data/Dockerfiles/dovecot/trim_logs.sh b/data/Dockerfiles/dovecot/trim_logs.sh
index b8da9740..2fec55d3 100755
--- a/data/Dockerfiles/dovecot/trim_logs.sh
+++ b/data/Dockerfiles/dovecot/trim_logs.sh
@@ -1,8 +1,18 @@
#!/bin/bash
+catch_non_zero() {
+ CMD=${1}
+ ${CMD} > /dev/null
+ EC=$?
+ if [ ${EC} -ne 0 ]; then
+ echo "Command ${CMD} failed to execute, exit code was ${EC}"
+ fi
+}
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM ACME_LOG 0 __LOG_LINES__"
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM POSTFIX_MAILLOG 0 __LOG_LINES__"
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM DOVECOT_MAILLOG 0 __LOG_LINES__"
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM SOGO_LOG 0 __LOG_LINES__"
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM NETFILTER_LOG 0 __LOG_LINES__"
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM AUTODISCOVER_LOG 0 __LOG_LINES__"
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM API_LOG 0 __LOG_LINES__"
+catch_non_zero "/usr/bin/redis-cli -h redis LTRIM RL_LOG 0 __LOG_LINES__"
-redis-cli -h redis LTRIM ACME_LOG 0 LOG_LINES
-redis-cli -h redis LTRIM POSTFIX_MAILLOG 0 LOG_LINES
-redis-cli -h redis LTRIM DOVECOT_MAILLOG 0 LOG_LINES
-redis-cli -h redis LTRIM SOGO_LOG 0 LOG_LINES
-redis-cli -h redis LTRIM NETFILTER_LOG 0 LOG_LINES
-redis-cli -h redis LTRIM AUTODISCOVER_LOG 0 LOG_LINES
diff --git a/data/Dockerfiles/netfilter/Dockerfile b/data/Dockerfiles/netfilter/Dockerfile
index aab9b1d3..92eaa39f 100644
--- a/data/Dockerfiles/netfilter/Dockerfile
+++ b/data/Dockerfiles/netfilter/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.8
+FROM alpine:3.9
LABEL maintainer "Andre Peters "
ENV XTABLES_LIBDIR /usr/lib/xtables
diff --git a/data/Dockerfiles/netfilter/server.py b/data/Dockerfiles/netfilter/server.py
index 9bf4a084..910679c6 100644
--- a/data/Dockerfiles/netfilter/server.py
+++ b/data/Dockerfiles/netfilter/server.py
@@ -10,7 +10,6 @@ from random import randint
from threading import Thread
from threading import Lock
import redis
-import time
import json
import iptc
@@ -29,10 +28,11 @@ pubsub = r.pubsub()
RULES = {}
RULES[1] = 'warning: .*\[([0-9a-f\.:]+)\]: SASL .+ authentication failed'
RULES[2] = '-login: Disconnected \(auth failed, .+\): user=.*, method=.+, rip=([0-9a-f\.:]+),'
-RULES[3] = '-login: Aborted login \(no auth .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
-RULES[4] = '-login: Aborted login \(tried to use disallowed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
-RULES[5] = 'SOGo.+ Login from \'([0-9a-f\.:]+)\' for user .+ might not have worked'
-RULES[6] = 'mailcow UI: Invalid password for .+ by ([0-9a-f\.:]+)'
+RULES[3] = '-login: Aborted login \(tried to use disallowed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
+RULES[4] = 'SOGo.+ Login from \'([0-9a-f\.:]+)\' for user .+ might not have worked'
+RULES[5] = 'mailcow UI: Invalid password for .+ by ([0-9a-f\.:]+)'
+RULES[6] = '([0-9a-f\.:]+) \"GET \/SOGo\/.* HTTP.+\" 403 .+'
+#RULES[7] = '-login: Aborted login \(no auth .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
bans = {}
log = {}
diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile
index 3acfd09f..de31031a 100644
--- a/data/Dockerfiles/phpfpm/Dockerfile
+++ b/data/Dockerfiles/phpfpm/Dockerfile
@@ -1,11 +1,11 @@
-FROM php:7.2-fpm-alpine3.7
+FROM php:7.3-fpm-alpine3.8
LABEL maintainer "Andre Peters "
-ENV APCU_PECL 5.1.11
+ENV APCU_PECL 5.1.16
ENV IMAGICK_PECL 3.4.3
-ENV MAILPARSE_PECL 3.0.2
-ENV MEMCACHED_PECL 3.0.4
-ENV REDIS_PECL 4.0.2
+#ENV MAILPARSE_PECL 3.0.2
+ENV MEMCACHED_PECL 3.1.3
+ENV REDIS_PECL 4.2.0
RUN apk add -U --no-cache autoconf \
bash \
@@ -14,12 +14,14 @@ RUN apk add -U --no-cache autoconf \
freetype \
freetype-dev \
g++ \
+ git \
gettext-dev \
icu-dev \
icu-libs \
imagemagick \
imagemagick-dev \
imap-dev \
+ jq \
libjpeg-turbo \
libjpeg-turbo-dev \
libmemcached-dev \
@@ -32,6 +34,7 @@ RUN apk add -U --no-cache autoconf \
libwebp-dev \
libxml2-dev \
libxpm-dev \
+ libzip-dev \
make \
mysql-client \
openldap-dev \
@@ -41,14 +44,13 @@ RUN apk add -U --no-cache autoconf \
samba-client \
zlib-dev \
tzdata \
- && pear install channel://pear.php.net/Net_IDNA2-0.2.0 \
- channel://pear.php.net/Auth_SASL-1.1.0 \
- Net_IMAP \
- Net_Sieve \
- NET_SMTP \
- Mail_mime \
- && pecl install redis-${REDIS_PECL} memcached-${MEMCACHED_PECL} APCu-${APCU_PECL} imagick-${IMAGICK_PECL} mailparse-${MAILPARSE_PECL} \
- && docker-php-ext-enable apcu imagick mailparse memcached redis \
+ && git clone https://github.com/php/pecl-mail-mailparse \
+ && cd pecl-mail-mailparse \
+ && pecl install package.xml \
+ && cd .. \
+ && rm -r pecl-mail-mailparse \
+ && pecl install redis-${REDIS_PECL} memcached-${MEMCACHED_PECL} APCu-${APCU_PECL} imagick-${IMAGICK_PECL} \
+ && docker-php-ext-enable apcu imagick memcached mailparse redis \
&& pecl clear-cache \
&& docker-php-ext-configure intl \
&& docker-php-ext-configure gd \
diff --git a/data/Dockerfiles/phpfpm/docker-entrypoint.sh b/data/Dockerfiles/phpfpm/docker-entrypoint.sh
index 44d46f74..bf055f3a 100755
--- a/data/Dockerfiles/phpfpm/docker-entrypoint.sh
+++ b/data/Dockerfiles/phpfpm/docker-entrypoint.sh
@@ -1,28 +1,67 @@
#!/bin/bash
-set -e
function array_by_comma { local IFS=","; echo "$*"; }
# Wait for containers
-while ! mysqladmin ping --host mysql -u${DBUSER} -p${DBPASS} --silent; do
+while ! mysqladmin status --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do
+ echo "Waiting for SQL..."
sleep 2
done
until [[ $(redis-cli -h redis-mailcow PING) == "PONG" ]]; do
+ echo "Waiting for Redis..."
sleep 2
done
+# Set a default release format
+
+if [[ -z $(redis-cli --raw -h redis-mailcow GET Q_RELEASE_FORMAT) ]]; then
+ redis-cli --raw -h redis-mailcow SET Q_RELEASE_FORMAT raw
+fi
+
+# Check of mysql_upgrade
+
+CONTAINER_ID=
+# Todo: Better check if upgrade failed
+# This can happen due to a broken sogo_view
+[ -s /mysql_upgrade_loop ] && SQL_LOOP_C=$(cat /mysql_upgrade_loop)
+until [[ ! -z "${CONTAINER_ID}" ]] && [[ "${CONTAINER_ID}" =~ ^[[:alnum:]]*$ ]]; do
+ CONTAINER_ID=$(curl --silent --insecure https://dockerapi/containers/json | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], id: .Id}" 2> /dev/null | jq -rc "select( .name | tostring | contains(\"mysql-mailcow\")) | .id" 2> /dev/null)
+done
+echo "MySQL @ ${CONTAINER_ID}"
+SQL_UPGRADE_RETURN=$(curl --silent --insecure -XPOST https://dockerapi/containers/${CONTAINER_ID}/exec -d '{"cmd":"system", "task":"mysql_upgrade"}' --silent -H 'Content-type: application/json' | jq -r .type)
+if [[ ${SQL_UPGRADE_RETURN} == 'warning' ]]; then
+ if [ -z ${SQL_LOOP_C} ]; then
+ echo 1 > /mysql_upgrade_loop
+ echo "MySQL applied an upgrade, restarting PHP-FPM..."
+ exit 1
+ else
+ rm /mysql_upgrade_loop
+ echo "MySQL was not applied previously, skipping. Restart php-fpm-mailcow to retry or run mysql_upgrade manually."
+ while ! mysqladmin status --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do
+ echo "Waiting for SQL to return..."
+ sleep 2
+ done
+ fi
+else
+ echo "MySQL is up-to-date"
+fi
+
+# Trigger db init
+echo "Running DB init..."
+php -c /usr/local/etc/php -f /web/inc/init_db.inc.php
+
# Migrate domain map
declare -a DOMAIN_ARR
redis-cli -h redis-mailcow DEL DOMAIN_MAP
while read line
do
DOMAIN_ARR+=("$line")
-done < <(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain" -Bs)
+done < <(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain" -Bs)
while read line
do
DOMAIN_ARR+=("$line")
-done < <(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT alias_domain FROM alias_domain" -Bs)
+done < <(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT alias_domain FROM alias_domain" -Bs)
if [[ ! -z ${DOMAIN_ARR} ]]; then
for domain in "${DOMAIN_ARR[@]}"; do
@@ -48,10 +87,9 @@ if [[ ${API_ALLOW_FROM} != "invalid" ]] && \
done
VALIDATED_IPS=$(array_by_comma ${VALIDATED_API_ALLOW_FROM_ARR[*]})
if [[ ! -z ${VALIDATED_IPS} ]]; then
- mysql --host mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
-INSERT INTO api (username, api_key, active, allow_from)
-SELECT username, "${API_KEY}", '1', "${VALIDATED_IPS}" FROM admin WHERE superadmin='1' AND active='1'
-ON DUPLICATE KEY UPDATE active = '1', allow_from = "${VALIDATED_IPS}", api_key = "${API_KEY}";
+ mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
+DELETE FROM api;
+INSERT INTO api (api_key, active, allow_from) VALUES ("${API_KEY}", "1", "${VALIDATED_IPS}");
EOF
fi
fi
diff --git a/data/Dockerfiles/postfix/Dockerfile b/data/Dockerfiles/postfix/Dockerfile
index 9ad52fb2..05f2c3c7 100644
--- a/data/Dockerfiles/postfix/Dockerfile
+++ b/data/Dockerfiles/postfix/Dockerfile
@@ -48,6 +48,13 @@ COPY postfix.sh /opt/postfix.sh
COPY rspamd-pipe-ham /usr/local/bin/rspamd-pipe-ham
COPY rspamd-pipe-spam /usr/local/bin/rspamd-pipe-spam
COPY whitelist_forwardinghosts.sh /usr/local/bin/whitelist_forwardinghosts.sh
+COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh
+
+RUN chmod +x /opt/postfix.sh \
+ /usr/local/bin/rspamd-pipe-ham \
+ /usr/local/bin/rspamd-pipe-spam \
+ /usr/local/bin/whitelist_forwardinghosts.sh \
+ /usr/local/sbin/stop-supervisor.sh
EXPOSE 588
diff --git a/data/Dockerfiles/postfix/postfix.sh b/data/Dockerfiles/postfix/postfix.sh
index 28e51ccd..d3e9ed0c 100755
--- a/data/Dockerfiles/postfix/postfix.sh
+++ b/data/Dockerfiles/postfix/postfix.sh
@@ -14,7 +14,7 @@ newaliases;
cat < /opt/postfix/conf/sql/mysql_relay_recipient_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT DISTINCT
CASE WHEN '%d' IN (
@@ -29,10 +29,18 @@ query = SELECT DISTINCT
END AS result;
EOF
+cat < /opt/postfix/conf/sql/mysql_tls_policy_override_maps.cf
+user = ${DBUSER}
+password = ${DBPASS}
+hosts = unix:/var/run/mysqld/mysqld.sock
+dbname = ${DBNAME}
+query = SELECT CONCAT(policy, ' ', parameters) AS tls_policy FROM tls_policy_override WHERE active = '1' AND dest = '%s'
+EOF
+
cat < /opt/postfix/conf/sql/mysql_tls_enforce_in_policy.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT IF(EXISTS(
SELECT 'TLS_ACTIVE' FROM alias
@@ -49,7 +57,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_sender_dependent_default_transport_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT GROUP_CONCAT(transport SEPARATOR '') AS transport_maps
FROM (
@@ -77,26 +85,49 @@ query = SELECT GROUP_CONCAT(transport SEPARATOR '') AS transport_maps
AS transport_view;
EOF
-cat < /opt/postfix/conf/sql/mysql_sasl_passwd_maps.cf
+cat < /opt/postfix/conf/sql/mysql_transport_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
+dbname = ${DBNAME}
+query = SELECT CONCAT('smtp_via_transport_maps:', nexthop) AS transport FROM transports
+ WHERE active = '1'
+ AND destination = '%s';
+EOF
+
+cat < /opt/postfix/conf/sql/mysql_sasl_passwd_maps_sender_dependent.cf
+user = ${DBUSER}
+password = ${DBPASS}
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT CONCAT_WS(':', username, password) AS auth_data FROM relayhosts
WHERE id IN (
SELECT relayhost FROM domain
WHERE CONCAT('@', domain) = '%s'
- OR '%s' IN (
- SELECT CONCAT('@', alias_domain) FROM alias_domain
+ OR domain IN (
+ SELECT target_domain FROM alias_domain WHERE CONCAT('@', alias_domain) = '%s'
)
)
+ AND active = '1'
AND username != '';
EOF
+cat < /opt/postfix/conf/sql/mysql_sasl_passwd_maps_transport_maps.cf
+user = ${DBUSER}
+password = ${DBPASS}
+hosts = unix:/var/run/mysqld/mysqld.sock
+dbname = ${DBNAME}
+query = SELECT CONCAT_WS(':', username, password) AS auth_data FROM transports
+ WHERE nexthop = '%s'
+ AND active = '1'
+ AND username != ''
+ LIMIT 1;
+EOF
+
cat < /opt/postfix/conf/sql/mysql_virtual_alias_domain_catchall_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT goto FROM alias, alias_domain
WHERE alias_domain.alias_domain = '%d'
@@ -107,7 +138,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_virtual_alias_domain_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT username FROM mailbox, alias_domain
WHERE alias_domain.alias_domain = '%d'
@@ -119,7 +150,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_virtual_alias_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT goto FROM alias
WHERE address='%s'
@@ -129,7 +160,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_recipient_bcc_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT bcc_dest FROM bcc_maps
WHERE local_dest='%s'
@@ -140,7 +171,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_sender_bcc_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT bcc_dest FROM bcc_maps
WHERE local_dest='%s'
@@ -151,7 +182,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_recipient_canonical_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT new_dest FROM recipient_maps
WHERE old_dest='%s'
@@ -161,7 +192,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_virtual_domains_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT alias_domain from alias_domain WHERE alias_domain='%s' AND active='1'
UNION
@@ -174,15 +205,15 @@ EOF
cat < /opt/postfix/conf/sql/mysql_virtual_mailbox_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
-query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
+query = SELECT CONCAT(JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.mailbox_format')), mailbox_path_prefix, '%d/%u/') FROM mailbox WHERE username='%s' AND active = '1'
EOF
cat < /opt/postfix/conf/sql/mysql_virtual_relay_domain_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '1' AND active = '1'
EOF
@@ -190,7 +221,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_virtual_sender_acl.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
# First select queries domain and alias_domain to determine if domains are active.
query = SELECT goto FROM alias
@@ -231,7 +262,7 @@ EOF
cat < /opt/postfix/conf/sql/mysql_virtual_spamalias_maps.cf
user = ${DBUSER}
password = ${DBPASS}
-hosts = mysql
+hosts = unix:/var/run/mysqld/mysqld.sock
dbname = ${DBNAME}
query = SELECT goto FROM spamalias
WHERE address='%s'
@@ -244,6 +275,8 @@ chmod 700 /var/lib/zeyple/keys
chown -R 600:600 /var/lib/zeyple/keys
# Fix Postfix permissions
+chown -R root:postfix /opt/postfix/conf/sql/
+chmod 640 /opt/postfix/conf/sql/*.cf
chgrp -R postdrop /var/spool/postfix/public
chgrp -R postdrop /var/spool/postfix/maildrop
postfix set-permissions
diff --git a/data/Dockerfiles/postfix/rspamd-pipe-ham b/data/Dockerfiles/postfix/rspamd-pipe-ham
index 9d961be0..9b26817c 100755
--- a/data/Dockerfiles/postfix/rspamd-pipe-ham
+++ b/data/Dockerfiles/postfix/rspamd-pipe-ham
@@ -3,7 +3,7 @@ FILE=/tmp/mail$$
cat > $FILE
trap "/bin/rm -f $FILE" 0 1 2 3 13 15
-cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/learnham
-cat ${FILE} | /usr/bin/curl -H "Flag: 13" -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/fuzzyadd
+cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/learnham
+cat ${FILE} | /usr/bin/curl -H "Flag: 13" -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/fuzzyadd
exit 0
diff --git a/data/Dockerfiles/postfix/rspamd-pipe-spam b/data/Dockerfiles/postfix/rspamd-pipe-spam
index 3b9e3497..d06aa919 100755
--- a/data/Dockerfiles/postfix/rspamd-pipe-spam
+++ b/data/Dockerfiles/postfix/rspamd-pipe-spam
@@ -3,7 +3,7 @@ FILE=/tmp/mail$$
cat > $FILE
trap "/bin/rm -f $FILE" 0 1 2 3 13 15
-cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/learnspam
-cat ${FILE} | /usr/bin/curl -H "Flag: 11" -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/fuzzyadd
+cat ${FILE} | /usr/bin/curl -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/learnspam
+cat ${FILE} | /usr/bin/curl -H "Flag: 11" -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/fuzzyadd
exit 0
diff --git a/data/Dockerfiles/postfix/stop-supervisor.sh b/data/Dockerfiles/postfix/stop-supervisor.sh
new file mode 100755
index 00000000..5394490c
--- /dev/null
+++ b/data/Dockerfiles/postfix/stop-supervisor.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+printf "READY\n";
+
+while read line; do
+ echo "Processing Event: $line" >&2;
+ kill -3 $(cat "/var/run/supervisord.pid")
+done < /dev/stdin
diff --git a/data/Dockerfiles/postfix/supervisord.conf b/data/Dockerfiles/postfix/supervisord.conf
index b5ae6b54..27494bd6 100644
--- a/data/Dockerfiles/postfix/supervisord.conf
+++ b/data/Dockerfiles/postfix/supervisord.conf
@@ -13,3 +13,7 @@ autostart=true
[program:postfix]
command=/opt/postfix.sh
autorestart=true
+
+[eventlistener:processes]
+command=/usr/local/sbin/stop-supervisor.sh
+events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL
diff --git a/data/Dockerfiles/rspamd/Dockerfile b/data/Dockerfiles/rspamd/Dockerfile
index 67b8aa1c..87d92139 100644
--- a/data/Dockerfiles/rspamd/Dockerfile
+++ b/data/Dockerfiles/rspamd/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:xenial
+FROM ubuntu:bionic
LABEL maintainer "Andre Peters "
ARG DEBIAN_FRONTEND=noninteractive
@@ -8,21 +8,21 @@ RUN apt-get update && apt-get install -y \
tzdata \
ca-certificates \
gnupg2 \
- gnupg-curl \
apt-transport-https \
&& apt-key adv --fetch-keys https://rspamd.com/apt/gpg.key \
- && echo "deb https://rspamd.com/apt-stable/ xenial main" > /etc/apt/sources.list.d/rspamd.list \
+ && echo "deb https://rspamd.com/apt-stable/ bionic main" > /etc/apt/sources.list.d/rspamd.list \
&& apt-get update && apt-get install -y rspamd \
&& rm -rf /var/lib/apt/lists/* \
- && echo '.include $LOCAL_CONFDIR/local.d/rspamd.conf.local' > /etc/rspamd/rspamd.conf.local \
&& apt-get autoremove --purge \
&& apt-get clean \
&& mkdir -p /run/rspamd \
&& chown _rspamd:_rspamd /run/rspamd
-COPY settings.conf /etc/rspamd/modules.d/settings.conf
+COPY settings.conf /etc/rspamd/settings.conf
COPY docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
+STOPSIGNAL SIGTERM
+
CMD ["/usr/bin/rspamd", "-f", "-u", "_rspamd", "-g", "_rspamd"]
diff --git a/data/Dockerfiles/rspamd/docker-entrypoint.sh b/data/Dockerfiles/rspamd/docker-entrypoint.sh
index afb03bb6..6288550d 100755
--- a/data/Dockerfiles/rspamd/docker-entrypoint.sh
+++ b/data/Dockerfiles/rspamd/docker-entrypoint.sh
@@ -1,6 +1,9 @@
#!/bin/bash
-chown -R _rspamd:_rspamd /var/lib/rspamd
+chown -R _rspamd:_rspamd /var/lib/rspamd /etc/rspamd/local.d /etc/rspamd/override.d /etc/rspamd/custom
+chmod 755 /var/lib/rspamd
[[ ! -f /etc/rspamd/override.d/worker-controller-password.inc ]] && echo '# Placeholder' > /etc/rspamd/override.d/worker-controller-password.inc
+chown _rspamd:_rspamd /etc/rspamd/override.d/worker-controller-password.inc
+[[ ! -f /etc/rspamd/custom/sa-rules-heinlein ]] && echo '# to be auto-filled by dovecot-mailcow' > /etc/rspamd/custom/sa-rules-heinlein
exec "$@"
diff --git a/data/Dockerfiles/rspamd/lua_util.lua b/data/Dockerfiles/rspamd/lua_util.lua
deleted file mode 100644
index a9abd901..00000000
--- a/data/Dockerfiles/rspamd/lua_util.lua
+++ /dev/null
@@ -1,152 +0,0 @@
-local exports = {}
-local lpeg = require 'lpeg'
-
-local split_grammar = {}
-local function rspamd_str_split(s, sep)
- local gr = split_grammar[sep]
-
- if not gr then
- local _sep = lpeg.P(sep)
- local elem = lpeg.C((1 - _sep)^0)
- local p = lpeg.Ct(elem * (_sep * elem)^0)
- gr = p
- split_grammar[sep] = gr
- end
-
- return gr:match(s)
-end
-
-exports.rspamd_str_split = rspamd_str_split
-
-local space = lpeg.S' \t\n\v\f\r'
-local nospace = 1 - space
-local ptrim = space^0 * lpeg.C((space^0 * nospace^1)^0)
-local match = lpeg.match
-exports.rspamd_str_trim = function(s)
- return match(ptrim, s)
-end
-
--- Robert Jay Gould http://lua-users.org/wiki/SimpleRound
-exports.round = function(num, numDecimalPlaces)
- local mult = 10^(numDecimalPlaces or 0)
- return math.floor(num * mult) / mult
-end
-
-exports.template = function(tmpl, keys)
- local var_lit = lpeg.P { lpeg.R("az") + lpeg.R("AZ") + lpeg.R("09") + "_" }
- local var = lpeg.P { (lpeg.P("$") / "") * ((var_lit^1) / keys) }
- local var_braced = lpeg.P { (lpeg.P("${") / "") * ((var_lit^1) / keys) * (lpeg.P("}") / "") }
-
- local template_grammar = lpeg.Cs((var + var_braced + 1)^0)
-
- return lpeg.match(template_grammar, tmpl)
-end
-
-exports.remove_email_aliases = function(email_addr)
- local function check_gmail_user(addr)
- -- Remove all points
- local no_dots_user = string.gsub(addr.user, '%.', '')
- local cap, pluses = string.match(no_dots_user, '^([^%+][^%+]*)(%+.*)$')
- if cap then
- return cap, rspamd_str_split(pluses, '+'), nil
- elseif no_dots_user ~= addr.user then
- return no_dots_user,{},nil
- end
-
- return nil
- end
-
- local function check_address(addr)
- if addr.user then
- local cap, pluses = string.match(addr.user, '^([^%+][^%+]*)(%+.*)$')
- if cap then
- return cap, rspamd_str_split(pluses, '+'), nil
- end
- end
-
- return nil
- end
-
- local function set_addr(addr, new_user, new_domain)
- if new_user then
- addr.user = new_user
- end
- if new_domain then
- addr.domain = new_domain
- end
-
- if addr.domain then
- addr.addr = string.format('%s@%s', addr.user, addr.domain)
- else
- addr.addr = string.format('%s@', addr.user)
- end
-
- if addr.name and #addr.name > 0 then
- addr.raw = string.format('"%s" <%s>', addr.name, addr.addr)
- else
- addr.raw = string.format('<%s>', addr.addr)
- end
- end
-
- local function check_gmail(addr)
- local nu, tags, nd = check_gmail_user(addr)
-
- if nu then
- return nu, tags, nd
- end
-
- return nil
- end
-
- local function check_googlemail(addr)
- local nd = 'gmail.com'
- local nu, tags = check_gmail_user(addr)
-
- if nu then
- return nu, tags, nd
- end
-
- return nil, nil, nd
- end
-
- local specific_domains = {
- ['gmail.com'] = check_gmail,
- ['googlemail.com'] = check_googlemail,
- }
-
- if email_addr then
- if email_addr.domain and specific_domains[email_addr.domain] then
- local nu, tags, nd = specific_domains[email_addr.domain](email_addr)
- if nu or nd then
- set_addr(email_addr, nu, nd)
-
- return nu, tags
- end
- else
- local nu, tags, nd = check_address(email_addr)
- if nu or nd then
- set_addr(email_addr, nu, nd)
-
- return nu, tags
- end
- end
-
- return nil
- end
-end
-
-exports.is_rspamc_or_controller = function(task)
- local ua = task:get_request_header('User-Agent') or ''
- local pwd = task:get_request_header('Password')
- local is_rspamc = false
- if tostring(ua) == 'rspamc' or pwd then is_rspamc = true end
-
- return is_rspamc
-end
-
-local unpack_function = table.unpack or unpack
-exports.unpack = function(t)
- return unpack_function(t)
-end
-
-return exports
diff --git a/data/Dockerfiles/rspamd/metadata_exporter.lua b/data/Dockerfiles/rspamd/metadata_exporter.lua
new file mode 100644
index 00000000..8420bd55
--- /dev/null
+++ b/data/Dockerfiles/rspamd/metadata_exporter.lua
@@ -0,0 +1,722 @@
+--[[
+Copyright (c) 2016, Andrew Lewis
+Copyright (c) 2016, Vsevolod Stakhov
+
+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.
+]]--
+
+if confighelp then
+ return
+end
+
+-- A plugin that pushes metadata (or whole messages) to external services
+
+local redis_params
+local lua_util = require "lua_util"
+local rspamd_http = require "rspamd_http"
+local rspamd_tcp = require "rspamd_tcp"
+local rspamd_util = require "rspamd_util"
+local rspamd_logger = require "rspamd_logger"
+local ucl = require "ucl"
+local E = {}
+local N = 'metadata_exporter'
+
+local settings = {
+ pusher_enabled = {},
+ pusher_format = {},
+ pusher_select = {},
+ mime_type = 'text/plain',
+ defer = false,
+ mail_from = '',
+ mail_to = 'postmaster@localhost',
+ helo = 'rspamd',
+ email_template = [[From: "Rspamd" <$mail_from>
+To: $mail_to
+Subject: Spam alert
+Date: $date
+MIME-Version: 1.0
+Message-ID: <$our_message_id>
+Content-type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Authenticated username: $user
+IP: $ip
+Queue ID: $qid
+SMTP FROM: $from
+SMTP RCPT: $rcpt
+MIME From: $header_from
+MIME To: $header_to
+MIME Date: $header_date
+Subject: $header_subject
+Message-ID: $message_id
+Action: $action
+Score: $score
+Symbols: $symbols]],
+}
+
+local function get_general_metadata(task, flatten, no_content)
+ local r = {}
+ local ip = task:get_from_ip()
+ if ip and ip:is_valid() then
+ r.ip = tostring(ip)
+ else
+ r.ip = 'unknown'
+ end
+ r.user = task:get_user() or 'unknown'
+ r.qid = task:get_queue_id() or 'unknown'
+ r.subject = task:get_subject() or 'unknown'
+ r.action = task:get_metric_action('default')
+
+ local s = task:get_metric_score('default')[1]
+ r.score = flatten and string.format('%.2f', s) or s
+
+ local rcpt = task:get_recipients('smtp')
+ if rcpt then
+ local l = {}
+ for _, a in ipairs(rcpt) do
+ table.insert(l, a['addr'])
+ end
+ if not flatten then
+ r.rcpt = l
+ else
+ r.rcpt = table.concat(l, ', ')
+ end
+ else
+ r.rcpt = 'unknown'
+ end
+ local from = task:get_from('smtp')
+ if ((from or E)[1] or E).addr then
+ r.from = from[1].addr
+ else
+ r.from = 'unknown'
+ end
+ local syminf = task:get_symbols_all()
+ if flatten then
+ local l = {}
+ for _, sym in ipairs(syminf) do
+ local txt
+ if sym.options then
+ local topt = table.concat(sym.options, ', ')
+ txt = sym.name .. '(' .. string.format('%.2f', sym.score) .. ')' .. ' [' .. topt .. ']'
+ else
+ txt = sym.name .. '(' .. string.format('%.2f', sym.score) .. ')'
+ end
+ table.insert(l, txt)
+ end
+ r.symbols = table.concat(l, '\n\t')
+ else
+ r.symbols = syminf
+ end
+ local function process_header(name)
+ local hdr = task:get_header_full(name)
+ if hdr then
+ local l = {}
+ for _, h in ipairs(hdr) do
+ table.insert(l, h.decoded)
+ end
+ if not flatten then
+ return l
+ else
+ return table.concat(l, '\n')
+ end
+ else
+ return 'unknown'
+ end
+ end
+ if not no_content then
+ r.header_from = process_header('from')
+ r.header_to = process_header('to')
+ r.header_subject = process_header('subject')
+ r.header_date = process_header('date')
+ r.message_id = task:get_message_id()
+ end
+ return r
+end
+
+local formatters = {
+ default = function(task)
+ return task:get_content()
+ end,
+ email_alert = function(task, rule, extra)
+ local meta = get_general_metadata(task, true)
+ local display_emails = {}
+ meta.mail_from = rule.mail_from or settings.mail_from
+ local mail_targets = rule.mail_to or settings.mail_to
+ if type(mail_targets) ~= 'table' then
+ table.insert(display_emails, string.format('<%s>', mail_targets))
+ mail_targets = {[mail_targets] = true}
+ else
+ for _, e in ipairs(mail_targets) do
+ table.insert(display_emails, string.format('<%s>', e))
+ end
+ end
+ if rule.email_alert_sender then
+ local x = task:get_from('smtp')
+ if x and string.len(x[1].addr) > 0 then
+ mail_targets[x] = true
+ table.insert(display_emails, string.format('<%s>', x[1].addr))
+ end
+ end
+ if rule.email_alert_user then
+ local x = task:get_user()
+ if x then
+ mail_targets[x] = true
+ table.insert(display_emails, string.format('<%s>', x))
+ end
+ end
+ if rule.email_alert_recipients then
+ local x = task:get_recipients('smtp')
+ if x then
+ for _, e in ipairs(x) do
+ if string.len(e.addr) > 0 then
+ mail_targets[e.addr] = true
+ table.insert(display_emails, string.format('<%s>', e.addr))
+ end
+ end
+ end
+ end
+ meta.mail_to = table.concat(display_emails, ', ')
+ meta.our_message_id = rspamd_util.random_hex(12) .. '@rspamd'
+ meta.date = rspamd_util.time_to_string(rspamd_util.get_time())
+ return lua_util.template(rule.email_template or settings.email_template, meta), { mail_targets = mail_targets}
+ end,
+ json = function(task)
+ return ucl.to_format(get_general_metadata(task), 'json-compact')
+ end
+}
+
+local function is_spam(action)
+ return (action == 'reject' or action == 'add header' or action == 'rewrite subject')
+end
+
+local selectors = {
+ default = function(task)
+ return true
+ end,
+ is_spam = function(task)
+ local action = task:get_metric_action('default')
+ return is_spam(action)
+ end,
+ is_spam_authed = function(task)
+ if not task:get_user() then
+ return false
+ end
+ local action = task:get_metric_action('default')
+ return is_spam(action)
+ end,
+ is_reject = function(task)
+ local action = task:get_metric_action('default')
+ return (action == 'reject')
+ end,
+ is_reject_authed = function(task)
+ if not task:get_user() then
+ return false
+ end
+ local action = task:get_metric_action('default')
+ return (action == 'reject')
+ end,
+}
+
+local function maybe_defer(task, rule)
+ if rule.defer then
+ rspamd_logger.warnx(task, 'deferring message')
+ task:set_pre_result('soft reject', 'deferred', N)
+ end
+end
+
+local pushers = {
+ redis_pubsub = function(task, formatted, rule)
+ local _,ret,upstream
+ local function redis_pub_cb(err)
+ if err then
+ rspamd_logger.errx(task, 'got error %s when publishing on server %s',
+ err, upstream:get_addr())
+ return maybe_defer(task, rule)
+ end
+ return true
+ end
+ ret,_,upstream = rspamd_redis_make_request(task,
+ redis_params, -- connect params
+ nil, -- hash key
+ true, -- is write
+ redis_pub_cb, --callback
+ 'PUBLISH', -- command
+ {rule.channel, formatted} -- arguments
+ )
+ if not ret then
+ rspamd_logger.errx(task, 'error connecting to redis')
+ maybe_defer(task, rule)
+ end
+ end,
+ http = function(task, formatted, rule)
+ local function http_callback(err, code)
+ if err then
+ rspamd_logger.errx(task, 'got error %s in http callback', err)
+ return maybe_defer(task, rule)
+ end
+ if code ~= 200 then
+ rspamd_logger.errx(task, 'got unexpected http status: %s', code)
+ return maybe_defer(task, rule)
+ end
+ return true
+ end
+ local hdrs = {}
+ if rule.meta_headers then
+ local gm = get_general_metadata(task, false, true)
+ local pfx = rule.meta_header_prefix or 'X-Rspamd-'
+ for k, v in pairs(gm) do
+ if type(v) == 'table' then
+ hdrs[pfx .. k] = ucl.to_format(v, 'json-compact')
+ else
+ hdrs[pfx .. k] = v
+ end
+ end
+ end
+ rspamd_http.request({
+ task=task,
+ url=rule.url,
+ body=formatted,
+ callback=http_callback,
+ mime_type=rule.mime_type or settings.mime_type,
+ headers=hdrs,
+ })
+ end,
+ send_mail = function(task, formatted, rule, extra)
+ local function mail_cb(err, data, conn)
+ local function no_error(merr, mdata, wantcode)
+ wantcode = wantcode or '2'
+ if merr then
+ rspamd_logger.errx(task, 'got error in tcp callback: %s', merr)
+ if conn then
+ conn:close()
+ end
+ maybe_defer(task, rule)
+ return false
+ end
+ if mdata then
+ if type(mdata) ~= 'string' then
+ mdata = tostring(mdata)
+ end
+ if string.sub(mdata, 1, 1) ~= wantcode then
+ rspamd_logger.errx(task, 'got bad smtp response: %s', mdata)
+ if conn then
+ conn:close()
+ end
+ maybe_defer(task, rule)
+ return false
+ end
+ else
+ rspamd_logger.errx(task, 'no data')
+ if conn then
+ conn:close()
+ end
+ maybe_defer(task, rule)
+ return false
+ end
+ return true
+ end
+ local function all_done_cb(merr, mdata)
+ if conn then
+ conn:close()
+ end
+ return true
+ end
+ local function quit_done_cb(merr, mdata)
+ conn:add_read(all_done_cb, '\r\n')
+ end
+ local function quit_cb(merr, mdata)
+ if no_error(merr, mdata) then
+ conn:add_write(quit_done_cb, 'QUIT\r\n')
+ end
+ end
+ local function pre_quit_cb(merr, mdata)
+ if no_error(merr, '2') then
+ conn:add_read(quit_cb, '\r\n')
+ end
+ end
+ local function data_done_cb(merr, mdata)
+ if no_error(merr, mdata, '3') then
+ conn:add_write(pre_quit_cb, {formatted, '\r\n.\r\n'})
+ end
+ end
+ local function data_cb(merr, mdata)
+ if no_error(merr, '2') then
+ conn:add_read(data_done_cb, '\r\n')
+ end
+ end
+ local from_done_cb
+ local function rcpt_done_cb(merr, mdata)
+ if no_error(merr, mdata) then
+ local k = next(extra.mail_targets)
+ if not k then
+ conn:add_write(data_cb, 'DATA\r\n')
+ else
+ from_done_cb('2', '2')
+ end
+ end
+ end
+ local function rcpt_cb(merr, mdata)
+ if no_error(merr, '2') then
+ conn:add_read(rcpt_done_cb, '\r\n')
+ end
+ end
+ from_done_cb = function(merr, mdata)
+ local k
+ if extra then
+ k = next(extra.mail_targets)
+ else
+ extra = {mail_targets = {}}
+ if type(rule.mail_to) == 'string' then
+ extra = {mail_targets = {}}
+ k = rule.mail_to
+ elseif type(rule.mail_to) == 'table' then
+ for _, r in ipairs(rule.mail_to) do
+ extra.mail_targets[r] = true
+ end
+ k = next(extra.mail_targets)
+ end
+ end
+ extra.mail_targets[k] = nil
+ conn:add_write(rcpt_cb, {'RCPT TO: <', k, '>\r\n'})
+ end
+ local function from_cb(merr, mdata)
+ if no_error(merr, '2') then
+ conn:add_read(from_done_cb, '\r\n')
+ end
+ end
+ local function hello_done_cb(merr, mdata)
+ if no_error(merr, mdata) then
+ conn:add_write(from_cb, {'MAIL FROM: <', rule.mail_from or settings.mail_from, '>\r\n'})
+ end
+ end
+ local function hello_cb(merr)
+ if no_error(merr, '2') then
+ conn:add_read(hello_done_cb, '\r\n')
+ end
+ end
+ if no_error(err, data) then
+ conn:add_write(hello_cb, {'HELO ', rule.helo or settings.helo, '\r\n'})
+ end
+ end
+ rspamd_tcp.request({
+ task = task,
+ callback = mail_cb,
+ stop_pattern = '\r\n',
+ host = rule.smtp,
+ port = rule.smtp_port or settings.smtp_port or 25,
+ })
+ end,
+}
+
+local opts = rspamd_config:get_all_opt(N)
+if not opts then return end
+local process_settings = {
+ select = function(val)
+ selectors.custom = assert(load(val))()
+ end,
+ format = function(val)
+ formatters.custom = assert(load(val))()
+ end,
+ push = function(val)
+ pushers.custom = assert(load(val))()
+ end,
+ custom_push = function(val)
+ if type(val) == 'table' then
+ for k, v in pairs(val) do
+ pushers[k] = assert(load(v))()
+ end
+ end
+ end,
+ custom_select = function(val)
+ if type(val) == 'table' then
+ for k, v in pairs(val) do
+ selectors[k] = assert(load(v))()
+ end
+ end
+ end,
+ custom_format = function(val)
+ if type(val) == 'table' then
+ for k, v in pairs(val) do
+ formatters[k] = assert(load(v))()
+ end
+ end
+ end,
+ pusher_enabled = function(val)
+ if type(val) == 'string' then
+ if pushers[val] then
+ settings.pusher_enabled[val] = true
+ else
+ rspamd_logger.errx(rspamd_config, 'Pusher type: %s is invalid', val)
+ end
+ elseif type(val) == 'table' then
+ for _, v in ipairs(val) do
+ if pushers[v] then
+ settings.pusher_enabled[v] = true
+ else
+ rspamd_logger.errx(rspamd_config, 'Pusher type: %s is invalid', val)
+ end
+ end
+ end
+ end,
+}
+for k, v in pairs(opts) do
+ local f = process_settings[k]
+ if f then
+ f(opts[k])
+ else
+ settings[k] = v
+ end
+end
+if type(settings.rules) ~= 'table' then
+ -- Legacy config
+ settings.rules = {}
+ if not next(settings.pusher_enabled) then
+ if pushers.custom then
+ rspamd_logger.infox(rspamd_config, 'Custom pusher implicitly enabled')
+ settings.pusher_enabled.custom = true
+ else
+ -- Check legacy options
+ if settings.url then
+ rspamd_logger.warnx(rspamd_config, 'HTTP pusher implicitly enabled')
+ settings.pusher_enabled.http = true
+ end
+ if settings.channel then
+ rspamd_logger.warnx(rspamd_config, 'Redis Pubsub pusher implicitly enabled')
+ settings.pusher_enabled.redis_pubsub = true
+ end
+ if settings.smtp and settings.mail_to then
+ rspamd_logger.warnx(rspamd_config, 'SMTP pusher implicitly enabled')
+ settings.pusher_enabled.send_mail = true
+ end
+ end
+ end
+ if not next(settings.pusher_enabled) then
+ rspamd_logger.errx(rspamd_config, 'No push backend enabled')
+ return
+ end
+ if settings.formatter then
+ settings.format = formatters[settings.formatter]
+ if not settings.format then
+ rspamd_logger.errx(rspamd_config, 'No such formatter: %s', settings.formatter)
+ return
+ end
+ end
+ if settings.selector then
+ settings.select = selectors[settings.selector]
+ if not settings.select then
+ rspamd_logger.errx(rspamd_config, 'No such selector: %s', settings.selector)
+ return
+ end
+ end
+ for k in pairs(settings.pusher_enabled) do
+ local formatter = settings.pusher_format[k]
+ local selector = settings.pusher_select[k]
+ if not formatter then
+ settings.pusher_format[k] = settings.formatter or 'default'
+ rspamd_logger.infox(rspamd_config, 'Using default formatter for %s pusher', k)
+ else
+ if not formatters[formatter] then
+ rspamd_logger.errx(rspamd_config, 'No such formatter: %s - disabling %s', formatter, k)
+ settings.pusher_enabled.k = nil
+ end
+ end
+ if not selector then
+ settings.pusher_select[k] = settings.selector or 'default'
+ rspamd_logger.infox(rspamd_config, 'Using default selector for %s pusher', k)
+ else
+ if not selectors[selector] then
+ rspamd_logger.errx(rspamd_config, 'No such selector: %s - disabling %s', selector, k)
+ settings.pusher_enabled.k = nil
+ end
+ end
+ end
+ if settings.pusher_enabled.redis_pubsub then
+ redis_params = rspamd_parse_redis_server(N)
+ if not redis_params then
+ rspamd_logger.errx(rspamd_config, 'No redis servers are specified')
+ settings.pusher_enabled.redis_pubsub = nil
+ else
+ local r = {}
+ r.backend = 'redis_pubsub'
+ r.channel = settings.channel
+ r.defer = settings.defer
+ r.selector = settings.pusher_select.redis_pubsub
+ r.formatter = settings.pusher_format.redis_pubsub
+ settings.rules[r.backend:upper()] = r
+ end
+ end
+ if settings.pusher_enabled.http then
+ if not settings.url then
+ rspamd_logger.errx(rspamd_config, 'No URL is specified')
+ settings.pusher_enabled.http = nil
+ else
+ local r = {}
+ r.backend = 'http'
+ r.url = settings.url
+ r.mime_type = settings.mime_type
+ r.defer = settings.defer
+ r.selector = settings.pusher_select.http
+ r.formatter = settings.pusher_format.http
+ settings.rules[r.backend:upper()] = r
+ end
+ end
+ if settings.pusher_enabled.send_mail then
+ if not (settings.mail_to and settings.smtp) then
+ rspamd_logger.errx(rspamd_config, 'No mail_to and/or smtp setting is specified')
+ settings.pusher_enabled.send_mail = nil
+ else
+ local r = {}
+ r.backend = 'send_mail'
+ r.mail_to = settings.mail_to
+ r.mail_from = settings.mail_from
+ r.helo = settings.hello
+ r.smtp = settings.smtp
+ r.smtp_port = settings.smtp_port
+ r.email_template = settings.email_template
+ r.defer = settings.defer
+ r.selector = settings.pusher_select.send_mail
+ r.formatter = settings.pusher_format.send_mail
+ settings.rules[r.backend:upper()] = r
+ end
+ end
+ if not next(settings.pusher_enabled) then
+ rspamd_logger.errx(rspamd_config, 'No push backend enabled')
+ return
+ end
+elseif not next(settings.rules) then
+ lua_util.debugm(N, rspamd_config, 'No rules enabled')
+ return
+end
+if not settings.rules or not next(settings.rules) then
+ rspamd_logger.errx(rspamd_config, 'No rules enabled')
+ return
+end
+local backend_required_elements = {
+ http = {
+ 'url',
+ },
+ smtp = {
+ 'mail_to',
+ 'smtp',
+ },
+ redis_pubsub = {
+ 'channel',
+ },
+}
+local check_element = {
+ selector = function(k, v)
+ if not selectors[v] then
+ rspamd_logger.errx(rspamd_config, 'Rule %s has invalid selector %s', k, v)
+ return false
+ else
+ return true
+ end
+ end,
+ formatter = function(k, v)
+ if not formatters[v] then
+ rspamd_logger.errx(rspamd_config, 'Rule %s has invalid formatter %s', k, v)
+ return false
+ else
+ return true
+ end
+ end,
+}
+local backend_check = {
+ default = function(k, rule)
+ local reqset = backend_required_elements[rule.backend]
+ if reqset then
+ for _, e in ipairs(reqset) do
+ if not rule[e] then
+ rspamd_logger.errx(rspamd_config, 'Rule %s misses required setting %s', k, e)
+ settings.rules[k] = nil
+ end
+ end
+ end
+ for sett, v in pairs(rule) do
+ local f = check_element[sett]
+ if f then
+ if not f(sett, v) then
+ settings.rules[k] = nil
+ end
+ end
+ end
+ end,
+}
+backend_check.redis_pubsub = function(k, rule)
+ if not redis_params then
+ redis_params = rspamd_parse_redis_server(N)
+ end
+ if not redis_params then
+ rspamd_logger.errx(rspamd_config, 'No redis servers are specified')
+ settings.rules[k] = nil
+ else
+ backend_check.default(k, rule)
+ end
+end
+setmetatable(backend_check, {
+ __index = function()
+ return backend_check.default
+ end,
+})
+for k, v in pairs(settings.rules) do
+ if type(v) == 'table' then
+ local backend = v.backend
+ if not backend then
+ rspamd_logger.errx(rspamd_config, 'Rule %s has no backend', k)
+ settings.rules[k] = nil
+ elseif not pushers[backend] then
+ rspamd_logger.errx(rspamd_config, 'Rule %s has invalid backend %s', k, backend)
+ settings.rules[k] = nil
+ else
+ local f = backend_check[backend]
+ f(k, v)
+ end
+ else
+ rspamd_logger.errx(rspamd_config, 'Rule %s has bad type: %s', k, type(v))
+ settings.rules[k] = nil
+ end
+end
+
+local function gen_exporter(rule)
+ return function (task)
+ if task:has_flag('skip') then return end
+ local selector = rule.selector or 'default'
+ local selected = selectors[selector](task)
+ if selected then
+ lua_util.debugm(N, task, 'Message selected for processing')
+ local formatter = rule.formatter or 'default'
+ local formatted, extra = formatters[formatter](task, rule)
+ if formatted then
+ pushers[rule.backend](task, formatted, rule, extra)
+ else
+ lua_util.debugm(N, task, 'Formatter [%s] returned non-truthy value [%s]', formatter, formatted)
+ end
+ else
+ lua_util.debugm(N, task, 'Selector [%s] returned non-truthy value [%s]', selector, selected)
+ end
+ end
+end
+
+if not next(settings.rules) then
+ rspamd_logger.errx(rspamd_config, 'No rules enabled')
+ lua_util.disable_module(N, "config")
+end
+for k, r in pairs(settings.rules) do
+ rspamd_config:register_symbol({
+ name = 'EXPORT_METADATA_' .. k,
+ type = 'postfilter,idempotent',
+ callback = gen_exporter(r),
+ priority = 10,
+ flags = 'empty',
+ })
+end
diff --git a/data/Dockerfiles/rspamd/ratelimit.lua b/data/Dockerfiles/rspamd/ratelimit.lua
deleted file mode 100644
index 839ec5c6..00000000
--- a/data/Dockerfiles/rspamd/ratelimit.lua
+++ /dev/null
@@ -1,674 +0,0 @@
---[[
-Copyright (c) 2011-2017, Vsevolod Stakhov
-Copyright (c) 2016-2017, Andrew Lewis
-
-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.
-]]--
-
-if confighelp then
- return
-end
-
--- A plugin that implements ratelimits using redis
-
-local E = {}
-local N = 'ratelimit'
-local redis_params
--- Senders that are considered as bounce
-local settings = {
- bounce_senders = { 'postmaster', 'mailer-daemon', '', 'null', 'fetchmail-daemon', 'mdaemon' },
--- Do not check ratelimits for these recipients
- whitelisted_rcpts = { 'postmaster', 'mailer-daemon' },
- prefix = 'RL',
- ham_factor_rate = 1.01,
- spam_factor_rate = 0.99,
- ham_factor_burst = 1.02,
- spam_factor_burst = 0.98,
- max_rate_mult = 5,
- max_bucket_mult = 10,
- expire = 60 * 60 * 24 * 2, -- 2 days by default
- limits = {},
- allow_local = false,
-}
-
--- Checks bucket, updating it if needed
--- KEYS[1] - prefix to update, e.g. RL__
--- KEYS[2] - current time in milliseconds
--- KEYS[3] - bucket leak rate (messages per millisecond)
--- KEYS[4] - bucket burst
--- KEYS[5] - expire for a bucket
--- return 1 if message should be ratelimited and 0 if not
--- Redis keys used:
--- l - last hit
--- b - current burst
--- dr - current dynamic rate multiplier (*10000)
--- db - current dynamic burst multiplier (*10000)
-local bucket_check_script = [[
- local last = redis.call('HGET', KEYS[1], 'l')
- local now = tonumber(KEYS[2])
- local dynr, dynb = 0, 0
- if not last then
- -- New bucket
- redis.call('HSET', KEYS[1], 'l', KEYS[2])
- redis.call('HSET', KEYS[1], 'b', '0')
- redis.call('HSET', KEYS[1], 'dr', '10000')
- redis.call('HSET', KEYS[1], 'db', '10000')
- redis.call('EXPIRE', KEYS[1], KEYS[5])
- return {0, 0, 1, 1}
- end
-
- last = tonumber(last)
- local burst = tonumber(redis.call('HGET', KEYS[1], 'b'))
- -- Perform leak
- if burst > 0 then
- if last < tonumber(KEYS[2]) then
- local rate = tonumber(KEYS[3])
- dynr = tonumber(redis.call('HGET', KEYS[1], 'dr')) / 10000.0
- rate = rate * dynr
- local leaked = ((now - last) * rate)
- burst = burst - leaked
- redis.call('HINCRBYFLOAT', KEYS[1], 'b', -(leaked))
- end
- else
- burst = 0
- redis.call('HSET', KEYS[1], 'b', '0')
- end
-
- dynb = tonumber(redis.call('HGET', KEYS[1], 'db')) / 10000.0
-
- if (burst + 1) * dynb > tonumber(KEYS[4]) then
- return {1, tostring(burst), tostring(dynr), tostring(dynb)}
- end
-
- return {0, tostring(burst), tostring(dynr), tostring(dynb)}
-]]
-local bucket_check_id
-
-
--- Updates a bucket
--- KEYS[1] - prefix to update, e.g. RL__
--- KEYS[2] - current time in milliseconds
--- KEYS[3] - dynamic rate multiplier
--- KEYS[4] - dynamic burst multiplier
--- KEYS[5] - max dyn rate (min: 1/x)
--- KEYS[6] - max burst rate (min: 1/x)
--- KEYS[7] - expire for a bucket
--- Redis keys used:
--- l - last hit
--- b - current burst
--- dr - current dynamic rate multiplier
--- db - current dynamic burst multiplier
-local bucket_update_script = [[
- local last = redis.call('HGET', KEYS[1], 'l')
- local now = tonumber(KEYS[2])
- if not last then
- -- New bucket
- redis.call('HSET', KEYS[1], 'l', KEYS[2])
- redis.call('HSET', KEYS[1], 'b', '1')
- redis.call('HSET', KEYS[1], 'dr', '10000')
- redis.call('HSET', KEYS[1], 'db', '10000')
- redis.call('EXPIRE', KEYS[1], KEYS[7])
- return {1, 1, 1}
- end
-
- local burst = tonumber(redis.call('HGET', KEYS[1], 'b'))
- local db = tonumber(redis.call('HGET', KEYS[1], 'db')) / 10000
- local dr = tonumber(redis.call('HGET', KEYS[1], 'dr')) / 10000
-
- if dr < tonumber(KEYS[5]) and dr > 1.0 / tonumber(KEYS[5]) then
- dr = dr * tonumber(KEYS[3])
- redis.call('HSET', KEYS[1], 'dr', tostring(math.floor(dr * 10000)))
- end
-
- if db < tonumber(KEYS[6]) and db > 1.0 / tonumber(KEYS[6]) then
- db = db * tonumber(KEYS[4])
- redis.call('HSET', KEYS[1], 'db', tostring(math.floor(db * 10000)))
- end
-
- redis.call('HINCRBYFLOAT', KEYS[1], 'b', 1)
- redis.call('HSET', KEYS[1], 'l', KEYS[2])
- redis.call('EXPIRE', KEYS[1], KEYS[7])
-
- return {tostring(burst), tostring(dr), tostring(db)}
-]]
-local bucket_update_id
-
--- message_func(task, limit_type, prefix, bucket)
-local message_func = function(_, limit_type, _, _)
- return string.format('Ratelimit "%s" exceeded', limit_type)
-end
-
-local rspamd_logger = require "rspamd_logger"
-local rspamd_util = require "rspamd_util"
-local rspamd_lua_utils = require "lua_util"
-local lua_redis = require "lua_redis"
-local fun = require "fun"
-local lua_maps = require "lua_maps"
-local lua_util = require "lua_util"
-local rspamd_hash = require "rspamd_cryptobox_hash"
-
-
-local function load_scripts(cfg, ev_base)
- bucket_check_id = lua_redis.add_redis_script(bucket_check_script, redis_params)
- bucket_update_id = lua_redis.add_redis_script(bucket_update_script, redis_params)
-end
-
-local limit_parser
-local function parse_string_limit(lim, no_error)
- local function parse_time_suffix(s)
- if s == 's' then
- return 1
- elseif s == 'm' then
- return 60
- elseif s == 'h' then
- return 3600
- elseif s == 'd' then
- return 86400
- end
- end
- local function parse_num_suffix(s)
- if s == '' then
- return 1
- elseif s == 'k' then
- return 1000
- elseif s == 'm' then
- return 1000000
- elseif s == 'g' then
- return 1000000000
- end
- end
- local lpeg = require "lpeg"
-
- if not limit_parser then
- local digit = lpeg.R("09")
- limit_parser = {}
- limit_parser.integer =
- (lpeg.S("+-") ^ -1) *
- (digit ^ 1)
- limit_parser.fractional =
- (lpeg.P(".") ) *
- (digit ^ 1)
- limit_parser.number =
- (limit_parser.integer *
- (limit_parser.fractional ^ -1)) +
- (lpeg.S("+-") * limit_parser.fractional)
- limit_parser.time = lpeg.Cf(lpeg.Cc(1) *
- (limit_parser.number / tonumber) *
- ((lpeg.S("smhd") / parse_time_suffix) ^ -1),
- function (acc, val) return acc * val end)
- limit_parser.suffixed_number = lpeg.Cf(lpeg.Cc(1) *
- (limit_parser.number / tonumber) *
- ((lpeg.S("kmg") / parse_num_suffix) ^ -1),
- function (acc, val) return acc * val end)
- limit_parser.limit = lpeg.Ct(limit_parser.suffixed_number *
- (lpeg.S(" ") ^ 0) * lpeg.S("/") * (lpeg.S(" ") ^ 0) *
- limit_parser.time)
- end
- local t = lpeg.match(limit_parser.limit, lim)
-
- if t and t[1] and t[2] and t[2] ~= 0 then
- return t[2], t[1]
- end
-
- if not no_error then
- rspamd_logger.errx(rspamd_config, 'bad limit: %s', lim)
- end
-
- return nil
-end
-
-local function parse_limit(name, data)
- local buckets = {}
- if type(data) == 'table' then
- -- 3 cases here:
- -- * old limit in format [burst, rate]
- -- * vector of strings in Andrew's string format
- -- * proper bucket table
- if #data == 2 and tonumber(data[1]) and tonumber(data[2]) then
- -- Old style ratelimit
- rspamd_logger.warnx(rspamd_config, 'old style ratelimit for %s', name)
- if tonumber(data[1]) > 0 and tonumber(data[2]) > 0 then
- table.insert(buckets, {
- burst = data[1],
- rate = data[2]
- })
- elseif data[1] ~= 0 then
- rspamd_logger.warnx(rspamd_config, 'invalid numbers for %s', name)
- else
- rspamd_logger.infox(rspamd_config, 'disable limit %s, burst is zero', name)
- end
- else
- -- Recursively map parse_limit and flatten the list
- fun.each(function(l)
- -- Flatten list
- for _,b in ipairs(l) do table.insert(buckets, b) end
- end, fun.map(function(d) return parse_limit(d, name) end, data))
- end
- elseif type(data) == 'string' then
- local rep_rate, burst = parse_string_limit(data)
-
- if rep_rate and burst then
- table.insert(buckets, {
- burst = burst,
- rate = 1.0 / rep_rate -- reciprocal
- })
- end
- end
-
- -- Filter valid
- return fun.totable(fun.filter(function(val)
- return type(val.burst) == 'number' and type(val.rate) == 'number'
- end, buckets))
-end
-
---- Check whether this addr is bounce
-local function check_bounce(from)
- return fun.any(function(b) return b == from end, settings.bounce_senders)
-end
-
-local keywords = {
- ['ip'] = {
- ['get_value'] = function(task)
- local ip = task:get_ip()
- if ip and ip:is_valid() then return tostring(ip) end
- return nil
- end,
- },
- ['rip'] = {
- ['get_value'] = function(task)
- local ip = task:get_ip()
- if ip and ip:is_valid() and not ip:is_local() then return tostring(ip) end
- return nil
- end,
- },
- ['from'] = {
- ['get_value'] = function(task)
- local from = task:get_from(0)
- if ((from or E)[1] or E).addr then
- return string.lower(from[1]['addr'])
- end
- return nil
- end,
- },
- ['bounce'] = {
- ['get_value'] = function(task)
- local from = task:get_from(0)
- if not ((from or E)[1] or E).user then
- return '_'
- end
- if check_bounce(from[1]['user']) then return '_' else return nil end
- end,
- },
- ['asn'] = {
- ['get_value'] = function(task)
- local asn = task:get_mempool():get_variable('asn')
- if not asn then
- return nil
- else
- return asn
- end
- end,
- },
- ['user'] = {
- ['get_value'] = function(task)
- local auser = task:get_user()
- if not auser then
- return nil
- else
- return auser
- end
- end,
- },
- ['to'] = {
- ['get_value'] = function(task)
- return task:get_principal_recipient()
- end,
- },
-}
-
-local function gen_rate_key(task, rtype, bucket)
- local key_t = {tostring(lua_util.round(100000.0 / bucket.burst))}
- local key_keywords = lua_util.str_split(rtype, '_')
- local have_user = false
-
- for _, v in ipairs(key_keywords) do
- local ret
-
- if keywords[v] and type(keywords[v]['get_value']) == 'function' then
- ret = keywords[v]['get_value'](task)
- end
- if not ret then return nil end
- if v == 'user' then have_user = true end
- if type(ret) ~= 'string' then ret = tostring(ret) end
- table.insert(key_t, ret)
- end
-
- if have_user and not task:get_user() then
- return nil
- end
-
- return table.concat(key_t, ":")
-end
-
-local function make_prefix(redis_key, name, bucket)
- local hash_len = 24
- if hash_len > #redis_key then hash_len = #redis_key end
- local hash = settings.prefix ..
- string.sub(rspamd_hash.create(redis_key):base32(), 1, hash_len)
- -- Fill defaults
- if not bucket.spam_factor_rate then
- bucket.spam_factor_rate = settings.spam_factor_rate
- end
- if not bucket.ham_factor_rate then
- bucket.ham_factor_rate = settings.ham_factor_rate
- end
- if not bucket.spam_factor_burst then
- bucket.spam_factor_burst = settings.spam_factor_burst
- end
- if not bucket.ham_factor_burst then
- bucket.ham_factor_burst = settings.ham_factor_burst
- end
-
- return {
- bucket = bucket,
- name = name,
- hash = hash
- }
-end
-
-local function limit_to_prefixes(task, k, v, prefixes)
- local n = 0
- for _,bucket in ipairs(v) do
- local prefix = gen_rate_key(task, k, bucket)
-
- if prefix then
- prefixes[prefix] = make_prefix(prefix, k, bucket)
- n = n + 1
- end
- end
-
- return n
-end
-
-local function ratelimit_cb(task)
- if not settings.allow_local and
- rspamd_lua_utils.is_rspamc_or_controller(task) then return end
-
- -- Get initial task data
- local ip = task:get_from_ip()
- if ip and ip:is_valid() and settings.whitelisted_ip then
- if settings.whitelisted_ip:get_key(ip) then
- -- Do not check whitelisted ip
- rspamd_logger.infox(task, 'skip ratelimit for whitelisted IP')
- return
- end
- end
- -- Parse all rcpts
- local rcpts = task:get_recipients()
- local rcpts_user = {}
- if rcpts then
- fun.each(function(r)
- fun.each(function(type) table.insert(rcpts_user, r[type]) end, {'user', 'addr'})
- end, rcpts)
-
- if fun.any(function(r) return settings.whitelisted_rcpts:get_key(r) end, rcpts_user) then
- rspamd_logger.infox(task, 'skip ratelimit for whitelisted recipient')
- return
- end
- end
- -- Get user (authuser)
- if settings.whitelisted_user then
- local auser = task:get_user()
- if settings.whitelisted_user:get_key(auser) then
- rspamd_logger.infox(task, 'skip ratelimit for whitelisted user')
- return
- end
- end
- -- Now create all ratelimit prefixes
- local prefixes = {}
- local nprefixes = 0
-
- for k,v in pairs(settings.limits) do
- nprefixes = nprefixes + limit_to_prefixes(task, k, v, prefixes)
- end
-
- for k, hdl in pairs(settings.custom_keywords or E) do
- local ret, redis_key, bd = pcall(hdl, task)
-
- if ret then
- local bucket = parse_limit(k, bd)
- if bucket[1] then
- prefixes[redis_key] = make_prefix(redis_key, k, bucket[1])
- end
- nprefixes = nprefixes + 1
- else
- rspamd_logger.errx(task, 'cannot call handler for %s: %s',
- k, redis_key)
- end
- end
-
- local function gen_check_cb(prefix, bucket, lim_name)
- return function(err, data)
- if err then
- rspamd_logger.errx('cannot check limit %s: %s %s', prefix, err, data)
- elseif type(data) == 'table' and data[1] and data[1] == 1 then
- -- set symbol only and do NOT soft reject
- if settings.symbol then
- task:insert_result(settings.symbol, 0.0, lim_name .. "(" .. prefix .. ")")
- rspamd_logger.infox(task,
- 'set_symbol_only: ratelimit "%s(%s)" exceeded, (%s / %s): %s (%s:%s dyn)',
- lim_name, prefix,
- bucket.burst, bucket.rate,
- data[2], data[3], data[4])
- return
- -- set INFO symbol and soft reject
- elseif settings.info_symbol then
- task:insert_result(settings.info_symbol, 1.0,
- lim_name .. "(" .. prefix .. ")")
- end
- rspamd_logger.infox(task,
- 'ratelimit "%s(%s)" exceeded, (%s / %s): %s (%s:%s dyn)',
- lim_name, prefix,
- bucket.burst, bucket.rate,
- data[2], data[3], data[4])
- task:set_pre_result('soft reject',
- message_func(task, lim_name, prefix, bucket))
- end
- end
- end
-
- -- Don't do anything if pre-result has been already set
- if task:has_pre_result() then return end
-
- if nprefixes > 0 then
- -- Save prefixes to the cache to allow update
- task:cache_set('ratelimit_prefixes', prefixes)
- local now = rspamd_util.get_time()
- now = lua_util.round(now * 1000.0) -- Get milliseconds
- -- Now call check script for all defined prefixes
-
- for pr,value in pairs(prefixes) do
- local bucket = value.bucket
- local rate = (bucket.rate) / 1000.0 -- Leak rate in messages/ms
- rspamd_logger.debugm(N, task, "check limit %s:%s -> %s (%s/%s)",
- value.name, pr, value.hash, bucket.burst, bucket.rate)
- lua_redis.exec_redis_script(bucket_check_id,
- {key = value.hash, task = task, is_write = true},
- gen_check_cb(pr, bucket, value.name),
- {value.hash, tostring(now), tostring(rate), tostring(bucket.burst),
- tostring(settings.expire)})
- end
- end
-end
-
-local function ratelimit_update_cb(task)
- local prefixes = task:cache_get('ratelimit_prefixes')
-
- if prefixes then
- if task:has_pre_result() then
- -- Already rate limited/greylisted, do nothing
- rspamd_logger.debugm(N, task, 'pre-action has been set, do not update')
- return
- end
-
- local is_spam = not (task:get_metric_action() == 'no action')
-
- -- Update each bucket
- for k, v in pairs(prefixes) do
- local bucket = v.bucket
- local function update_bucket_cb(err, data)
- if err then
- rspamd_logger.errx(task, 'cannot update rate bucket %s: %s',
- k, err)
- else
- rspamd_logger.debugm(N, task,
- "updated limit %s:%s -> %s (%s/%s), burst: %s, dyn_rate: %s, dyn_burst: %s",
- v.name, k, v.hash,
- bucket.burst, bucket.rate,
- data[1], data[2], data[3])
- end
- end
- local now = rspamd_util.get_time()
- now = lua_util.round(now * 1000.0) -- Get milliseconds
- local mult_burst = bucket.ham_factor_burst or 1.0
- local mult_rate = bucket.ham_factor_burst or 1.0
-
- if is_spam then
- mult_burst = bucket.spam_factor_burst or 1.0
- mult_rate = bucket.spam_factor_rate or 1.0
- end
-
- lua_redis.exec_redis_script(bucket_update_id,
- {key = v.hash, task = task, is_write = true},
- update_bucket_cb,
- {v.hash, tostring(now), tostring(mult_rate), tostring(mult_burst),
- tostring(settings.max_rate_mult), tostring(settings.max_bucket_mult),
- tostring(settings.expire)})
- end
- end
-end
-
-local opts = rspamd_config:get_all_opt(N)
-if opts then
-
- settings = lua_util.override_defaults(settings, opts)
-
- if opts['limit'] then
- rspamd_logger.errx(rspamd_config, 'Legacy ratelimit config format no longer supported')
- end
-
- if opts['rates'] and type(opts['rates']) == 'table' then
- -- new way of setting limits
- fun.each(function(t, lim)
- local buckets = parse_limit(t, lim)
-
- if buckets and #buckets > 0 then
- settings.limits[t] = buckets
- end
- end, opts['rates'])
- end
-
- local enabled_limits = fun.totable(fun.map(function(t)
- return t
- end, settings.limits))
- rspamd_logger.infox(rspamd_config,
- 'enabled rate buckets: [%1]', table.concat(enabled_limits, ','))
-
- -- Ret, ret, ret: stupid legacy stuff:
- -- If we have a string with commas then load it as as static map
- -- otherwise, apply normal logic of Rspamd maps
-
- local wrcpts = opts['whitelisted_rcpts']
- if type(wrcpts) == 'string' then
- if string.find(wrcpts, ',') then
- settings.whitelisted_rcpts = lua_maps.rspamd_map_add_from_ucl(
- lua_util.rspamd_str_split(wrcpts, ','), 'set', 'Ratelimit whitelisted rcpts')
- else
- settings.whitelisted_rcpts = lua_maps.rspamd_map_add_from_ucl(wrcpts, 'set',
- 'Ratelimit whitelisted rcpts')
- end
- elseif type(opts['whitelisted_rcpts']) == 'table' then
- settings.whitelisted_rcpts = lua_maps.rspamd_map_add_from_ucl(wrcpts, 'set',
- 'Ratelimit whitelisted rcpts')
- else
- -- Stupid default...
- settings.whitelisted_rcpts = lua_maps.rspamd_map_add_from_ucl(
- settings.whitelisted_rcpts, 'set', 'Ratelimit whitelisted rcpts')
- end
-
- if opts['whitelisted_ip'] then
- settings.whitelisted_ip = lua_maps.rspamd_map_add('ratelimit', 'whitelisted_ip', 'radix',
- 'Ratelimit whitelist ip map')
- end
-
- if opts['whitelisted_user'] then
- settings.whitelisted_user = lua_maps.rspamd_map_add('ratelimit', 'whitelisted_user', 'set',
- 'Ratelimit whitelist user map')
- end
-
- settings.custom_keywords = {}
- if opts['custom_keywords'] then
- local ret, res_or_err = pcall(loadfile(opts['custom_keywords']))
-
- if ret then
- opts['custom_keywords'] = {}
- if type(res_or_err) == 'table' then
- for k,hdl in pairs(res_or_err) do
- settings['custom_keywords'][k] = hdl
- end
- elseif type(res_or_err) == 'function' then
- settings['custom_keywords']['custom'] = res_or_err
- end
- else
- rspamd_logger.errx(rspamd_config, 'cannot execute %s: %s',
- opts['custom_keywords'], res_or_err)
- settings['custom_keywords'] = {}
- end
- end
-
- if opts['message_func'] then
- message_func = assert(load(opts['message_func']))()
- end
-
- redis_params = lua_redis.parse_redis_server('ratelimit')
-
- if not redis_params then
- rspamd_logger.infox(rspamd_config, 'no servers are specified, disabling module')
- lua_util.disable_module(N, "redis")
- else
- local s = {
- type = 'prefilter,nostat',
- name = 'RATELIMIT_CHECK',
- priority = 7,
- callback = ratelimit_cb,
- flags = 'empty',
- }
-
- if settings.symbol then
- s.name = settings.symbol
- elseif settings.info_symbol then
- s.name = settings.info_symbol
- end
-
- rspamd_config:register_symbol(s)
- rspamd_config:register_symbol {
- type = 'idempotent',
- name = 'RATELIMIT_UPDATE',
- callback = ratelimit_update_cb,
- }
- end
-end
-
-rspamd_config:add_on_load(function(cfg, ev_base, worker)
- load_scripts(cfg, ev_base)
-end)
diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile
index 30a06d24..970ec252 100644
--- a/data/Dockerfiles/sogo/Dockerfile
+++ b/data/Dockerfiles/sogo/Dockerfile
@@ -7,46 +7,50 @@ ENV GOSU_VERSION 1.9
# Prerequisites
RUN apt-get update && apt-get install -y --no-install-recommends \
- apt-transport-https \
- ca-certificates \
- cron \
- gnupg \
- mysql-client \
- supervisor \
- syslog-ng \
- syslog-ng-core \
- syslog-ng-mod-redis \
- dirmngr \
- netcat \
- psmisc \
- wget \
- patch \
- && rm -rf /var/lib/apt/lists/* \
- && dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
- && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
- && chmod +x /usr/local/bin/gosu \
- && gosu nobody true
+ apt-transport-https \
+ ca-certificates \
+ cron \
+ gettext \
+ gnupg \
+ mysql-client \
+ rsync \
+ supervisor \
+ syslog-ng \
+ syslog-ng-core \
+ syslog-ng-mod-redis \
+ dirmngr \
+ netcat \
+ psmisc \
+ wget \
+ patch \
+ && rm -rf /var/lib/apt/lists/* \
+ && dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
+ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
+ && chmod +x /usr/local/bin/gosu \
+ && gosu nobody true
RUN mkdir /usr/share/doc/sogo \
- && touch /usr/share/doc/sogo/empty.sh \
- && apt-key adv --keyserver keyserver.ubuntu.com --recv-key 0x810273C4 \
- && echo "deb http://packages.inverse.ca/SOGo/nightly/4/debian/ stretch stretch" > /etc/apt/sources.list.d/sogo.list \
- && apt-get update && apt-get install -y --force-yes \
- sogo \
- sogo-activesync \
- && rm -rf /var/lib/apt/lists/* \
- && echo '* * * * * sogo /usr/sbin/sogo-ealarms-notify 2>/dev/null' > /etc/cron.d/sogo \
- && echo '* * * * * sogo /usr/sbin/sogo-tool expire-sessions 60' >> /etc/cron.d/sogo \
- && echo '0 0 * * * sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds' >> /etc/cron.d/sogo \
- && touch /etc/default/locale
+ && touch /usr/share/doc/sogo/empty.sh \
+ && apt-key adv --keyserver keyserver.ubuntu.com --recv-key 0x810273C4 \
+ && echo "deb http://packages.inverse.ca/SOGo/nightly/4/debian/ stretch stretch" > /etc/apt/sources.list.d/sogo.list \
+ && apt-get update && apt-get install -y --force-yes \
+ sogo \
+ sogo-activesync \
+ && rm -rf /var/lib/apt/lists/* \
+ && echo '* * * * * sogo /usr/sbin/sogo-ealarms-notify -p /etc/sogo/sieve.creds 2>/dev/null' > /etc/cron.d/sogo \
+ && echo '* * * * * sogo /usr/sbin/sogo-tool expire-sessions 60' >> /etc/cron.d/sogo \
+ && echo '0 0 * * * sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds' >> /etc/cron.d/sogo \
+ && touch /etc/default/locale
-COPY ./bootstrap-sogo.sh /
+COPY ./bootstrap-sogo.sh /bootstrap-sogo.sh
COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
COPY supervisord.conf /etc/supervisor/supervisord.conf
-COPY theme-blue.js /usr/lib/GNUstep/SOGo/WebServerResources/js/theme-blue.js
-COPY theme-blue.css /usr/lib/GNUstep/SOGo/WebServerResources/css/theme-default.css
-COPY sogo-full.svg /usr/lib/GNUstep/SOGo/WebServerResources/img/sogo-full.svg
COPY acl.diff /acl.diff
+COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh
+
+RUN chmod +x /bootstrap-sogo.sh \
+ /usr/local/sbin/stop-supervisor.sh
+
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
RUN rm -rf /tmp/* /var/tmp/*
diff --git a/data/Dockerfiles/sogo/bootstrap-sogo.sh b/data/Dockerfiles/sogo/bootstrap-sogo.sh
index 46d8ec6c..7f1835db 100755
--- a/data/Dockerfiles/sogo/bootstrap-sogo.sh
+++ b/data/Dockerfiles/sogo/bootstrap-sogo.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Wait for MySQL to warm-up
-while ! mysqladmin ping --host mysql -u${DBUSER} -p${DBPASS} --silent; do
+while ! mysqladmin status --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do
echo "Waiting for database to come up..."
sleep 2
done
@@ -13,20 +13,31 @@ do
sleep 3
done
+# Wait for updated schema
+DBV_NOW=$(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT version FROM versions;" -BN)
+DBV_NEW=$(grep -oE '\$db_version = .*;' init_db.inc.php | sed 's/$db_version = //g;s/;//g' | cut -d \" -f2)
+while [[ ${DBV_NOW} != ${DBV_NEW} ]]; do
+ echo "Waiting for schema update..."
+ DBV_NOW=$(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT version FROM versions;" -BN)
+ DBV_NEW=$(grep -oE '\$db_version = .*;' init_db.inc.php | sed 's/$db_version = //g;s/;//g' | cut -d \" -f2)
+ sleep 5
+done
+echo "DB schema is ${DBV_NOW}"
+
# Recreate view
-mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view"
+mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view"
while [[ ${VIEW_OK} != 'OK' ]]; do
- mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
-CREATE VIEW sogo_view (c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, home, kind, multiple_bookings) AS
-SELECT mailbox.username, mailbox.domain, mailbox.username, if(json_extract(attributes, '$.force_pw_update') LIKE '%0%', password, 'invalid'), mailbox.name, mailbox.username, IFNULL(GROUP_CONCAT(ga.aliases SEPARATOR ' '), ''), IFNULL(gda.ad_alias, ''), CONCAT('/var/vmail/', maildir), mailbox.kind, mailbox.multiple_bookings FROM mailbox
+ mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
+CREATE VIEW sogo_view (c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, kind, multiple_bookings) AS
+SELECT mailbox.username, mailbox.domain, mailbox.username, if(json_extract(attributes, '$.force_pw_update') LIKE '%0%', if(json_extract(attributes, '$.sogo_access') LIKE '%1%', password, 'invalid'), 'invalid'), mailbox.name, mailbox.username, IFNULL(GROUP_CONCAT(ga.aliases SEPARATOR ' '), ''), IFNULL(gda.ad_alias, ''), mailbox.kind, mailbox.multiple_bookings FROM mailbox
LEFT OUTER JOIN grouped_mail_aliases ga ON ga.username REGEXP CONCAT('(^|,)', mailbox.username, '($|,)')
LEFT OUTER JOIN grouped_domain_alias_address gda ON gda.username = mailbox.username
WHERE mailbox.active = '1'
GROUP BY mailbox.username;
EOF
- if [[ ! -z $(mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sogo_view'") ]]; then
+ if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sogo_view'") ]]; then
VIEW_OK=OK
else
echo "Will retry to setup SOGo view in 3s"
@@ -37,11 +48,11 @@ done
# Wait for static view table if missing after update and update content
while [[ ${STATIC_VIEW_OK} != 'OK' ]]; do
- if [[ ! -z $(mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '_sogo_static_view'") ]]; then
+ if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '_sogo_static_view'") ]]; then
STATIC_VIEW_OK=OK
echo "Updating _sogo_static_view content..."
- mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "REPLACE INTO _sogo_static_view SELECT * from sogo_view"
- mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "DELETE FROM _sogo_static_view WHERE c_uid NOT IN (SELECT username FROM mailbox WHERE active = '1')"
+ mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "REPLACE INTO _sogo_static_view (c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, kind, multiple_bookings) SELECT c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, kind, multiple_bookings from sogo_view;"
+ mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "DELETE FROM _sogo_static_view WHERE c_uid NOT IN (SELECT username FROM mailbox WHERE active = '1')"
else
echo "Waiting for database initialization..."
sleep 3
@@ -50,10 +61,10 @@ done
# Recreate password update trigger
-mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP TRIGGER IF EXISTS sogo_update_password"
+mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP TRIGGER IF EXISTS sogo_update_password"
while [[ ${TRIGGER_OK} != 'OK' ]]; do
- mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
+ mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
DELIMITER -
CREATE TRIGGER sogo_update_password AFTER UPDATE ON _sogo_static_view
FOR EACH ROW
@@ -63,7 +74,7 @@ END;
-
DELIMITER ;
EOF
- if [[ ! -z $(mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'sogo_update_password'") ]]; then
+ if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'sogo_update_password'") ]]; then
TRIGGER_OK=OK
else
echo "Will retry to setup SOGo password update trigger in 3s"
@@ -72,28 +83,41 @@ EOF
done
-mkdir -p /var/lib/sogo/GNUstep/Defaults/
+if [[ "${ALLOW_ADMIN_EMAIL_LOGIN}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+ TRUST_PROXY="YES"
+else
+ TRUST_PROXY="NO"
+fi
+# cat /dev/urandom seems to hang here occasionally and is not recommended anyway, better use openssl
+RAND_PASS=$(openssl rand -base64 16 | tr -dc _A-Z-a-z-0-9)
# Generate plist header with timezone data
+mkdir -p /var/lib/sogo/GNUstep/Defaults/
cat < /var/lib/sogo/GNUstep/Defaults/sogod.plist
OCSAclURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_acl
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_acl
+ SOGoIMAPServer
+ imap://${IPV4_NETWORK}.250:143/?tls=YES
+ SOGoTrustProxyAuthentication
+ ${TRUST_PROXY}
+ SOGoEncryptionKey
+ ${RAND_PASS}OCSCacheFolderURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_cache_folder
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_cache_folderOCSEMailAlarmsFolderURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_alarms_folder
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_alarms_folderOCSFolderInfoURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_folder_info
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_folder_infoOCSSessionsFolderURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_sessions_folder
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_sessions_folderOCSStoreURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_store
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_storeSOGoProfileURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_user_profile
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_user_profileSOGoTimeZone${TZ}domains
@@ -101,9 +125,9 @@ cat < /var/lib/sogo/GNUstep/Defaults/sogod.plist
EOF
# Generate multi-domain setup
-while read line
- do
- echo " ${line}
+while read -r line gal
+ do
+ echo " ${line}SOGoMailDomain${line}
@@ -126,11 +150,11 @@ while read line
canAuthenticateYESdisplayName
- GAL
+ GAL ${line}id${line}isAddressBook
- YES
+ ${gal}typesqluserPasswordAlgorithm
@@ -138,11 +162,14 @@ while read line
prependPasswordSchemeYESviewURL
- mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/_sogo_static_view
-
-
+ mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/_sogo_static_view
+ " >> /var/lib/sogo/GNUstep/Defaults/sogod.plist
+ # Generate alternative LDAP authentication dict, when SQL authentication fails
+ # This will nevertheless read attributes from LDAP
+ line=${line} envsubst < /etc/sogo/plist_ldap >> /var/lib/sogo/GNUstep/Defaults/sogod.plist
+ echo "
" >> /var/lib/sogo/GNUstep/Defaults/sogod.plist
-done < <(mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain;" -B -N)
+done < <(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain, CASE gal WHEN '1' THEN 'YES' ELSE 'NO' END AS gal FROM domain;" -B -N)
# Generate footer
echo '
@@ -153,46 +180,24 @@ echo '
chown sogo:sogo -R /var/lib/sogo/
chmod 600 /var/lib/sogo/GNUstep/Defaults/sogod.plist
-# Prevent theme switching
-sed -i \
- -e 's/eaf5e9/E3F2FD/g' \
- -e 's/cbe5c8/BBDEFB/g' \
- -e 's/aad6a5/90CAF9/g' \
- -e 's/88c781/64B5F6/g' \
- -e 's/66b86a/42A5F5/g' \
- -e 's/56b04c/2196F3/g' \
- -e 's/4da143/1E88E5/g' \
- -e 's/388e3c/1976D2/g' \
- -e 's/367d2e/1565C0/g' \
- -e 's/225e1b/0D47A1/g' \
- -e 's/fafafa/82B1FF/g' \
- -e 's/69f0ae/448AFF/g' \
- -e 's/00e676/2979ff/g' \
- -e 's/00c853/2962ff/g' \
- /usr/lib/GNUstep/SOGo/WebServerResources/js/Common/Common.app.js \
- /usr/lib/GNUstep/SOGo/WebServerResources/js/Common.js
-
-sed -i \
- -e 's/default: "900"/default: "700"/g' \
- -e 's/default: "500"/default: "700"/g' \
- -e 's/"hue-1": "400"/"hue-1": "500"/g' \
- -e 's/"hue-1": "A100"/"hue-1": "500"/g' \
- -e 's/"hue-2": "800"/"hue-2": "700"/g' \
- -e 's/"hue-2": "300"/"hue-2": "700"/g' \
- -e 's/"hue-3": "A700"/"hue-3": "A200"/' \
- -e 's/default:"900"/default:"700"/g' \
- -e 's/default:"500"/default:"700"/g' \
- -e 's/"hue-1":"400"/"hue-1":"500"/g' \
- -e 's/"hue-1":"A100"/"hue-1":"500"/g' \
- -e 's/"hue-2":"800"/"hue-2":"700"/g' \
- -e 's/"hue-2":"300"/"hue-2":"700"/g' \
- -e 's/"hue-3":"A700"/"hue-3":"A200"/' \
- /usr/lib/GNUstep/SOGo/WebServerResources/js/Common/Common.app.js \
- /usr/lib/GNUstep/SOGo/WebServerResources/js/Common.js
-
-# Patch ACLs (comment this out to enable any or authenticated targets for ACL)
-if patch -sfN --dry-run /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff > /dev/null; then
- patch /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff;
+# Patch ACLs
+if [[ ${ACL_ANYONE} == 'allow' ]]; then
+ #enable any or authenticated targets for ACL
+ if patch -R -sfN --dry-run /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff > /dev/null; then
+ patch -R /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff;
+ fi
+else
+ #disable any or authenticated targets for ACL
+ if patch -sfN --dry-run /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff > /dev/null; then
+ patch /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff;
+ fi
fi
+# Copy logo, if any
+[[ -f /etc/sogo/sogo-full.svg ]] && cp /etc/sogo/sogo-full.svg /usr/lib/GNUstep/SOGo/WebServerResources/img/sogo-full.svg
+
+# Rsync web content
+echo "Syncing web content with named volume"
+rsync -a /usr/lib/GNUstep/SOGo/. /sogo_web/
+
exec gosu sogo /usr/sbin/sogod
diff --git a/data/Dockerfiles/sogo/sogo-full.svg b/data/Dockerfiles/sogo/sogo-full.svg
deleted file mode 100644
index 281ee7c6..00000000
--- a/data/Dockerfiles/sogo/sogo-full.svg
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/data/Dockerfiles/sogo/stop-supervisor.sh b/data/Dockerfiles/sogo/stop-supervisor.sh
new file mode 100755
index 00000000..5394490c
--- /dev/null
+++ b/data/Dockerfiles/sogo/stop-supervisor.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+printf "READY\n";
+
+while read line; do
+ echo "Processing Event: $line" >&2;
+ kill -3 $(cat "/var/run/supervisord.pid")
+done < /dev/stdin
diff --git a/data/Dockerfiles/sogo/supervisord.conf b/data/Dockerfiles/sogo/supervisord.conf
index 2a889560..551a8e12 100644
--- a/data/Dockerfiles/sogo/supervisord.conf
+++ b/data/Dockerfiles/sogo/supervisord.conf
@@ -16,13 +16,6 @@ command=/usr/sbin/cron -f
autorestart=true
priority=2
-[program:sogo-webres]
-command=/usr/bin/python -u -m SimpleHTTPServer 9192
-directory=/usr/lib/GNUstep/SOGo/
-user=sogo
-autorestart=true
-priority=4
-
[program:bootstrap-sogo]
command=/bootstrap-sogo.sh
stdout_logfile=/dev/stdout
@@ -33,3 +26,7 @@ priority=3
startretries=10
autorestart=true
stopwaitsecs=120
+
+[eventlistener:processes]
+command=/usr/local/sbin/stop-supervisor.sh
+events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL
diff --git a/data/Dockerfiles/sogo/theme-blue.css b/data/Dockerfiles/sogo/theme-blue.css
deleted file mode 100644
index 1282d405..00000000
--- a/data/Dockerfiles/sogo/theme-blue.css
+++ /dev/null
@@ -1,16 +0,0 @@
-md-autocomplete.md-default-theme input, md-autocomplete input{color:rgba(0,0,0,0.87)}.md-autocomplete-suggestions-container.md-default-theme li, .md-autocomplete-suggestions-container li{color:rgba(0,0,0,0.87)}md-bottom-sheet.md-default-theme.md-list md-list-item, md-bottom-sheet.md-list md-list-item{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-primary, .md-button.md-primary{color:rgb(25,118,210)}.md-button.md-default-theme.md-primary.md-fab, .md-button.md-primary.md-fab,.md-button.md-default-theme.md-primary.md-raised, .md-button.md-primary.md-raised{color:rgba(255,255,255,0.87);background-color:rgb(25,118,210)}.md-button.md-default-theme.md-primary.md-fab:not([disabled]) md-icon, .md-button.md-primary.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-primary.md-raised:not([disabled]) md-icon, .md-button.md-primary.md-raised:not([disabled]) md-icon{color:rgba(255,255,255,0.87)}.md-button.md-default-theme.md-primary.md-fab:not([disabled]).md-focused, .md-button.md-primary.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-primary.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-primary.md-raised:not([disabled]).md-focused, .md-button.md-primary.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-primary.md-raised:not([disabled]):hover{background-color:rgb(30,136,229)}.md-button.md-default-theme.md-primary:not([disabled]) md-icon, .md-button.md-primary:not([disabled]) md-icon{color:rgb(25,118,210)}._md a.md-default-theme:not(.md-button).md-primary, ._md a:not(.md-button).md-primary{color:rgb(25,118,210)}._md a.md-default-theme:not(.md-button).md-primary:hover, ._md a:not(.md-button).md-primary:hover{color:rgb(25,118,210)}md-card.md-default-theme .md-card-image, md-card .md-card-image{border-radius:2px 2px 0 0}md-card.md-default-theme md-card-header md-card-header-text .md-subhead, md-card md-card-header md-card-header-text .md-subhead,md-card.md-default-theme md-card-title md-card-title-text:not(:only-child) .md-subhead, md-card md-card-title md-card-title-text:not(:only-child) .md-subhead{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme .md-ink-ripple, md-checkbox .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme:not(.md-checked) .md-icon, md-checkbox:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme:not([disabled]).md-primary .md-ripple, md-checkbox:not([disabled]).md-primary .md-ripple{color:rgb(30,136,229)}md-checkbox.md-default-theme:not([disabled]).md-primary.md-checked .md-ripple, md-checkbox:not([disabled]).md-primary.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme:not([disabled]).md-primary .md-ink-ripple, md-checkbox:not([disabled]).md-primary .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme:not([disabled]).md-primary.md-checked .md-ink-ripple, md-checkbox:not([disabled]).md-primary.md-checked .md-ink-ripple{color:rgba(25,118,210,0.87)}md-checkbox.md-default-theme:not([disabled]).md-primary:not(.md-checked) .md-icon, md-checkbox:not([disabled]).md-primary:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme:not([disabled]).md-primary.md-checked .md-icon, md-checkbox:not([disabled]).md-primary.md-checked .md-icon{background-color:rgba(25,118,210,0.87)}md-checkbox.md-default-theme:not([disabled]).md-primary.md-checked.md-focused .md-container:before, md-checkbox:not([disabled]).md-primary.md-checked.md-focused .md-container:before{background-color:rgba(25,118,210,0.26)}md-checkbox.md-default-theme:not([disabled]).md-primary.md-checked .md-icon:after, md-checkbox:not([disabled]).md-primary.md-checked .md-icon:after{border-color:rgba(255,255,255,0.87)}md-checkbox.md-default-theme:not([disabled]).md-primary .md-indeterminate[disabled] .md-container, md-checkbox:not([disabled]).md-primary .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme[disabled]:not(.md-checked) .md-icon, md-checkbox[disabled]:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme[disabled] .md-icon:after, md-checkbox[disabled] .md-icon:after{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme[disabled] .md-label, md-checkbox[disabled] .md-label{color:rgba(0,0,0,0.38)}md-chips.md-default-theme .md-chips, md-chips .md-chips{box-shadow:0 1px rgba(0,0,0,0.12)}md-chips.md-default-theme .md-chips.md-focused, md-chips .md-chips.md-focused{box-shadow:0 2px rgb(25,118,210)}md-chips.md-default-theme .md-chips .md-chip-input-container input, md-chips .md-chips .md-chip-input-container input{color:rgba(0,0,0,0.87)}md-chips.md-default-theme .md-chips .md-chip-input-container input:-moz-placeholder, md-chips .md-chips .md-chip-input-container input:-moz-placeholder,md-chips.md-default-theme .md-chips .md-chip-input-container input::-moz-placeholder, md-chips .md-chips .md-chip-input-container input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme .md-chips .md-chip-input-container input:-ms-input-placeholder, md-chips .md-chips .md-chip-input-container input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme .md-chips .md-chip-input-container input::-webkit-input-placeholder, md-chips .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme md-chip.md-focused, md-chips md-chip.md-focused{background:rgb(25,118,210);color:rgba(255,255,255,0.87)}md-chips.md-default-theme md-chip.md-focused md-icon, md-chips md-chip.md-focused md-icon{color:rgba(255,255,255,0.87)}.md-default-theme .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator, .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator{border:1px solid rgb(33,150,243)}.md-default-theme .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled, .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled{color:rgba(33,150,243,0.6)}.md-default-theme .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator,.md-default-theme .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator{background:rgb(33,150,243);color:rgba(0,0,0,0.87);border-color:transparent}.md-default-theme .md-calendar-date-disabled, .md-calendar-date-disabled,.md-default-theme .md-calendar-month-label-disabled, .md-calendar-month-label-disabled{color:rgba(0,0,0,0.38)}.md-default-theme .md-calendar-month-label md-icon, .md-calendar-month-label md-icon,.md-default-theme .md-datepicker-input, .md-datepicker-input{color:rgba(0,0,0,0.87)}.md-default-theme .md-datepicker-input:-moz-placeholder, .md-datepicker-input:-moz-placeholder,.md-default-theme .md-datepicker-input::-moz-placeholder, .md-datepicker-input::-moz-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme .md-datepicker-input:-ms-input-placeholder, .md-datepicker-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme .md-datepicker-input::-webkit-input-placeholder, .md-datepicker-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme .md-datepicker-input-container, .md-datepicker-input-container{border-bottom-color:rgba(0,0,0,0.12)}.md-default-theme .md-datepicker-input-container.md-datepicker-focused, .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(25,118,210)}.md-default-theme .md-datepicker-triangle-button .md-datepicker-expand-triangle, .md-datepicker-triangle-button .md-datepicker-expand-triangle{border-top-color:rgba(0,0,0,0.54)}.md-default-theme .md-datepicker-open .md-datepicker-calendar-icon, .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(25,118,210)}md-dialog.md-default-theme.md-content-overflow .md-actions, md-dialog.md-content-overflow .md-actions,md-dialog.md-default-theme.md-content-overflow md-dialog-actions, md-dialog.md-content-overflow md-dialog-actions,md-divider.md-default-theme, md-divider{border-top-color:rgba(0,0,0,0.12)}.layout-gt-lg-row>md-divider.md-default-theme, .layout-gt-lg-row>md-divider,.layout-gt-md-row>md-divider.md-default-theme, .layout-gt-md-row>md-divider,.layout-gt-sm-row>md-divider.md-default-theme, .layout-gt-sm-row>md-divider,.layout-gt-xs-row>md-divider.md-default-theme, .layout-gt-xs-row>md-divider,.layout-lg-row>md-divider.md-default-theme, .layout-lg-row>md-divider,.layout-md-row>md-divider.md-default-theme, .layout-md-row>md-divider,.layout-row>md-divider.md-default-theme, .layout-row>md-divider,.layout-sm-row>md-divider.md-default-theme, .layout-sm-row>md-divider,.layout-xl-row>md-divider.md-default-theme, .layout-xl-row>md-divider,.layout-xs-row>md-divider.md-default-theme, .layout-xs-row>md-divider{border-right-color:rgba(0,0,0,0.12)}md-icon.md-default-theme, md-icon{color:rgba(0,0,0,0.54)}md-icon.md-default-theme.md-primary, md-icon.md-primary{color:rgb(25,118,210)}md-input-container.md-default-theme .md-input, md-input-container .md-input{color:rgba(0,0,0,0.87);border-color:rgba(0,0,0,0.12)}md-input-container.md-default-theme .md-input:-moz-placeholder, md-input-container .md-input:-moz-placeholder,md-input-container.md-default-theme .md-input::-moz-placeholder, md-input-container .md-input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme .md-input:-ms-input-placeholder, md-input-container .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme .md-input::-webkit-input-placeholder, md-input-container .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme>md-icon, md-input-container>md-icon{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme .md-placeholder, md-input-container .md-placeholder,md-input-container.md-default-theme label, md-input-container label{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme:not(.md-input-focused):not(.md-input-invalid) label.md-required:after, md-input-container:not(.md-input-focused):not(.md-input-invalid) label.md-required:after{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme .md-input-message-animation .md-char-counter, md-input-container .md-input-message-animation .md-char-counter,md-input-container.md-default-theme .md-input-messages-animation .md-char-counter, md-input-container .md-input-messages-animation .md-char-counter{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme.md-input-focused .md-input:-moz-placeholder, md-input-container.md-input-focused .md-input:-moz-placeholder,md-input-container.md-default-theme.md-input-focused .md-input::-moz-placeholder, md-input-container.md-input-focused .md-input::-moz-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-input-focused .md-input:-ms-input-placeholder, md-input-container.md-input-focused .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-input-focused .md-input::-webkit-input-placeholder, md-input-container.md-input-focused .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme:not(.md-input-invalid).md-input-has-value label, md-input-container:not(.md-input-invalid).md-input-has-value label{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused .md-input, md-input-container:not(.md-input-invalid).md-input-focused .md-input,md-input-container.md-default-theme:not(.md-input-invalid).md-input-resized .md-input, md-input-container:not(.md-input-invalid).md-input-resized .md-input{border-color:rgb(25,118,210)}md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused label, md-input-container:not(.md-input-invalid).md-input-focused label,md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused md-icon, md-input-container:not(.md-input-invalid).md-input-focused md-icon{color:rgb(25,118,210)}md-list.md-default-theme md-list-item.md-2-line .md-list-item-text h3, md-list md-list-item.md-2-line .md-list-item-text h3,md-list.md-default-theme md-list-item.md-2-line .md-list-item-text h4, md-list md-list-item.md-2-line .md-list-item-text h4,md-list.md-default-theme md-list-item.md-3-line .md-list-item-text h3, md-list md-list-item.md-3-line .md-list-item-text h3,md-list.md-default-theme md-list-item.md-3-line .md-list-item-text h4, md-list md-list-item.md-3-line .md-list-item-text h4{color:rgba(0,0,0,0.87)}md-list.md-default-theme md-list-item.md-2-line .md-list-item-text p, md-list md-list-item.md-2-line .md-list-item-text p,md-list.md-default-theme md-list-item.md-3-line .md-list-item-text p, md-list md-list-item.md-3-line .md-list-item-text p{color:rgba(0,0,0,0.54)}md-list.md-default-theme md-list-item>md-icon, md-list md-list-item>md-icon{color:rgba(0,0,0,0.54)}md-list.md-default-theme md-list-item>md-icon.md-highlight, md-list md-list-item>md-icon.md-highlight{color:rgb(25,118,210)}md-menu-content.md-default-theme md-menu-item, md-menu-content md-menu-item{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme md-menu-item md-icon, md-menu-content md-menu-item md-icon{color:rgba(0,0,0,0.54)}md-menu-content.md-default-theme md-menu-item .md-button[disabled], md-menu-content md-menu-item .md-button[disabled],md-menu-content.md-default-theme md-menu-item .md-button[disabled] md-icon, md-menu-content md-menu-item .md-button[disabled] md-icon{color:rgba(0,0,0,0.38)}md-menu-bar.md-default-theme>button.md-button, md-menu-bar>button.md-button{color:rgba(0,0,0,0.87);border-radius:2px}md-menu-bar.md-default-theme md-menu>button, md-menu-bar md-menu>button{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme .md-menu>.md-button:after, md-menu-content .md-menu>.md-button:after{color:rgba(0,0,0,0.54)}md-toolbar.md-default-theme.md-menu-toolbar md-toolbar-filler, md-toolbar.md-menu-toolbar md-toolbar-filler{background-color:rgb(25,118,210);color:rgba(255,255,255,0.87)}md-toolbar.md-default-theme.md-menu-toolbar md-toolbar-filler md-icon, md-toolbar.md-menu-toolbar md-toolbar-filler md-icon{color:rgba(255,255,255,0.87)}md-nav-bar.md-default-theme .md-button._md-nav-button.md-unselected, md-nav-bar .md-button._md-nav-button.md-unselected{color:rgba(0,0,0,0.54)}md-nav-bar.md-default-theme .md-button._md-nav-button[disabled], md-nav-bar .md-button._md-nav-button[disabled]{color:rgba(0,0,0,0.38)}md-nav-bar.md-default-theme.md-primary>.md-nav-bar, md-nav-bar.md-primary>.md-nav-bar{background-color:rgb(25,118,210)}md-nav-bar.md-default-theme.md-primary>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-primary>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-nav-bar.md-default-theme.md-primary>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-primary>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(255,255,255,0.87)}md-nav-bar.md-default-theme.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-toolbar>md-nav-bar.md-default-theme>.md-nav-bar, md-toolbar>md-nav-bar>.md-nav-bar{background-color:rgb(25,118,210)}md-toolbar>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button, md-toolbar>md-nav-bar>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-toolbar>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(255,255,255,0.87)}md-toolbar>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-progress-circular.md-default-theme path, md-progress-circular path{stroke:rgb(25,118,210)}md-progress-linear.md-default-theme .md-container, md-progress-linear .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme .md-bar, md-progress-linear .md-bar{background-color:rgb(25,118,210)}md-progress-linear.md-default-theme[md-mode=buffer].md-primary .md-bar1, md-progress-linear[md-mode=buffer].md-primary .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme[md-mode=buffer].md-primary .md-dashed:before, md-progress-linear[md-mode=buffer].md-primary .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme .md-off, md-radio-button .md-off{border-color:rgba(0,0,0,0.54)}md-radio-button.md-default-theme:not([disabled]).md-primary .md-on, md-radio-button:not([disabled]).md-primary .md-on,md-radio-button.md-default-theme:not([disabled]) .md-primary .md-on, md-radio-button:not([disabled]) .md-primary .md-on,md-radio-group.md-default-theme:not([disabled]).md-primary .md-on, md-radio-group:not([disabled]).md-primary .md-on,md-radio-group.md-default-theme:not([disabled]) .md-primary .md-on, md-radio-group:not([disabled]) .md-primary .md-on{background-color:rgba(25,118,210,0.87)}md-radio-button.md-default-theme:not([disabled]).md-primary.md-checked .md-off, md-radio-button:not([disabled]).md-primary.md-checked .md-off,md-radio-button.md-default-theme:not([disabled]) .md-primary.md-checked .md-off, md-radio-button:not([disabled]) .md-primary.md-checked .md-off,md-radio-button.md-default-theme:not([disabled]).md-primary .md-checked .md-off, md-radio-button:not([disabled]).md-primary .md-checked .md-off,md-radio-button.md-default-theme:not([disabled]) .md-primary .md-checked .md-off, md-radio-button:not([disabled]) .md-primary .md-checked .md-off,md-radio-group.md-default-theme:not([disabled]).md-primary.md-checked .md-off, md-radio-group:not([disabled]).md-primary.md-checked .md-off,md-radio-group.md-default-theme:not([disabled]) .md-primary.md-checked .md-off, md-radio-group:not([disabled]) .md-primary.md-checked .md-off,md-radio-group.md-default-theme:not([disabled]).md-primary .md-checked .md-off, md-radio-group:not([disabled]).md-primary .md-checked .md-off,md-radio-group.md-default-theme:not([disabled]) .md-primary .md-checked .md-off, md-radio-group:not([disabled]) .md-primary .md-checked .md-off{border-color:rgba(25,118,210,0.87)}md-radio-button.md-default-theme:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-button:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-button:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-button:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-button.md-default-theme:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-button:not([disabled]) .md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-group:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-group:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-group:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-group:not([disabled]) .md-primary .md-checked .md-ink-ripple{color:rgba(25,118,210,0.87)}md-radio-button.md-default-theme:not([disabled]).md-primary .md-container .md-ripple, md-radio-button:not([disabled]).md-primary .md-container .md-ripple,md-radio-button.md-default-theme:not([disabled]) .md-primary .md-container .md-ripple, md-radio-button:not([disabled]) .md-primary .md-container .md-ripple,md-radio-group.md-default-theme:not([disabled]).md-primary .md-container .md-ripple, md-radio-group:not([disabled]).md-primary .md-container .md-ripple,md-radio-group.md-default-theme:not([disabled]) .md-primary .md-container .md-ripple, md-radio-group:not([disabled]) .md-primary .md-container .md-ripple{color:rgb(30,136,229)}md-radio-button.md-default-theme[disabled], md-radio-button[disabled],md-radio-group.md-default-theme[disabled], md-radio-group[disabled]{color:rgba(0,0,0,0.38)}md-radio-button.md-default-theme[disabled] .md-container .md-off, md-radio-button[disabled] .md-container .md-off,md-radio-button.md-default-theme[disabled] .md-container .md-on, md-radio-button[disabled] .md-container .md-on,md-radio-group.md-default-theme[disabled] .md-container .md-off, md-radio-group[disabled] .md-container .md-off,md-radio-group.md-default-theme[disabled] .md-container .md-on, md-radio-group[disabled] .md-container .md-on{border-color:rgba(0,0,0,0.38)}md-radio-group.md-default-theme .md-checked:not([disabled]).md-primary .md-ink-ripple, md-radio-group .md-checked:not([disabled]).md-primary .md-ink-ripple,md-radio-group.md-default-theme.md-primary .md-checked:not([disabled]) .md-ink-ripple, md-radio-group.md-primary .md-checked:not([disabled]) .md-ink-ripple{color:rgba(25,118,210,0.26)}md-radio-group.md-default-theme.md-focused:not(:empty) .md-checked.md-primary .md-container:before, md-radio-group.md-focused:not(:empty) .md-checked.md-primary .md-container:before,md-radio-group.md-default-theme.md-focused:not(:empty).md-primary .md-checked .md-container:before, md-radio-group.md-focused:not(:empty).md-primary .md-checked .md-container:before{background-color:rgba(25,118,210,0.26)}md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-default-theme .md-select-value span:first-child:after, md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select .md-select-value span:first-child:after{color:rgba(0,0,0,0.38)}md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme .md-select-value, md-input-container.md-input-focused:not(.md-input-has-value) md-select .md-select-value,md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme .md-select-value.md-select-placeholder, md-input-container.md-input-focused:not(.md-input-has-value) md-select .md-select-value.md-select-placeholder{color:rgb(25,118,210)}md-input-container.md-input-invalid md-select.md-default-theme.md-no-underline .md-select-value, md-input-container.md-input-invalid md-select.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme .md-select-value, md-select .md-select-value{border-bottom-color:rgba(0,0,0,0.12)}md-select.md-default-theme .md-select-value.md-select-placeholder, md-select .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme.md-no-underline .md-select-value, md-select.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.ng-invalid.ng-touched.md-no-underline .md-select-value, md-select.ng-invalid.ng-touched.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme:not([disabled]):focus .md-select-value, md-select:not([disabled]):focus .md-select-value{border-bottom-color:rgb(25,118,210);color:rgba(0,0,0,0.87)}md-select.md-default-theme:not([disabled]):focus .md-select-value.md-select-placeholder, md-select:not([disabled]):focus .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.87)}md-select.md-default-theme:not([disabled]):focus.md-no-underline .md-select-value, md-select:not([disabled]):focus.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme[disabled] .md-select-icon, md-select[disabled] .md-select-icon,md-select.md-default-theme[disabled] .md-select-value, md-select[disabled] .md-select-value,md-select.md-default-theme[disabled] .md-select-value.md-select-placeholder, md-select[disabled] .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme .md-select-icon, md-select .md-select-icon{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme md-content md-optgroup, md-select-menu md-content md-optgroup{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme md-content md-option, md-select-menu md-content md-option{color:rgba(0,0,0,0.87)}md-select-menu.md-default-theme md-content md-option[disabled] .md-text, md-select-menu md-content md-option[disabled] .md-text{color:rgba(0,0,0,0.38)}md-select-menu.md-default-theme md-content md-option[selected], md-select-menu md-content md-option[selected]{color:rgb(33,150,243)}md-select-menu.md-default-theme md-content md-option[selected]:focus, md-select-menu md-content md-option[selected]:focus{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme .md-ripple, .md-checkbox-enabled .md-ripple{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme .md-ink-ripple, .md-checkbox-enabled .md-ink-ripple{color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme[selected] .md-ink-ripple, .md-checkbox-enabled[selected] .md-ink-ripple{color:rgba(25,118,210,0.87)}.md-checkbox-enabled.md-default-theme:not(.md-checked) .md-icon, .md-checkbox-enabled:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme[selected] .md-icon, .md-checkbox-enabled[selected] .md-icon{background-color:rgba(25,118,210,0.87)}.md-checkbox-enabled.md-default-theme[selected].md-focused .md-container:before, .md-checkbox-enabled[selected].md-focused .md-container:before{background-color:rgba(25,118,210,0.26)}.md-checkbox-enabled.md-default-theme[selected] .md-icon:after, .md-checkbox-enabled[selected] .md-icon:after{border-color:rgba(255,255,255,0.87)}.md-checkbox-enabled.md-default-theme .md-indeterminate[disabled] .md-container, .md-checkbox-enabled .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}.md-checkbox-enabled.md-default-theme md-option .md-text, .md-checkbox-enabled md-option .md-text{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-primary .md-focus-ring, md-slider.md-primary .md-focus-ring{background-color:rgba(144,202,249,0.38)}md-slider.md-default-theme.md-primary .md-track.md-track-fill, md-slider.md-primary .md-track.md-track-fill{background-color:rgb(25,118,210)}md-slider.md-default-theme.md-primary .md-thumb:after, md-slider.md-primary .md-thumb:after{border-color:rgb(25,118,210);background-color:rgb(25,118,210)}md-slider.md-default-theme.md-primary .md-sign, md-slider.md-primary .md-sign{background-color:rgb(25,118,210)}md-slider.md-default-theme.md-primary .md-sign:after, md-slider.md-primary .md-sign:after{border-top-color:rgb(25,118,210)}md-slider.md-default-theme.md-primary[md-vertical] .md-sign:after, md-slider.md-primary[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(25,118,210)}md-slider.md-default-theme.md-primary .md-thumb-text, md-slider.md-primary .md-thumb-text{color:rgba(255,255,255,0.87)}md-slider.md-default-theme[disabled] .md-thumb:after, md-slider[disabled] .md-thumb:after{border-color:transparent}md-slider-container[disabled]>:first-child:not(md-slider),md-slider-container[disabled]>:last-child:not(md-slider){color:rgba(0,0,0,0.38)}.md-subheader.md-default-theme.md-primary, .md-subheader.md-primary{color:rgb(25,118,210)}md-switch.md-default-theme.md-checked.md-primary .md-ink-ripple, md-switch.md-checked.md-primary .md-ink-ripple{color:rgb(25,118,210)}md-switch.md-default-theme.md-checked.md-primary .md-thumb, md-switch.md-checked.md-primary .md-thumb{background-color:rgb(25,118,210)}md-switch.md-default-theme.md-checked.md-primary .md-bar, md-switch.md-checked.md-primary .md-bar{background-color:rgba(25,118,210,0.5)}md-switch.md-default-theme.md-checked.md-primary.md-focused .md-thumb:before, md-switch.md-checked.md-primary.md-focused .md-thumb:before{background-color:rgba(25,118,210,0.26)}md-tabs.md-default-theme .md-paginator md-icon, md-tabs .md-paginator md-icon{color:rgb(25,118,210)}md-tabs.md-default-theme .md-tab, md-tabs .md-tab{color:rgba(0,0,0,0.54)}md-tabs.md-default-theme .md-tab[disabled], md-tabs .md-tab[disabled],md-tabs.md-default-theme .md-tab[disabled] md-icon, md-tabs .md-tab[disabled] md-icon{color:rgba(0,0,0,0.38)}md-tabs.md-default-theme .md-tab.md-active, md-tabs .md-tab.md-active,md-tabs.md-default-theme .md-tab.md-active md-icon, md-tabs .md-tab.md-active md-icon,md-tabs.md-default-theme .md-tab.md-focused, md-tabs .md-tab.md-focused,md-tabs.md-default-theme .md-tab.md-focused md-icon, md-tabs .md-tab.md-focused md-icon{color:rgb(25,118,210)}md-tabs.md-default-theme .md-tab.md-focused, md-tabs .md-tab.md-focused{background:rgba(25,118,210,0.1)}md-tabs.md-default-theme.md-primary>md-tabs-wrapper, md-tabs.md-primary>md-tabs-wrapper{background-color:rgb(25,118,210)}md-tabs.md-default-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-tabs.md-default-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(255,255,255,0.87)}md-tabs.md-default-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper, md-toolbar>md-tabs>md-tabs-wrapper{background-color:rgb(25,118,210)}md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(255,255,255,0.87)}md-toolbar>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toast.md-default-theme .md-toast-content .md-button.md-highlight.md-primary, md-toast .md-toast-content .md-button.md-highlight.md-primary{color:rgb(25,118,210)}md-toolbar.md-default-theme:not(.md-menu-toolbar), md-toolbar:not(.md-menu-toolbar){background-color:rgb(25,118,210);color:rgba(255,255,255,0.87)}md-toolbar.md-default-theme:not(.md-menu-toolbar) md-icon, md-toolbar:not(.md-menu-toolbar) md-icon{color:rgba(255,255,255,0.87);fill:rgba(255,255,255,0.87)}md-toolbar.md-default-theme:not(.md-menu-toolbar) .md-button[disabled] md-icon, md-toolbar:not(.md-menu-toolbar) .md-button[disabled] md-icon{color:rgba(255,255,255,0.26);fill:rgba(255,255,255,0.26)}
-md-autocomplete.md-default-theme.md-hue-1 input, md-autocomplete.md-hue-1 input{color:rgba(0,0,0,0.87)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-1 li, .md-autocomplete-suggestions-container.md-hue-1 li{color:rgba(0,0,0,0.87)}md-bottom-sheet.md-default-theme.md-hue-1.md-list md-list-item, md-bottom-sheet.md-hue-1.md-list md-list-item{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1.md-primary, .md-button.md-hue-1.md-primary{color:rgb(33,150,243)}.md-button.md-default-theme.md-hue-1.md-primary.md-fab, .md-button.md-hue-1.md-primary.md-fab,.md-button.md-default-theme.md-hue-1.md-primary.md-raised, .md-button.md-hue-1.md-primary.md-raised{color:rgba(0,0,0,0.87);background-color:rgb(33,150,243)}.md-button.md-default-theme.md-hue-1.md-primary.md-fab:not([disabled]) md-icon, .md-button.md-hue-1.md-primary.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-1.md-primary.md-raised:not([disabled]) md-icon, .md-button.md-hue-1.md-primary.md-raised:not([disabled]) md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1.md-primary.md-fab:not([disabled]).md-focused, .md-button.md-hue-1.md-primary.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1.md-primary.md-fab:not([disabled]):hover, .md-button.md-hue-1.md-primary.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-1.md-primary.md-raised:not([disabled]).md-focused, .md-button.md-hue-1.md-primary.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1.md-primary.md-raised:not([disabled]):hover, .md-button.md-hue-1.md-primary.md-raised:not([disabled]):hover{background-color:rgb(30,136,229)}.md-button.md-default-theme.md-hue-1.md-primary:not([disabled]) md-icon, .md-button.md-hue-1.md-primary:not([disabled]) md-icon{color:rgb(33,150,243)}._md a.md-default-theme.md-hue-1:not(.md-button).md-primary, ._md a.md-hue-1:not(.md-button).md-primary{color:rgb(33,150,243)}._md a.md-default-theme.md-hue-1:not(.md-button).md-primary:hover, ._md a.md-hue-1:not(.md-button).md-primary:hover{color:rgb(25,118,210)}md-card.md-default-theme.md-hue-1 .md-card-image, md-card.md-hue-1 .md-card-image{border-radius:2px 2px 0 0}md-card.md-default-theme.md-hue-1 md-card-header md-card-header-text .md-subhead, md-card.md-hue-1 md-card-header md-card-header-text .md-subhead,md-card.md-default-theme.md-hue-1 md-card-title md-card-title-text:not(:only-child) .md-subhead, md-card.md-hue-1 md-card-title md-card-title-text:not(:only-child) .md-subhead{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-1 .md-ink-ripple, md-checkbox.md-hue-1 .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-1:not(.md-checked) .md-icon, md-checkbox.md-hue-1:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary .md-ripple, md-checkbox.md-hue-1:not([disabled]).md-primary .md-ripple{color:rgb(30,136,229)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-ripple, md-checkbox.md-hue-1:not([disabled]).md-primary.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary .md-ink-ripple, md-checkbox.md-hue-1:not([disabled]).md-primary .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-ink-ripple, md-checkbox.md-hue-1:not([disabled]).md-primary.md-checked .md-ink-ripple{color:rgba(33,150,243,0.87)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary:not(.md-checked) .md-icon, md-checkbox.md-hue-1:not([disabled]).md-primary:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-icon, md-checkbox.md-hue-1:not([disabled]).md-primary.md-checked .md-icon{background-color:rgba(33,150,243,0.87)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked.md-focused .md-container:before, md-checkbox.md-hue-1:not([disabled]).md-primary.md-checked.md-focused .md-container:before{background-color:rgba(33,150,243,0.26)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-icon:after, md-checkbox.md-hue-1:not([disabled]).md-primary.md-checked .md-icon:after{border-color:rgba(0,0,0,0.87)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-primary .md-indeterminate[disabled] .md-container, md-checkbox.md-hue-1:not([disabled]).md-primary .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-1[disabled]:not(.md-checked) .md-icon, md-checkbox.md-hue-1[disabled]:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-1[disabled] .md-icon:after, md-checkbox.md-hue-1[disabled] .md-icon:after{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-1[disabled] .md-label, md-checkbox.md-hue-1[disabled] .md-label{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-1 .md-chips, md-chips.md-hue-1 .md-chips{box-shadow:0 1px rgba(0,0,0,0.12)}md-chips.md-default-theme.md-hue-1 .md-chips.md-focused, md-chips.md-hue-1 .md-chips.md-focused{box-shadow:0 2px rgb(33,150,243)}md-chips.md-default-theme.md-hue-1 .md-chips .md-chip-input-container input, md-chips.md-hue-1 .md-chips .md-chip-input-container input{color:rgba(0,0,0,0.87)}md-chips.md-default-theme.md-hue-1 .md-chips .md-chip-input-container input:-moz-placeholder, md-chips.md-hue-1 .md-chips .md-chip-input-container input:-moz-placeholder,md-chips.md-default-theme.md-hue-1 .md-chips .md-chip-input-container input::-moz-placeholder, md-chips.md-hue-1 .md-chips .md-chip-input-container input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-1 .md-chips .md-chip-input-container input:-ms-input-placeholder, md-chips.md-hue-1 .md-chips .md-chip-input-container input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-1 .md-chips .md-chip-input-container input::-webkit-input-placeholder, md-chips.md-hue-1 .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-1 md-chip.md-focused, md-chips.md-hue-1 md-chip.md-focused{background:rgb(33,150,243);color:rgba(0,0,0,0.87)}md-chips.md-default-theme.md-hue-1 md-chip.md-focused md-icon, md-chips.md-hue-1 md-chip.md-focused md-icon{color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-1 .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator, .md-hue-1 .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator{border:1px solid rgb(33,150,243)}.md-default-theme.md-hue-1 .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled, .md-hue-1 .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled{color:rgba(33,150,243,0.6)}.md-default-theme.md-hue-1 .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-hue-1 .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator,.md-default-theme.md-hue-1 .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-hue-1 .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator{background:rgb(33,150,243);color:rgba(0,0,0,0.87);border-color:transparent}.md-default-theme.md-hue-1 .md-calendar-date-disabled, .md-hue-1 .md-calendar-date-disabled,.md-default-theme.md-hue-1 .md-calendar-month-label-disabled, .md-hue-1 .md-calendar-month-label-disabled{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-1 .md-calendar-month-label md-icon, .md-hue-1 .md-calendar-month-label md-icon,.md-default-theme.md-hue-1 .md-datepicker-input, .md-hue-1 .md-datepicker-input{color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-1 .md-datepicker-input:-moz-placeholder, .md-hue-1 .md-datepicker-input:-moz-placeholder,.md-default-theme.md-hue-1 .md-datepicker-input::-moz-placeholder, .md-hue-1 .md-datepicker-input::-moz-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-1 .md-datepicker-input:-ms-input-placeholder, .md-hue-1 .md-datepicker-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-1 .md-datepicker-input::-webkit-input-placeholder, .md-hue-1 .md-datepicker-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-1 .md-datepicker-input-container, .md-hue-1 .md-datepicker-input-container{border-bottom-color:rgba(0,0,0,0.12)}.md-default-theme.md-hue-1 .md-datepicker-input-container.md-datepicker-focused, .md-hue-1 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(33,150,243)}.md-default-theme.md-hue-1 .md-datepicker-triangle-button .md-datepicker-expand-triangle, .md-hue-1 .md-datepicker-triangle-button .md-datepicker-expand-triangle{border-top-color:rgba(0,0,0,0.54)}.md-default-theme.md-hue-1 .md-datepicker-open .md-datepicker-calendar-icon, .md-hue-1 .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(33,150,243)}md-dialog.md-default-theme.md-hue-1.md-content-overflow .md-actions, md-dialog.md-hue-1.md-content-overflow .md-actions,md-dialog.md-default-theme.md-hue-1.md-content-overflow md-dialog-actions, md-dialog.md-hue-1.md-content-overflow md-dialog-actions,md-divider.md-default-theme.md-hue-1, md-divider.md-hue-1{border-top-color:rgba(0,0,0,0.12)}.layout-gt-lg-row>md-divider.md-default-theme.md-hue-1, .layout-gt-lg-row>md-divider.md-hue-1,.layout-gt-md-row>md-divider.md-default-theme.md-hue-1, .layout-gt-md-row>md-divider.md-hue-1,.layout-gt-sm-row>md-divider.md-default-theme.md-hue-1, .layout-gt-sm-row>md-divider.md-hue-1,.layout-gt-xs-row>md-divider.md-default-theme.md-hue-1, .layout-gt-xs-row>md-divider.md-hue-1,.layout-lg-row>md-divider.md-default-theme.md-hue-1, .layout-lg-row>md-divider.md-hue-1,.layout-md-row>md-divider.md-default-theme.md-hue-1, .layout-md-row>md-divider.md-hue-1,.layout-row>md-divider.md-default-theme.md-hue-1, .layout-row>md-divider.md-hue-1,.layout-sm-row>md-divider.md-default-theme.md-hue-1, .layout-sm-row>md-divider.md-hue-1,.layout-xl-row>md-divider.md-default-theme.md-hue-1, .layout-xl-row>md-divider.md-hue-1,.layout-xs-row>md-divider.md-default-theme.md-hue-1, .layout-xs-row>md-divider.md-hue-1{border-right-color:rgba(0,0,0,0.12)}md-icon.md-default-theme.md-hue-1, md-icon.md-hue-1{color:rgba(0,0,0,0.54)}md-icon.md-default-theme.md-hue-1.md-primary, md-icon.md-hue-1.md-primary{color:rgb(33,150,243)}md-input-container.md-default-theme.md-hue-1 .md-input, md-input-container.md-hue-1 .md-input{color:rgba(0,0,0,0.87);border-color:rgba(0,0,0,0.12)}md-input-container.md-default-theme.md-hue-1 .md-input:-moz-placeholder, md-input-container.md-hue-1 .md-input:-moz-placeholder,md-input-container.md-default-theme.md-hue-1 .md-input::-moz-placeholder, md-input-container.md-hue-1 .md-input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-1 .md-input:-ms-input-placeholder, md-input-container.md-hue-1 .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-1 .md-input::-webkit-input-placeholder, md-input-container.md-hue-1 .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-1>md-icon, md-input-container.md-hue-1>md-icon{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme.md-hue-1 .md-placeholder, md-input-container.md-hue-1 .md-placeholder,md-input-container.md-default-theme.md-hue-1 label, md-input-container.md-hue-1 label{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-1:not(.md-input-focused):not(.md-input-invalid) label.md-required:after, md-input-container.md-hue-1:not(.md-input-focused):not(.md-input-invalid) label.md-required:after{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-1 .md-input-message-animation .md-char-counter, md-input-container.md-hue-1 .md-input-message-animation .md-char-counter,md-input-container.md-default-theme.md-hue-1 .md-input-messages-animation .md-char-counter, md-input-container.md-hue-1 .md-input-messages-animation .md-char-counter{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme.md-hue-1.md-input-focused .md-input:-moz-placeholder, md-input-container.md-hue-1.md-input-focused .md-input:-moz-placeholder,md-input-container.md-default-theme.md-hue-1.md-input-focused .md-input::-moz-placeholder, md-input-container.md-hue-1.md-input-focused .md-input::-moz-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-1.md-input-focused .md-input:-ms-input-placeholder, md-input-container.md-hue-1.md-input-focused .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-1.md-input-focused .md-input::-webkit-input-placeholder, md-input-container.md-hue-1.md-input-focused .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-has-value label, md-input-container.md-hue-1:not(.md-input-invalid).md-input-has-value label{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused .md-input, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused .md-input,md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-resized .md-input, md-input-container.md-hue-1:not(.md-input-invalid).md-input-resized .md-input{border-color:rgb(33,150,243)}md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused label, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused label,md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused md-icon, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused md-icon{color:rgb(33,150,243)}md-list.md-default-theme.md-hue-1 md-list-item.md-2-line .md-list-item-text h3, md-list.md-hue-1 md-list-item.md-2-line .md-list-item-text h3,md-list.md-default-theme.md-hue-1 md-list-item.md-2-line .md-list-item-text h4, md-list.md-hue-1 md-list-item.md-2-line .md-list-item-text h4,md-list.md-default-theme.md-hue-1 md-list-item.md-3-line .md-list-item-text h3, md-list.md-hue-1 md-list-item.md-3-line .md-list-item-text h3,md-list.md-default-theme.md-hue-1 md-list-item.md-3-line .md-list-item-text h4, md-list.md-hue-1 md-list-item.md-3-line .md-list-item-text h4{color:rgba(0,0,0,0.87)}md-list.md-default-theme.md-hue-1 md-list-item.md-2-line .md-list-item-text p, md-list.md-hue-1 md-list-item.md-2-line .md-list-item-text p,md-list.md-default-theme.md-hue-1 md-list-item.md-3-line .md-list-item-text p, md-list.md-hue-1 md-list-item.md-3-line .md-list-item-text p{color:rgba(0,0,0,0.54)}md-list.md-default-theme.md-hue-1 md-list-item>md-icon, md-list.md-hue-1 md-list-item>md-icon{color:rgba(0,0,0,0.54)}md-list.md-default-theme.md-hue-1 md-list-item>md-icon.md-highlight, md-list.md-hue-1 md-list-item>md-icon.md-highlight{color:rgb(33,150,243)}md-menu-content.md-default-theme.md-hue-1 md-menu-item, md-menu-content.md-hue-1 md-menu-item{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme.md-hue-1 md-menu-item md-icon, md-menu-content.md-hue-1 md-menu-item md-icon{color:rgba(0,0,0,0.54)}md-menu-content.md-default-theme.md-hue-1 md-menu-item .md-button[disabled], md-menu-content.md-hue-1 md-menu-item .md-button[disabled],md-menu-content.md-default-theme.md-hue-1 md-menu-item .md-button[disabled] md-icon, md-menu-content.md-hue-1 md-menu-item .md-button[disabled] md-icon{color:rgba(0,0,0,0.38)}md-menu-bar.md-default-theme.md-hue-1>button.md-button, md-menu-bar.md-hue-1>button.md-button{color:rgba(0,0,0,0.87);border-radius:2px}md-menu-bar.md-default-theme.md-hue-1 md-menu>button, md-menu-bar.md-hue-1 md-menu>button{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme.md-hue-1 .md-menu>.md-button:after, md-menu-content.md-hue-1 .md-menu>.md-button:after{color:rgba(0,0,0,0.54)}md-toolbar.md-default-theme.md-hue-1.md-menu-toolbar md-toolbar-filler, md-toolbar.md-hue-1.md-menu-toolbar md-toolbar-filler{background-color:rgb(33,150,243);color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-1.md-menu-toolbar md-toolbar-filler md-icon, md-toolbar.md-hue-1.md-menu-toolbar md-toolbar-filler md-icon{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-1 .md-button._md-nav-button.md-unselected, md-nav-bar.md-hue-1 .md-button._md-nav-button.md-unselected{color:rgba(0,0,0,0.54)}md-nav-bar.md-default-theme.md-hue-1 .md-button._md-nav-button[disabled], md-nav-bar.md-hue-1 .md-button._md-nav-button[disabled]{color:rgba(0,0,0,0.38)}md-nav-bar.md-default-theme.md-hue-1.md-primary>.md-nav-bar, md-nav-bar.md-hue-1.md-primary>.md-nav-bar{background-color:rgb(33,150,243)}md-nav-bar.md-default-theme.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-nav-bar.md-default-theme.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-1.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-toolbar>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar, md-toolbar>md-nav-bar.md-hue-1>.md-nav-bar{background-color:rgb(33,150,243)}md-toolbar>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button, md-toolbar>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-toolbar>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-toolbar>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-progress-circular.md-default-theme.md-hue-1 path, md-progress-circular.md-hue-1 path{stroke:rgb(33,150,243)}md-progress-linear.md-default-theme.md-hue-1 .md-container, md-progress-linear.md-hue-1 .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-1 .md-bar, md-progress-linear.md-hue-1 .md-bar{background-color:rgb(33,150,243)}md-progress-linear.md-default-theme.md-hue-1[md-mode=buffer].md-primary .md-bar1, md-progress-linear.md-hue-1[md-mode=buffer].md-primary .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-1[md-mode=buffer].md-primary .md-dashed:before, md-progress-linear.md-hue-1[md-mode=buffer].md-primary .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-1 .md-off, md-radio-button.md-hue-1 .md-off{border-color:rgba(0,0,0,0.54)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-primary .md-on, md-radio-button.md-hue-1:not([disabled]).md-primary .md-on,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-on, md-radio-button.md-hue-1:not([disabled]) .md-primary .md-on,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-primary .md-on, md-radio-group.md-hue-1:not([disabled]).md-primary .md-on,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-on, md-radio-group.md-hue-1:not([disabled]) .md-primary .md-on{background-color:rgba(33,150,243,0.87)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-off, md-radio-button.md-hue-1:not([disabled]).md-primary.md-checked .md-off,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-primary.md-checked .md-off, md-radio-button.md-hue-1:not([disabled]) .md-primary.md-checked .md-off,md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-primary .md-checked .md-off, md-radio-button.md-hue-1:not([disabled]).md-primary .md-checked .md-off,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-checked .md-off, md-radio-button.md-hue-1:not([disabled]) .md-primary .md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-off, md-radio-group.md-hue-1:not([disabled]).md-primary.md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-primary.md-checked .md-off, md-radio-group.md-hue-1:not([disabled]) .md-primary.md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-primary .md-checked .md-off, md-radio-group.md-hue-1:not([disabled]).md-primary .md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-checked .md-off, md-radio-group.md-hue-1:not([disabled]) .md-primary .md-checked .md-off{border-color:rgba(33,150,243,0.87)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]) .md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]) .md-primary .md-checked .md-ink-ripple{color:rgba(33,150,243,0.87)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-primary .md-container .md-ripple, md-radio-button.md-hue-1:not([disabled]).md-primary .md-container .md-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-container .md-ripple, md-radio-button.md-hue-1:not([disabled]) .md-primary .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-primary .md-container .md-ripple, md-radio-group.md-hue-1:not([disabled]).md-primary .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-primary .md-container .md-ripple, md-radio-group.md-hue-1:not([disabled]) .md-primary .md-container .md-ripple{color:rgb(30,136,229)}md-radio-button.md-default-theme.md-hue-1[disabled], md-radio-button.md-hue-1[disabled],md-radio-group.md-default-theme.md-hue-1[disabled], md-radio-group.md-hue-1[disabled]{color:rgba(0,0,0,0.38)}md-radio-button.md-default-theme.md-hue-1[disabled] .md-container .md-off, md-radio-button.md-hue-1[disabled] .md-container .md-off,md-radio-button.md-default-theme.md-hue-1[disabled] .md-container .md-on, md-radio-button.md-hue-1[disabled] .md-container .md-on,md-radio-group.md-default-theme.md-hue-1[disabled] .md-container .md-off, md-radio-group.md-hue-1[disabled] .md-container .md-off,md-radio-group.md-default-theme.md-hue-1[disabled] .md-container .md-on, md-radio-group.md-hue-1[disabled] .md-container .md-on{border-color:rgba(0,0,0,0.38)}md-radio-group.md-default-theme.md-hue-1 .md-checked:not([disabled]).md-primary .md-ink-ripple, md-radio-group.md-hue-1 .md-checked:not([disabled]).md-primary .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1.md-primary .md-checked:not([disabled]) .md-ink-ripple, md-radio-group.md-hue-1.md-primary .md-checked:not([disabled]) .md-ink-ripple{color:rgba(33,150,243,0.26)}md-radio-group.md-default-theme.md-hue-1.md-focused:not(:empty) .md-checked.md-primary .md-container:before, md-radio-group.md-hue-1.md-focused:not(:empty) .md-checked.md-primary .md-container:before,md-radio-group.md-default-theme.md-hue-1.md-focused:not(:empty).md-primary .md-checked .md-container:before, md-radio-group.md-hue-1.md-focused:not(:empty).md-primary .md-checked .md-container:before{background-color:rgba(33,150,243,0.26)}md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-default-theme.md-hue-1 .md-select-value span:first-child:after, md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-hue-1 .md-select-value span:first-child:after{color:rgba(0,0,0,0.38)}md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme.md-hue-1 .md-select-value, md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-hue-1 .md-select-value,md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme.md-hue-1 .md-select-value.md-select-placeholder, md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-hue-1 .md-select-value.md-select-placeholder{color:rgb(33,150,243)}md-input-container.md-input-invalid md-select.md-default-theme.md-hue-1.md-no-underline .md-select-value, md-input-container.md-input-invalid md-select.md-hue-1.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-1 .md-select-value, md-select.md-hue-1 .md-select-value{border-bottom-color:rgba(0,0,0,0.12)}md-select.md-default-theme.md-hue-1 .md-select-value.md-select-placeholder, md-select.md-hue-1 .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme.md-hue-1.md-no-underline .md-select-value, md-select.md-hue-1.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-1.ng-invalid.ng-touched.md-no-underline .md-select-value, md-select.md-hue-1.ng-invalid.ng-touched.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-1:not([disabled]):focus .md-select-value, md-select.md-hue-1:not([disabled]):focus .md-select-value{border-bottom-color:rgb(33,150,243);color:rgba(0,0,0,0.87)}md-select.md-default-theme.md-hue-1:not([disabled]):focus .md-select-value.md-select-placeholder, md-select.md-hue-1:not([disabled]):focus .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.87)}md-select.md-default-theme.md-hue-1:not([disabled]):focus.md-no-underline .md-select-value, md-select.md-hue-1:not([disabled]):focus.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-1[disabled] .md-select-icon, md-select.md-hue-1[disabled] .md-select-icon,md-select.md-default-theme.md-hue-1[disabled] .md-select-value, md-select.md-hue-1[disabled] .md-select-value,md-select.md-default-theme.md-hue-1[disabled] .md-select-value.md-select-placeholder, md-select.md-hue-1[disabled] .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme.md-hue-1 .md-select-icon, md-select.md-hue-1 .md-select-icon{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme.md-hue-1 md-content md-optgroup, md-select-menu.md-hue-1 md-content md-optgroup{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme.md-hue-1 md-content md-option, md-select-menu.md-hue-1 md-content md-option{color:rgba(0,0,0,0.87)}md-select-menu.md-default-theme.md-hue-1 md-content md-option[disabled] .md-text, md-select-menu.md-hue-1 md-content md-option[disabled] .md-text{color:rgba(0,0,0,0.38)}md-select-menu.md-default-theme.md-hue-1 md-content md-option[selected], md-select-menu.md-hue-1 md-content md-option[selected]{color:rgb(33,150,243)}md-select-menu.md-default-theme.md-hue-1 md-content md-option[selected]:focus, md-select-menu.md-hue-1 md-content md-option[selected]:focus{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme.md-hue-1 .md-ripple, .md-checkbox-enabled.md-hue-1 .md-ripple{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme.md-hue-1 .md-ink-ripple, .md-checkbox-enabled.md-hue-1 .md-ink-ripple{color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme.md-hue-1[selected] .md-ink-ripple, .md-checkbox-enabled.md-hue-1[selected] .md-ink-ripple{color:rgba(33,150,243,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-1:not(.md-checked) .md-icon, .md-checkbox-enabled.md-hue-1:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme.md-hue-1[selected] .md-icon, .md-checkbox-enabled.md-hue-1[selected] .md-icon{background-color:rgba(33,150,243,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-1[selected].md-focused .md-container:before, .md-checkbox-enabled.md-hue-1[selected].md-focused .md-container:before{background-color:rgba(33,150,243,0.26)}.md-checkbox-enabled.md-default-theme.md-hue-1[selected] .md-icon:after, .md-checkbox-enabled.md-hue-1[selected] .md-icon:after{border-color:rgba(0,0,0,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-1 .md-indeterminate[disabled] .md-container, .md-checkbox-enabled.md-hue-1 .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}.md-checkbox-enabled.md-default-theme.md-hue-1 md-option .md-text, .md-checkbox-enabled.md-hue-1 md-option .md-text{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-1.md-primary .md-focus-ring, md-slider.md-hue-1.md-primary .md-focus-ring{background-color:rgba(144,202,249,0.38)}md-slider.md-default-theme.md-hue-1.md-primary .md-track.md-track-fill, md-slider.md-hue-1.md-primary .md-track.md-track-fill{background-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-1.md-primary .md-thumb:after, md-slider.md-hue-1.md-primary .md-thumb:after{border-color:rgb(33,150,243);background-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-1.md-primary .md-sign, md-slider.md-hue-1.md-primary .md-sign{background-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-1.md-primary .md-sign:after, md-slider.md-hue-1.md-primary .md-sign:after{border-top-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-1.md-primary[md-vertical] .md-sign:after, md-slider.md-hue-1.md-primary[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-1.md-primary .md-thumb-text, md-slider.md-hue-1.md-primary .md-thumb-text{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-1[disabled] .md-thumb:after, md-slider.md-hue-1[disabled] .md-thumb:after{border-color:transparent}md-slider-container[disabled]>:first-child:not(md-slider),md-slider-container[disabled]>:last-child:not(md-slider){color:rgba(0,0,0,0.38)}.md-subheader.md-default-theme.md-hue-1.md-primary, .md-subheader.md-hue-1.md-primary{color:rgb(33,150,243)}md-switch.md-default-theme.md-hue-1.md-checked.md-primary .md-ink-ripple, md-switch.md-hue-1.md-checked.md-primary .md-ink-ripple{color:rgb(33,150,243)}md-switch.md-default-theme.md-hue-1.md-checked.md-primary .md-thumb, md-switch.md-hue-1.md-checked.md-primary .md-thumb{background-color:rgb(33,150,243)}md-switch.md-default-theme.md-hue-1.md-checked.md-primary .md-bar, md-switch.md-hue-1.md-checked.md-primary .md-bar{background-color:rgba(33,150,243,0.5)}md-switch.md-default-theme.md-hue-1.md-checked.md-primary.md-focused .md-thumb:before, md-switch.md-hue-1.md-checked.md-primary.md-focused .md-thumb:before{background-color:rgba(33,150,243,0.26)}md-tabs.md-default-theme.md-hue-1 .md-paginator md-icon, md-tabs.md-hue-1 .md-paginator md-icon{color:rgb(33,150,243)}md-tabs.md-default-theme.md-hue-1 .md-tab, md-tabs.md-hue-1 .md-tab{color:rgba(0,0,0,0.54)}md-tabs.md-default-theme.md-hue-1 .md-tab[disabled], md-tabs.md-hue-1 .md-tab[disabled],md-tabs.md-default-theme.md-hue-1 .md-tab[disabled] md-icon, md-tabs.md-hue-1 .md-tab[disabled] md-icon{color:rgba(0,0,0,0.38)}md-tabs.md-default-theme.md-hue-1 .md-tab.md-active, md-tabs.md-hue-1 .md-tab.md-active,md-tabs.md-default-theme.md-hue-1 .md-tab.md-active md-icon, md-tabs.md-hue-1 .md-tab.md-active md-icon,md-tabs.md-default-theme.md-hue-1 .md-tab.md-focused, md-tabs.md-hue-1 .md-tab.md-focused,md-tabs.md-default-theme.md-hue-1 .md-tab.md-focused md-icon, md-tabs.md-hue-1 .md-tab.md-focused md-icon{color:rgb(33,150,243)}md-tabs.md-default-theme.md-hue-1 .md-tab.md-focused, md-tabs.md-hue-1 .md-tab.md-focused{background:rgba(33,150,243,0.1)}md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper, md-tabs.md-hue-1.md-primary>md-tabs-wrapper{background-color:rgb(33,150,243)}md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-tabs.md-default-theme.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-1.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper, md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper{background-color:rgb(33,150,243)}md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-toolbar>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toast.md-default-theme.md-hue-1 .md-toast-content .md-button.md-highlight.md-primary, md-toast.md-hue-1 .md-toast-content .md-button.md-highlight.md-primary{color:rgb(33,150,243)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar), md-toolbar.md-hue-1:not(.md-menu-toolbar){background-color:rgb(33,150,243);color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar) md-icon, md-toolbar.md-hue-1:not(.md-menu-toolbar) md-icon{color:rgba(0,0,0,0.87);fill:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar) .md-button[disabled] md-icon, md-toolbar.md-hue-1:not(.md-menu-toolbar) .md-button[disabled] md-icon{color:rgba(0,0,0,0.26);fill:rgba(0,0,0,0.26)}
-md-autocomplete.md-default-theme.md-hue-2 input, md-autocomplete.md-hue-2 input{color:rgba(0,0,0,0.87)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-2 li, .md-autocomplete-suggestions-container.md-hue-2 li{color:rgba(0,0,0,0.87)}md-bottom-sheet.md-default-theme.md-hue-2.md-list md-list-item, md-bottom-sheet.md-hue-2.md-list md-list-item{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-2.md-primary, .md-button.md-hue-2.md-primary{color:rgb(25,118,210)}.md-button.md-default-theme.md-hue-2.md-primary.md-fab, .md-button.md-hue-2.md-primary.md-fab,.md-button.md-default-theme.md-hue-2.md-primary.md-raised, .md-button.md-hue-2.md-primary.md-raised{color:rgba(255,255,255,0.87);background-color:rgb(25,118,210)}.md-button.md-default-theme.md-hue-2.md-primary.md-fab:not([disabled]) md-icon, .md-button.md-hue-2.md-primary.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-2.md-primary.md-raised:not([disabled]) md-icon, .md-button.md-hue-2.md-primary.md-raised:not([disabled]) md-icon{color:rgba(255,255,255,0.87)}.md-button.md-default-theme.md-hue-2.md-primary.md-fab:not([disabled]).md-focused, .md-button.md-hue-2.md-primary.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2.md-primary.md-fab:not([disabled]):hover, .md-button.md-hue-2.md-primary.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-2.md-primary.md-raised:not([disabled]).md-focused, .md-button.md-hue-2.md-primary.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2.md-primary.md-raised:not([disabled]):hover, .md-button.md-hue-2.md-primary.md-raised:not([disabled]):hover{background-color:rgb(30,136,229)}.md-button.md-default-theme.md-hue-2.md-primary:not([disabled]) md-icon, .md-button.md-hue-2.md-primary:not([disabled]) md-icon{color:rgb(25,118,210)}._md a.md-default-theme.md-hue-2:not(.md-button).md-primary, ._md a.md-hue-2:not(.md-button).md-primary{color:rgb(25,118,210)}._md a.md-default-theme.md-hue-2:not(.md-button).md-primary:hover, ._md a.md-hue-2:not(.md-button).md-primary:hover{color:rgb(25,118,210)}md-card.md-default-theme.md-hue-2 .md-card-image, md-card.md-hue-2 .md-card-image{border-radius:2px 2px 0 0}md-card.md-default-theme.md-hue-2 md-card-header md-card-header-text .md-subhead, md-card.md-hue-2 md-card-header md-card-header-text .md-subhead,md-card.md-default-theme.md-hue-2 md-card-title md-card-title-text:not(:only-child) .md-subhead, md-card.md-hue-2 md-card-title md-card-title-text:not(:only-child) .md-subhead{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-2 .md-ink-ripple, md-checkbox.md-hue-2 .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-2:not(.md-checked) .md-icon, md-checkbox.md-hue-2:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary .md-ripple, md-checkbox.md-hue-2:not([disabled]).md-primary .md-ripple{color:rgb(30,136,229)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-ripple, md-checkbox.md-hue-2:not([disabled]).md-primary.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary .md-ink-ripple, md-checkbox.md-hue-2:not([disabled]).md-primary .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-ink-ripple, md-checkbox.md-hue-2:not([disabled]).md-primary.md-checked .md-ink-ripple{color:rgba(25,118,210,0.87)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary:not(.md-checked) .md-icon, md-checkbox.md-hue-2:not([disabled]).md-primary:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-icon, md-checkbox.md-hue-2:not([disabled]).md-primary.md-checked .md-icon{background-color:rgba(25,118,210,0.87)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked.md-focused .md-container:before, md-checkbox.md-hue-2:not([disabled]).md-primary.md-checked.md-focused .md-container:before{background-color:rgba(25,118,210,0.26)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-icon:after, md-checkbox.md-hue-2:not([disabled]).md-primary.md-checked .md-icon:after{border-color:rgba(255,255,255,0.87)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-primary .md-indeterminate[disabled] .md-container, md-checkbox.md-hue-2:not([disabled]).md-primary .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-2[disabled]:not(.md-checked) .md-icon, md-checkbox.md-hue-2[disabled]:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-2[disabled] .md-icon:after, md-checkbox.md-hue-2[disabled] .md-icon:after{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-2[disabled] .md-label, md-checkbox.md-hue-2[disabled] .md-label{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-2 .md-chips, md-chips.md-hue-2 .md-chips{box-shadow:0 1px rgba(0,0,0,0.12)}md-chips.md-default-theme.md-hue-2 .md-chips.md-focused, md-chips.md-hue-2 .md-chips.md-focused{box-shadow:0 2px rgb(25,118,210)}md-chips.md-default-theme.md-hue-2 .md-chips .md-chip-input-container input, md-chips.md-hue-2 .md-chips .md-chip-input-container input{color:rgba(0,0,0,0.87)}md-chips.md-default-theme.md-hue-2 .md-chips .md-chip-input-container input:-moz-placeholder, md-chips.md-hue-2 .md-chips .md-chip-input-container input:-moz-placeholder,md-chips.md-default-theme.md-hue-2 .md-chips .md-chip-input-container input::-moz-placeholder, md-chips.md-hue-2 .md-chips .md-chip-input-container input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-2 .md-chips .md-chip-input-container input:-ms-input-placeholder, md-chips.md-hue-2 .md-chips .md-chip-input-container input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-2 .md-chips .md-chip-input-container input::-webkit-input-placeholder, md-chips.md-hue-2 .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-2 md-chip.md-focused, md-chips.md-hue-2 md-chip.md-focused{background:rgb(25,118,210);color:rgba(255,255,255,0.87)}md-chips.md-default-theme.md-hue-2 md-chip.md-focused md-icon, md-chips.md-hue-2 md-chip.md-focused md-icon{color:rgba(255,255,255,0.87)}.md-default-theme.md-hue-2 .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator, .md-hue-2 .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator{border:1px solid rgb(33,150,243)}.md-default-theme.md-hue-2 .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled, .md-hue-2 .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled{color:rgba(33,150,243,0.6)}.md-default-theme.md-hue-2 .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-hue-2 .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator,.md-default-theme.md-hue-2 .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-hue-2 .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator{background:rgb(33,150,243);color:rgba(0,0,0,0.87);border-color:transparent}.md-default-theme.md-hue-2 .md-calendar-date-disabled, .md-hue-2 .md-calendar-date-disabled,.md-default-theme.md-hue-2 .md-calendar-month-label-disabled, .md-hue-2 .md-calendar-month-label-disabled{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-2 .md-calendar-month-label md-icon, .md-hue-2 .md-calendar-month-label md-icon,.md-default-theme.md-hue-2 .md-datepicker-input, .md-hue-2 .md-datepicker-input{color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-2 .md-datepicker-input:-moz-placeholder, .md-hue-2 .md-datepicker-input:-moz-placeholder,.md-default-theme.md-hue-2 .md-datepicker-input::-moz-placeholder, .md-hue-2 .md-datepicker-input::-moz-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-2 .md-datepicker-input:-ms-input-placeholder, .md-hue-2 .md-datepicker-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-2 .md-datepicker-input::-webkit-input-placeholder, .md-hue-2 .md-datepicker-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-2 .md-datepicker-input-container, .md-hue-2 .md-datepicker-input-container{border-bottom-color:rgba(0,0,0,0.12)}.md-default-theme.md-hue-2 .md-datepicker-input-container.md-datepicker-focused, .md-hue-2 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(25,118,210)}.md-default-theme.md-hue-2 .md-datepicker-triangle-button .md-datepicker-expand-triangle, .md-hue-2 .md-datepicker-triangle-button .md-datepicker-expand-triangle{border-top-color:rgba(0,0,0,0.54)}.md-default-theme.md-hue-2 .md-datepicker-open .md-datepicker-calendar-icon, .md-hue-2 .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(25,118,210)}md-dialog.md-default-theme.md-hue-2.md-content-overflow .md-actions, md-dialog.md-hue-2.md-content-overflow .md-actions,md-dialog.md-default-theme.md-hue-2.md-content-overflow md-dialog-actions, md-dialog.md-hue-2.md-content-overflow md-dialog-actions,md-divider.md-default-theme.md-hue-2, md-divider.md-hue-2{border-top-color:rgba(0,0,0,0.12)}.layout-gt-lg-row>md-divider.md-default-theme.md-hue-2, .layout-gt-lg-row>md-divider.md-hue-2,.layout-gt-md-row>md-divider.md-default-theme.md-hue-2, .layout-gt-md-row>md-divider.md-hue-2,.layout-gt-sm-row>md-divider.md-default-theme.md-hue-2, .layout-gt-sm-row>md-divider.md-hue-2,.layout-gt-xs-row>md-divider.md-default-theme.md-hue-2, .layout-gt-xs-row>md-divider.md-hue-2,.layout-lg-row>md-divider.md-default-theme.md-hue-2, .layout-lg-row>md-divider.md-hue-2,.layout-md-row>md-divider.md-default-theme.md-hue-2, .layout-md-row>md-divider.md-hue-2,.layout-row>md-divider.md-default-theme.md-hue-2, .layout-row>md-divider.md-hue-2,.layout-sm-row>md-divider.md-default-theme.md-hue-2, .layout-sm-row>md-divider.md-hue-2,.layout-xl-row>md-divider.md-default-theme.md-hue-2, .layout-xl-row>md-divider.md-hue-2,.layout-xs-row>md-divider.md-default-theme.md-hue-2, .layout-xs-row>md-divider.md-hue-2{border-right-color:rgba(0,0,0,0.12)}md-icon.md-default-theme.md-hue-2, md-icon.md-hue-2{color:rgba(0,0,0,0.54)}md-icon.md-default-theme.md-hue-2.md-primary, md-icon.md-hue-2.md-primary{color:rgb(25,118,210)}md-input-container.md-default-theme.md-hue-2 .md-input, md-input-container.md-hue-2 .md-input{color:rgba(0,0,0,0.87);border-color:rgba(0,0,0,0.12)}md-input-container.md-default-theme.md-hue-2 .md-input:-moz-placeholder, md-input-container.md-hue-2 .md-input:-moz-placeholder,md-input-container.md-default-theme.md-hue-2 .md-input::-moz-placeholder, md-input-container.md-hue-2 .md-input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-2 .md-input:-ms-input-placeholder, md-input-container.md-hue-2 .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-2 .md-input::-webkit-input-placeholder, md-input-container.md-hue-2 .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-2>md-icon, md-input-container.md-hue-2>md-icon{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme.md-hue-2 .md-placeholder, md-input-container.md-hue-2 .md-placeholder,md-input-container.md-default-theme.md-hue-2 label, md-input-container.md-hue-2 label{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-2:not(.md-input-focused):not(.md-input-invalid) label.md-required:after, md-input-container.md-hue-2:not(.md-input-focused):not(.md-input-invalid) label.md-required:after{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-2 .md-input-message-animation .md-char-counter, md-input-container.md-hue-2 .md-input-message-animation .md-char-counter,md-input-container.md-default-theme.md-hue-2 .md-input-messages-animation .md-char-counter, md-input-container.md-hue-2 .md-input-messages-animation .md-char-counter{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme.md-hue-2.md-input-focused .md-input:-moz-placeholder, md-input-container.md-hue-2.md-input-focused .md-input:-moz-placeholder,md-input-container.md-default-theme.md-hue-2.md-input-focused .md-input::-moz-placeholder, md-input-container.md-hue-2.md-input-focused .md-input::-moz-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-2.md-input-focused .md-input:-ms-input-placeholder, md-input-container.md-hue-2.md-input-focused .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-2.md-input-focused .md-input::-webkit-input-placeholder, md-input-container.md-hue-2.md-input-focused .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-has-value label, md-input-container.md-hue-2:not(.md-input-invalid).md-input-has-value label{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused .md-input, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused .md-input,md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-resized .md-input, md-input-container.md-hue-2:not(.md-input-invalid).md-input-resized .md-input{border-color:rgb(25,118,210)}md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused label, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused label,md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused md-icon, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused md-icon{color:rgb(25,118,210)}md-list.md-default-theme.md-hue-2 md-list-item.md-2-line .md-list-item-text h3, md-list.md-hue-2 md-list-item.md-2-line .md-list-item-text h3,md-list.md-default-theme.md-hue-2 md-list-item.md-2-line .md-list-item-text h4, md-list.md-hue-2 md-list-item.md-2-line .md-list-item-text h4,md-list.md-default-theme.md-hue-2 md-list-item.md-3-line .md-list-item-text h3, md-list.md-hue-2 md-list-item.md-3-line .md-list-item-text h3,md-list.md-default-theme.md-hue-2 md-list-item.md-3-line .md-list-item-text h4, md-list.md-hue-2 md-list-item.md-3-line .md-list-item-text h4{color:rgba(0,0,0,0.87)}md-list.md-default-theme.md-hue-2 md-list-item.md-2-line .md-list-item-text p, md-list.md-hue-2 md-list-item.md-2-line .md-list-item-text p,md-list.md-default-theme.md-hue-2 md-list-item.md-3-line .md-list-item-text p, md-list.md-hue-2 md-list-item.md-3-line .md-list-item-text p{color:rgba(0,0,0,0.54)}md-list.md-default-theme.md-hue-2 md-list-item>md-icon, md-list.md-hue-2 md-list-item>md-icon{color:rgba(0,0,0,0.54)}md-list.md-default-theme.md-hue-2 md-list-item>md-icon.md-highlight, md-list.md-hue-2 md-list-item>md-icon.md-highlight{color:rgb(25,118,210)}md-menu-content.md-default-theme.md-hue-2 md-menu-item, md-menu-content.md-hue-2 md-menu-item{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme.md-hue-2 md-menu-item md-icon, md-menu-content.md-hue-2 md-menu-item md-icon{color:rgba(0,0,0,0.54)}md-menu-content.md-default-theme.md-hue-2 md-menu-item .md-button[disabled], md-menu-content.md-hue-2 md-menu-item .md-button[disabled],md-menu-content.md-default-theme.md-hue-2 md-menu-item .md-button[disabled] md-icon, md-menu-content.md-hue-2 md-menu-item .md-button[disabled] md-icon{color:rgba(0,0,0,0.38)}md-menu-bar.md-default-theme.md-hue-2>button.md-button, md-menu-bar.md-hue-2>button.md-button{color:rgba(0,0,0,0.87);border-radius:2px}md-menu-bar.md-default-theme.md-hue-2 md-menu>button, md-menu-bar.md-hue-2 md-menu>button{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme.md-hue-2 .md-menu>.md-button:after, md-menu-content.md-hue-2 .md-menu>.md-button:after{color:rgba(0,0,0,0.54)}md-toolbar.md-default-theme.md-hue-2.md-menu-toolbar md-toolbar-filler, md-toolbar.md-hue-2.md-menu-toolbar md-toolbar-filler{background-color:rgb(25,118,210);color:rgba(255,255,255,0.87)}md-toolbar.md-default-theme.md-hue-2.md-menu-toolbar md-toolbar-filler md-icon, md-toolbar.md-hue-2.md-menu-toolbar md-toolbar-filler md-icon{color:rgba(255,255,255,0.87)}md-nav-bar.md-default-theme.md-hue-2 .md-button._md-nav-button.md-unselected, md-nav-bar.md-hue-2 .md-button._md-nav-button.md-unselected{color:rgba(0,0,0,0.54)}md-nav-bar.md-default-theme.md-hue-2 .md-button._md-nav-button[disabled], md-nav-bar.md-hue-2 .md-button._md-nav-button[disabled]{color:rgba(0,0,0,0.38)}md-nav-bar.md-default-theme.md-hue-2.md-primary>.md-nav-bar, md-nav-bar.md-hue-2.md-primary>.md-nav-bar{background-color:rgb(25,118,210)}md-nav-bar.md-default-theme.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-nav-bar.md-default-theme.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(255,255,255,0.87)}md-nav-bar.md-default-theme.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-2.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-toolbar>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar, md-toolbar>md-nav-bar.md-hue-2>.md-nav-bar{background-color:rgb(25,118,210)}md-toolbar>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button, md-toolbar>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-toolbar>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(255,255,255,0.87)}md-toolbar>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-progress-circular.md-default-theme.md-hue-2 path, md-progress-circular.md-hue-2 path{stroke:rgb(25,118,210)}md-progress-linear.md-default-theme.md-hue-2 .md-container, md-progress-linear.md-hue-2 .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-2 .md-bar, md-progress-linear.md-hue-2 .md-bar{background-color:rgb(25,118,210)}md-progress-linear.md-default-theme.md-hue-2[md-mode=buffer].md-primary .md-bar1, md-progress-linear.md-hue-2[md-mode=buffer].md-primary .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-2[md-mode=buffer].md-primary .md-dashed:before, md-progress-linear.md-hue-2[md-mode=buffer].md-primary .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-2 .md-off, md-radio-button.md-hue-2 .md-off{border-color:rgba(0,0,0,0.54)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-primary .md-on, md-radio-button.md-hue-2:not([disabled]).md-primary .md-on,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-on, md-radio-button.md-hue-2:not([disabled]) .md-primary .md-on,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-primary .md-on, md-radio-group.md-hue-2:not([disabled]).md-primary .md-on,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-on, md-radio-group.md-hue-2:not([disabled]) .md-primary .md-on{background-color:rgba(25,118,210,0.87)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-off, md-radio-button.md-hue-2:not([disabled]).md-primary.md-checked .md-off,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-primary.md-checked .md-off, md-radio-button.md-hue-2:not([disabled]) .md-primary.md-checked .md-off,md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-primary .md-checked .md-off, md-radio-button.md-hue-2:not([disabled]).md-primary .md-checked .md-off,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-checked .md-off, md-radio-button.md-hue-2:not([disabled]) .md-primary .md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-off, md-radio-group.md-hue-2:not([disabled]).md-primary.md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-primary.md-checked .md-off, md-radio-group.md-hue-2:not([disabled]) .md-primary.md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-primary .md-checked .md-off, md-radio-group.md-hue-2:not([disabled]).md-primary .md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-checked .md-off, md-radio-group.md-hue-2:not([disabled]) .md-primary .md-checked .md-off{border-color:rgba(25,118,210,0.87)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]) .md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]) .md-primary .md-checked .md-ink-ripple{color:rgba(25,118,210,0.87)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-primary .md-container .md-ripple, md-radio-button.md-hue-2:not([disabled]).md-primary .md-container .md-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-container .md-ripple, md-radio-button.md-hue-2:not([disabled]) .md-primary .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-primary .md-container .md-ripple, md-radio-group.md-hue-2:not([disabled]).md-primary .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-primary .md-container .md-ripple, md-radio-group.md-hue-2:not([disabled]) .md-primary .md-container .md-ripple{color:rgb(30,136,229)}md-radio-button.md-default-theme.md-hue-2[disabled], md-radio-button.md-hue-2[disabled],md-radio-group.md-default-theme.md-hue-2[disabled], md-radio-group.md-hue-2[disabled]{color:rgba(0,0,0,0.38)}md-radio-button.md-default-theme.md-hue-2[disabled] .md-container .md-off, md-radio-button.md-hue-2[disabled] .md-container .md-off,md-radio-button.md-default-theme.md-hue-2[disabled] .md-container .md-on, md-radio-button.md-hue-2[disabled] .md-container .md-on,md-radio-group.md-default-theme.md-hue-2[disabled] .md-container .md-off, md-radio-group.md-hue-2[disabled] .md-container .md-off,md-radio-group.md-default-theme.md-hue-2[disabled] .md-container .md-on, md-radio-group.md-hue-2[disabled] .md-container .md-on{border-color:rgba(0,0,0,0.38)}md-radio-group.md-default-theme.md-hue-2 .md-checked:not([disabled]).md-primary .md-ink-ripple, md-radio-group.md-hue-2 .md-checked:not([disabled]).md-primary .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2.md-primary .md-checked:not([disabled]) .md-ink-ripple, md-radio-group.md-hue-2.md-primary .md-checked:not([disabled]) .md-ink-ripple{color:rgba(25,118,210,0.26)}md-radio-group.md-default-theme.md-hue-2.md-focused:not(:empty) .md-checked.md-primary .md-container:before, md-radio-group.md-hue-2.md-focused:not(:empty) .md-checked.md-primary .md-container:before,md-radio-group.md-default-theme.md-hue-2.md-focused:not(:empty).md-primary .md-checked .md-container:before, md-radio-group.md-hue-2.md-focused:not(:empty).md-primary .md-checked .md-container:before{background-color:rgba(25,118,210,0.26)}md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-default-theme.md-hue-2 .md-select-value span:first-child:after, md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-hue-2 .md-select-value span:first-child:after{color:rgba(0,0,0,0.38)}md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme.md-hue-2 .md-select-value, md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-hue-2 .md-select-value,md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme.md-hue-2 .md-select-value.md-select-placeholder, md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-hue-2 .md-select-value.md-select-placeholder{color:rgb(25,118,210)}md-input-container.md-input-invalid md-select.md-default-theme.md-hue-2.md-no-underline .md-select-value, md-input-container.md-input-invalid md-select.md-hue-2.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-2 .md-select-value, md-select.md-hue-2 .md-select-value{border-bottom-color:rgba(0,0,0,0.12)}md-select.md-default-theme.md-hue-2 .md-select-value.md-select-placeholder, md-select.md-hue-2 .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme.md-hue-2.md-no-underline .md-select-value, md-select.md-hue-2.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-2.ng-invalid.ng-touched.md-no-underline .md-select-value, md-select.md-hue-2.ng-invalid.ng-touched.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-2:not([disabled]):focus .md-select-value, md-select.md-hue-2:not([disabled]):focus .md-select-value{border-bottom-color:rgb(25,118,210);color:rgba(0,0,0,0.87)}md-select.md-default-theme.md-hue-2:not([disabled]):focus .md-select-value.md-select-placeholder, md-select.md-hue-2:not([disabled]):focus .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.87)}md-select.md-default-theme.md-hue-2:not([disabled]):focus.md-no-underline .md-select-value, md-select.md-hue-2:not([disabled]):focus.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-2[disabled] .md-select-icon, md-select.md-hue-2[disabled] .md-select-icon,md-select.md-default-theme.md-hue-2[disabled] .md-select-value, md-select.md-hue-2[disabled] .md-select-value,md-select.md-default-theme.md-hue-2[disabled] .md-select-value.md-select-placeholder, md-select.md-hue-2[disabled] .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme.md-hue-2 .md-select-icon, md-select.md-hue-2 .md-select-icon{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme.md-hue-2 md-content md-optgroup, md-select-menu.md-hue-2 md-content md-optgroup{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme.md-hue-2 md-content md-option, md-select-menu.md-hue-2 md-content md-option{color:rgba(0,0,0,0.87)}md-select-menu.md-default-theme.md-hue-2 md-content md-option[disabled] .md-text, md-select-menu.md-hue-2 md-content md-option[disabled] .md-text{color:rgba(0,0,0,0.38)}md-select-menu.md-default-theme.md-hue-2 md-content md-option[selected], md-select-menu.md-hue-2 md-content md-option[selected]{color:rgb(33,150,243)}md-select-menu.md-default-theme.md-hue-2 md-content md-option[selected]:focus, md-select-menu.md-hue-2 md-content md-option[selected]:focus{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme.md-hue-2 .md-ripple, .md-checkbox-enabled.md-hue-2 .md-ripple{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme.md-hue-2 .md-ink-ripple, .md-checkbox-enabled.md-hue-2 .md-ink-ripple{color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme.md-hue-2[selected] .md-ink-ripple, .md-checkbox-enabled.md-hue-2[selected] .md-ink-ripple{color:rgba(25,118,210,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-2:not(.md-checked) .md-icon, .md-checkbox-enabled.md-hue-2:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme.md-hue-2[selected] .md-icon, .md-checkbox-enabled.md-hue-2[selected] .md-icon{background-color:rgba(25,118,210,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-2[selected].md-focused .md-container:before, .md-checkbox-enabled.md-hue-2[selected].md-focused .md-container:before{background-color:rgba(25,118,210,0.26)}.md-checkbox-enabled.md-default-theme.md-hue-2[selected] .md-icon:after, .md-checkbox-enabled.md-hue-2[selected] .md-icon:after{border-color:rgba(255,255,255,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-2 .md-indeterminate[disabled] .md-container, .md-checkbox-enabled.md-hue-2 .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}.md-checkbox-enabled.md-default-theme.md-hue-2 md-option .md-text, .md-checkbox-enabled.md-hue-2 md-option .md-text{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-2.md-primary .md-focus-ring, md-slider.md-hue-2.md-primary .md-focus-ring{background-color:rgba(144,202,249,0.38)}md-slider.md-default-theme.md-hue-2.md-primary .md-track.md-track-fill, md-slider.md-hue-2.md-primary .md-track.md-track-fill{background-color:rgb(25,118,210)}md-slider.md-default-theme.md-hue-2.md-primary .md-thumb:after, md-slider.md-hue-2.md-primary .md-thumb:after{border-color:rgb(25,118,210);background-color:rgb(25,118,210)}md-slider.md-default-theme.md-hue-2.md-primary .md-sign, md-slider.md-hue-2.md-primary .md-sign{background-color:rgb(25,118,210)}md-slider.md-default-theme.md-hue-2.md-primary .md-sign:after, md-slider.md-hue-2.md-primary .md-sign:after{border-top-color:rgb(25,118,210)}md-slider.md-default-theme.md-hue-2.md-primary[md-vertical] .md-sign:after, md-slider.md-hue-2.md-primary[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(25,118,210)}md-slider.md-default-theme.md-hue-2.md-primary .md-thumb-text, md-slider.md-hue-2.md-primary .md-thumb-text{color:rgba(255,255,255,0.87)}md-slider.md-default-theme.md-hue-2[disabled] .md-thumb:after, md-slider.md-hue-2[disabled] .md-thumb:after{border-color:transparent}md-slider-container[disabled]>:first-child:not(md-slider),md-slider-container[disabled]>:last-child:not(md-slider){color:rgba(0,0,0,0.38)}.md-subheader.md-default-theme.md-hue-2.md-primary, .md-subheader.md-hue-2.md-primary{color:rgb(25,118,210)}md-switch.md-default-theme.md-hue-2.md-checked.md-primary .md-ink-ripple, md-switch.md-hue-2.md-checked.md-primary .md-ink-ripple{color:rgb(25,118,210)}md-switch.md-default-theme.md-hue-2.md-checked.md-primary .md-thumb, md-switch.md-hue-2.md-checked.md-primary .md-thumb{background-color:rgb(25,118,210)}md-switch.md-default-theme.md-hue-2.md-checked.md-primary .md-bar, md-switch.md-hue-2.md-checked.md-primary .md-bar{background-color:rgba(25,118,210,0.5)}md-switch.md-default-theme.md-hue-2.md-checked.md-primary.md-focused .md-thumb:before, md-switch.md-hue-2.md-checked.md-primary.md-focused .md-thumb:before{background-color:rgba(25,118,210,0.26)}md-tabs.md-default-theme.md-hue-2 .md-paginator md-icon, md-tabs.md-hue-2 .md-paginator md-icon{color:rgb(25,118,210)}md-tabs.md-default-theme.md-hue-2 .md-tab, md-tabs.md-hue-2 .md-tab{color:rgba(0,0,0,0.54)}md-tabs.md-default-theme.md-hue-2 .md-tab[disabled], md-tabs.md-hue-2 .md-tab[disabled],md-tabs.md-default-theme.md-hue-2 .md-tab[disabled] md-icon, md-tabs.md-hue-2 .md-tab[disabled] md-icon{color:rgba(0,0,0,0.38)}md-tabs.md-default-theme.md-hue-2 .md-tab.md-active, md-tabs.md-hue-2 .md-tab.md-active,md-tabs.md-default-theme.md-hue-2 .md-tab.md-active md-icon, md-tabs.md-hue-2 .md-tab.md-active md-icon,md-tabs.md-default-theme.md-hue-2 .md-tab.md-focused, md-tabs.md-hue-2 .md-tab.md-focused,md-tabs.md-default-theme.md-hue-2 .md-tab.md-focused md-icon, md-tabs.md-hue-2 .md-tab.md-focused md-icon{color:rgb(25,118,210)}md-tabs.md-default-theme.md-hue-2 .md-tab.md-focused, md-tabs.md-hue-2 .md-tab.md-focused{background:rgba(25,118,210,0.1)}md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper, md-tabs.md-hue-2.md-primary>md-tabs-wrapper{background-color:rgb(25,118,210)}md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(255,255,255,0.87)}md-tabs.md-default-theme.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-2.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper, md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper{background-color:rgb(25,118,210)}md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(255,255,255,0.87)}md-toolbar>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toast.md-default-theme.md-hue-2 .md-toast-content .md-button.md-highlight.md-primary, md-toast.md-hue-2 .md-toast-content .md-button.md-highlight.md-primary{color:rgb(25,118,210)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar), md-toolbar.md-hue-2:not(.md-menu-toolbar){background-color:rgb(25,118,210);color:rgba(255,255,255,0.87)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar) md-icon, md-toolbar.md-hue-2:not(.md-menu-toolbar) md-icon{color:rgba(255,255,255,0.87);fill:rgba(255,255,255,0.87)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar) .md-button[disabled] md-icon, md-toolbar.md-hue-2:not(.md-menu-toolbar) .md-button[disabled] md-icon{color:rgba(255,255,255,0.26);fill:rgba(255,255,255,0.26)}
-md-autocomplete.md-default-theme.md-hue-3 input, md-autocomplete.md-hue-3 input{color:rgba(0,0,0,0.87)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-3 li, .md-autocomplete-suggestions-container.md-hue-3 li{color:rgba(0,0,0,0.87)}md-bottom-sheet.md-default-theme.md-hue-3.md-list md-list-item, md-bottom-sheet.md-hue-3.md-list md-list-item{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3.md-primary, .md-button.md-hue-3.md-primary{color:rgb(68,138,255)}.md-button.md-default-theme.md-hue-3.md-primary.md-fab, .md-button.md-hue-3.md-primary.md-fab,.md-button.md-default-theme.md-hue-3.md-primary.md-raised, .md-button.md-hue-3.md-primary.md-raised{color:rgba(0,0,0,0.87);background-color:rgb(68,138,255)}.md-button.md-default-theme.md-hue-3.md-primary.md-fab:not([disabled]) md-icon, .md-button.md-hue-3.md-primary.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-3.md-primary.md-raised:not([disabled]) md-icon, .md-button.md-hue-3.md-primary.md-raised:not([disabled]) md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3.md-primary.md-fab:not([disabled]).md-focused, .md-button.md-hue-3.md-primary.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3.md-primary.md-fab:not([disabled]):hover, .md-button.md-hue-3.md-primary.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-3.md-primary.md-raised:not([disabled]).md-focused, .md-button.md-hue-3.md-primary.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3.md-primary.md-raised:not([disabled]):hover, .md-button.md-hue-3.md-primary.md-raised:not([disabled]):hover{background-color:rgb(30,136,229)}.md-button.md-default-theme.md-hue-3.md-primary:not([disabled]) md-icon, .md-button.md-hue-3.md-primary:not([disabled]) md-icon{color:rgb(68,138,255)}._md a.md-default-theme.md-hue-3:not(.md-button).md-primary, ._md a.md-hue-3:not(.md-button).md-primary{color:rgb(68,138,255)}._md a.md-default-theme.md-hue-3:not(.md-button).md-primary:hover, ._md a.md-hue-3:not(.md-button).md-primary:hover{color:rgb(25,118,210)}md-card.md-default-theme.md-hue-3 .md-card-image, md-card.md-hue-3 .md-card-image{border-radius:2px 2px 0 0}md-card.md-default-theme.md-hue-3 md-card-header md-card-header-text .md-subhead, md-card.md-hue-3 md-card-header md-card-header-text .md-subhead,md-card.md-default-theme.md-hue-3 md-card-title md-card-title-text:not(:only-child) .md-subhead, md-card.md-hue-3 md-card-title md-card-title-text:not(:only-child) .md-subhead{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-3 .md-ink-ripple, md-checkbox.md-hue-3 .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-3:not(.md-checked) .md-icon, md-checkbox.md-hue-3:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary .md-ripple, md-checkbox.md-hue-3:not([disabled]).md-primary .md-ripple{color:rgb(30,136,229)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-ripple, md-checkbox.md-hue-3:not([disabled]).md-primary.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary .md-ink-ripple, md-checkbox.md-hue-3:not([disabled]).md-primary .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-ink-ripple, md-checkbox.md-hue-3:not([disabled]).md-primary.md-checked .md-ink-ripple{color:rgba(68,138,255,0.87)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary:not(.md-checked) .md-icon, md-checkbox.md-hue-3:not([disabled]).md-primary:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-icon, md-checkbox.md-hue-3:not([disabled]).md-primary.md-checked .md-icon{background-color:rgba(68,138,255,0.87)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked.md-focused .md-container:before, md-checkbox.md-hue-3:not([disabled]).md-primary.md-checked.md-focused .md-container:before{background-color:rgba(68,138,255,0.26)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-icon:after, md-checkbox.md-hue-3:not([disabled]).md-primary.md-checked .md-icon:after{border-color:rgba(0,0,0,0.87)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-primary .md-indeterminate[disabled] .md-container, md-checkbox.md-hue-3:not([disabled]).md-primary .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-3[disabled]:not(.md-checked) .md-icon, md-checkbox.md-hue-3[disabled]:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-3[disabled] .md-icon:after, md-checkbox.md-hue-3[disabled] .md-icon:after{border-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-3[disabled] .md-label, md-checkbox.md-hue-3[disabled] .md-label{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-3 .md-chips, md-chips.md-hue-3 .md-chips{box-shadow:0 1px rgba(0,0,0,0.12)}md-chips.md-default-theme.md-hue-3 .md-chips.md-focused, md-chips.md-hue-3 .md-chips.md-focused{box-shadow:0 2px rgb(68,138,255)}md-chips.md-default-theme.md-hue-3 .md-chips .md-chip-input-container input, md-chips.md-hue-3 .md-chips .md-chip-input-container input{color:rgba(0,0,0,0.87)}md-chips.md-default-theme.md-hue-3 .md-chips .md-chip-input-container input:-moz-placeholder, md-chips.md-hue-3 .md-chips .md-chip-input-container input:-moz-placeholder,md-chips.md-default-theme.md-hue-3 .md-chips .md-chip-input-container input::-moz-placeholder, md-chips.md-hue-3 .md-chips .md-chip-input-container input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-3 .md-chips .md-chip-input-container input:-ms-input-placeholder, md-chips.md-hue-3 .md-chips .md-chip-input-container input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-3 .md-chips .md-chip-input-container input::-webkit-input-placeholder, md-chips.md-hue-3 .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-chips.md-default-theme.md-hue-3 md-chip.md-focused, md-chips.md-hue-3 md-chip.md-focused{background:rgb(68,138,255);color:rgba(0,0,0,0.87)}md-chips.md-default-theme.md-hue-3 md-chip.md-focused md-icon, md-chips.md-hue-3 md-chip.md-focused md-icon{color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-3 .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator, .md-hue-3 .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator{border:1px solid rgb(33,150,243)}.md-default-theme.md-hue-3 .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled, .md-hue-3 .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled{color:rgba(33,150,243,0.6)}.md-default-theme.md-hue-3 .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-hue-3 .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator,.md-default-theme.md-hue-3 .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator, .md-hue-3 .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator{background:rgb(33,150,243);color:rgba(0,0,0,0.87);border-color:transparent}.md-default-theme.md-hue-3 .md-calendar-date-disabled, .md-hue-3 .md-calendar-date-disabled,.md-default-theme.md-hue-3 .md-calendar-month-label-disabled, .md-hue-3 .md-calendar-month-label-disabled{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-3 .md-calendar-month-label md-icon, .md-hue-3 .md-calendar-month-label md-icon,.md-default-theme.md-hue-3 .md-datepicker-input, .md-hue-3 .md-datepicker-input{color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-3 .md-datepicker-input:-moz-placeholder, .md-hue-3 .md-datepicker-input:-moz-placeholder,.md-default-theme.md-hue-3 .md-datepicker-input::-moz-placeholder, .md-hue-3 .md-datepicker-input::-moz-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-3 .md-datepicker-input:-ms-input-placeholder, .md-hue-3 .md-datepicker-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-3 .md-datepicker-input::-webkit-input-placeholder, .md-hue-3 .md-datepicker-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.md-default-theme.md-hue-3 .md-datepicker-input-container, .md-hue-3 .md-datepicker-input-container{border-bottom-color:rgba(0,0,0,0.12)}.md-default-theme.md-hue-3 .md-datepicker-input-container.md-datepicker-focused, .md-hue-3 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(68,138,255)}.md-default-theme.md-hue-3 .md-datepicker-triangle-button .md-datepicker-expand-triangle, .md-hue-3 .md-datepicker-triangle-button .md-datepicker-expand-triangle{border-top-color:rgba(0,0,0,0.54)}.md-default-theme.md-hue-3 .md-datepicker-open .md-datepicker-calendar-icon, .md-hue-3 .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(68,138,255)}md-dialog.md-default-theme.md-hue-3.md-content-overflow .md-actions, md-dialog.md-hue-3.md-content-overflow .md-actions,md-dialog.md-default-theme.md-hue-3.md-content-overflow md-dialog-actions, md-dialog.md-hue-3.md-content-overflow md-dialog-actions,md-divider.md-default-theme.md-hue-3, md-divider.md-hue-3{border-top-color:rgba(0,0,0,0.12)}.layout-gt-lg-row>md-divider.md-default-theme.md-hue-3, .layout-gt-lg-row>md-divider.md-hue-3,.layout-gt-md-row>md-divider.md-default-theme.md-hue-3, .layout-gt-md-row>md-divider.md-hue-3,.layout-gt-sm-row>md-divider.md-default-theme.md-hue-3, .layout-gt-sm-row>md-divider.md-hue-3,.layout-gt-xs-row>md-divider.md-default-theme.md-hue-3, .layout-gt-xs-row>md-divider.md-hue-3,.layout-lg-row>md-divider.md-default-theme.md-hue-3, .layout-lg-row>md-divider.md-hue-3,.layout-md-row>md-divider.md-default-theme.md-hue-3, .layout-md-row>md-divider.md-hue-3,.layout-row>md-divider.md-default-theme.md-hue-3, .layout-row>md-divider.md-hue-3,.layout-sm-row>md-divider.md-default-theme.md-hue-3, .layout-sm-row>md-divider.md-hue-3,.layout-xl-row>md-divider.md-default-theme.md-hue-3, .layout-xl-row>md-divider.md-hue-3,.layout-xs-row>md-divider.md-default-theme.md-hue-3, .layout-xs-row>md-divider.md-hue-3{border-right-color:rgba(0,0,0,0.12)}md-icon.md-default-theme.md-hue-3, md-icon.md-hue-3{color:rgba(0,0,0,0.54)}md-icon.md-default-theme.md-hue-3.md-primary, md-icon.md-hue-3.md-primary{color:rgb(68,138,255)}md-input-container.md-default-theme.md-hue-3 .md-input, md-input-container.md-hue-3 .md-input{color:rgba(0,0,0,0.87);border-color:rgba(0,0,0,0.12)}md-input-container.md-default-theme.md-hue-3 .md-input:-moz-placeholder, md-input-container.md-hue-3 .md-input:-moz-placeholder,md-input-container.md-default-theme.md-hue-3 .md-input::-moz-placeholder, md-input-container.md-hue-3 .md-input::-moz-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-3 .md-input:-ms-input-placeholder, md-input-container.md-hue-3 .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-3 .md-input::-webkit-input-placeholder, md-input-container.md-hue-3 .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-3>md-icon, md-input-container.md-hue-3>md-icon{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme.md-hue-3 .md-placeholder, md-input-container.md-hue-3 .md-placeholder,md-input-container.md-default-theme.md-hue-3 label, md-input-container.md-hue-3 label{color:rgba(0,0,0,0.38)}md-input-container.md-default-theme.md-hue-3:not(.md-input-focused):not(.md-input-invalid) label.md-required:after, md-input-container.md-hue-3:not(.md-input-focused):not(.md-input-invalid) label.md-required:after{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-3 .md-input-message-animation .md-char-counter, md-input-container.md-hue-3 .md-input-message-animation .md-char-counter,md-input-container.md-default-theme.md-hue-3 .md-input-messages-animation .md-char-counter, md-input-container.md-hue-3 .md-input-messages-animation .md-char-counter{color:rgba(0,0,0,0.87)}md-input-container.md-default-theme.md-hue-3.md-input-focused .md-input:-moz-placeholder, md-input-container.md-hue-3.md-input-focused .md-input:-moz-placeholder,md-input-container.md-default-theme.md-hue-3.md-input-focused .md-input::-moz-placeholder, md-input-container.md-hue-3.md-input-focused .md-input::-moz-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-3.md-input-focused .md-input:-ms-input-placeholder, md-input-container.md-hue-3.md-input-focused .md-input:-ms-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-3.md-input-focused .md-input::-webkit-input-placeholder, md-input-container.md-hue-3.md-input-focused .md-input::-webkit-input-placeholder{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-has-value label, md-input-container.md-hue-3:not(.md-input-invalid).md-input-has-value label{color:rgba(0,0,0,0.54)}md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused .md-input, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused .md-input,md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-resized .md-input, md-input-container.md-hue-3:not(.md-input-invalid).md-input-resized .md-input{border-color:rgb(68,138,255)}md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused label, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused label,md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused md-icon, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused md-icon{color:rgb(68,138,255)}md-list.md-default-theme.md-hue-3 md-list-item.md-2-line .md-list-item-text h3, md-list.md-hue-3 md-list-item.md-2-line .md-list-item-text h3,md-list.md-default-theme.md-hue-3 md-list-item.md-2-line .md-list-item-text h4, md-list.md-hue-3 md-list-item.md-2-line .md-list-item-text h4,md-list.md-default-theme.md-hue-3 md-list-item.md-3-line .md-list-item-text h3, md-list.md-hue-3 md-list-item.md-3-line .md-list-item-text h3,md-list.md-default-theme.md-hue-3 md-list-item.md-3-line .md-list-item-text h4, md-list.md-hue-3 md-list-item.md-3-line .md-list-item-text h4{color:rgba(0,0,0,0.87)}md-list.md-default-theme.md-hue-3 md-list-item.md-2-line .md-list-item-text p, md-list.md-hue-3 md-list-item.md-2-line .md-list-item-text p,md-list.md-default-theme.md-hue-3 md-list-item.md-3-line .md-list-item-text p, md-list.md-hue-3 md-list-item.md-3-line .md-list-item-text p{color:rgba(0,0,0,0.54)}md-list.md-default-theme.md-hue-3 md-list-item>md-icon, md-list.md-hue-3 md-list-item>md-icon{color:rgba(0,0,0,0.54)}md-list.md-default-theme.md-hue-3 md-list-item>md-icon.md-highlight, md-list.md-hue-3 md-list-item>md-icon.md-highlight{color:rgb(68,138,255)}md-menu-content.md-default-theme.md-hue-3 md-menu-item, md-menu-content.md-hue-3 md-menu-item{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme.md-hue-3 md-menu-item md-icon, md-menu-content.md-hue-3 md-menu-item md-icon{color:rgba(0,0,0,0.54)}md-menu-content.md-default-theme.md-hue-3 md-menu-item .md-button[disabled], md-menu-content.md-hue-3 md-menu-item .md-button[disabled],md-menu-content.md-default-theme.md-hue-3 md-menu-item .md-button[disabled] md-icon, md-menu-content.md-hue-3 md-menu-item .md-button[disabled] md-icon{color:rgba(0,0,0,0.38)}md-menu-bar.md-default-theme.md-hue-3>button.md-button, md-menu-bar.md-hue-3>button.md-button{color:rgba(0,0,0,0.87);border-radius:2px}md-menu-bar.md-default-theme.md-hue-3 md-menu>button, md-menu-bar.md-hue-3 md-menu>button{color:rgba(0,0,0,0.87)}md-menu-content.md-default-theme.md-hue-3 .md-menu>.md-button:after, md-menu-content.md-hue-3 .md-menu>.md-button:after{color:rgba(0,0,0,0.54)}md-toolbar.md-default-theme.md-hue-3.md-menu-toolbar md-toolbar-filler, md-toolbar.md-hue-3.md-menu-toolbar md-toolbar-filler{background-color:rgb(68,138,255);color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-3.md-menu-toolbar md-toolbar-filler md-icon, md-toolbar.md-hue-3.md-menu-toolbar md-toolbar-filler md-icon{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-3 .md-button._md-nav-button.md-unselected, md-nav-bar.md-hue-3 .md-button._md-nav-button.md-unselected{color:rgba(0,0,0,0.54)}md-nav-bar.md-default-theme.md-hue-3 .md-button._md-nav-button[disabled], md-nav-bar.md-hue-3 .md-button._md-nav-button[disabled]{color:rgba(0,0,0,0.38)}md-nav-bar.md-default-theme.md-hue-3.md-primary>.md-nav-bar, md-nav-bar.md-hue-3.md-primary>.md-nav-bar{background-color:rgb(68,138,255)}md-nav-bar.md-default-theme.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-nav-bar.md-default-theme.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-3.md-primary>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-toolbar>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar, md-toolbar>md-nav-bar.md-hue-3>.md-nav-bar{background-color:rgb(68,138,255)}md-toolbar>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button, md-toolbar>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button{color:rgb(187,222,251)}md-toolbar>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-toolbar>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-progress-circular.md-default-theme.md-hue-3 path, md-progress-circular.md-hue-3 path{stroke:rgb(68,138,255)}md-progress-linear.md-default-theme.md-hue-3 .md-container, md-progress-linear.md-hue-3 .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-3 .md-bar, md-progress-linear.md-hue-3 .md-bar{background-color:rgb(68,138,255)}md-progress-linear.md-default-theme.md-hue-3[md-mode=buffer].md-primary .md-bar1, md-progress-linear.md-hue-3[md-mode=buffer].md-primary .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-3[md-mode=buffer].md-primary .md-dashed:before, md-progress-linear.md-hue-3[md-mode=buffer].md-primary .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-3 .md-off, md-radio-button.md-hue-3 .md-off{border-color:rgba(0,0,0,0.54)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-primary .md-on, md-radio-button.md-hue-3:not([disabled]).md-primary .md-on,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-on, md-radio-button.md-hue-3:not([disabled]) .md-primary .md-on,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-primary .md-on, md-radio-group.md-hue-3:not([disabled]).md-primary .md-on,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-on, md-radio-group.md-hue-3:not([disabled]) .md-primary .md-on{background-color:rgba(68,138,255,0.87)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-off, md-radio-button.md-hue-3:not([disabled]).md-primary.md-checked .md-off,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-primary.md-checked .md-off, md-radio-button.md-hue-3:not([disabled]) .md-primary.md-checked .md-off,md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-primary .md-checked .md-off, md-radio-button.md-hue-3:not([disabled]).md-primary .md-checked .md-off,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-checked .md-off, md-radio-button.md-hue-3:not([disabled]) .md-primary .md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-off, md-radio-group.md-hue-3:not([disabled]).md-primary.md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-primary.md-checked .md-off, md-radio-group.md-hue-3:not([disabled]) .md-primary.md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-primary .md-checked .md-off, md-radio-group.md-hue-3:not([disabled]).md-primary .md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-checked .md-off, md-radio-group.md-hue-3:not([disabled]) .md-primary .md-checked .md-off{border-color:rgba(68,138,255,0.87)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]) .md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-primary.md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-primary.md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-primary .md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]) .md-primary .md-checked .md-ink-ripple{color:rgba(68,138,255,0.87)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-primary .md-container .md-ripple, md-radio-button.md-hue-3:not([disabled]).md-primary .md-container .md-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-container .md-ripple, md-radio-button.md-hue-3:not([disabled]) .md-primary .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-primary .md-container .md-ripple, md-radio-group.md-hue-3:not([disabled]).md-primary .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-primary .md-container .md-ripple, md-radio-group.md-hue-3:not([disabled]) .md-primary .md-container .md-ripple{color:rgb(30,136,229)}md-radio-button.md-default-theme.md-hue-3[disabled], md-radio-button.md-hue-3[disabled],md-radio-group.md-default-theme.md-hue-3[disabled], md-radio-group.md-hue-3[disabled]{color:rgba(0,0,0,0.38)}md-radio-button.md-default-theme.md-hue-3[disabled] .md-container .md-off, md-radio-button.md-hue-3[disabled] .md-container .md-off,md-radio-button.md-default-theme.md-hue-3[disabled] .md-container .md-on, md-radio-button.md-hue-3[disabled] .md-container .md-on,md-radio-group.md-default-theme.md-hue-3[disabled] .md-container .md-off, md-radio-group.md-hue-3[disabled] .md-container .md-off,md-radio-group.md-default-theme.md-hue-3[disabled] .md-container .md-on, md-radio-group.md-hue-3[disabled] .md-container .md-on{border-color:rgba(0,0,0,0.38)}md-radio-group.md-default-theme.md-hue-3 .md-checked:not([disabled]).md-primary .md-ink-ripple, md-radio-group.md-hue-3 .md-checked:not([disabled]).md-primary .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3.md-primary .md-checked:not([disabled]) .md-ink-ripple, md-radio-group.md-hue-3.md-primary .md-checked:not([disabled]) .md-ink-ripple{color:rgba(68,138,255,0.26)}md-radio-group.md-default-theme.md-hue-3.md-focused:not(:empty) .md-checked.md-primary .md-container:before, md-radio-group.md-hue-3.md-focused:not(:empty) .md-checked.md-primary .md-container:before,md-radio-group.md-default-theme.md-hue-3.md-focused:not(:empty).md-primary .md-checked .md-container:before, md-radio-group.md-hue-3.md-focused:not(:empty).md-primary .md-checked .md-container:before{background-color:rgba(68,138,255,0.26)}md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-default-theme.md-hue-3 .md-select-value span:first-child:after, md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-hue-3 .md-select-value span:first-child:after{color:rgba(0,0,0,0.38)}md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme.md-hue-3 .md-select-value, md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-hue-3 .md-select-value,md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-default-theme.md-hue-3 .md-select-value.md-select-placeholder, md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-hue-3 .md-select-value.md-select-placeholder{color:rgb(68,138,255)}md-input-container.md-input-invalid md-select.md-default-theme.md-hue-3.md-no-underline .md-select-value, md-input-container.md-input-invalid md-select.md-hue-3.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-3 .md-select-value, md-select.md-hue-3 .md-select-value{border-bottom-color:rgba(0,0,0,0.12)}md-select.md-default-theme.md-hue-3 .md-select-value.md-select-placeholder, md-select.md-hue-3 .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme.md-hue-3.md-no-underline .md-select-value, md-select.md-hue-3.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-3.ng-invalid.ng-touched.md-no-underline .md-select-value, md-select.md-hue-3.ng-invalid.ng-touched.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-3:not([disabled]):focus .md-select-value, md-select.md-hue-3:not([disabled]):focus .md-select-value{border-bottom-color:rgb(68,138,255);color:rgba(0,0,0,0.87)}md-select.md-default-theme.md-hue-3:not([disabled]):focus .md-select-value.md-select-placeholder, md-select.md-hue-3:not([disabled]):focus .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.87)}md-select.md-default-theme.md-hue-3:not([disabled]):focus.md-no-underline .md-select-value, md-select.md-hue-3:not([disabled]):focus.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-default-theme.md-hue-3[disabled] .md-select-icon, md-select.md-hue-3[disabled] .md-select-icon,md-select.md-default-theme.md-hue-3[disabled] .md-select-value, md-select.md-hue-3[disabled] .md-select-value,md-select.md-default-theme.md-hue-3[disabled] .md-select-value.md-select-placeholder, md-select.md-hue-3[disabled] .md-select-value.md-select-placeholder{color:rgba(0,0,0,0.38)}md-select.md-default-theme.md-hue-3 .md-select-icon, md-select.md-hue-3 .md-select-icon{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme.md-hue-3 md-content md-optgroup, md-select-menu.md-hue-3 md-content md-optgroup{color:rgba(0,0,0,0.54)}md-select-menu.md-default-theme.md-hue-3 md-content md-option, md-select-menu.md-hue-3 md-content md-option{color:rgba(0,0,0,0.87)}md-select-menu.md-default-theme.md-hue-3 md-content md-option[disabled] .md-text, md-select-menu.md-hue-3 md-content md-option[disabled] .md-text{color:rgba(0,0,0,0.38)}md-select-menu.md-default-theme.md-hue-3 md-content md-option[selected], md-select-menu.md-hue-3 md-content md-option[selected]{color:rgb(33,150,243)}md-select-menu.md-default-theme.md-hue-3 md-content md-option[selected]:focus, md-select-menu.md-hue-3 md-content md-option[selected]:focus{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme.md-hue-3 .md-ripple, .md-checkbox-enabled.md-hue-3 .md-ripple{color:rgb(30,136,229)}.md-checkbox-enabled.md-default-theme.md-hue-3 .md-ink-ripple, .md-checkbox-enabled.md-hue-3 .md-ink-ripple{color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme.md-hue-3[selected] .md-ink-ripple, .md-checkbox-enabled.md-hue-3[selected] .md-ink-ripple{color:rgba(68,138,255,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-3:not(.md-checked) .md-icon, .md-checkbox-enabled.md-hue-3:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}.md-checkbox-enabled.md-default-theme.md-hue-3[selected] .md-icon, .md-checkbox-enabled.md-hue-3[selected] .md-icon{background-color:rgba(68,138,255,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-3[selected].md-focused .md-container:before, .md-checkbox-enabled.md-hue-3[selected].md-focused .md-container:before{background-color:rgba(68,138,255,0.26)}.md-checkbox-enabled.md-default-theme.md-hue-3[selected] .md-icon:after, .md-checkbox-enabled.md-hue-3[selected] .md-icon:after{border-color:rgba(0,0,0,0.87)}.md-checkbox-enabled.md-default-theme.md-hue-3 .md-indeterminate[disabled] .md-container, .md-checkbox-enabled.md-hue-3 .md-indeterminate[disabled] .md-container{color:rgba(0,0,0,0.38)}.md-checkbox-enabled.md-default-theme.md-hue-3 md-option .md-text, .md-checkbox-enabled.md-hue-3 md-option .md-text{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-3.md-primary .md-focus-ring, md-slider.md-hue-3.md-primary .md-focus-ring{background-color:rgba(144,202,249,0.38)}md-slider.md-default-theme.md-hue-3.md-primary .md-track.md-track-fill, md-slider.md-hue-3.md-primary .md-track.md-track-fill{background-color:rgb(68,138,255)}md-slider.md-default-theme.md-hue-3.md-primary .md-thumb:after, md-slider.md-hue-3.md-primary .md-thumb:after{border-color:rgb(68,138,255);background-color:rgb(68,138,255)}md-slider.md-default-theme.md-hue-3.md-primary .md-sign, md-slider.md-hue-3.md-primary .md-sign{background-color:rgb(68,138,255)}md-slider.md-default-theme.md-hue-3.md-primary .md-sign:after, md-slider.md-hue-3.md-primary .md-sign:after{border-top-color:rgb(68,138,255)}md-slider.md-default-theme.md-hue-3.md-primary[md-vertical] .md-sign:after, md-slider.md-hue-3.md-primary[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(68,138,255)}md-slider.md-default-theme.md-hue-3.md-primary .md-thumb-text, md-slider.md-hue-3.md-primary .md-thumb-text{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-3[disabled] .md-thumb:after, md-slider.md-hue-3[disabled] .md-thumb:after{border-color:transparent}md-slider-container[disabled]>:first-child:not(md-slider),md-slider-container[disabled]>:last-child:not(md-slider){color:rgba(0,0,0,0.38)}.md-subheader.md-default-theme.md-hue-3.md-primary, .md-subheader.md-hue-3.md-primary{color:rgb(68,138,255)}md-switch.md-default-theme.md-hue-3.md-checked.md-primary .md-ink-ripple, md-switch.md-hue-3.md-checked.md-primary .md-ink-ripple{color:rgb(68,138,255)}md-switch.md-default-theme.md-hue-3.md-checked.md-primary .md-thumb, md-switch.md-hue-3.md-checked.md-primary .md-thumb{background-color:rgb(68,138,255)}md-switch.md-default-theme.md-hue-3.md-checked.md-primary .md-bar, md-switch.md-hue-3.md-checked.md-primary .md-bar{background-color:rgba(68,138,255,0.5)}md-switch.md-default-theme.md-hue-3.md-checked.md-primary.md-focused .md-thumb:before, md-switch.md-hue-3.md-checked.md-primary.md-focused .md-thumb:before{background-color:rgba(68,138,255,0.26)}md-tabs.md-default-theme.md-hue-3 .md-paginator md-icon, md-tabs.md-hue-3 .md-paginator md-icon{color:rgb(68,138,255)}md-tabs.md-default-theme.md-hue-3 .md-tab, md-tabs.md-hue-3 .md-tab{color:rgba(0,0,0,0.54)}md-tabs.md-default-theme.md-hue-3 .md-tab[disabled], md-tabs.md-hue-3 .md-tab[disabled],md-tabs.md-default-theme.md-hue-3 .md-tab[disabled] md-icon, md-tabs.md-hue-3 .md-tab[disabled] md-icon{color:rgba(0,0,0,0.38)}md-tabs.md-default-theme.md-hue-3 .md-tab.md-active, md-tabs.md-hue-3 .md-tab.md-active,md-tabs.md-default-theme.md-hue-3 .md-tab.md-active md-icon, md-tabs.md-hue-3 .md-tab.md-active md-icon,md-tabs.md-default-theme.md-hue-3 .md-tab.md-focused, md-tabs.md-hue-3 .md-tab.md-focused,md-tabs.md-default-theme.md-hue-3 .md-tab.md-focused md-icon, md-tabs.md-hue-3 .md-tab.md-focused md-icon{color:rgb(68,138,255)}md-tabs.md-default-theme.md-hue-3 .md-tab.md-focused, md-tabs.md-hue-3 .md-tab.md-focused{background:rgba(68,138,255,0.1)}md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper, md-tabs.md-hue-3.md-primary>md-tabs-wrapper{background-color:rgb(68,138,255)}md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-tabs.md-default-theme.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-3.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper, md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper{background-color:rgb(68,138,255)}md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(187,222,251)}md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-toolbar>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toast.md-default-theme.md-hue-3 .md-toast-content .md-button.md-highlight.md-primary, md-toast.md-hue-3 .md-toast-content .md-button.md-highlight.md-primary{color:rgb(68,138,255)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar), md-toolbar.md-hue-3:not(.md-menu-toolbar){background-color:rgb(68,138,255);color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar) md-icon, md-toolbar.md-hue-3:not(.md-menu-toolbar) md-icon{color:rgba(0,0,0,0.87);fill:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar) .md-button[disabled] md-icon, md-toolbar.md-hue-3:not(.md-menu-toolbar) .md-button[disabled] md-icon{color:rgba(0,0,0,0.26);fill:rgba(0,0,0,0.26)}
-.md-button.md-default-theme.md-fab md-icon, .md-button.md-fab md-icon{color:rgba(255,255,255,0.87)}.md-button.md-default-theme.md-fab, .md-button.md-fab{background-color:rgb(21,101,192);color:rgba(255,255,255,0.87)}.md-button.md-default-theme.md-fab:not([disabled]) .md-icon, .md-button.md-fab:not([disabled]) .md-icon{color:rgba(255,255,255,0.87)}.md-button.md-default-theme.md-fab:not([disabled]).md-focused, .md-button.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-fab:not([disabled]):hover, .md-button.md-fab:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-accent, .md-button.md-accent{color:rgb(21,101,192)}.md-button.md-default-theme.md-accent.md-fab, .md-button.md-accent.md-fab,.md-button.md-default-theme.md-accent.md-raised, .md-button.md-accent.md-raised{color:rgba(255,255,255,0.87);background-color:rgb(21,101,192)}.md-button.md-default-theme.md-accent.md-fab:not([disabled]) md-icon, .md-button.md-accent.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-accent.md-raised:not([disabled]) md-icon, .md-button.md-accent.md-raised:not([disabled]) md-icon{color:rgba(255,255,255,0.87)}.md-button.md-default-theme.md-accent.md-fab:not([disabled]).md-focused, .md-button.md-accent.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-accent.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-accent.md-raised:not([disabled]).md-focused, .md-button.md-accent.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-accent.md-raised:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-accent:not([disabled]) md-icon, .md-button.md-accent:not([disabled]) md-icon{color:rgb(21,101,192)}.md-button.md-default-theme.md-accent[disabled], .md-button.md-accent[disabled],.md-button.md-default-theme.md-fab[disabled], .md-button.md-fab[disabled],.md-button.md-default-theme.md-raised[disabled], .md-button.md-raised[disabled],.md-button.md-default-theme.md-warn[disabled], .md-button.md-warn[disabled],.md-button.md-default-theme[disabled], .md-button[disabled]{color:rgba(0,0,0,0.38);cursor:default}.md-button.md-default-theme.md-accent[disabled] md-icon, .md-button.md-accent[disabled] md-icon,.md-button.md-default-theme.md-fab[disabled] md-icon, .md-button.md-fab[disabled] md-icon,.md-button.md-default-theme.md-raised[disabled] md-icon, .md-button.md-raised[disabled] md-icon,.md-button.md-default-theme.md-warn[disabled] md-icon, .md-button.md-warn[disabled] md-icon,.md-button.md-default-theme[disabled] md-icon, .md-button[disabled] md-icon{color:rgba(0,0,0,0.38)}._md a.md-default-theme:not(.md-button).md-accent, ._md a:not(.md-button).md-accent{color:rgb(21,101,192)}._md a.md-default-theme:not(.md-button).md-accent:hover, ._md a:not(.md-button).md-accent:hover{color:rgb(41,98,255)}md-checkbox.md-default-theme .md-ripple, md-checkbox .md-ripple{color:rgb(41,98,255)}md-checkbox.md-default-theme.md-checked.md-focused .md-container:before, md-checkbox.md-checked.md-focused .md-container:before{background-color:rgba(21,101,192,0.26)}md-checkbox.md-default-theme.md-checked .md-ink-ripple, md-checkbox.md-checked .md-ink-ripple{color:rgba(21,101,192,0.87)}md-checkbox.md-default-theme.md-checked .md-icon, md-checkbox.md-checked .md-icon{background-color:rgba(21,101,192,0.87)}md-checkbox.md-default-theme.md-checked .md-icon:after, md-checkbox.md-checked .md-icon:after{border-color:rgba(255,255,255,0.87)}.md-accent .md-default-theme .md-datepicker-input-container.md-datepicker-focused, .md-accent .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(21,101,192)}.md-accent .md-default-theme .md-datepicker-open .md-datepicker-calendar-icon, .md-accent .md-datepicker-open .md-datepicker-calendar-icon,.md-default-theme .md-datepicker-open.md-accent .md-datepicker-calendar-icon, .md-datepicker-open.md-accent .md-datepicker-calendar-icon{color:rgb(21,101,192)}md-icon.md-default-theme.md-accent, md-icon.md-accent{color:rgb(21,101,192)}md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input, md-input-container:not(.md-input-invalid).md-input-focused.md-accent .md-input{border-color:rgb(21,101,192)}md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused.md-accent label, md-input-container:not(.md-input-invalid).md-input-focused.md-accent label,md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused.md-accent md-icon, md-input-container:not(.md-input-invalid).md-input-focused.md-accent md-icon{color:rgb(21,101,192)}md-list.md-default-theme md-list-item>md-icon.md-highlight.md-accent, md-list md-list-item>md-icon.md-highlight.md-accent{color:rgb(21,101,192)}md-nav-bar.md-default-theme md-nav-ink-bar, md-nav-bar md-nav-ink-bar{color:rgb(21,101,192);background:rgb(21,101,192)}md-nav-bar.md-default-theme.md-accent>.md-nav-bar, md-nav-bar.md-accent>.md-nav-bar{background-color:rgb(21,101,192)}md-nav-bar.md-default-theme.md-accent>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-accent>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-nav-bar.md-default-theme.md-accent>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-accent>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(255,255,255,0.87)}md-nav-bar.md-default-theme.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-nav-bar.md-default-theme.md-accent>.md-nav-bar md-nav-ink-bar, md-nav-bar.md-accent>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-nav-bar.md-default-theme>.md-nav-bar, md-toolbar.md-accent>md-nav-bar>.md-nav-bar{background-color:rgb(21,101,192)}md-toolbar.md-accent>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-accent>md-nav-bar>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-toolbar.md-accent>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-accent>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-accent>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(255,255,255,0.87)}md-toolbar.md-accent>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-toolbar.md-accent>md-nav-bar.md-default-theme>.md-nav-bar md-nav-ink-bar, md-toolbar.md-accent>md-nav-bar>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-progress-circular.md-default-theme.md-accent path, md-progress-circular.md-accent path{stroke:rgb(21,101,192)}md-progress-linear.md-default-theme.md-accent .md-container, md-progress-linear.md-accent .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-accent .md-bar, md-progress-linear.md-accent .md-bar{background-color:rgb(21,101,192)}md-progress-linear.md-default-theme[md-mode=buffer].md-accent .md-bar1, md-progress-linear[md-mode=buffer].md-accent .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme[md-mode=buffer].md-accent .md-dashed:before, md-progress-linear[md-mode=buffer].md-accent .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme .md-on, md-radio-button .md-on{background-color:rgba(21,101,192,0.87)}md-radio-button.md-default-theme.md-checked .md-off, md-radio-button.md-checked .md-off{border-color:rgba(21,101,192,0.87)}md-radio-button.md-default-theme.md-checked .md-ink-ripple, md-radio-button.md-checked .md-ink-ripple{color:rgba(21,101,192,0.87)}md-radio-button.md-default-theme .md-container .md-ripple, md-radio-button .md-container .md-ripple{color:rgb(41,98,255)}md-radio-group.md-default-theme .md-checked .md-ink-ripple, md-radio-group .md-checked .md-ink-ripple{color:rgba(21,101,192,0.26)}md-radio-group.md-default-theme.md-focused:not(:empty) .md-checked .md-container:before, md-radio-group.md-focused:not(:empty) .md-checked .md-container:before{background-color:rgba(21,101,192,0.26)}md-select.md-default-theme:not([disabled]):focus.md-accent .md-select-value, md-select:not([disabled]):focus.md-accent .md-select-value{border-bottom-color:rgb(21,101,192)}md-select-menu.md-default-theme md-content md-option[selected].md-accent, md-select-menu md-content md-option[selected].md-accent{color:rgb(21,101,192)}md-select-menu.md-default-theme md-content md-option[selected].md-accent:focus, md-select-menu md-content md-option[selected].md-accent:focus{color:rgb(41,98,255)}md-slider.md-default-theme .md-focus-ring, md-slider .md-focus-ring{background-color:rgba(68,138,255,0.2)}md-slider.md-default-theme .md-track.md-track-fill, md-slider .md-track.md-track-fill{background-color:rgb(21,101,192)}md-slider.md-default-theme .md-thumb:after, md-slider .md-thumb:after{border-color:rgb(21,101,192);background-color:rgb(21,101,192)}md-slider.md-default-theme .md-sign, md-slider .md-sign{background-color:rgb(21,101,192)}md-slider.md-default-theme .md-sign:after, md-slider .md-sign:after{border-top-color:rgb(21,101,192)}md-slider.md-default-theme[md-vertical] .md-sign:after, md-slider[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(21,101,192)}md-slider.md-default-theme .md-thumb-text, md-slider .md-thumb-text{color:rgba(255,255,255,0.87)}.md-subheader.md-default-theme.md-accent, .md-subheader.md-accent{color:rgb(21,101,192)}md-switch.md-default-theme.md-checked .md-ink-ripple, md-switch.md-checked .md-ink-ripple{color:rgb(21,101,192)}md-switch.md-default-theme.md-checked .md-thumb, md-switch.md-checked .md-thumb{background-color:rgb(21,101,192)}md-switch.md-default-theme.md-checked .md-bar, md-switch.md-checked .md-bar{background-color:rgba(21,101,192,0.5)}md-switch.md-default-theme.md-checked.md-focused .md-thumb:before, md-switch.md-checked.md-focused .md-thumb:before{background-color:rgba(21,101,192,0.26)}md-tabs.md-default-theme md-ink-bar, md-tabs md-ink-bar{color:rgb(21,101,192);background:rgb(21,101,192)}md-tabs.md-default-theme .md-tab .md-ripple-container, md-tabs .md-tab .md-ripple-container{color:rgb(130,177,255)}md-tabs.md-default-theme.md-accent>md-tabs-wrapper, md-tabs.md-accent>md-tabs-wrapper{background-color:rgb(21,101,192)}md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(255,255,255,0.87)}md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-tabs.md-default-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-tabs.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper, md-toolbar.md-accent>md-tabs>md-tabs-wrapper{background-color:rgb(21,101,192)}md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(255,255,255,0.87)}md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toolbar.md-accent>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-toolbar.md-accent>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toast.md-default-theme .md-toast-content .md-button.md-highlight, md-toast .md-toast-content .md-button.md-highlight{color:rgb(21,101,192)}md-toolbar.md-default-theme:not(.md-menu-toolbar).md-accent, md-toolbar:not(.md-menu-toolbar).md-accent{background-color:rgb(21,101,192);color:rgba(255,255,255,0.87)}md-toolbar.md-default-theme:not(.md-menu-toolbar).md-accent .md-ink-ripple, md-toolbar:not(.md-menu-toolbar).md-accent .md-ink-ripple{color:rgba(255,255,255,0.87)}md-toolbar.md-default-theme:not(.md-menu-toolbar).md-accent md-icon, md-toolbar:not(.md-menu-toolbar).md-accent md-icon{color:rgba(255,255,255,0.87);fill:rgba(255,255,255,0.87)}md-toolbar.md-default-theme:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon, md-toolbar:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon{color:rgba(255,255,255,0.26);fill:rgba(255,255,255,0.26)}
-.md-button.md-default-theme.md-hue-1.md-fab md-icon, .md-button.md-hue-1.md-fab md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1.md-fab, .md-button.md-hue-1.md-fab{background-color:rgb(227,242,253);color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1.md-fab:not([disabled]) .md-icon, .md-button.md-hue-1.md-fab:not([disabled]) .md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1.md-fab:not([disabled]).md-focused, .md-button.md-hue-1.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1.md-fab:not([disabled]):hover, .md-button.md-hue-1.md-fab:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-1.md-accent, .md-button.md-hue-1.md-accent{color:rgb(227,242,253)}.md-button.md-default-theme.md-hue-1.md-accent.md-fab, .md-button.md-hue-1.md-accent.md-fab,.md-button.md-default-theme.md-hue-1.md-accent.md-raised, .md-button.md-hue-1.md-accent.md-raised{color:rgba(0,0,0,0.87);background-color:rgb(227,242,253)}.md-button.md-default-theme.md-hue-1.md-accent.md-fab:not([disabled]) md-icon, .md-button.md-hue-1.md-accent.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-1.md-accent.md-raised:not([disabled]) md-icon, .md-button.md-hue-1.md-accent.md-raised:not([disabled]) md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1.md-accent.md-fab:not([disabled]).md-focused, .md-button.md-hue-1.md-accent.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1.md-accent.md-fab:not([disabled]):hover, .md-button.md-hue-1.md-accent.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-1.md-accent.md-raised:not([disabled]).md-focused, .md-button.md-hue-1.md-accent.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1.md-accent.md-raised:not([disabled]):hover, .md-button.md-hue-1.md-accent.md-raised:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-1.md-accent:not([disabled]) md-icon, .md-button.md-hue-1.md-accent:not([disabled]) md-icon{color:rgb(227,242,253)}.md-button.md-default-theme.md-hue-1.md-accent[disabled], .md-button.md-hue-1.md-accent[disabled],.md-button.md-default-theme.md-hue-1.md-fab[disabled], .md-button.md-hue-1.md-fab[disabled],.md-button.md-default-theme.md-hue-1.md-raised[disabled], .md-button.md-hue-1.md-raised[disabled],.md-button.md-default-theme.md-hue-1.md-warn[disabled], .md-button.md-hue-1.md-warn[disabled],.md-button.md-default-theme.md-hue-1[disabled], .md-button.md-hue-1[disabled]{color:rgba(0,0,0,0.38);cursor:default}.md-button.md-default-theme.md-hue-1.md-accent[disabled] md-icon, .md-button.md-hue-1.md-accent[disabled] md-icon,.md-button.md-default-theme.md-hue-1.md-fab[disabled] md-icon, .md-button.md-hue-1.md-fab[disabled] md-icon,.md-button.md-default-theme.md-hue-1.md-raised[disabled] md-icon, .md-button.md-hue-1.md-raised[disabled] md-icon,.md-button.md-default-theme.md-hue-1.md-warn[disabled] md-icon, .md-button.md-hue-1.md-warn[disabled] md-icon,.md-button.md-default-theme.md-hue-1[disabled] md-icon, .md-button.md-hue-1[disabled] md-icon{color:rgba(0,0,0,0.38)}._md a.md-default-theme.md-hue-1:not(.md-button).md-accent, ._md a.md-hue-1:not(.md-button).md-accent{color:rgb(227,242,253)}._md a.md-default-theme.md-hue-1:not(.md-button).md-accent:hover, ._md a.md-hue-1:not(.md-button).md-accent:hover{color:rgb(41,98,255)}md-checkbox.md-default-theme.md-hue-1 .md-ripple, md-checkbox.md-hue-1 .md-ripple{color:rgb(41,98,255)}md-checkbox.md-default-theme.md-hue-1.md-checked.md-focused .md-container:before, md-checkbox.md-hue-1.md-checked.md-focused .md-container:before{background-color:rgba(227,242,253,0.26)}md-checkbox.md-default-theme.md-hue-1.md-checked .md-ink-ripple, md-checkbox.md-hue-1.md-checked .md-ink-ripple{color:rgba(227,242,253,0.87)}md-checkbox.md-default-theme.md-hue-1.md-checked .md-icon, md-checkbox.md-hue-1.md-checked .md-icon{background-color:rgba(227,242,253,0.87)}md-checkbox.md-default-theme.md-hue-1.md-checked .md-icon:after, md-checkbox.md-hue-1.md-checked .md-icon:after{border-color:rgba(0,0,0,0.87)}.md-accent .md-default-theme.md-hue-1 .md-datepicker-input-container.md-datepicker-focused, .md-accent .md-hue-1 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(227,242,253)}.md-accent .md-default-theme.md-hue-1 .md-datepicker-open .md-datepicker-calendar-icon, .md-accent .md-hue-1 .md-datepicker-open .md-datepicker-calendar-icon,.md-default-theme.md-hue-1 .md-datepicker-open.md-accent .md-datepicker-calendar-icon, .md-hue-1 .md-datepicker-open.md-accent .md-datepicker-calendar-icon{color:rgb(227,242,253)}md-icon.md-default-theme.md-hue-1.md-accent, md-icon.md-hue-1.md-accent{color:rgb(227,242,253)}md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused.md-accent .md-input, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused.md-accent .md-input{border-color:rgb(227,242,253)}md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused.md-accent label, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused.md-accent label,md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused.md-accent md-icon, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused.md-accent md-icon{color:rgb(227,242,253)}md-list.md-default-theme.md-hue-1 md-list-item>md-icon.md-highlight.md-accent, md-list.md-hue-1 md-list-item>md-icon.md-highlight.md-accent{color:rgb(227,242,253)}md-nav-bar.md-default-theme.md-hue-1 md-nav-ink-bar, md-nav-bar.md-hue-1 md-nav-ink-bar{color:rgb(227,242,253);background:rgb(227,242,253)}md-nav-bar.md-default-theme.md-hue-1.md-accent>.md-nav-bar, md-nav-bar.md-hue-1.md-accent>.md-nav-bar{background-color:rgb(227,242,253)}md-nav-bar.md-default-theme.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-nav-bar.md-default-theme.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-1.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-nav-bar.md-default-theme.md-hue-1.md-accent>.md-nav-bar md-nav-ink-bar, md-nav-bar.md-hue-1.md-accent>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar, md-toolbar.md-accent>md-nav-bar.md-hue-1>.md-nav-bar{background-color:rgb(227,242,253)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-accent>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-accent>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar md-nav-ink-bar, md-toolbar.md-accent>md-nav-bar.md-hue-1>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-progress-circular.md-default-theme.md-hue-1.md-accent path, md-progress-circular.md-hue-1.md-accent path{stroke:rgb(227,242,253)}md-progress-linear.md-default-theme.md-hue-1.md-accent .md-container, md-progress-linear.md-hue-1.md-accent .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-1.md-accent .md-bar, md-progress-linear.md-hue-1.md-accent .md-bar{background-color:rgb(227,242,253)}md-progress-linear.md-default-theme.md-hue-1[md-mode=buffer].md-accent .md-bar1, md-progress-linear.md-hue-1[md-mode=buffer].md-accent .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-1[md-mode=buffer].md-accent .md-dashed:before, md-progress-linear.md-hue-1[md-mode=buffer].md-accent .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-1 .md-on, md-radio-button.md-hue-1 .md-on{background-color:rgba(227,242,253,0.87)}md-radio-button.md-default-theme.md-hue-1.md-checked .md-off, md-radio-button.md-hue-1.md-checked .md-off{border-color:rgba(227,242,253,0.87)}md-radio-button.md-default-theme.md-hue-1.md-checked .md-ink-ripple, md-radio-button.md-hue-1.md-checked .md-ink-ripple{color:rgba(227,242,253,0.87)}md-radio-button.md-default-theme.md-hue-1 .md-container .md-ripple, md-radio-button.md-hue-1 .md-container .md-ripple{color:rgb(41,98,255)}md-radio-group.md-default-theme.md-hue-1 .md-checked .md-ink-ripple, md-radio-group.md-hue-1 .md-checked .md-ink-ripple{color:rgba(227,242,253,0.26)}md-radio-group.md-default-theme.md-hue-1.md-focused:not(:empty) .md-checked .md-container:before, md-radio-group.md-hue-1.md-focused:not(:empty) .md-checked .md-container:before{background-color:rgba(227,242,253,0.26)}md-select.md-default-theme.md-hue-1:not([disabled]):focus.md-accent .md-select-value, md-select.md-hue-1:not([disabled]):focus.md-accent .md-select-value{border-bottom-color:rgb(227,242,253)}md-select-menu.md-default-theme.md-hue-1 md-content md-option[selected].md-accent, md-select-menu.md-hue-1 md-content md-option[selected].md-accent{color:rgb(227,242,253)}md-select-menu.md-default-theme.md-hue-1 md-content md-option[selected].md-accent:focus, md-select-menu.md-hue-1 md-content md-option[selected].md-accent:focus{color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-1 .md-focus-ring, md-slider.md-hue-1 .md-focus-ring{background-color:rgba(68,138,255,0.2)}md-slider.md-default-theme.md-hue-1 .md-track.md-track-fill, md-slider.md-hue-1 .md-track.md-track-fill{background-color:rgb(227,242,253)}md-slider.md-default-theme.md-hue-1 .md-thumb:after, md-slider.md-hue-1 .md-thumb:after{border-color:rgb(227,242,253);background-color:rgb(227,242,253)}md-slider.md-default-theme.md-hue-1 .md-sign, md-slider.md-hue-1 .md-sign{background-color:rgb(227,242,253)}md-slider.md-default-theme.md-hue-1 .md-sign:after, md-slider.md-hue-1 .md-sign:after{border-top-color:rgb(227,242,253)}md-slider.md-default-theme.md-hue-1[md-vertical] .md-sign:after, md-slider.md-hue-1[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(227,242,253)}md-slider.md-default-theme.md-hue-1 .md-thumb-text, md-slider.md-hue-1 .md-thumb-text{color:rgba(0,0,0,0.87)}.md-subheader.md-default-theme.md-hue-1.md-accent, .md-subheader.md-hue-1.md-accent{color:rgb(227,242,253)}md-switch.md-default-theme.md-hue-1.md-checked .md-ink-ripple, md-switch.md-hue-1.md-checked .md-ink-ripple{color:rgb(227,242,253)}md-switch.md-default-theme.md-hue-1.md-checked .md-thumb, md-switch.md-hue-1.md-checked .md-thumb{background-color:rgb(227,242,253)}md-switch.md-default-theme.md-hue-1.md-checked .md-bar, md-switch.md-hue-1.md-checked .md-bar{background-color:rgba(227,242,253,0.5)}md-switch.md-default-theme.md-hue-1.md-checked.md-focused .md-thumb:before, md-switch.md-hue-1.md-checked.md-focused .md-thumb:before{background-color:rgba(227,242,253,0.26)}md-tabs.md-default-theme.md-hue-1 md-ink-bar, md-tabs.md-hue-1 md-ink-bar{color:rgb(227,242,253);background:rgb(227,242,253)}md-tabs.md-default-theme.md-hue-1 .md-tab .md-ripple-container, md-tabs.md-hue-1 .md-tab .md-ripple-container{color:rgb(130,177,255)}md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper, md-tabs.md-hue-1.md-accent>md-tabs-wrapper{background-color:rgb(227,242,253)}md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-tabs.md-default-theme.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-tabs.md-hue-1.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper{background-color:rgb(227,242,253)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-toolbar.md-accent>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toast.md-default-theme.md-hue-1 .md-toast-content .md-button.md-highlight, md-toast.md-hue-1 .md-toast-content .md-button.md-highlight{color:rgb(227,242,253)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar).md-accent, md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent{background-color:rgb(227,242,253);color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar).md-accent .md-ink-ripple, md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent .md-ink-ripple{color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar).md-accent md-icon, md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent md-icon{color:rgba(0,0,0,0.87);fill:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon, md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon{color:rgba(0,0,0,0.26);fill:rgba(0,0,0,0.26)}
-.md-button.md-default-theme.md-hue-2.md-fab md-icon, .md-button.md-hue-2.md-fab md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-2.md-fab, .md-button.md-hue-2.md-fab{background-color:rgb(33,150,243);color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-2.md-fab:not([disabled]) .md-icon, .md-button.md-hue-2.md-fab:not([disabled]) .md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-2.md-fab:not([disabled]).md-focused, .md-button.md-hue-2.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2.md-fab:not([disabled]):hover, .md-button.md-hue-2.md-fab:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-2.md-accent, .md-button.md-hue-2.md-accent{color:rgb(33,150,243)}.md-button.md-default-theme.md-hue-2.md-accent.md-fab, .md-button.md-hue-2.md-accent.md-fab,.md-button.md-default-theme.md-hue-2.md-accent.md-raised, .md-button.md-hue-2.md-accent.md-raised{color:rgba(0,0,0,0.87);background-color:rgb(33,150,243)}.md-button.md-default-theme.md-hue-2.md-accent.md-fab:not([disabled]) md-icon, .md-button.md-hue-2.md-accent.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-2.md-accent.md-raised:not([disabled]) md-icon, .md-button.md-hue-2.md-accent.md-raised:not([disabled]) md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-2.md-accent.md-fab:not([disabled]).md-focused, .md-button.md-hue-2.md-accent.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2.md-accent.md-fab:not([disabled]):hover, .md-button.md-hue-2.md-accent.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-2.md-accent.md-raised:not([disabled]).md-focused, .md-button.md-hue-2.md-accent.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2.md-accent.md-raised:not([disabled]):hover, .md-button.md-hue-2.md-accent.md-raised:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-2.md-accent:not([disabled]) md-icon, .md-button.md-hue-2.md-accent:not([disabled]) md-icon{color:rgb(33,150,243)}.md-button.md-default-theme.md-hue-2.md-accent[disabled], .md-button.md-hue-2.md-accent[disabled],.md-button.md-default-theme.md-hue-2.md-fab[disabled], .md-button.md-hue-2.md-fab[disabled],.md-button.md-default-theme.md-hue-2.md-raised[disabled], .md-button.md-hue-2.md-raised[disabled],.md-button.md-default-theme.md-hue-2.md-warn[disabled], .md-button.md-hue-2.md-warn[disabled],.md-button.md-default-theme.md-hue-2[disabled], .md-button.md-hue-2[disabled]{color:rgba(0,0,0,0.38);cursor:default}.md-button.md-default-theme.md-hue-2.md-accent[disabled] md-icon, .md-button.md-hue-2.md-accent[disabled] md-icon,.md-button.md-default-theme.md-hue-2.md-fab[disabled] md-icon, .md-button.md-hue-2.md-fab[disabled] md-icon,.md-button.md-default-theme.md-hue-2.md-raised[disabled] md-icon, .md-button.md-hue-2.md-raised[disabled] md-icon,.md-button.md-default-theme.md-hue-2.md-warn[disabled] md-icon, .md-button.md-hue-2.md-warn[disabled] md-icon,.md-button.md-default-theme.md-hue-2[disabled] md-icon, .md-button.md-hue-2[disabled] md-icon{color:rgba(0,0,0,0.38)}._md a.md-default-theme.md-hue-2:not(.md-button).md-accent, ._md a.md-hue-2:not(.md-button).md-accent{color:rgb(33,150,243)}._md a.md-default-theme.md-hue-2:not(.md-button).md-accent:hover, ._md a.md-hue-2:not(.md-button).md-accent:hover{color:rgb(41,98,255)}md-checkbox.md-default-theme.md-hue-2 .md-ripple, md-checkbox.md-hue-2 .md-ripple{color:rgb(41,98,255)}md-checkbox.md-default-theme.md-hue-2.md-checked.md-focused .md-container:before, md-checkbox.md-hue-2.md-checked.md-focused .md-container:before{background-color:rgba(33,150,243,0.26)}md-checkbox.md-default-theme.md-hue-2.md-checked .md-ink-ripple, md-checkbox.md-hue-2.md-checked .md-ink-ripple{color:rgba(33,150,243,0.87)}md-checkbox.md-default-theme.md-hue-2.md-checked .md-icon, md-checkbox.md-hue-2.md-checked .md-icon{background-color:rgba(33,150,243,0.87)}md-checkbox.md-default-theme.md-hue-2.md-checked .md-icon:after, md-checkbox.md-hue-2.md-checked .md-icon:after{border-color:rgba(0,0,0,0.87)}.md-accent .md-default-theme.md-hue-2 .md-datepicker-input-container.md-datepicker-focused, .md-accent .md-hue-2 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(33,150,243)}.md-accent .md-default-theme.md-hue-2 .md-datepicker-open .md-datepicker-calendar-icon, .md-accent .md-hue-2 .md-datepicker-open .md-datepicker-calendar-icon,.md-default-theme.md-hue-2 .md-datepicker-open.md-accent .md-datepicker-calendar-icon, .md-hue-2 .md-datepicker-open.md-accent .md-datepicker-calendar-icon{color:rgb(33,150,243)}md-icon.md-default-theme.md-hue-2.md-accent, md-icon.md-hue-2.md-accent{color:rgb(33,150,243)}md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused.md-accent .md-input, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused.md-accent .md-input{border-color:rgb(33,150,243)}md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused.md-accent label, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused.md-accent label,md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused.md-accent md-icon, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused.md-accent md-icon{color:rgb(33,150,243)}md-list.md-default-theme.md-hue-2 md-list-item>md-icon.md-highlight.md-accent, md-list.md-hue-2 md-list-item>md-icon.md-highlight.md-accent{color:rgb(33,150,243)}md-nav-bar.md-default-theme.md-hue-2 md-nav-ink-bar, md-nav-bar.md-hue-2 md-nav-ink-bar{color:rgb(33,150,243);background:rgb(33,150,243)}md-nav-bar.md-default-theme.md-hue-2.md-accent>.md-nav-bar, md-nav-bar.md-hue-2.md-accent>.md-nav-bar{background-color:rgb(33,150,243)}md-nav-bar.md-default-theme.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-nav-bar.md-default-theme.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-2.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-nav-bar.md-default-theme.md-hue-2.md-accent>.md-nav-bar md-nav-ink-bar, md-nav-bar.md-hue-2.md-accent>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar, md-toolbar.md-accent>md-nav-bar.md-hue-2>.md-nav-bar{background-color:rgb(33,150,243)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-accent>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-accent>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar md-nav-ink-bar, md-toolbar.md-accent>md-nav-bar.md-hue-2>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-progress-circular.md-default-theme.md-hue-2.md-accent path, md-progress-circular.md-hue-2.md-accent path{stroke:rgb(33,150,243)}md-progress-linear.md-default-theme.md-hue-2.md-accent .md-container, md-progress-linear.md-hue-2.md-accent .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-2.md-accent .md-bar, md-progress-linear.md-hue-2.md-accent .md-bar{background-color:rgb(33,150,243)}md-progress-linear.md-default-theme.md-hue-2[md-mode=buffer].md-accent .md-bar1, md-progress-linear.md-hue-2[md-mode=buffer].md-accent .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-2[md-mode=buffer].md-accent .md-dashed:before, md-progress-linear.md-hue-2[md-mode=buffer].md-accent .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-2 .md-on, md-radio-button.md-hue-2 .md-on{background-color:rgba(33,150,243,0.87)}md-radio-button.md-default-theme.md-hue-2.md-checked .md-off, md-radio-button.md-hue-2.md-checked .md-off{border-color:rgba(33,150,243,0.87)}md-radio-button.md-default-theme.md-hue-2.md-checked .md-ink-ripple, md-radio-button.md-hue-2.md-checked .md-ink-ripple{color:rgba(33,150,243,0.87)}md-radio-button.md-default-theme.md-hue-2 .md-container .md-ripple, md-radio-button.md-hue-2 .md-container .md-ripple{color:rgb(41,98,255)}md-radio-group.md-default-theme.md-hue-2 .md-checked .md-ink-ripple, md-radio-group.md-hue-2 .md-checked .md-ink-ripple{color:rgba(33,150,243,0.26)}md-radio-group.md-default-theme.md-hue-2.md-focused:not(:empty) .md-checked .md-container:before, md-radio-group.md-hue-2.md-focused:not(:empty) .md-checked .md-container:before{background-color:rgba(33,150,243,0.26)}md-select.md-default-theme.md-hue-2:not([disabled]):focus.md-accent .md-select-value, md-select.md-hue-2:not([disabled]):focus.md-accent .md-select-value{border-bottom-color:rgb(33,150,243)}md-select-menu.md-default-theme.md-hue-2 md-content md-option[selected].md-accent, md-select-menu.md-hue-2 md-content md-option[selected].md-accent{color:rgb(33,150,243)}md-select-menu.md-default-theme.md-hue-2 md-content md-option[selected].md-accent:focus, md-select-menu.md-hue-2 md-content md-option[selected].md-accent:focus{color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-2 .md-focus-ring, md-slider.md-hue-2 .md-focus-ring{background-color:rgba(68,138,255,0.2)}md-slider.md-default-theme.md-hue-2 .md-track.md-track-fill, md-slider.md-hue-2 .md-track.md-track-fill{background-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-2 .md-thumb:after, md-slider.md-hue-2 .md-thumb:after{border-color:rgb(33,150,243);background-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-2 .md-sign, md-slider.md-hue-2 .md-sign{background-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-2 .md-sign:after, md-slider.md-hue-2 .md-sign:after{border-top-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-2[md-vertical] .md-sign:after, md-slider.md-hue-2[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(33,150,243)}md-slider.md-default-theme.md-hue-2 .md-thumb-text, md-slider.md-hue-2 .md-thumb-text{color:rgba(0,0,0,0.87)}.md-subheader.md-default-theme.md-hue-2.md-accent, .md-subheader.md-hue-2.md-accent{color:rgb(33,150,243)}md-switch.md-default-theme.md-hue-2.md-checked .md-ink-ripple, md-switch.md-hue-2.md-checked .md-ink-ripple{color:rgb(33,150,243)}md-switch.md-default-theme.md-hue-2.md-checked .md-thumb, md-switch.md-hue-2.md-checked .md-thumb{background-color:rgb(33,150,243)}md-switch.md-default-theme.md-hue-2.md-checked .md-bar, md-switch.md-hue-2.md-checked .md-bar{background-color:rgba(33,150,243,0.5)}md-switch.md-default-theme.md-hue-2.md-checked.md-focused .md-thumb:before, md-switch.md-hue-2.md-checked.md-focused .md-thumb:before{background-color:rgba(33,150,243,0.26)}md-tabs.md-default-theme.md-hue-2 md-ink-bar, md-tabs.md-hue-2 md-ink-bar{color:rgb(33,150,243);background:rgb(33,150,243)}md-tabs.md-default-theme.md-hue-2 .md-tab .md-ripple-container, md-tabs.md-hue-2 .md-tab .md-ripple-container{color:rgb(130,177,255)}md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper, md-tabs.md-hue-2.md-accent>md-tabs-wrapper{background-color:rgb(33,150,243)}md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-tabs.md-default-theme.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-tabs.md-hue-2.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper{background-color:rgb(33,150,243)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-toolbar.md-accent>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toast.md-default-theme.md-hue-2 .md-toast-content .md-button.md-highlight, md-toast.md-hue-2 .md-toast-content .md-button.md-highlight{color:rgb(33,150,243)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar).md-accent, md-toolbar.md-hue-2:not(.md-menu-toolbar).md-accent{background-color:rgb(33,150,243);color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar).md-accent .md-ink-ripple, md-toolbar.md-hue-2:not(.md-menu-toolbar).md-accent .md-ink-ripple{color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar).md-accent md-icon, md-toolbar.md-hue-2:not(.md-menu-toolbar).md-accent md-icon{color:rgba(0,0,0,0.87);fill:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon, md-toolbar.md-hue-2:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon{color:rgba(0,0,0,0.26);fill:rgba(0,0,0,0.26)}
-.md-button.md-default-theme.md-hue-3.md-fab md-icon, .md-button.md-hue-3.md-fab md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3.md-fab, .md-button.md-hue-3.md-fab{background-color:rgb(41,98,255);color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3.md-fab:not([disabled]) .md-icon, .md-button.md-hue-3.md-fab:not([disabled]) .md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3.md-fab:not([disabled]).md-focused, .md-button.md-hue-3.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3.md-fab:not([disabled]):hover, .md-button.md-hue-3.md-fab:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-3.md-accent, .md-button.md-hue-3.md-accent{color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-3.md-accent.md-fab, .md-button.md-hue-3.md-accent.md-fab,.md-button.md-default-theme.md-hue-3.md-accent.md-raised, .md-button.md-hue-3.md-accent.md-raised{color:rgba(0,0,0,0.87);background-color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-3.md-accent.md-fab:not([disabled]) md-icon, .md-button.md-hue-3.md-accent.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-3.md-accent.md-raised:not([disabled]) md-icon, .md-button.md-hue-3.md-accent.md-raised:not([disabled]) md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3.md-accent.md-fab:not([disabled]).md-focused, .md-button.md-hue-3.md-accent.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3.md-accent.md-fab:not([disabled]):hover, .md-button.md-hue-3.md-accent.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-3.md-accent.md-raised:not([disabled]).md-focused, .md-button.md-hue-3.md-accent.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3.md-accent.md-raised:not([disabled]):hover, .md-button.md-hue-3.md-accent.md-raised:not([disabled]):hover{background-color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-3.md-accent:not([disabled]) md-icon, .md-button.md-hue-3.md-accent:not([disabled]) md-icon{color:rgb(41,98,255)}.md-button.md-default-theme.md-hue-3.md-accent[disabled], .md-button.md-hue-3.md-accent[disabled],.md-button.md-default-theme.md-hue-3.md-fab[disabled], .md-button.md-hue-3.md-fab[disabled],.md-button.md-default-theme.md-hue-3.md-raised[disabled], .md-button.md-hue-3.md-raised[disabled],.md-button.md-default-theme.md-hue-3.md-warn[disabled], .md-button.md-hue-3.md-warn[disabled],.md-button.md-default-theme.md-hue-3[disabled], .md-button.md-hue-3[disabled]{color:rgba(0,0,0,0.38);cursor:default}.md-button.md-default-theme.md-hue-3.md-accent[disabled] md-icon, .md-button.md-hue-3.md-accent[disabled] md-icon,.md-button.md-default-theme.md-hue-3.md-fab[disabled] md-icon, .md-button.md-hue-3.md-fab[disabled] md-icon,.md-button.md-default-theme.md-hue-3.md-raised[disabled] md-icon, .md-button.md-hue-3.md-raised[disabled] md-icon,.md-button.md-default-theme.md-hue-3.md-warn[disabled] md-icon, .md-button.md-hue-3.md-warn[disabled] md-icon,.md-button.md-default-theme.md-hue-3[disabled] md-icon, .md-button.md-hue-3[disabled] md-icon{color:rgba(0,0,0,0.38)}._md a.md-default-theme.md-hue-3:not(.md-button).md-accent, ._md a.md-hue-3:not(.md-button).md-accent{color:rgb(41,98,255)}._md a.md-default-theme.md-hue-3:not(.md-button).md-accent:hover, ._md a.md-hue-3:not(.md-button).md-accent:hover{color:rgb(41,98,255)}md-checkbox.md-default-theme.md-hue-3 .md-ripple, md-checkbox.md-hue-3 .md-ripple{color:rgb(41,98,255)}md-checkbox.md-default-theme.md-hue-3.md-checked.md-focused .md-container:before, md-checkbox.md-hue-3.md-checked.md-focused .md-container:before{background-color:rgba(41,98,255,0.26)}md-checkbox.md-default-theme.md-hue-3.md-checked .md-ink-ripple, md-checkbox.md-hue-3.md-checked .md-ink-ripple{color:rgba(41,98,255,0.87)}md-checkbox.md-default-theme.md-hue-3.md-checked .md-icon, md-checkbox.md-hue-3.md-checked .md-icon{background-color:rgba(41,98,255,0.87)}md-checkbox.md-default-theme.md-hue-3.md-checked .md-icon:after, md-checkbox.md-hue-3.md-checked .md-icon:after{border-color:rgba(0,0,0,0.87)}.md-accent .md-default-theme.md-hue-3 .md-datepicker-input-container.md-datepicker-focused, .md-accent .md-hue-3 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(41,98,255)}.md-accent .md-default-theme.md-hue-3 .md-datepicker-open .md-datepicker-calendar-icon, .md-accent .md-hue-3 .md-datepicker-open .md-datepicker-calendar-icon,.md-default-theme.md-hue-3 .md-datepicker-open.md-accent .md-datepicker-calendar-icon, .md-hue-3 .md-datepicker-open.md-accent .md-datepicker-calendar-icon{color:rgb(41,98,255)}md-icon.md-default-theme.md-hue-3.md-accent, md-icon.md-hue-3.md-accent{color:rgb(41,98,255)}md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused.md-accent .md-input, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused.md-accent .md-input{border-color:rgb(41,98,255)}md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused.md-accent label, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused.md-accent label,md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused.md-accent md-icon, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused.md-accent md-icon{color:rgb(41,98,255)}md-list.md-default-theme.md-hue-3 md-list-item>md-icon.md-highlight.md-accent, md-list.md-hue-3 md-list-item>md-icon.md-highlight.md-accent{color:rgb(41,98,255)}md-nav-bar.md-default-theme.md-hue-3 md-nav-ink-bar, md-nav-bar.md-hue-3 md-nav-ink-bar{color:rgb(41,98,255);background:rgb(41,98,255)}md-nav-bar.md-default-theme.md-hue-3.md-accent>.md-nav-bar, md-nav-bar.md-hue-3.md-accent>.md-nav-bar{background-color:rgb(41,98,255)}md-nav-bar.md-default-theme.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-nav-bar.md-default-theme.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-3.md-accent>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-nav-bar.md-default-theme.md-hue-3.md-accent>.md-nav-bar md-nav-ink-bar, md-nav-bar.md-hue-3.md-accent>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar, md-toolbar.md-accent>md-nav-bar.md-hue-3>.md-nav-bar{background-color:rgb(41,98,255)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-accent>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button{color:rgb(130,177,255)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-accent>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-accent>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-accent>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar md-nav-ink-bar, md-toolbar.md-accent>md-nav-bar.md-hue-3>.md-nav-bar md-nav-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-progress-circular.md-default-theme.md-hue-3.md-accent path, md-progress-circular.md-hue-3.md-accent path{stroke:rgb(41,98,255)}md-progress-linear.md-default-theme.md-hue-3.md-accent .md-container, md-progress-linear.md-hue-3.md-accent .md-container{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-3.md-accent .md-bar, md-progress-linear.md-hue-3.md-accent .md-bar{background-color:rgb(41,98,255)}md-progress-linear.md-default-theme.md-hue-3[md-mode=buffer].md-accent .md-bar1, md-progress-linear.md-hue-3[md-mode=buffer].md-accent .md-bar1{background-color:rgb(187,222,251)}md-progress-linear.md-default-theme.md-hue-3[md-mode=buffer].md-accent .md-dashed:before, md-progress-linear.md-hue-3[md-mode=buffer].md-accent .md-dashed:before{background:radial-gradient(rgb(187,222,251) 0,rgb(187,222,251) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-3 .md-on, md-radio-button.md-hue-3 .md-on{background-color:rgba(41,98,255,0.87)}md-radio-button.md-default-theme.md-hue-3.md-checked .md-off, md-radio-button.md-hue-3.md-checked .md-off{border-color:rgba(41,98,255,0.87)}md-radio-button.md-default-theme.md-hue-3.md-checked .md-ink-ripple, md-radio-button.md-hue-3.md-checked .md-ink-ripple{color:rgba(41,98,255,0.87)}md-radio-button.md-default-theme.md-hue-3 .md-container .md-ripple, md-radio-button.md-hue-3 .md-container .md-ripple{color:rgb(41,98,255)}md-radio-group.md-default-theme.md-hue-3 .md-checked .md-ink-ripple, md-radio-group.md-hue-3 .md-checked .md-ink-ripple{color:rgba(41,98,255,0.26)}md-radio-group.md-default-theme.md-hue-3.md-focused:not(:empty) .md-checked .md-container:before, md-radio-group.md-hue-3.md-focused:not(:empty) .md-checked .md-container:before{background-color:rgba(41,98,255,0.26)}md-select.md-default-theme.md-hue-3:not([disabled]):focus.md-accent .md-select-value, md-select.md-hue-3:not([disabled]):focus.md-accent .md-select-value{border-bottom-color:rgb(41,98,255)}md-select-menu.md-default-theme.md-hue-3 md-content md-option[selected].md-accent, md-select-menu.md-hue-3 md-content md-option[selected].md-accent{color:rgb(41,98,255)}md-select-menu.md-default-theme.md-hue-3 md-content md-option[selected].md-accent:focus, md-select-menu.md-hue-3 md-content md-option[selected].md-accent:focus{color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-3 .md-focus-ring, md-slider.md-hue-3 .md-focus-ring{background-color:rgba(68,138,255,0.2)}md-slider.md-default-theme.md-hue-3 .md-track.md-track-fill, md-slider.md-hue-3 .md-track.md-track-fill{background-color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-3 .md-thumb:after, md-slider.md-hue-3 .md-thumb:after{border-color:rgb(41,98,255);background-color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-3 .md-sign, md-slider.md-hue-3 .md-sign{background-color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-3 .md-sign:after, md-slider.md-hue-3 .md-sign:after{border-top-color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-3[md-vertical] .md-sign:after, md-slider.md-hue-3[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(41,98,255)}md-slider.md-default-theme.md-hue-3 .md-thumb-text, md-slider.md-hue-3 .md-thumb-text{color:rgba(0,0,0,0.87)}.md-subheader.md-default-theme.md-hue-3.md-accent, .md-subheader.md-hue-3.md-accent{color:rgb(41,98,255)}md-switch.md-default-theme.md-hue-3.md-checked .md-ink-ripple, md-switch.md-hue-3.md-checked .md-ink-ripple{color:rgb(41,98,255)}md-switch.md-default-theme.md-hue-3.md-checked .md-thumb, md-switch.md-hue-3.md-checked .md-thumb{background-color:rgb(41,98,255)}md-switch.md-default-theme.md-hue-3.md-checked .md-bar, md-switch.md-hue-3.md-checked .md-bar{background-color:rgba(41,98,255,0.5)}md-switch.md-default-theme.md-hue-3.md-checked.md-focused .md-thumb:before, md-switch.md-hue-3.md-checked.md-focused .md-thumb:before{background-color:rgba(41,98,255,0.26)}md-tabs.md-default-theme.md-hue-3 md-ink-bar, md-tabs.md-hue-3 md-ink-bar{color:rgb(41,98,255);background:rgb(41,98,255)}md-tabs.md-default-theme.md-hue-3 .md-tab .md-ripple-container, md-tabs.md-hue-3 .md-tab .md-ripple-container{color:rgb(130,177,255)}md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper, md-tabs.md-hue-3.md-accent>md-tabs-wrapper{background-color:rgb(41,98,255)}md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-tabs.md-default-theme.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-tabs.md-hue-3.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper{background-color:rgb(41,98,255)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(130,177,255)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-accent>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar, md-toolbar.md-accent>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:rgba(30,136,229,1);background:rgba(30,136,229,1)}md-toast.md-default-theme.md-hue-3 .md-toast-content .md-button.md-highlight, md-toast.md-hue-3 .md-toast-content .md-button.md-highlight{color:rgb(41,98,255)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar).md-accent, md-toolbar.md-hue-3:not(.md-menu-toolbar).md-accent{background-color:rgb(41,98,255);color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar).md-accent .md-ink-ripple, md-toolbar.md-hue-3:not(.md-menu-toolbar).md-accent .md-ink-ripple{color:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar).md-accent md-icon, md-toolbar.md-hue-3:not(.md-menu-toolbar).md-accent md-icon{color:rgba(0,0,0,0.87);fill:rgba(0,0,0,0.87)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon, md-toolbar.md-hue-3:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon{color:rgba(0,0,0,0.26);fill:rgba(0,0,0,0.26)}
-.md-button.md-default-theme.md-warn, .md-button.md-warn{color:rgb(255,87,34)}.md-button.md-default-theme.md-warn.md-fab, .md-button.md-warn.md-fab,.md-button.md-default-theme.md-warn.md-raised, .md-button.md-warn.md-raised{color:rgb(255,255,255);background-color:rgb(255,87,34)}.md-button.md-default-theme.md-warn.md-fab:not([disabled]) md-icon, .md-button.md-warn.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-warn.md-raised:not([disabled]) md-icon, .md-button.md-warn.md-raised:not([disabled]) md-icon{color:rgb(255,255,255)}.md-button.md-default-theme.md-warn.md-fab:not([disabled]).md-focused, .md-button.md-warn.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-warn.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-warn.md-raised:not([disabled]).md-focused, .md-button.md-warn.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-warn.md-raised:not([disabled]):hover{background-color:rgb(244,81,30)}.md-button.md-default-theme.md-warn:not([disabled]) md-icon, .md-button.md-warn:not([disabled]) md-icon{color:rgb(255,87,34)}._md a.md-default-theme:not(.md-button).md-warn, ._md a:not(.md-button).md-warn{color:rgb(255,87,34)}._md a.md-default-theme:not(.md-button).md-warn:hover, ._md a:not(.md-button).md-warn:hover{color:rgb(230,74,25)}md-checkbox.md-default-theme:not([disabled]).md-warn .md-ripple, md-checkbox:not([disabled]).md-warn .md-ripple{color:rgb(244,81,30)}md-checkbox.md-default-theme:not([disabled]).md-warn .md-ink-ripple, md-checkbox:not([disabled]).md-warn .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme:not([disabled]).md-warn.md-checked .md-ink-ripple, md-checkbox:not([disabled]).md-warn.md-checked .md-ink-ripple{color:rgba(255,87,34,0.87)}md-checkbox.md-default-theme:not([disabled]).md-warn:not(.md-checked) .md-icon, md-checkbox:not([disabled]).md-warn:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme:not([disabled]).md-warn.md-checked .md-icon, md-checkbox:not([disabled]).md-warn.md-checked .md-icon{background-color:rgba(255,87,34,0.87)}md-checkbox.md-default-theme:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before, md-checkbox:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before{background-color:rgba(255,87,34,0.26)}md-checkbox.md-default-theme:not([disabled]).md-warn.md-checked .md-icon:after, md-checkbox:not([disabled]).md-warn.md-checked .md-icon:after{border-color:rgb(238,238,238)}.md-default-theme .md-datepicker-input-container.md-datepicker-invalid, .md-datepicker-input-container.md-datepicker-invalid,.md-warn .md-default-theme .md-datepicker-input-container.md-datepicker-focused, .md-warn .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(221,44,0)}.md-default-theme .md-datepicker-open.md-warn .md-datepicker-calendar-icon, .md-datepicker-open.md-warn .md-datepicker-calendar-icon,.md-warn .md-default-theme .md-datepicker-open .md-datepicker-calendar-icon, .md-warn .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(221,44,0)}md-icon.md-default-theme.md-warn, md-icon.md-warn{color:rgb(255,87,34)}md-input-container.md-default-theme label.md-required:after, md-input-container label.md-required:after{color:rgb(221,44,0)}md-input-container.md-default-theme .md-input-message-animation, md-input-container .md-input-message-animation,md-input-container.md-default-theme .md-input-messages-animation, md-input-container .md-input-messages-animation{color:rgb(221,44,0)}md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input, md-input-container:not(.md-input-invalid).md-input-focused.md-warn .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused.md-warn label, md-input-container:not(.md-input-invalid).md-input-focused.md-warn label,md-input-container.md-default-theme:not(.md-input-invalid).md-input-focused.md-warn md-icon, md-input-container:not(.md-input-invalid).md-input-focused.md-warn md-icon{color:rgb(221,44,0)}md-input-container.md-default-theme.md-input-invalid .md-input, md-input-container.md-input-invalid .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme.md-input-invalid .md-char-counter, md-input-container.md-input-invalid .md-char-counter,md-input-container.md-default-theme.md-input-invalid .md-input-message-animation, md-input-container.md-input-invalid .md-input-message-animation,md-input-container.md-default-theme.md-input-invalid label, md-input-container.md-input-invalid label{color:rgb(221,44,0)}md-nav-bar.md-default-theme.md-warn>.md-nav-bar, md-nav-bar.md-warn>.md-nav-bar{background-color:rgb(255,87,34)}md-nav-bar.md-default-theme.md-warn>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-warn>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-nav-bar.md-default-theme.md-warn>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-warn>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgb(255,255,255)}md-nav-bar.md-default-theme.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-toolbar.md-warn>md-nav-bar.md-default-theme>.md-nav-bar, md-toolbar.md-warn>md-nav-bar>.md-nav-bar{background-color:rgb(255,87,34)}md-toolbar.md-warn>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-warn>md-nav-bar>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-toolbar.md-warn>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-warn>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-warn>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgb(255,255,255)}md-toolbar.md-warn>md-nav-bar.md-default-theme>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-progress-circular.md-default-theme.md-warn path, md-progress-circular.md-warn path{stroke:rgb(255,87,34)}md-progress-linear.md-default-theme.md-warn .md-container, md-progress-linear.md-warn .md-container{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme.md-warn .md-bar, md-progress-linear.md-warn .md-bar{background-color:rgb(255,87,34)}md-progress-linear.md-default-theme[md-mode=buffer].md-warn .md-bar1, md-progress-linear[md-mode=buffer].md-warn .md-bar1{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme[md-mode=buffer].md-warn .md-dashed:before, md-progress-linear[md-mode=buffer].md-warn .md-dashed:before{background:radial-gradient(rgb(255,204,188) 0,rgb(255,204,188) 16%,transparent 42%)}md-radio-button.md-default-theme:not([disabled]).md-warn .md-on, md-radio-button:not([disabled]).md-warn .md-on,md-radio-button.md-default-theme:not([disabled]) .md-warn .md-on, md-radio-button:not([disabled]) .md-warn .md-on,md-radio-group.md-default-theme:not([disabled]).md-warn .md-on, md-radio-group:not([disabled]).md-warn .md-on,md-radio-group.md-default-theme:not([disabled]) .md-warn .md-on, md-radio-group:not([disabled]) .md-warn .md-on{background-color:rgba(255,87,34,0.87)}md-radio-button.md-default-theme:not([disabled]).md-warn.md-checked .md-off, md-radio-button:not([disabled]).md-warn.md-checked .md-off,md-radio-button.md-default-theme:not([disabled]) .md-warn.md-checked .md-off, md-radio-button:not([disabled]) .md-warn.md-checked .md-off,md-radio-button.md-default-theme:not([disabled]).md-warn .md-checked .md-off, md-radio-button:not([disabled]).md-warn .md-checked .md-off,md-radio-button.md-default-theme:not([disabled]) .md-warn .md-checked .md-off, md-radio-button:not([disabled]) .md-warn .md-checked .md-off,md-radio-group.md-default-theme:not([disabled]).md-warn.md-checked .md-off, md-radio-group:not([disabled]).md-warn.md-checked .md-off,md-radio-group.md-default-theme:not([disabled]) .md-warn.md-checked .md-off, md-radio-group:not([disabled]) .md-warn.md-checked .md-off,md-radio-group.md-default-theme:not([disabled]).md-warn .md-checked .md-off, md-radio-group:not([disabled]).md-warn .md-checked .md-off,md-radio-group.md-default-theme:not([disabled]) .md-warn .md-checked .md-off, md-radio-group:not([disabled]) .md-warn .md-checked .md-off{border-color:rgba(255,87,34,0.87)}md-radio-button.md-default-theme:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-button:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-button:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-button:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-button.md-default-theme:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-button:not([disabled]) .md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-group:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-group:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-group:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-group:not([disabled]) .md-warn .md-checked .md-ink-ripple{color:rgba(255,87,34,0.87)}md-radio-button.md-default-theme:not([disabled]).md-warn .md-container .md-ripple, md-radio-button:not([disabled]).md-warn .md-container .md-ripple,md-radio-button.md-default-theme:not([disabled]) .md-warn .md-container .md-ripple, md-radio-button:not([disabled]) .md-warn .md-container .md-ripple,md-radio-group.md-default-theme:not([disabled]).md-warn .md-container .md-ripple, md-radio-group:not([disabled]).md-warn .md-container .md-ripple,md-radio-group.md-default-theme:not([disabled]) .md-warn .md-container .md-ripple, md-radio-group:not([disabled]) .md-warn .md-container .md-ripple{color:rgb(244,81,30)}md-radio-group.md-default-theme.md-focused:not(:empty) .md-checked.md-warn .md-container:before, md-radio-group.md-focused:not(:empty) .md-checked.md-warn .md-container:before,md-radio-group.md-default-theme.md-focused:not(:empty).md-warn .md-checked .md-container:before, md-radio-group.md-focused:not(:empty).md-warn .md-checked .md-container:before{background-color:rgba(255,87,34,0.26)}md-input-container md-select.md-default-theme .md-select-value span:first-child:after, md-input-container md-select .md-select-value span:first-child:after{color:rgb(221,44,0)}md-input-container.md-input-invalid md-select.md-default-theme .md-select-value, md-input-container.md-input-invalid md-select .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme .md-select-value span:first-child:after, md-select .md-select-value span:first-child:after{color:rgb(221,44,0)}md-select.md-default-theme.ng-invalid.ng-touched .md-select-value, md-select.ng-invalid.ng-touched .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme:not([disabled]):focus.md-warn .md-select-value, md-select:not([disabled]):focus.md-warn .md-select-value{border-bottom-color:rgb(255,87,34)}md-slider.md-default-theme.md-warn .md-focus-ring, md-slider.md-warn .md-focus-ring{background-color:rgba(255,171,145,0.38)}md-slider.md-default-theme.md-warn .md-track.md-track-fill, md-slider.md-warn .md-track.md-track-fill{background-color:rgb(255,87,34)}md-slider.md-default-theme.md-warn .md-thumb:after, md-slider.md-warn .md-thumb:after{border-color:rgb(255,87,34);background-color:rgb(255,87,34)}md-slider.md-default-theme.md-warn .md-sign, md-slider.md-warn .md-sign{background-color:rgb(255,87,34)}md-slider.md-default-theme.md-warn .md-sign:after, md-slider.md-warn .md-sign:after{border-top-color:rgb(255,87,34)}md-slider.md-default-theme.md-warn[md-vertical] .md-sign:after, md-slider.md-warn[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(255,87,34)}md-slider.md-default-theme.md-warn .md-thumb-text, md-slider.md-warn .md-thumb-text{color:rgb(255,255,255)}.md-subheader.md-default-theme.md-warn, .md-subheader.md-warn{color:rgb(255,87,34)}md-switch.md-default-theme.md-checked.md-warn .md-ink-ripple, md-switch.md-checked.md-warn .md-ink-ripple{color:rgb(255,87,34)}md-switch.md-default-theme.md-checked.md-warn .md-thumb, md-switch.md-checked.md-warn .md-thumb{background-color:rgb(255,87,34)}md-switch.md-default-theme.md-checked.md-warn .md-bar, md-switch.md-checked.md-warn .md-bar{background-color:rgba(255,87,34,0.5)}md-switch.md-default-theme.md-checked.md-warn.md-focused .md-thumb:before, md-switch.md-checked.md-warn.md-focused .md-thumb:before{background-color:rgba(255,87,34,0.26)}md-tabs.md-default-theme.md-warn>md-tabs-wrapper, md-tabs.md-warn>md-tabs-wrapper{background-color:rgb(255,87,34)}md-tabs.md-default-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-tabs.md-default-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgb(255,255,255)}md-tabs.md-default-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper, md-toolbar.md-warn>md-tabs>md-tabs-wrapper{background-color:rgb(255,87,34)}md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-warn>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-warn>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-warn>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-warn>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-warn>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgb(255,255,255)}md-toolbar.md-warn>md-tabs.md-default-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toast.md-default-theme .md-toast-content .md-button.md-highlight.md-warn, md-toast .md-toast-content .md-button.md-highlight.md-warn{color:rgb(255,87,34)}md-toolbar.md-default-theme:not(.md-menu-toolbar).md-warn, md-toolbar:not(.md-menu-toolbar).md-warn{background-color:rgb(255,87,34);color:rgb(255,255,255)}
-.md-button.md-default-theme.md-hue-1.md-warn, .md-button.md-hue-1.md-warn{color:rgb(255,138,101)}.md-button.md-default-theme.md-hue-1.md-warn.md-fab, .md-button.md-hue-1.md-warn.md-fab,.md-button.md-default-theme.md-hue-1.md-warn.md-raised, .md-button.md-hue-1.md-warn.md-raised{color:rgba(0,0,0,0.87);background-color:rgb(255,138,101)}.md-button.md-default-theme.md-hue-1.md-warn.md-fab:not([disabled]) md-icon, .md-button.md-hue-1.md-warn.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-1.md-warn.md-raised:not([disabled]) md-icon, .md-button.md-hue-1.md-warn.md-raised:not([disabled]) md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1.md-warn.md-fab:not([disabled]).md-focused, .md-button.md-hue-1.md-warn.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1.md-warn.md-fab:not([disabled]):hover, .md-button.md-hue-1.md-warn.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-1.md-warn.md-raised:not([disabled]).md-focused, .md-button.md-hue-1.md-warn.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1.md-warn.md-raised:not([disabled]):hover, .md-button.md-hue-1.md-warn.md-raised:not([disabled]):hover{background-color:rgb(244,81,30)}.md-button.md-default-theme.md-hue-1.md-warn:not([disabled]) md-icon, .md-button.md-hue-1.md-warn:not([disabled]) md-icon{color:rgb(255,138,101)}._md a.md-default-theme.md-hue-1:not(.md-button).md-warn, ._md a.md-hue-1:not(.md-button).md-warn{color:rgb(255,138,101)}._md a.md-default-theme.md-hue-1:not(.md-button).md-warn:hover, ._md a.md-hue-1:not(.md-button).md-warn:hover{color:rgb(230,74,25)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-warn .md-ripple, md-checkbox.md-hue-1:not([disabled]).md-warn .md-ripple{color:rgb(244,81,30)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-warn .md-ink-ripple, md-checkbox.md-hue-1:not([disabled]).md-warn .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked .md-ink-ripple, md-checkbox.md-hue-1:not([disabled]).md-warn.md-checked .md-ink-ripple{color:rgba(255,138,101,0.87)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-warn:not(.md-checked) .md-icon, md-checkbox.md-hue-1:not([disabled]).md-warn:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked .md-icon, md-checkbox.md-hue-1:not([disabled]).md-warn.md-checked .md-icon{background-color:rgba(255,138,101,0.87)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before, md-checkbox.md-hue-1:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before{background-color:rgba(255,138,101,0.26)}md-checkbox.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked .md-icon:after, md-checkbox.md-hue-1:not([disabled]).md-warn.md-checked .md-icon:after{border-color:rgb(238,238,238)}.md-default-theme.md-hue-1 .md-datepicker-input-container.md-datepicker-invalid, .md-hue-1 .md-datepicker-input-container.md-datepicker-invalid,.md-warn .md-default-theme.md-hue-1 .md-datepicker-input-container.md-datepicker-focused, .md-warn .md-hue-1 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(221,44,0)}.md-default-theme.md-hue-1 .md-datepicker-open.md-warn .md-datepicker-calendar-icon, .md-hue-1 .md-datepicker-open.md-warn .md-datepicker-calendar-icon,.md-warn .md-default-theme.md-hue-1 .md-datepicker-open .md-datepicker-calendar-icon, .md-warn .md-hue-1 .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(221,44,0)}md-icon.md-default-theme.md-hue-1.md-warn, md-icon.md-hue-1.md-warn{color:rgb(255,138,101)}md-input-container.md-default-theme.md-hue-1 label.md-required:after, md-input-container.md-hue-1 label.md-required:after{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-1 .md-input-message-animation, md-input-container.md-hue-1 .md-input-message-animation,md-input-container.md-default-theme.md-hue-1 .md-input-messages-animation, md-input-container.md-hue-1 .md-input-messages-animation{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused.md-warn .md-input, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused.md-warn .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused.md-warn label, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused.md-warn label,md-input-container.md-default-theme.md-hue-1:not(.md-input-invalid).md-input-focused.md-warn md-icon, md-input-container.md-hue-1:not(.md-input-invalid).md-input-focused.md-warn md-icon{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-1.md-input-invalid .md-input, md-input-container.md-hue-1.md-input-invalid .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-1.md-input-invalid .md-char-counter, md-input-container.md-hue-1.md-input-invalid .md-char-counter,md-input-container.md-default-theme.md-hue-1.md-input-invalid .md-input-message-animation, md-input-container.md-hue-1.md-input-invalid .md-input-message-animation,md-input-container.md-default-theme.md-hue-1.md-input-invalid label, md-input-container.md-hue-1.md-input-invalid label{color:rgb(221,44,0)}md-nav-bar.md-default-theme.md-hue-1.md-warn>.md-nav-bar, md-nav-bar.md-hue-1.md-warn>.md-nav-bar{background-color:rgb(255,138,101)}md-nav-bar.md-default-theme.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-nav-bar.md-default-theme.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-1.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar, md-toolbar.md-warn>md-nav-bar.md-hue-1>.md-nav-bar{background-color:rgb(255,138,101)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-warn>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-warn>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar.md-hue-1>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-progress-circular.md-default-theme.md-hue-1.md-warn path, md-progress-circular.md-hue-1.md-warn path{stroke:rgb(255,138,101)}md-progress-linear.md-default-theme.md-hue-1.md-warn .md-container, md-progress-linear.md-hue-1.md-warn .md-container{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme.md-hue-1.md-warn .md-bar, md-progress-linear.md-hue-1.md-warn .md-bar{background-color:rgb(255,138,101)}md-progress-linear.md-default-theme.md-hue-1[md-mode=buffer].md-warn .md-bar1, md-progress-linear.md-hue-1[md-mode=buffer].md-warn .md-bar1{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme.md-hue-1[md-mode=buffer].md-warn .md-dashed:before, md-progress-linear.md-hue-1[md-mode=buffer].md-warn .md-dashed:before{background:radial-gradient(rgb(255,204,188) 0,rgb(255,204,188) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-warn .md-on, md-radio-button.md-hue-1:not([disabled]).md-warn .md-on,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-on, md-radio-button.md-hue-1:not([disabled]) .md-warn .md-on,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-warn .md-on, md-radio-group.md-hue-1:not([disabled]).md-warn .md-on,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-on, md-radio-group.md-hue-1:not([disabled]) .md-warn .md-on{background-color:rgba(255,138,101,0.87)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked .md-off, md-radio-button.md-hue-1:not([disabled]).md-warn.md-checked .md-off,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-warn.md-checked .md-off, md-radio-button.md-hue-1:not([disabled]) .md-warn.md-checked .md-off,md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-warn .md-checked .md-off, md-radio-button.md-hue-1:not([disabled]).md-warn .md-checked .md-off,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-checked .md-off, md-radio-button.md-hue-1:not([disabled]) .md-warn .md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked .md-off, md-radio-group.md-hue-1:not([disabled]).md-warn.md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-warn.md-checked .md-off, md-radio-group.md-hue-1:not([disabled]) .md-warn.md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-warn .md-checked .md-off, md-radio-group.md-hue-1:not([disabled]).md-warn .md-checked .md-off,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-checked .md-off, md-radio-group.md-hue-1:not([disabled]) .md-warn .md-checked .md-off{border-color:rgba(255,138,101,0.87)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-button.md-hue-1:not([disabled]) .md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-group.md-hue-1:not([disabled]) .md-warn .md-checked .md-ink-ripple{color:rgba(255,138,101,0.87)}md-radio-button.md-default-theme.md-hue-1:not([disabled]).md-warn .md-container .md-ripple, md-radio-button.md-hue-1:not([disabled]).md-warn .md-container .md-ripple,md-radio-button.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-container .md-ripple, md-radio-button.md-hue-1:not([disabled]) .md-warn .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]).md-warn .md-container .md-ripple, md-radio-group.md-hue-1:not([disabled]).md-warn .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-1:not([disabled]) .md-warn .md-container .md-ripple, md-radio-group.md-hue-1:not([disabled]) .md-warn .md-container .md-ripple{color:rgb(244,81,30)}md-radio-group.md-default-theme.md-hue-1.md-focused:not(:empty) .md-checked.md-warn .md-container:before, md-radio-group.md-hue-1.md-focused:not(:empty) .md-checked.md-warn .md-container:before,md-radio-group.md-default-theme.md-hue-1.md-focused:not(:empty).md-warn .md-checked .md-container:before, md-radio-group.md-hue-1.md-focused:not(:empty).md-warn .md-checked .md-container:before{background-color:rgba(255,138,101,0.26)}md-input-container md-select.md-default-theme.md-hue-1 .md-select-value span:first-child:after, md-input-container md-select.md-hue-1 .md-select-value span:first-child:after{color:rgb(221,44,0)}md-input-container.md-input-invalid md-select.md-default-theme.md-hue-1 .md-select-value, md-input-container.md-input-invalid md-select.md-hue-1 .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme.md-hue-1 .md-select-value span:first-child:after, md-select.md-hue-1 .md-select-value span:first-child:after{color:rgb(221,44,0)}md-select.md-default-theme.md-hue-1.ng-invalid.ng-touched .md-select-value, md-select.md-hue-1.ng-invalid.ng-touched .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme.md-hue-1:not([disabled]):focus.md-warn .md-select-value, md-select.md-hue-1:not([disabled]):focus.md-warn .md-select-value{border-bottom-color:rgb(255,138,101)}md-slider.md-default-theme.md-hue-1.md-warn .md-focus-ring, md-slider.md-hue-1.md-warn .md-focus-ring{background-color:rgba(255,171,145,0.38)}md-slider.md-default-theme.md-hue-1.md-warn .md-track.md-track-fill, md-slider.md-hue-1.md-warn .md-track.md-track-fill{background-color:rgb(255,138,101)}md-slider.md-default-theme.md-hue-1.md-warn .md-thumb:after, md-slider.md-hue-1.md-warn .md-thumb:after{border-color:rgb(255,138,101);background-color:rgb(255,138,101)}md-slider.md-default-theme.md-hue-1.md-warn .md-sign, md-slider.md-hue-1.md-warn .md-sign{background-color:rgb(255,138,101)}md-slider.md-default-theme.md-hue-1.md-warn .md-sign:after, md-slider.md-hue-1.md-warn .md-sign:after{border-top-color:rgb(255,138,101)}md-slider.md-default-theme.md-hue-1.md-warn[md-vertical] .md-sign:after, md-slider.md-hue-1.md-warn[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(255,138,101)}md-slider.md-default-theme.md-hue-1.md-warn .md-thumb-text, md-slider.md-hue-1.md-warn .md-thumb-text{color:rgba(0,0,0,0.87)}.md-subheader.md-default-theme.md-hue-1.md-warn, .md-subheader.md-hue-1.md-warn{color:rgb(255,138,101)}md-switch.md-default-theme.md-hue-1.md-checked.md-warn .md-ink-ripple, md-switch.md-hue-1.md-checked.md-warn .md-ink-ripple{color:rgb(255,138,101)}md-switch.md-default-theme.md-hue-1.md-checked.md-warn .md-thumb, md-switch.md-hue-1.md-checked.md-warn .md-thumb{background-color:rgb(255,138,101)}md-switch.md-default-theme.md-hue-1.md-checked.md-warn .md-bar, md-switch.md-hue-1.md-checked.md-warn .md-bar{background-color:rgba(255,138,101,0.5)}md-switch.md-default-theme.md-hue-1.md-checked.md-warn.md-focused .md-thumb:before, md-switch.md-hue-1.md-checked.md-warn.md-focused .md-thumb:before{background-color:rgba(255,138,101,0.26)}md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper, md-tabs.md-hue-1.md-warn>md-tabs-wrapper{background-color:rgb(255,138,101)}md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-tabs.md-default-theme.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-1.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper, md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper{background-color:rgb(255,138,101)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs.md-hue-1>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toast.md-default-theme.md-hue-1 .md-toast-content .md-button.md-highlight.md-warn, md-toast.md-hue-1 .md-toast-content .md-button.md-highlight.md-warn{color:rgb(255,138,101)}md-toolbar.md-default-theme.md-hue-1:not(.md-menu-toolbar).md-warn, md-toolbar.md-hue-1:not(.md-menu-toolbar).md-warn{background-color:rgb(255,138,101);color:rgba(0,0,0,0.87)}
-.md-button.md-default-theme.md-hue-2.md-warn, .md-button.md-hue-2.md-warn{color:rgb(216,67,21)}.md-button.md-default-theme.md-hue-2.md-warn.md-fab, .md-button.md-hue-2.md-warn.md-fab,.md-button.md-default-theme.md-hue-2.md-warn.md-raised, .md-button.md-hue-2.md-warn.md-raised{color:rgb(255,255,255);background-color:rgb(216,67,21)}.md-button.md-default-theme.md-hue-2.md-warn.md-fab:not([disabled]) md-icon, .md-button.md-hue-2.md-warn.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-2.md-warn.md-raised:not([disabled]) md-icon, .md-button.md-hue-2.md-warn.md-raised:not([disabled]) md-icon{color:rgb(255,255,255)}.md-button.md-default-theme.md-hue-2.md-warn.md-fab:not([disabled]).md-focused, .md-button.md-hue-2.md-warn.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2.md-warn.md-fab:not([disabled]):hover, .md-button.md-hue-2.md-warn.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-2.md-warn.md-raised:not([disabled]).md-focused, .md-button.md-hue-2.md-warn.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2.md-warn.md-raised:not([disabled]):hover, .md-button.md-hue-2.md-warn.md-raised:not([disabled]):hover{background-color:rgb(244,81,30)}.md-button.md-default-theme.md-hue-2.md-warn:not([disabled]) md-icon, .md-button.md-hue-2.md-warn:not([disabled]) md-icon{color:rgb(216,67,21)}._md a.md-default-theme.md-hue-2:not(.md-button).md-warn, ._md a.md-hue-2:not(.md-button).md-warn{color:rgb(216,67,21)}._md a.md-default-theme.md-hue-2:not(.md-button).md-warn:hover, ._md a.md-hue-2:not(.md-button).md-warn:hover{color:rgb(230,74,25)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-warn .md-ripple, md-checkbox.md-hue-2:not([disabled]).md-warn .md-ripple{color:rgb(244,81,30)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-warn .md-ink-ripple, md-checkbox.md-hue-2:not([disabled]).md-warn .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked .md-ink-ripple, md-checkbox.md-hue-2:not([disabled]).md-warn.md-checked .md-ink-ripple{color:rgba(216,67,21,0.87)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-warn:not(.md-checked) .md-icon, md-checkbox.md-hue-2:not([disabled]).md-warn:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked .md-icon, md-checkbox.md-hue-2:not([disabled]).md-warn.md-checked .md-icon{background-color:rgba(216,67,21,0.87)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before, md-checkbox.md-hue-2:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before{background-color:rgba(216,67,21,0.26)}md-checkbox.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked .md-icon:after, md-checkbox.md-hue-2:not([disabled]).md-warn.md-checked .md-icon:after{border-color:rgb(238,238,238)}.md-default-theme.md-hue-2 .md-datepicker-input-container.md-datepicker-invalid, .md-hue-2 .md-datepicker-input-container.md-datepicker-invalid,.md-warn .md-default-theme.md-hue-2 .md-datepicker-input-container.md-datepicker-focused, .md-warn .md-hue-2 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(221,44,0)}.md-default-theme.md-hue-2 .md-datepicker-open.md-warn .md-datepicker-calendar-icon, .md-hue-2 .md-datepicker-open.md-warn .md-datepicker-calendar-icon,.md-warn .md-default-theme.md-hue-2 .md-datepicker-open .md-datepicker-calendar-icon, .md-warn .md-hue-2 .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(221,44,0)}md-icon.md-default-theme.md-hue-2.md-warn, md-icon.md-hue-2.md-warn{color:rgb(216,67,21)}md-input-container.md-default-theme.md-hue-2 label.md-required:after, md-input-container.md-hue-2 label.md-required:after{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-2 .md-input-message-animation, md-input-container.md-hue-2 .md-input-message-animation,md-input-container.md-default-theme.md-hue-2 .md-input-messages-animation, md-input-container.md-hue-2 .md-input-messages-animation{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused.md-warn .md-input, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused.md-warn .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused.md-warn label, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused.md-warn label,md-input-container.md-default-theme.md-hue-2:not(.md-input-invalid).md-input-focused.md-warn md-icon, md-input-container.md-hue-2:not(.md-input-invalid).md-input-focused.md-warn md-icon{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-2.md-input-invalid .md-input, md-input-container.md-hue-2.md-input-invalid .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-2.md-input-invalid .md-char-counter, md-input-container.md-hue-2.md-input-invalid .md-char-counter,md-input-container.md-default-theme.md-hue-2.md-input-invalid .md-input-message-animation, md-input-container.md-hue-2.md-input-invalid .md-input-message-animation,md-input-container.md-default-theme.md-hue-2.md-input-invalid label, md-input-container.md-hue-2.md-input-invalid label{color:rgb(221,44,0)}md-nav-bar.md-default-theme.md-hue-2.md-warn>.md-nav-bar, md-nav-bar.md-hue-2.md-warn>.md-nav-bar{background-color:rgb(216,67,21)}md-nav-bar.md-default-theme.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-nav-bar.md-default-theme.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgb(255,255,255)}md-nav-bar.md-default-theme.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-2.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar, md-toolbar.md-warn>md-nav-bar.md-hue-2>.md-nav-bar{background-color:rgb(216,67,21)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-warn>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-warn>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgb(255,255,255)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar.md-hue-2>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(255,255,255,0.1)}md-progress-circular.md-default-theme.md-hue-2.md-warn path, md-progress-circular.md-hue-2.md-warn path{stroke:rgb(216,67,21)}md-progress-linear.md-default-theme.md-hue-2.md-warn .md-container, md-progress-linear.md-hue-2.md-warn .md-container{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme.md-hue-2.md-warn .md-bar, md-progress-linear.md-hue-2.md-warn .md-bar{background-color:rgb(216,67,21)}md-progress-linear.md-default-theme.md-hue-2[md-mode=buffer].md-warn .md-bar1, md-progress-linear.md-hue-2[md-mode=buffer].md-warn .md-bar1{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme.md-hue-2[md-mode=buffer].md-warn .md-dashed:before, md-progress-linear.md-hue-2[md-mode=buffer].md-warn .md-dashed:before{background:radial-gradient(rgb(255,204,188) 0,rgb(255,204,188) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-warn .md-on, md-radio-button.md-hue-2:not([disabled]).md-warn .md-on,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-on, md-radio-button.md-hue-2:not([disabled]) .md-warn .md-on,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-warn .md-on, md-radio-group.md-hue-2:not([disabled]).md-warn .md-on,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-on, md-radio-group.md-hue-2:not([disabled]) .md-warn .md-on{background-color:rgba(216,67,21,0.87)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked .md-off, md-radio-button.md-hue-2:not([disabled]).md-warn.md-checked .md-off,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-warn.md-checked .md-off, md-radio-button.md-hue-2:not([disabled]) .md-warn.md-checked .md-off,md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-warn .md-checked .md-off, md-radio-button.md-hue-2:not([disabled]).md-warn .md-checked .md-off,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-checked .md-off, md-radio-button.md-hue-2:not([disabled]) .md-warn .md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked .md-off, md-radio-group.md-hue-2:not([disabled]).md-warn.md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-warn.md-checked .md-off, md-radio-group.md-hue-2:not([disabled]) .md-warn.md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-warn .md-checked .md-off, md-radio-group.md-hue-2:not([disabled]).md-warn .md-checked .md-off,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-checked .md-off, md-radio-group.md-hue-2:not([disabled]) .md-warn .md-checked .md-off{border-color:rgba(216,67,21,0.87)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-button.md-hue-2:not([disabled]) .md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-group.md-hue-2:not([disabled]) .md-warn .md-checked .md-ink-ripple{color:rgba(216,67,21,0.87)}md-radio-button.md-default-theme.md-hue-2:not([disabled]).md-warn .md-container .md-ripple, md-radio-button.md-hue-2:not([disabled]).md-warn .md-container .md-ripple,md-radio-button.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-container .md-ripple, md-radio-button.md-hue-2:not([disabled]) .md-warn .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]).md-warn .md-container .md-ripple, md-radio-group.md-hue-2:not([disabled]).md-warn .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-2:not([disabled]) .md-warn .md-container .md-ripple, md-radio-group.md-hue-2:not([disabled]) .md-warn .md-container .md-ripple{color:rgb(244,81,30)}md-radio-group.md-default-theme.md-hue-2.md-focused:not(:empty) .md-checked.md-warn .md-container:before, md-radio-group.md-hue-2.md-focused:not(:empty) .md-checked.md-warn .md-container:before,md-radio-group.md-default-theme.md-hue-2.md-focused:not(:empty).md-warn .md-checked .md-container:before, md-radio-group.md-hue-2.md-focused:not(:empty).md-warn .md-checked .md-container:before{background-color:rgba(216,67,21,0.26)}md-input-container md-select.md-default-theme.md-hue-2 .md-select-value span:first-child:after, md-input-container md-select.md-hue-2 .md-select-value span:first-child:after{color:rgb(221,44,0)}md-input-container.md-input-invalid md-select.md-default-theme.md-hue-2 .md-select-value, md-input-container.md-input-invalid md-select.md-hue-2 .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme.md-hue-2 .md-select-value span:first-child:after, md-select.md-hue-2 .md-select-value span:first-child:after{color:rgb(221,44,0)}md-select.md-default-theme.md-hue-2.ng-invalid.ng-touched .md-select-value, md-select.md-hue-2.ng-invalid.ng-touched .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme.md-hue-2:not([disabled]):focus.md-warn .md-select-value, md-select.md-hue-2:not([disabled]):focus.md-warn .md-select-value{border-bottom-color:rgb(216,67,21)}md-slider.md-default-theme.md-hue-2.md-warn .md-focus-ring, md-slider.md-hue-2.md-warn .md-focus-ring{background-color:rgba(255,171,145,0.38)}md-slider.md-default-theme.md-hue-2.md-warn .md-track.md-track-fill, md-slider.md-hue-2.md-warn .md-track.md-track-fill{background-color:rgb(216,67,21)}md-slider.md-default-theme.md-hue-2.md-warn .md-thumb:after, md-slider.md-hue-2.md-warn .md-thumb:after{border-color:rgb(216,67,21);background-color:rgb(216,67,21)}md-slider.md-default-theme.md-hue-2.md-warn .md-sign, md-slider.md-hue-2.md-warn .md-sign{background-color:rgb(216,67,21)}md-slider.md-default-theme.md-hue-2.md-warn .md-sign:after, md-slider.md-hue-2.md-warn .md-sign:after{border-top-color:rgb(216,67,21)}md-slider.md-default-theme.md-hue-2.md-warn[md-vertical] .md-sign:after, md-slider.md-hue-2.md-warn[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(216,67,21)}md-slider.md-default-theme.md-hue-2.md-warn .md-thumb-text, md-slider.md-hue-2.md-warn .md-thumb-text{color:rgb(255,255,255)}.md-subheader.md-default-theme.md-hue-2.md-warn, .md-subheader.md-hue-2.md-warn{color:rgb(216,67,21)}md-switch.md-default-theme.md-hue-2.md-checked.md-warn .md-ink-ripple, md-switch.md-hue-2.md-checked.md-warn .md-ink-ripple{color:rgb(216,67,21)}md-switch.md-default-theme.md-hue-2.md-checked.md-warn .md-thumb, md-switch.md-hue-2.md-checked.md-warn .md-thumb{background-color:rgb(216,67,21)}md-switch.md-default-theme.md-hue-2.md-checked.md-warn .md-bar, md-switch.md-hue-2.md-checked.md-warn .md-bar{background-color:rgba(216,67,21,0.5)}md-switch.md-default-theme.md-hue-2.md-checked.md-warn.md-focused .md-thumb:before, md-switch.md-hue-2.md-checked.md-warn.md-focused .md-thumb:before{background-color:rgba(216,67,21,0.26)}md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper, md-tabs.md-hue-2.md-warn>md-tabs-wrapper{background-color:rgb(216,67,21)}md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgb(255,255,255)}md-tabs.md-default-theme.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-2.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper, md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper{background-color:rgb(216,67,21)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgb(255,255,255)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs.md-hue-2>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(255,255,255,0.1)}md-toast.md-default-theme.md-hue-2 .md-toast-content .md-button.md-highlight.md-warn, md-toast.md-hue-2 .md-toast-content .md-button.md-highlight.md-warn{color:rgb(216,67,21)}md-toolbar.md-default-theme.md-hue-2:not(.md-menu-toolbar).md-warn, md-toolbar.md-hue-2:not(.md-menu-toolbar).md-warn{background-color:rgb(216,67,21);color:rgb(255,255,255)}
-.md-button.md-default-theme.md-hue-3.md-warn, .md-button.md-hue-3.md-warn{color:rgb(255,158,128)}.md-button.md-default-theme.md-hue-3.md-warn.md-fab, .md-button.md-hue-3.md-warn.md-fab,.md-button.md-default-theme.md-hue-3.md-warn.md-raised, .md-button.md-hue-3.md-warn.md-raised{color:rgba(0,0,0,0.87);background-color:rgb(255,158,128)}.md-button.md-default-theme.md-hue-3.md-warn.md-fab:not([disabled]) md-icon, .md-button.md-hue-3.md-warn.md-fab:not([disabled]) md-icon,.md-button.md-default-theme.md-hue-3.md-warn.md-raised:not([disabled]) md-icon, .md-button.md-hue-3.md-warn.md-raised:not([disabled]) md-icon{color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3.md-warn.md-fab:not([disabled]).md-focused, .md-button.md-hue-3.md-warn.md-fab:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3.md-warn.md-fab:not([disabled]):hover, .md-button.md-hue-3.md-warn.md-fab:not([disabled]):hover,.md-button.md-default-theme.md-hue-3.md-warn.md-raised:not([disabled]).md-focused, .md-button.md-hue-3.md-warn.md-raised:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3.md-warn.md-raised:not([disabled]):hover, .md-button.md-hue-3.md-warn.md-raised:not([disabled]):hover{background-color:rgb(244,81,30)}.md-button.md-default-theme.md-hue-3.md-warn:not([disabled]) md-icon, .md-button.md-hue-3.md-warn:not([disabled]) md-icon{color:rgb(255,158,128)}._md a.md-default-theme.md-hue-3:not(.md-button).md-warn, ._md a.md-hue-3:not(.md-button).md-warn{color:rgb(255,158,128)}._md a.md-default-theme.md-hue-3:not(.md-button).md-warn:hover, ._md a.md-hue-3:not(.md-button).md-warn:hover{color:rgb(230,74,25)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-warn .md-ripple, md-checkbox.md-hue-3:not([disabled]).md-warn .md-ripple{color:rgb(244,81,30)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-warn .md-ink-ripple, md-checkbox.md-hue-3:not([disabled]).md-warn .md-ink-ripple{color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked .md-ink-ripple, md-checkbox.md-hue-3:not([disabled]).md-warn.md-checked .md-ink-ripple{color:rgba(255,158,128,0.87)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-warn:not(.md-checked) .md-icon, md-checkbox.md-hue-3:not([disabled]).md-warn:not(.md-checked) .md-icon{border-color:rgba(0,0,0,0.54)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked .md-icon, md-checkbox.md-hue-3:not([disabled]).md-warn.md-checked .md-icon{background-color:rgba(255,158,128,0.87)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before, md-checkbox.md-hue-3:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before{background-color:rgba(255,158,128,0.26)}md-checkbox.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked .md-icon:after, md-checkbox.md-hue-3:not([disabled]).md-warn.md-checked .md-icon:after{border-color:rgb(238,238,238)}.md-default-theme.md-hue-3 .md-datepicker-input-container.md-datepicker-invalid, .md-hue-3 .md-datepicker-input-container.md-datepicker-invalid,.md-warn .md-default-theme.md-hue-3 .md-datepicker-input-container.md-datepicker-focused, .md-warn .md-hue-3 .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:rgb(221,44,0)}.md-default-theme.md-hue-3 .md-datepicker-open.md-warn .md-datepicker-calendar-icon, .md-hue-3 .md-datepicker-open.md-warn .md-datepicker-calendar-icon,.md-warn .md-default-theme.md-hue-3 .md-datepicker-open .md-datepicker-calendar-icon, .md-warn .md-hue-3 .md-datepicker-open .md-datepicker-calendar-icon{color:rgb(221,44,0)}md-icon.md-default-theme.md-hue-3.md-warn, md-icon.md-hue-3.md-warn{color:rgb(255,158,128)}md-input-container.md-default-theme.md-hue-3 label.md-required:after, md-input-container.md-hue-3 label.md-required:after{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-3 .md-input-message-animation, md-input-container.md-hue-3 .md-input-message-animation,md-input-container.md-default-theme.md-hue-3 .md-input-messages-animation, md-input-container.md-hue-3 .md-input-messages-animation{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused.md-warn .md-input, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused.md-warn .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused.md-warn label, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused.md-warn label,md-input-container.md-default-theme.md-hue-3:not(.md-input-invalid).md-input-focused.md-warn md-icon, md-input-container.md-hue-3:not(.md-input-invalid).md-input-focused.md-warn md-icon{color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-3.md-input-invalid .md-input, md-input-container.md-hue-3.md-input-invalid .md-input{border-color:rgb(221,44,0)}md-input-container.md-default-theme.md-hue-3.md-input-invalid .md-char-counter, md-input-container.md-hue-3.md-input-invalid .md-char-counter,md-input-container.md-default-theme.md-hue-3.md-input-invalid .md-input-message-animation, md-input-container.md-hue-3.md-input-invalid .md-input-message-animation,md-input-container.md-default-theme.md-hue-3.md-input-invalid label, md-input-container.md-hue-3.md-input-invalid label{color:rgb(221,44,0)}md-nav-bar.md-default-theme.md-hue-3.md-warn>.md-nav-bar, md-nav-bar.md-hue-3.md-warn>.md-nav-bar{background-color:rgb(255,158,128)}md-nav-bar.md-default-theme.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button, md-nav-bar.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-nav-bar.md-default-theme.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button.md-active, md-nav-bar.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button.md-active,md-nav-bar.md-default-theme.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused, md-nav-bar.md-hue-3.md-warn>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar, md-toolbar.md-warn>md-nav-bar.md-hue-3>.md-nav-bar{background-color:rgb(255,158,128)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button, md-toolbar.md-warn>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button{color:rgb(255,204,188)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-active, md-toolbar.md-warn>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-active,md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused{color:rgba(0,0,0,0.87)}md-toolbar.md-warn>md-nav-bar.md-default-theme.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused, md-toolbar.md-warn>md-nav-bar.md-hue-3>.md-nav-bar .md-button._md-nav-button.md-focused{background:rgba(0,0,0,0.1)}md-progress-circular.md-default-theme.md-hue-3.md-warn path, md-progress-circular.md-hue-3.md-warn path{stroke:rgb(255,158,128)}md-progress-linear.md-default-theme.md-hue-3.md-warn .md-container, md-progress-linear.md-hue-3.md-warn .md-container{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme.md-hue-3.md-warn .md-bar, md-progress-linear.md-hue-3.md-warn .md-bar{background-color:rgb(255,158,128)}md-progress-linear.md-default-theme.md-hue-3[md-mode=buffer].md-warn .md-bar1, md-progress-linear.md-hue-3[md-mode=buffer].md-warn .md-bar1{background-color:rgb(255,204,188)}md-progress-linear.md-default-theme.md-hue-3[md-mode=buffer].md-warn .md-dashed:before, md-progress-linear.md-hue-3[md-mode=buffer].md-warn .md-dashed:before{background:radial-gradient(rgb(255,204,188) 0,rgb(255,204,188) 16%,transparent 42%)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-warn .md-on, md-radio-button.md-hue-3:not([disabled]).md-warn .md-on,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-on, md-radio-button.md-hue-3:not([disabled]) .md-warn .md-on,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-warn .md-on, md-radio-group.md-hue-3:not([disabled]).md-warn .md-on,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-on, md-radio-group.md-hue-3:not([disabled]) .md-warn .md-on{background-color:rgba(255,158,128,0.87)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked .md-off, md-radio-button.md-hue-3:not([disabled]).md-warn.md-checked .md-off,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-warn.md-checked .md-off, md-radio-button.md-hue-3:not([disabled]) .md-warn.md-checked .md-off,md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-warn .md-checked .md-off, md-radio-button.md-hue-3:not([disabled]).md-warn .md-checked .md-off,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-checked .md-off, md-radio-button.md-hue-3:not([disabled]) .md-warn .md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked .md-off, md-radio-group.md-hue-3:not([disabled]).md-warn.md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-warn.md-checked .md-off, md-radio-group.md-hue-3:not([disabled]) .md-warn.md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-warn .md-checked .md-off, md-radio-group.md-hue-3:not([disabled]).md-warn .md-checked .md-off,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-checked .md-off, md-radio-group.md-hue-3:not([disabled]) .md-warn .md-checked .md-off{border-color:rgba(255,158,128,0.87)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-button.md-hue-3:not([disabled]) .md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-warn.md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-warn.md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-warn .md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-checked .md-ink-ripple, md-radio-group.md-hue-3:not([disabled]) .md-warn .md-checked .md-ink-ripple{color:rgba(255,158,128,0.87)}md-radio-button.md-default-theme.md-hue-3:not([disabled]).md-warn .md-container .md-ripple, md-radio-button.md-hue-3:not([disabled]).md-warn .md-container .md-ripple,md-radio-button.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-container .md-ripple, md-radio-button.md-hue-3:not([disabled]) .md-warn .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]).md-warn .md-container .md-ripple, md-radio-group.md-hue-3:not([disabled]).md-warn .md-container .md-ripple,md-radio-group.md-default-theme.md-hue-3:not([disabled]) .md-warn .md-container .md-ripple, md-radio-group.md-hue-3:not([disabled]) .md-warn .md-container .md-ripple{color:rgb(244,81,30)}md-radio-group.md-default-theme.md-hue-3.md-focused:not(:empty) .md-checked.md-warn .md-container:before, md-radio-group.md-hue-3.md-focused:not(:empty) .md-checked.md-warn .md-container:before,md-radio-group.md-default-theme.md-hue-3.md-focused:not(:empty).md-warn .md-checked .md-container:before, md-radio-group.md-hue-3.md-focused:not(:empty).md-warn .md-checked .md-container:before{background-color:rgba(255,158,128,0.26)}md-input-container md-select.md-default-theme.md-hue-3 .md-select-value span:first-child:after, md-input-container md-select.md-hue-3 .md-select-value span:first-child:after{color:rgb(221,44,0)}md-input-container.md-input-invalid md-select.md-default-theme.md-hue-3 .md-select-value, md-input-container.md-input-invalid md-select.md-hue-3 .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme.md-hue-3 .md-select-value span:first-child:after, md-select.md-hue-3 .md-select-value span:first-child:after{color:rgb(221,44,0)}md-select.md-default-theme.md-hue-3.ng-invalid.ng-touched .md-select-value, md-select.md-hue-3.ng-invalid.ng-touched .md-select-value{color:rgb(221,44,0)!important;border-bottom-color:rgb(221,44,0)!important}md-select.md-default-theme.md-hue-3:not([disabled]):focus.md-warn .md-select-value, md-select.md-hue-3:not([disabled]):focus.md-warn .md-select-value{border-bottom-color:rgb(255,158,128)}md-slider.md-default-theme.md-hue-3.md-warn .md-focus-ring, md-slider.md-hue-3.md-warn .md-focus-ring{background-color:rgba(255,171,145,0.38)}md-slider.md-default-theme.md-hue-3.md-warn .md-track.md-track-fill, md-slider.md-hue-3.md-warn .md-track.md-track-fill{background-color:rgb(255,158,128)}md-slider.md-default-theme.md-hue-3.md-warn .md-thumb:after, md-slider.md-hue-3.md-warn .md-thumb:after{border-color:rgb(255,158,128);background-color:rgb(255,158,128)}md-slider.md-default-theme.md-hue-3.md-warn .md-sign, md-slider.md-hue-3.md-warn .md-sign{background-color:rgb(255,158,128)}md-slider.md-default-theme.md-hue-3.md-warn .md-sign:after, md-slider.md-hue-3.md-warn .md-sign:after{border-top-color:rgb(255,158,128)}md-slider.md-default-theme.md-hue-3.md-warn[md-vertical] .md-sign:after, md-slider.md-hue-3.md-warn[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(255,158,128)}md-slider.md-default-theme.md-hue-3.md-warn .md-thumb-text, md-slider.md-hue-3.md-warn .md-thumb-text{color:rgba(0,0,0,0.87)}.md-subheader.md-default-theme.md-hue-3.md-warn, .md-subheader.md-hue-3.md-warn{color:rgb(255,158,128)}md-switch.md-default-theme.md-hue-3.md-checked.md-warn .md-ink-ripple, md-switch.md-hue-3.md-checked.md-warn .md-ink-ripple{color:rgb(255,158,128)}md-switch.md-default-theme.md-hue-3.md-checked.md-warn .md-thumb, md-switch.md-hue-3.md-checked.md-warn .md-thumb{background-color:rgb(255,158,128)}md-switch.md-default-theme.md-hue-3.md-checked.md-warn .md-bar, md-switch.md-hue-3.md-checked.md-warn .md-bar{background-color:rgba(255,158,128,0.5)}md-switch.md-default-theme.md-hue-3.md-checked.md-warn.md-focused .md-thumb:before, md-switch.md-hue-3.md-checked.md-warn.md-focused .md-thumb:before{background-color:rgba(255,158,128,0.26)}md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper, md-tabs.md-hue-3.md-warn>md-tabs-wrapper{background-color:rgb(255,158,128)}md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-tabs.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-tabs.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-tabs.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-tabs.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-tabs.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-tabs.md-default-theme.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-tabs.md-hue-3.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper, md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper{background-color:rgb(255,158,128)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]), md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon, md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:rgb(255,204,188)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active, md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon, md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon, md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:rgba(0,0,0,0.87)}md-toolbar.md-warn>md-tabs.md-default-theme.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused, md-toolbar.md-warn>md-tabs.md-hue-3>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:rgba(0,0,0,0.1)}md-toast.md-default-theme.md-hue-3 .md-toast-content .md-button.md-highlight.md-warn, md-toast.md-hue-3 .md-toast-content .md-button.md-highlight.md-warn{color:rgb(255,158,128)}md-toolbar.md-default-theme.md-hue-3:not(.md-menu-toolbar).md-warn, md-toolbar.md-hue-3:not(.md-menu-toolbar).md-warn{background-color:rgb(255,158,128);color:rgba(0,0,0,0.87)}
-md-autocomplete.md-default-theme, md-autocomplete{background:rgb(245,245,245)}md-autocomplete.md-default-theme[disabled]:not([md-floating-label]), md-autocomplete[disabled]:not([md-floating-label]){background:rgb(238,238,238)}md-autocomplete.md-default-theme button md-icon path, md-autocomplete button md-icon path{fill:rgb(117,117,117)}md-autocomplete.md-default-theme button:after, md-autocomplete button:after{background:rgba(117,117,117,0.3)}.md-autocomplete-suggestions-container.md-default-theme, .md-autocomplete-suggestions-container{background:rgb(245,245,245)}.md-autocomplete-suggestions-container.md-default-theme li.selected, .md-autocomplete-suggestions-container li.selected,.md-autocomplete-suggestions-container.md-default-theme li:hover, .md-autocomplete-suggestions-container li:hover{background:rgba(158,158,158,0.18)}md-backdrop{background-color:rgba(33,33,33,0.0)}md-backdrop.md-opaque.md-default-theme, md-backdrop.md-opaque{background-color:rgba(33,33,33,1.0)}md-bottom-sheet.md-default-theme, md-bottom-sheet{background-color:rgb(250,250,250);border-top-color:rgb(224,224,224)}md-bottom-sheet.md-default-theme .md-subheader, md-bottom-sheet .md-subheader{background-color:rgb(250,250,250);color:rgba(0,0,0,0.87)}.md-button.md-default-theme:not([disabled]).md-focused, .md-button:not([disabled]).md-focused,.md-button.md-default-theme:not([disabled]):hover, .md-button:not([disabled]):hover{background-color:rgba(158,158,158,0.2)}.md-button.md-default-theme:not([disabled]).md-icon-button:hover, .md-button:not([disabled]).md-icon-button:hover{background-color:transparent}.md-button.md-default-theme.md-raised, .md-button.md-raised{color:rgb(33,33,33);background-color:rgb(250,250,250)}.md-button.md-default-theme.md-raised:not([disabled]) md-icon, .md-button.md-raised:not([disabled]) md-icon{color:rgb(33,33,33)}.md-button.md-default-theme.md-raised:not([disabled]):hover, .md-button.md-raised:not([disabled]):hover{background-color:rgb(250,250,250)}.md-button.md-default-theme.md-raised:not([disabled]).md-focused, .md-button.md-raised:not([disabled]).md-focused{background-color:rgb(238,238,238)}.md-button.md-default-theme.md-fab[disabled], .md-button.md-fab[disabled],.md-button.md-default-theme.md-raised[disabled], .md-button.md-raised[disabled]{background-color:rgba(0,0,0,0.12)}.md-button.md-default-theme[disabled], .md-button[disabled]{background-color:transparent}md-card.md-default-theme, md-card{color:rgba(0,0,0,0.87);background-color:rgb(245,245,245);border-radius:2px}md-card.md-default-theme md-card-header md-card-avatar md-icon, md-card md-card-header md-card-avatar md-icon{color:rgb(250,250,250);background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-checked .md-ripple, md-checkbox.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme[disabled].md-checked .md-icon, md-checkbox[disabled].md-checked .md-icon{background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme[disabled].md-checked .md-icon:after, md-checkbox[disabled].md-checked .md-icon:after{border-color:rgb(238,238,238)}md-chips.md-default-theme md-chip, md-chips md-chip{background:rgb(224,224,224);color:rgb(66,66,66)}md-chips.md-default-theme md-chip md-icon, md-chips md-chip md-icon{color:rgb(97,97,97)}md-chips.md-default-theme md-chip._md-chip-editing, md-chips md-chip._md-chip-editing{background:transparent;color:rgb(66,66,66)}md-chips.md-default-theme md-chip-remove .md-button md-icon path, md-chips md-chip-remove .md-button md-icon path{fill:rgb(158,158,158)}.md-contact-suggestion span.md-contact-email{color:rgb(189,189,189)}md-content.md-default-theme, md-content{color:rgba(0,0,0,0.87);background-color:rgb(250,250,250)}.md-default-theme .md-calendar, .md-calendar{background:rgb(245,245,245);color:rgba(0,0,0,0.87)}.md-default-theme .md-calendar tr:last-child td, .md-calendar tr:last-child td{border-bottom-color:rgb(238,238,238)}.md-default-theme .md-calendar-day-header, .md-calendar-day-header{background:rgba(158,158,158,0.32);color:rgba(0,0,0,0.87)}.md-calendar-date.md-focus .md-default-theme .md-calendar-date-selection-indicator, .md-calendar-date.md-focus .md-calendar-date-selection-indicator,.md-default-theme .md-calendar-date-selection-indicator:hover, .md-calendar-date-selection-indicator:hover{background:rgba(158,158,158,0.32)}.md-default-theme .md-datepicker-calendar-pane, .md-datepicker-calendar-pane{border-color:rgb(245,245,245)}.md-default-theme .md-datepicker-calendar, .md-datepicker-calendar{background:rgb(245,245,245)}.md-default-theme .md-datepicker-input-mask-opaque, .md-datepicker-input-mask-opaque{box-shadow:0 0 0 9999px rgb(245,245,245)}.md-default-theme .md-datepicker-open .md-datepicker-input-container, .md-datepicker-open .md-datepicker-input-container{background:rgb(245,245,245)}md-dialog.md-default-theme, md-dialog{border-radius:4px;background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}[disabled] md-input-container.md-default-theme .md-input, [disabled] md-input-container .md-input,md-input-container.md-default-theme .md-input[disabled], md-input-container .md-input[disabled]{border-bottom-color:transparent;color:rgba(0,0,0,0.38);background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-list.md-default-theme .md-proxy-focus.md-focused div.md-no-style, md-list .md-proxy-focus.md-focused div.md-no-style{background-color:rgb(245,245,245)}md-list.md-default-theme md-list-item .md-avatar-icon, md-list md-list-item .md-avatar-icon{background-color:rgba(0,0,0,0.38);color:rgb(250,250,250)}md-menu-content.md-default-theme, md-menu-content{background-color:rgb(245,245,245)}md-menu-content.md-default-theme md-menu-divider, md-menu-content md-menu-divider{background-color:rgba(0,0,0,0.12)}md-menu-bar.md-default-theme md-menu.md-open>button, md-menu-bar md-menu.md-open>button,md-menu-bar.md-default-theme md-menu>button:focus, md-menu-bar md-menu>button:focus{outline:none;background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme.md-open:not(.md-keyboard-mode) md-menu:hover>button, md-menu-bar.md-open:not(.md-keyboard-mode) md-menu:hover>button{background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme:not(.md-keyboard-mode):not(.md-open) md-menu button:focus, md-menu-bar:not(.md-keyboard-mode):not(.md-open) md-menu button:focus,md-menu-bar.md-default-theme:not(.md-keyboard-mode):not(.md-open) md-menu button:hover, md-menu-bar:not(.md-keyboard-mode):not(.md-open) md-menu button:hover{background:transparent}md-menu-content.md-default-theme .md-menu.md-open>.md-button, md-menu-content .md-menu.md-open>.md-button{background-color:rgba(158,158,158,0.18)}md-toolbar.md-default-theme.md-menu-toolbar, md-toolbar.md-menu-toolbar{background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme .md-nav-bar, md-nav-bar .md-nav-bar{background-color:transparent;border-color:rgba(0,0,0,0.12)}._md-panel-backdrop.md-default-theme, ._md-panel-backdrop{background-color:rgba(33,33,33,1.0)}md-select.md-default-theme[disabled] .md-select-value, md-select[disabled] .md-select-value{border-bottom-color:transparent;background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-select-menu.md-default-theme md-content, md-select-menu md-content{background-color:rgb(245,245,245)}md-select-menu.md-default-theme md-content md-option:not([disabled]):focus, md-select-menu md-content md-option:not([disabled]):focus,md-select-menu.md-default-theme md-content md-option:not([disabled]):hover, md-select-menu md-content md-option:not([disabled]):hover{background-color:rgba(158,158,158,0.18)}.md-checkbox-enabled.md-default-theme[selected] .md-ripple, .md-checkbox-enabled[selected] .md-ripple{color:rgb(117,117,117)}md-sidenav.md-default-theme, md-sidenav,md-sidenav.md-default-theme md-content, md-sidenav md-content{background-color:rgb(245,245,245)}md-slider.md-default-theme .md-track, md-slider .md-track{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme .md-track-ticks, md-slider .md-track-ticks{color:rgba(0,0,0,0.87)}md-slider.md-default-theme .md-disabled-thumb, md-slider .md-disabled-thumb{border-color:rgb(250,250,250);background-color:rgb(250,250,250)}md-slider.md-default-theme.md-min .md-thumb:after, md-slider.md-min .md-thumb:after{background-color:rgb(250,250,250);border-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-min .md-focus-ring, md-slider.md-min .md-focus-ring{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-min[md-discrete] .md-thumb:after, md-slider.md-min[md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.87);border-color:transparent}md-slider.md-default-theme.md-min[md-discrete] .md-sign, md-slider.md-min[md-discrete] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme.md-min[md-discrete] .md-sign:after, md-slider.md-min[md-discrete] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme.md-min[md-discrete][md-vertical] .md-sign:after, md-slider.md-min[md-discrete][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme[disabled]:not(.md-min) .md-thumb:after, md-slider[disabled]:not(.md-min) .md-thumb:after,md-slider.md-default-theme[disabled][md-discrete] .md-thumb:after, md-slider[disabled][md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.38);border-color:transparent}md-slider.md-default-theme[disabled][readonly] .md-sign, md-slider[disabled][readonly] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme[disabled][readonly] .md-sign:after, md-slider[disabled][readonly] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme[disabled][readonly][md-vertical] .md-sign:after, md-slider[disabled][readonly][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme[disabled][readonly] .md-disabled-thumb, md-slider[disabled][readonly] .md-disabled-thumb{border-color:transparent;background-color:transparent}.md-subheader.md-default-theme, .md-subheader{color:rgba(0,0,0,0.54);background-color:rgb(250,250,250)}md-switch.md-default-theme .md-ink-ripple, md-switch .md-ink-ripple{color:rgb(158,158,158)}md-switch.md-default-theme .md-thumb, md-switch .md-thumb{background-color:rgb(250,250,250)}md-switch.md-default-theme .md-bar, md-switch .md-bar{background-color:rgb(158,158,158)}md-switch.md-default-theme[disabled] .md-thumb, md-switch[disabled] .md-thumb{background-color:rgb(189,189,189)}md-switch.md-default-theme[disabled] .md-bar, md-switch[disabled] .md-bar{background-color:rgba(0,0,0,0.12)}md-tabs.md-default-theme md-tabs-wrapper, md-tabs md-tabs-wrapper{background-color:transparent;border-color:rgba(0,0,0,0.12)}md-toast.md-default-theme .md-toast-content, md-toast .md-toast-content{background-color:#323232;color:rgb(250,250,250)}md-toast.md-default-theme .md-toast-content .md-button, md-toast .md-toast-content .md-button{color:rgb(250,250,250)}.md-panel.md-tooltip.md-default-theme, .md-panel.md-tooltip{color:rgba(255,255,255,0.87);background-color:rgb(97,97,97)}body.md-default-theme, body,html.md-default-theme, html{color:rgba(0,0,0,0.87);background-color:rgb(250,250,250)}
-md-autocomplete.md-default-theme.md-hue-1, md-autocomplete.md-hue-1{background:rgb(245,245,245)}md-autocomplete.md-default-theme.md-hue-1[disabled]:not([md-floating-label]), md-autocomplete.md-hue-1[disabled]:not([md-floating-label]){background:rgb(238,238,238)}md-autocomplete.md-default-theme.md-hue-1 button md-icon path, md-autocomplete.md-hue-1 button md-icon path{fill:rgb(117,117,117)}md-autocomplete.md-default-theme.md-hue-1 button:after, md-autocomplete.md-hue-1 button:after{background:rgba(117,117,117,0.3)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-1, .md-autocomplete-suggestions-container.md-hue-1{background:rgb(245,245,245)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-1 li.selected, .md-autocomplete-suggestions-container.md-hue-1 li.selected,.md-autocomplete-suggestions-container.md-default-theme.md-hue-1 li:hover, .md-autocomplete-suggestions-container.md-hue-1 li:hover{background:rgba(158,158,158,0.18)}md-backdrop{background-color:rgba(33,33,33,0.0)}md-backdrop.md-opaque.md-default-theme.md-hue-1, md-backdrop.md-opaque.md-hue-1{background-color:rgba(33,33,33,1.0)}md-bottom-sheet.md-default-theme.md-hue-1, md-bottom-sheet.md-hue-1{background-color:rgb(250,250,250);border-top-color:rgb(224,224,224)}md-bottom-sheet.md-default-theme.md-hue-1 .md-subheader, md-bottom-sheet.md-hue-1 .md-subheader{background-color:rgb(250,250,250);color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-1:not([disabled]).md-focused, .md-button.md-hue-1:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-1:not([disabled]):hover, .md-button.md-hue-1:not([disabled]):hover{background-color:rgba(158,158,158,0.2)}.md-button.md-default-theme.md-hue-1:not([disabled]).md-icon-button:hover, .md-button.md-hue-1:not([disabled]).md-icon-button:hover{background-color:transparent}.md-button.md-default-theme.md-hue-1.md-raised, .md-button.md-hue-1.md-raised{color:rgb(33,33,33);background-color:rgb(250,250,250)}.md-button.md-default-theme.md-hue-1.md-raised:not([disabled]) md-icon, .md-button.md-hue-1.md-raised:not([disabled]) md-icon{color:rgb(33,33,33)}.md-button.md-default-theme.md-hue-1.md-raised:not([disabled]):hover, .md-button.md-hue-1.md-raised:not([disabled]):hover{background-color:rgb(250,250,250)}.md-button.md-default-theme.md-hue-1.md-raised:not([disabled]).md-focused, .md-button.md-hue-1.md-raised:not([disabled]).md-focused{background-color:rgb(238,238,238)}.md-button.md-default-theme.md-hue-1.md-fab[disabled], .md-button.md-hue-1.md-fab[disabled],.md-button.md-default-theme.md-hue-1.md-raised[disabled], .md-button.md-hue-1.md-raised[disabled]{background-color:rgba(0,0,0,0.12)}.md-button.md-default-theme.md-hue-1[disabled], .md-button.md-hue-1[disabled]{background-color:transparent}md-card.md-default-theme.md-hue-1, md-card.md-hue-1{color:rgba(0,0,0,0.87);background-color:rgb(245,245,245);border-radius:2px}md-card.md-default-theme.md-hue-1 md-card-header md-card-avatar md-icon, md-card.md-hue-1 md-card-header md-card-avatar md-icon{color:rgb(245,245,245);background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-1.md-checked .md-ripple, md-checkbox.md-hue-1.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme.md-hue-1[disabled].md-checked .md-icon, md-checkbox.md-hue-1[disabled].md-checked .md-icon{background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-1[disabled].md-checked .md-icon:after, md-checkbox.md-hue-1[disabled].md-checked .md-icon:after{border-color:rgb(238,238,238)}md-chips.md-default-theme.md-hue-1 md-chip, md-chips.md-hue-1 md-chip{background:rgb(224,224,224);color:rgb(66,66,66)}md-chips.md-default-theme.md-hue-1 md-chip md-icon, md-chips.md-hue-1 md-chip md-icon{color:rgb(97,97,97)}md-chips.md-default-theme.md-hue-1 md-chip._md-chip-editing, md-chips.md-hue-1 md-chip._md-chip-editing{background:transparent;color:rgb(66,66,66)}md-chips.md-default-theme.md-hue-1 md-chip-remove .md-button md-icon path, md-chips.md-hue-1 md-chip-remove .md-button md-icon path{fill:rgb(158,158,158)}.md-contact-suggestion span.md-contact-email{color:rgb(189,189,189)}md-content.md-default-theme.md-hue-1, md-content.md-hue-1{color:rgba(0,0,0,0.87);background-color:rgb(250,250,250)}.md-default-theme.md-hue-1 .md-calendar, .md-hue-1 .md-calendar{background:rgb(245,245,245);color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-1 .md-calendar tr:last-child td, .md-hue-1 .md-calendar tr:last-child td{border-bottom-color:rgb(238,238,238)}.md-default-theme.md-hue-1 .md-calendar-day-header, .md-hue-1 .md-calendar-day-header{background:rgba(158,158,158,0.32);color:rgba(0,0,0,0.87)}.md-calendar-date.md-focus .md-default-theme.md-hue-1 .md-calendar-date-selection-indicator, .md-calendar-date.md-focus .md-hue-1 .md-calendar-date-selection-indicator,.md-default-theme.md-hue-1 .md-calendar-date-selection-indicator:hover, .md-hue-1 .md-calendar-date-selection-indicator:hover{background:rgba(158,158,158,0.32)}.md-default-theme.md-hue-1 .md-datepicker-calendar-pane, .md-hue-1 .md-datepicker-calendar-pane{border-color:rgb(245,245,245)}.md-default-theme.md-hue-1 .md-datepicker-calendar, .md-hue-1 .md-datepicker-calendar{background:rgb(245,245,245)}.md-default-theme.md-hue-1 .md-datepicker-input-mask-opaque, .md-hue-1 .md-datepicker-input-mask-opaque{box-shadow:0 0 0 9999px rgb(245,245,245)}.md-default-theme.md-hue-1 .md-datepicker-open .md-datepicker-input-container, .md-hue-1 .md-datepicker-open .md-datepicker-input-container{background:rgb(245,245,245)}md-dialog.md-default-theme.md-hue-1, md-dialog.md-hue-1{border-radius:4px;background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}[disabled] md-input-container.md-default-theme.md-hue-1 .md-input, [disabled] md-input-container.md-hue-1 .md-input,md-input-container.md-default-theme.md-hue-1 .md-input[disabled], md-input-container.md-hue-1 .md-input[disabled]{border-bottom-color:transparent;color:rgba(0,0,0,0.38);background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-list.md-default-theme.md-hue-1 .md-proxy-focus.md-focused div.md-no-style, md-list.md-hue-1 .md-proxy-focus.md-focused div.md-no-style{background-color:rgb(245,245,245)}md-list.md-default-theme.md-hue-1 md-list-item .md-avatar-icon, md-list.md-hue-1 md-list-item .md-avatar-icon{background-color:rgba(0,0,0,0.38);color:rgb(245,245,245)}md-menu-content.md-default-theme.md-hue-1, md-menu-content.md-hue-1{background-color:rgb(245,245,245)}md-menu-content.md-default-theme.md-hue-1 md-menu-divider, md-menu-content.md-hue-1 md-menu-divider{background-color:rgba(0,0,0,0.12)}md-menu-bar.md-default-theme.md-hue-1 md-menu.md-open>button, md-menu-bar.md-hue-1 md-menu.md-open>button,md-menu-bar.md-default-theme.md-hue-1 md-menu>button:focus, md-menu-bar.md-hue-1 md-menu>button:focus{outline:none;background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme.md-hue-1.md-open:not(.md-keyboard-mode) md-menu:hover>button, md-menu-bar.md-hue-1.md-open:not(.md-keyboard-mode) md-menu:hover>button{background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme.md-hue-1:not(.md-keyboard-mode):not(.md-open) md-menu button:focus, md-menu-bar.md-hue-1:not(.md-keyboard-mode):not(.md-open) md-menu button:focus,md-menu-bar.md-default-theme.md-hue-1:not(.md-keyboard-mode):not(.md-open) md-menu button:hover, md-menu-bar.md-hue-1:not(.md-keyboard-mode):not(.md-open) md-menu button:hover{background:transparent}md-menu-content.md-default-theme.md-hue-1 .md-menu.md-open>.md-button, md-menu-content.md-hue-1 .md-menu.md-open>.md-button{background-color:rgba(158,158,158,0.18)}md-toolbar.md-default-theme.md-hue-1.md-menu-toolbar, md-toolbar.md-hue-1.md-menu-toolbar{background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-1 .md-nav-bar, md-nav-bar.md-hue-1 .md-nav-bar{background-color:transparent;border-color:rgba(0,0,0,0.12)}._md-panel-backdrop.md-default-theme.md-hue-1, ._md-panel-backdrop.md-hue-1{background-color:rgba(33,33,33,1.0)}md-select.md-default-theme.md-hue-1[disabled] .md-select-value, md-select.md-hue-1[disabled] .md-select-value{border-bottom-color:transparent;background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-select-menu.md-default-theme.md-hue-1 md-content, md-select-menu.md-hue-1 md-content{background-color:rgb(245,245,245)}md-select-menu.md-default-theme.md-hue-1 md-content md-option:not([disabled]):focus, md-select-menu.md-hue-1 md-content md-option:not([disabled]):focus,md-select-menu.md-default-theme.md-hue-1 md-content md-option:not([disabled]):hover, md-select-menu.md-hue-1 md-content md-option:not([disabled]):hover{background-color:rgba(158,158,158,0.18)}.md-checkbox-enabled.md-default-theme.md-hue-1[selected] .md-ripple, .md-checkbox-enabled.md-hue-1[selected] .md-ripple{color:rgb(117,117,117)}md-sidenav.md-default-theme.md-hue-1, md-sidenav.md-hue-1,md-sidenav.md-default-theme.md-hue-1 md-content, md-sidenav.md-hue-1 md-content{background-color:rgb(245,245,245)}md-slider.md-default-theme.md-hue-1 .md-track, md-slider.md-hue-1 .md-track{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-1 .md-track-ticks, md-slider.md-hue-1 .md-track-ticks{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-1 .md-disabled-thumb, md-slider.md-hue-1 .md-disabled-thumb{border-color:rgb(245,245,245);background-color:rgb(245,245,245)}md-slider.md-default-theme.md-hue-1.md-min .md-thumb:after, md-slider.md-hue-1.md-min .md-thumb:after{background-color:rgb(245,245,245);border-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-1.md-min .md-focus-ring, md-slider.md-hue-1.md-min .md-focus-ring{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-1.md-min[md-discrete] .md-thumb:after, md-slider.md-hue-1.md-min[md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.87);border-color:transparent}md-slider.md-default-theme.md-hue-1.md-min[md-discrete] .md-sign, md-slider.md-hue-1.md-min[md-discrete] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-1.md-min[md-discrete] .md-sign:after, md-slider.md-hue-1.md-min[md-discrete] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-1.md-min[md-discrete][md-vertical] .md-sign:after, md-slider.md-hue-1.md-min[md-discrete][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-1[disabled]:not(.md-min) .md-thumb:after, md-slider.md-hue-1[disabled]:not(.md-min) .md-thumb:after,md-slider.md-default-theme.md-hue-1[disabled][md-discrete] .md-thumb:after, md-slider.md-hue-1[disabled][md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.38);border-color:transparent}md-slider.md-default-theme.md-hue-1[disabled][readonly] .md-sign, md-slider.md-hue-1[disabled][readonly] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-1[disabled][readonly] .md-sign:after, md-slider.md-hue-1[disabled][readonly] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-1[disabled][readonly][md-vertical] .md-sign:after, md-slider.md-hue-1[disabled][readonly][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-1[disabled][readonly] .md-disabled-thumb, md-slider.md-hue-1[disabled][readonly] .md-disabled-thumb{border-color:transparent;background-color:transparent}.md-subheader.md-default-theme.md-hue-1, .md-subheader.md-hue-1{color:rgba(0,0,0,0.54);background-color:rgb(250,250,250)}md-switch.md-default-theme.md-hue-1 .md-ink-ripple, md-switch.md-hue-1 .md-ink-ripple{color:rgb(158,158,158)}md-switch.md-default-theme.md-hue-1 .md-thumb, md-switch.md-hue-1 .md-thumb{background-color:rgb(250,250,250)}md-switch.md-default-theme.md-hue-1 .md-bar, md-switch.md-hue-1 .md-bar{background-color:rgb(158,158,158)}md-switch.md-default-theme.md-hue-1[disabled] .md-thumb, md-switch.md-hue-1[disabled] .md-thumb{background-color:rgb(189,189,189)}md-switch.md-default-theme.md-hue-1[disabled] .md-bar, md-switch.md-hue-1[disabled] .md-bar{background-color:rgba(0,0,0,0.12)}md-tabs.md-default-theme.md-hue-1 md-tabs-wrapper, md-tabs.md-hue-1 md-tabs-wrapper{background-color:transparent;border-color:rgba(0,0,0,0.12)}md-toast.md-default-theme.md-hue-1 .md-toast-content, md-toast.md-hue-1 .md-toast-content{background-color:#323232;color:rgb(250,250,250)}md-toast.md-default-theme.md-hue-1 .md-toast-content .md-button, md-toast.md-hue-1 .md-toast-content .md-button{color:rgb(250,250,250)}.md-panel.md-tooltip.md-default-theme.md-hue-1, .md-panel.md-tooltip.md-hue-1{color:rgba(255,255,255,0.87);background-color:rgb(97,97,97)}body.md-default-theme.md-hue-1, body.md-hue-1,html.md-default-theme.md-hue-1, html.md-hue-1{color:rgba(0,0,0,0.87);background-color:rgb(245,245,245)}
-md-autocomplete.md-default-theme.md-hue-2, md-autocomplete.md-hue-2{background:rgb(245,245,245)}md-autocomplete.md-default-theme.md-hue-2[disabled]:not([md-floating-label]), md-autocomplete.md-hue-2[disabled]:not([md-floating-label]){background:rgb(238,238,238)}md-autocomplete.md-default-theme.md-hue-2 button md-icon path, md-autocomplete.md-hue-2 button md-icon path{fill:rgb(117,117,117)}md-autocomplete.md-default-theme.md-hue-2 button:after, md-autocomplete.md-hue-2 button:after{background:rgba(117,117,117,0.3)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-2, .md-autocomplete-suggestions-container.md-hue-2{background:rgb(245,245,245)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-2 li.selected, .md-autocomplete-suggestions-container.md-hue-2 li.selected,.md-autocomplete-suggestions-container.md-default-theme.md-hue-2 li:hover, .md-autocomplete-suggestions-container.md-hue-2 li:hover{background:rgba(158,158,158,0.18)}md-backdrop{background-color:rgba(33,33,33,0.0)}md-backdrop.md-opaque.md-default-theme.md-hue-2, md-backdrop.md-opaque.md-hue-2{background-color:rgba(33,33,33,1.0)}md-bottom-sheet.md-default-theme.md-hue-2, md-bottom-sheet.md-hue-2{background-color:rgb(250,250,250);border-top-color:rgb(224,224,224)}md-bottom-sheet.md-default-theme.md-hue-2 .md-subheader, md-bottom-sheet.md-hue-2 .md-subheader{background-color:rgb(250,250,250);color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-2:not([disabled]).md-focused, .md-button.md-hue-2:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-2:not([disabled]):hover, .md-button.md-hue-2:not([disabled]):hover{background-color:rgba(158,158,158,0.2)}.md-button.md-default-theme.md-hue-2:not([disabled]).md-icon-button:hover, .md-button.md-hue-2:not([disabled]).md-icon-button:hover{background-color:transparent}.md-button.md-default-theme.md-hue-2.md-raised, .md-button.md-hue-2.md-raised{color:rgb(33,33,33);background-color:rgb(250,250,250)}.md-button.md-default-theme.md-hue-2.md-raised:not([disabled]) md-icon, .md-button.md-hue-2.md-raised:not([disabled]) md-icon{color:rgb(33,33,33)}.md-button.md-default-theme.md-hue-2.md-raised:not([disabled]):hover, .md-button.md-hue-2.md-raised:not([disabled]):hover{background-color:rgb(250,250,250)}.md-button.md-default-theme.md-hue-2.md-raised:not([disabled]).md-focused, .md-button.md-hue-2.md-raised:not([disabled]).md-focused{background-color:rgb(238,238,238)}.md-button.md-default-theme.md-hue-2.md-fab[disabled], .md-button.md-hue-2.md-fab[disabled],.md-button.md-default-theme.md-hue-2.md-raised[disabled], .md-button.md-hue-2.md-raised[disabled]{background-color:rgba(0,0,0,0.12)}.md-button.md-default-theme.md-hue-2[disabled], .md-button.md-hue-2[disabled]{background-color:transparent}md-card.md-default-theme.md-hue-2, md-card.md-hue-2{color:rgba(0,0,0,0.87);background-color:rgb(245,245,245);border-radius:2px}md-card.md-default-theme.md-hue-2 md-card-header md-card-avatar md-icon, md-card.md-hue-2 md-card-header md-card-avatar md-icon{color:rgb(238,238,238);background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-2.md-checked .md-ripple, md-checkbox.md-hue-2.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme.md-hue-2[disabled].md-checked .md-icon, md-checkbox.md-hue-2[disabled].md-checked .md-icon{background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-2[disabled].md-checked .md-icon:after, md-checkbox.md-hue-2[disabled].md-checked .md-icon:after{border-color:rgb(238,238,238)}md-chips.md-default-theme.md-hue-2 md-chip, md-chips.md-hue-2 md-chip{background:rgb(224,224,224);color:rgb(66,66,66)}md-chips.md-default-theme.md-hue-2 md-chip md-icon, md-chips.md-hue-2 md-chip md-icon{color:rgb(97,97,97)}md-chips.md-default-theme.md-hue-2 md-chip._md-chip-editing, md-chips.md-hue-2 md-chip._md-chip-editing{background:transparent;color:rgb(66,66,66)}md-chips.md-default-theme.md-hue-2 md-chip-remove .md-button md-icon path, md-chips.md-hue-2 md-chip-remove .md-button md-icon path{fill:rgb(158,158,158)}.md-contact-suggestion span.md-contact-email{color:rgb(189,189,189)}md-content.md-default-theme.md-hue-2, md-content.md-hue-2{color:rgba(0,0,0,0.87);background-color:rgb(250,250,250)}.md-default-theme.md-hue-2 .md-calendar, .md-hue-2 .md-calendar{background:rgb(245,245,245);color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-2 .md-calendar tr:last-child td, .md-hue-2 .md-calendar tr:last-child td{border-bottom-color:rgb(238,238,238)}.md-default-theme.md-hue-2 .md-calendar-day-header, .md-hue-2 .md-calendar-day-header{background:rgba(158,158,158,0.32);color:rgba(0,0,0,0.87)}.md-calendar-date.md-focus .md-default-theme.md-hue-2 .md-calendar-date-selection-indicator, .md-calendar-date.md-focus .md-hue-2 .md-calendar-date-selection-indicator,.md-default-theme.md-hue-2 .md-calendar-date-selection-indicator:hover, .md-hue-2 .md-calendar-date-selection-indicator:hover{background:rgba(158,158,158,0.32)}.md-default-theme.md-hue-2 .md-datepicker-calendar-pane, .md-hue-2 .md-datepicker-calendar-pane{border-color:rgb(245,245,245)}.md-default-theme.md-hue-2 .md-datepicker-calendar, .md-hue-2 .md-datepicker-calendar{background:rgb(245,245,245)}.md-default-theme.md-hue-2 .md-datepicker-input-mask-opaque, .md-hue-2 .md-datepicker-input-mask-opaque{box-shadow:0 0 0 9999px rgb(245,245,245)}.md-default-theme.md-hue-2 .md-datepicker-open .md-datepicker-input-container, .md-hue-2 .md-datepicker-open .md-datepicker-input-container{background:rgb(245,245,245)}md-dialog.md-default-theme.md-hue-2, md-dialog.md-hue-2{border-radius:4px;background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}[disabled] md-input-container.md-default-theme.md-hue-2 .md-input, [disabled] md-input-container.md-hue-2 .md-input,md-input-container.md-default-theme.md-hue-2 .md-input[disabled], md-input-container.md-hue-2 .md-input[disabled]{border-bottom-color:transparent;color:rgba(0,0,0,0.38);background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-list.md-default-theme.md-hue-2 .md-proxy-focus.md-focused div.md-no-style, md-list.md-hue-2 .md-proxy-focus.md-focused div.md-no-style{background-color:rgb(245,245,245)}md-list.md-default-theme.md-hue-2 md-list-item .md-avatar-icon, md-list.md-hue-2 md-list-item .md-avatar-icon{background-color:rgba(0,0,0,0.38);color:rgb(238,238,238)}md-menu-content.md-default-theme.md-hue-2, md-menu-content.md-hue-2{background-color:rgb(245,245,245)}md-menu-content.md-default-theme.md-hue-2 md-menu-divider, md-menu-content.md-hue-2 md-menu-divider{background-color:rgba(0,0,0,0.12)}md-menu-bar.md-default-theme.md-hue-2 md-menu.md-open>button, md-menu-bar.md-hue-2 md-menu.md-open>button,md-menu-bar.md-default-theme.md-hue-2 md-menu>button:focus, md-menu-bar.md-hue-2 md-menu>button:focus{outline:none;background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme.md-hue-2.md-open:not(.md-keyboard-mode) md-menu:hover>button, md-menu-bar.md-hue-2.md-open:not(.md-keyboard-mode) md-menu:hover>button{background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme.md-hue-2:not(.md-keyboard-mode):not(.md-open) md-menu button:focus, md-menu-bar.md-hue-2:not(.md-keyboard-mode):not(.md-open) md-menu button:focus,md-menu-bar.md-default-theme.md-hue-2:not(.md-keyboard-mode):not(.md-open) md-menu button:hover, md-menu-bar.md-hue-2:not(.md-keyboard-mode):not(.md-open) md-menu button:hover{background:transparent}md-menu-content.md-default-theme.md-hue-2 .md-menu.md-open>.md-button, md-menu-content.md-hue-2 .md-menu.md-open>.md-button{background-color:rgba(158,158,158,0.18)}md-toolbar.md-default-theme.md-hue-2.md-menu-toolbar, md-toolbar.md-hue-2.md-menu-toolbar{background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-2 .md-nav-bar, md-nav-bar.md-hue-2 .md-nav-bar{background-color:transparent;border-color:rgba(0,0,0,0.12)}._md-panel-backdrop.md-default-theme.md-hue-2, ._md-panel-backdrop.md-hue-2{background-color:rgba(33,33,33,1.0)}md-select.md-default-theme.md-hue-2[disabled] .md-select-value, md-select.md-hue-2[disabled] .md-select-value{border-bottom-color:transparent;background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-select-menu.md-default-theme.md-hue-2 md-content, md-select-menu.md-hue-2 md-content{background-color:rgb(245,245,245)}md-select-menu.md-default-theme.md-hue-2 md-content md-option:not([disabled]):focus, md-select-menu.md-hue-2 md-content md-option:not([disabled]):focus,md-select-menu.md-default-theme.md-hue-2 md-content md-option:not([disabled]):hover, md-select-menu.md-hue-2 md-content md-option:not([disabled]):hover{background-color:rgba(158,158,158,0.18)}.md-checkbox-enabled.md-default-theme.md-hue-2[selected] .md-ripple, .md-checkbox-enabled.md-hue-2[selected] .md-ripple{color:rgb(117,117,117)}md-sidenav.md-default-theme.md-hue-2, md-sidenav.md-hue-2,md-sidenav.md-default-theme.md-hue-2 md-content, md-sidenav.md-hue-2 md-content{background-color:rgb(245,245,245)}md-slider.md-default-theme.md-hue-2 .md-track, md-slider.md-hue-2 .md-track{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-2 .md-track-ticks, md-slider.md-hue-2 .md-track-ticks{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-2 .md-disabled-thumb, md-slider.md-hue-2 .md-disabled-thumb{border-color:rgb(238,238,238);background-color:rgb(238,238,238)}md-slider.md-default-theme.md-hue-2.md-min .md-thumb:after, md-slider.md-hue-2.md-min .md-thumb:after{background-color:rgb(238,238,238);border-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-2.md-min .md-focus-ring, md-slider.md-hue-2.md-min .md-focus-ring{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-2.md-min[md-discrete] .md-thumb:after, md-slider.md-hue-2.md-min[md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.87);border-color:transparent}md-slider.md-default-theme.md-hue-2.md-min[md-discrete] .md-sign, md-slider.md-hue-2.md-min[md-discrete] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-2.md-min[md-discrete] .md-sign:after, md-slider.md-hue-2.md-min[md-discrete] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-2.md-min[md-discrete][md-vertical] .md-sign:after, md-slider.md-hue-2.md-min[md-discrete][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-2[disabled]:not(.md-min) .md-thumb:after, md-slider.md-hue-2[disabled]:not(.md-min) .md-thumb:after,md-slider.md-default-theme.md-hue-2[disabled][md-discrete] .md-thumb:after, md-slider.md-hue-2[disabled][md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.38);border-color:transparent}md-slider.md-default-theme.md-hue-2[disabled][readonly] .md-sign, md-slider.md-hue-2[disabled][readonly] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-2[disabled][readonly] .md-sign:after, md-slider.md-hue-2[disabled][readonly] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-2[disabled][readonly][md-vertical] .md-sign:after, md-slider.md-hue-2[disabled][readonly][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-2[disabled][readonly] .md-disabled-thumb, md-slider.md-hue-2[disabled][readonly] .md-disabled-thumb{border-color:transparent;background-color:transparent}.md-subheader.md-default-theme.md-hue-2, .md-subheader.md-hue-2{color:rgba(0,0,0,0.54);background-color:rgb(250,250,250)}md-switch.md-default-theme.md-hue-2 .md-ink-ripple, md-switch.md-hue-2 .md-ink-ripple{color:rgb(158,158,158)}md-switch.md-default-theme.md-hue-2 .md-thumb, md-switch.md-hue-2 .md-thumb{background-color:rgb(250,250,250)}md-switch.md-default-theme.md-hue-2 .md-bar, md-switch.md-hue-2 .md-bar{background-color:rgb(158,158,158)}md-switch.md-default-theme.md-hue-2[disabled] .md-thumb, md-switch.md-hue-2[disabled] .md-thumb{background-color:rgb(189,189,189)}md-switch.md-default-theme.md-hue-2[disabled] .md-bar, md-switch.md-hue-2[disabled] .md-bar{background-color:rgba(0,0,0,0.12)}md-tabs.md-default-theme.md-hue-2 md-tabs-wrapper, md-tabs.md-hue-2 md-tabs-wrapper{background-color:transparent;border-color:rgba(0,0,0,0.12)}md-toast.md-default-theme.md-hue-2 .md-toast-content, md-toast.md-hue-2 .md-toast-content{background-color:#323232;color:rgb(250,250,250)}md-toast.md-default-theme.md-hue-2 .md-toast-content .md-button, md-toast.md-hue-2 .md-toast-content .md-button{color:rgb(250,250,250)}.md-panel.md-tooltip.md-default-theme.md-hue-2, .md-panel.md-tooltip.md-hue-2{color:rgba(255,255,255,0.87);background-color:rgb(97,97,97)}body.md-default-theme.md-hue-2, body.md-hue-2,html.md-default-theme.md-hue-2, html.md-hue-2{color:rgba(0,0,0,0.87);background-color:rgb(238,238,238)}
-md-autocomplete.md-default-theme.md-hue-3, md-autocomplete.md-hue-3{background:rgb(245,245,245)}md-autocomplete.md-default-theme.md-hue-3[disabled]:not([md-floating-label]), md-autocomplete.md-hue-3[disabled]:not([md-floating-label]){background:rgb(238,238,238)}md-autocomplete.md-default-theme.md-hue-3 button md-icon path, md-autocomplete.md-hue-3 button md-icon path{fill:rgb(117,117,117)}md-autocomplete.md-default-theme.md-hue-3 button:after, md-autocomplete.md-hue-3 button:after{background:rgba(117,117,117,0.3)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-3, .md-autocomplete-suggestions-container.md-hue-3{background:rgb(245,245,245)}.md-autocomplete-suggestions-container.md-default-theme.md-hue-3 li.selected, .md-autocomplete-suggestions-container.md-hue-3 li.selected,.md-autocomplete-suggestions-container.md-default-theme.md-hue-3 li:hover, .md-autocomplete-suggestions-container.md-hue-3 li:hover{background:rgba(158,158,158,0.18)}md-backdrop{background-color:rgba(33,33,33,0.0)}md-backdrop.md-opaque.md-default-theme.md-hue-3, md-backdrop.md-opaque.md-hue-3{background-color:rgba(33,33,33,1.0)}md-bottom-sheet.md-default-theme.md-hue-3, md-bottom-sheet.md-hue-3{background-color:rgb(250,250,250);border-top-color:rgb(224,224,224)}md-bottom-sheet.md-default-theme.md-hue-3 .md-subheader, md-bottom-sheet.md-hue-3 .md-subheader{background-color:rgb(250,250,250);color:rgba(0,0,0,0.87)}.md-button.md-default-theme.md-hue-3:not([disabled]).md-focused, .md-button.md-hue-3:not([disabled]).md-focused,.md-button.md-default-theme.md-hue-3:not([disabled]):hover, .md-button.md-hue-3:not([disabled]):hover{background-color:rgba(158,158,158,0.2)}.md-button.md-default-theme.md-hue-3:not([disabled]).md-icon-button:hover, .md-button.md-hue-3:not([disabled]).md-icon-button:hover{background-color:transparent}.md-button.md-default-theme.md-hue-3.md-raised, .md-button.md-hue-3.md-raised{color:rgb(33,33,33);background-color:rgb(250,250,250)}.md-button.md-default-theme.md-hue-3.md-raised:not([disabled]) md-icon, .md-button.md-hue-3.md-raised:not([disabled]) md-icon{color:rgb(33,33,33)}.md-button.md-default-theme.md-hue-3.md-raised:not([disabled]):hover, .md-button.md-hue-3.md-raised:not([disabled]):hover{background-color:rgb(250,250,250)}.md-button.md-default-theme.md-hue-3.md-raised:not([disabled]).md-focused, .md-button.md-hue-3.md-raised:not([disabled]).md-focused{background-color:rgb(238,238,238)}.md-button.md-default-theme.md-hue-3.md-fab[disabled], .md-button.md-hue-3.md-fab[disabled],.md-button.md-default-theme.md-hue-3.md-raised[disabled], .md-button.md-hue-3.md-raised[disabled]{background-color:rgba(0,0,0,0.12)}.md-button.md-default-theme.md-hue-3[disabled], .md-button.md-hue-3[disabled]{background-color:transparent}md-card.md-default-theme.md-hue-3, md-card.md-hue-3{color:rgba(0,0,0,0.87);background-color:rgb(245,245,245);border-radius:2px}md-card.md-default-theme.md-hue-3 md-card-header md-card-avatar md-icon, md-card.md-hue-3 md-card-header md-card-avatar md-icon{color:rgb(224,224,224);background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-3.md-checked .md-ripple, md-checkbox.md-hue-3.md-checked .md-ripple{color:rgb(117,117,117)}md-checkbox.md-default-theme.md-hue-3[disabled].md-checked .md-icon, md-checkbox.md-hue-3[disabled].md-checked .md-icon{background-color:rgba(0,0,0,0.38)}md-checkbox.md-default-theme.md-hue-3[disabled].md-checked .md-icon:after, md-checkbox.md-hue-3[disabled].md-checked .md-icon:after{border-color:rgb(238,238,238)}md-chips.md-default-theme.md-hue-3 md-chip, md-chips.md-hue-3 md-chip{background:rgb(224,224,224);color:rgb(66,66,66)}md-chips.md-default-theme.md-hue-3 md-chip md-icon, md-chips.md-hue-3 md-chip md-icon{color:rgb(97,97,97)}md-chips.md-default-theme.md-hue-3 md-chip._md-chip-editing, md-chips.md-hue-3 md-chip._md-chip-editing{background:transparent;color:rgb(66,66,66)}md-chips.md-default-theme.md-hue-3 md-chip-remove .md-button md-icon path, md-chips.md-hue-3 md-chip-remove .md-button md-icon path{fill:rgb(158,158,158)}.md-contact-suggestion span.md-contact-email{color:rgb(189,189,189)}md-content.md-default-theme.md-hue-3, md-content.md-hue-3{color:rgba(0,0,0,0.87);background-color:rgb(250,250,250)}.md-default-theme.md-hue-3 .md-calendar, .md-hue-3 .md-calendar{background:rgb(245,245,245);color:rgba(0,0,0,0.87)}.md-default-theme.md-hue-3 .md-calendar tr:last-child td, .md-hue-3 .md-calendar tr:last-child td{border-bottom-color:rgb(238,238,238)}.md-default-theme.md-hue-3 .md-calendar-day-header, .md-hue-3 .md-calendar-day-header{background:rgba(158,158,158,0.32);color:rgba(0,0,0,0.87)}.md-calendar-date.md-focus .md-default-theme.md-hue-3 .md-calendar-date-selection-indicator, .md-calendar-date.md-focus .md-hue-3 .md-calendar-date-selection-indicator,.md-default-theme.md-hue-3 .md-calendar-date-selection-indicator:hover, .md-hue-3 .md-calendar-date-selection-indicator:hover{background:rgba(158,158,158,0.32)}.md-default-theme.md-hue-3 .md-datepicker-calendar-pane, .md-hue-3 .md-datepicker-calendar-pane{border-color:rgb(245,245,245)}.md-default-theme.md-hue-3 .md-datepicker-calendar, .md-hue-3 .md-datepicker-calendar{background:rgb(245,245,245)}.md-default-theme.md-hue-3 .md-datepicker-input-mask-opaque, .md-hue-3 .md-datepicker-input-mask-opaque{box-shadow:0 0 0 9999px rgb(245,245,245)}.md-default-theme.md-hue-3 .md-datepicker-open .md-datepicker-input-container, .md-hue-3 .md-datepicker-open .md-datepicker-input-container{background:rgb(245,245,245)}md-dialog.md-default-theme.md-hue-3, md-dialog.md-hue-3{border-radius:4px;background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}[disabled] md-input-container.md-default-theme.md-hue-3 .md-input, [disabled] md-input-container.md-hue-3 .md-input,md-input-container.md-default-theme.md-hue-3 .md-input[disabled], md-input-container.md-hue-3 .md-input[disabled]{border-bottom-color:transparent;color:rgba(0,0,0,0.38);background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-list.md-default-theme.md-hue-3 .md-proxy-focus.md-focused div.md-no-style, md-list.md-hue-3 .md-proxy-focus.md-focused div.md-no-style{background-color:rgb(245,245,245)}md-list.md-default-theme.md-hue-3 md-list-item .md-avatar-icon, md-list.md-hue-3 md-list-item .md-avatar-icon{background-color:rgba(0,0,0,0.38);color:rgb(224,224,224)}md-menu-content.md-default-theme.md-hue-3, md-menu-content.md-hue-3{background-color:rgb(245,245,245)}md-menu-content.md-default-theme.md-hue-3 md-menu-divider, md-menu-content.md-hue-3 md-menu-divider{background-color:rgba(0,0,0,0.12)}md-menu-bar.md-default-theme.md-hue-3 md-menu.md-open>button, md-menu-bar.md-hue-3 md-menu.md-open>button,md-menu-bar.md-default-theme.md-hue-3 md-menu>button:focus, md-menu-bar.md-hue-3 md-menu>button:focus{outline:none;background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme.md-hue-3.md-open:not(.md-keyboard-mode) md-menu:hover>button, md-menu-bar.md-hue-3.md-open:not(.md-keyboard-mode) md-menu:hover>button{background-color:rgba(158,158,158,0.18)}md-menu-bar.md-default-theme.md-hue-3:not(.md-keyboard-mode):not(.md-open) md-menu button:focus, md-menu-bar.md-hue-3:not(.md-keyboard-mode):not(.md-open) md-menu button:focus,md-menu-bar.md-default-theme.md-hue-3:not(.md-keyboard-mode):not(.md-open) md-menu button:hover, md-menu-bar.md-hue-3:not(.md-keyboard-mode):not(.md-open) md-menu button:hover{background:transparent}md-menu-content.md-default-theme.md-hue-3 .md-menu.md-open>.md-button, md-menu-content.md-hue-3 .md-menu.md-open>.md-button{background-color:rgba(158,158,158,0.18)}md-toolbar.md-default-theme.md-hue-3.md-menu-toolbar, md-toolbar.md-hue-3.md-menu-toolbar{background-color:rgb(245,245,245);color:rgba(0,0,0,0.87)}md-nav-bar.md-default-theme.md-hue-3 .md-nav-bar, md-nav-bar.md-hue-3 .md-nav-bar{background-color:transparent;border-color:rgba(0,0,0,0.12)}._md-panel-backdrop.md-default-theme.md-hue-3, ._md-panel-backdrop.md-hue-3{background-color:rgba(33,33,33,1.0)}md-select.md-default-theme.md-hue-3[disabled] .md-select-value, md-select.md-hue-3[disabled] .md-select-value{border-bottom-color:transparent;background-image:linear-gradient(90deg,rgba(0,0,0,0.38) 0,rgba(0,0,0,0.38) 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,rgba(0,0,0,0.38) 100%)}md-select-menu.md-default-theme.md-hue-3 md-content, md-select-menu.md-hue-3 md-content{background-color:rgb(245,245,245)}md-select-menu.md-default-theme.md-hue-3 md-content md-option:not([disabled]):focus, md-select-menu.md-hue-3 md-content md-option:not([disabled]):focus,md-select-menu.md-default-theme.md-hue-3 md-content md-option:not([disabled]):hover, md-select-menu.md-hue-3 md-content md-option:not([disabled]):hover{background-color:rgba(158,158,158,0.18)}.md-checkbox-enabled.md-default-theme.md-hue-3[selected] .md-ripple, .md-checkbox-enabled.md-hue-3[selected] .md-ripple{color:rgb(117,117,117)}md-sidenav.md-default-theme.md-hue-3, md-sidenav.md-hue-3,md-sidenav.md-default-theme.md-hue-3 md-content, md-sidenav.md-hue-3 md-content{background-color:rgb(245,245,245)}md-slider.md-default-theme.md-hue-3 .md-track, md-slider.md-hue-3 .md-track{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-3 .md-track-ticks, md-slider.md-hue-3 .md-track-ticks{color:rgba(0,0,0,0.87)}md-slider.md-default-theme.md-hue-3 .md-disabled-thumb, md-slider.md-hue-3 .md-disabled-thumb{border-color:rgb(224,224,224);background-color:rgb(224,224,224)}md-slider.md-default-theme.md-hue-3.md-min .md-thumb:after, md-slider.md-hue-3.md-min .md-thumb:after{background-color:rgb(224,224,224);border-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-3.md-min .md-focus-ring, md-slider.md-hue-3.md-min .md-focus-ring{background-color:rgba(0,0,0,0.38)}md-slider.md-default-theme.md-hue-3.md-min[md-discrete] .md-thumb:after, md-slider.md-hue-3.md-min[md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.87);border-color:transparent}md-slider.md-default-theme.md-hue-3.md-min[md-discrete] .md-sign, md-slider.md-hue-3.md-min[md-discrete] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-3.md-min[md-discrete] .md-sign:after, md-slider.md-hue-3.md-min[md-discrete] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-3.md-min[md-discrete][md-vertical] .md-sign:after, md-slider.md-hue-3.md-min[md-discrete][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-3[disabled]:not(.md-min) .md-thumb:after, md-slider.md-hue-3[disabled]:not(.md-min) .md-thumb:after,md-slider.md-default-theme.md-hue-3[disabled][md-discrete] .md-thumb:after, md-slider.md-hue-3[disabled][md-discrete] .md-thumb:after{background-color:rgba(0,0,0,0.38);border-color:transparent}md-slider.md-default-theme.md-hue-3[disabled][readonly] .md-sign, md-slider.md-hue-3[disabled][readonly] .md-sign{background-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-3[disabled][readonly] .md-sign:after, md-slider.md-hue-3[disabled][readonly] .md-sign:after{border-top-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-3[disabled][readonly][md-vertical] .md-sign:after, md-slider.md-hue-3[disabled][readonly][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:rgb(189,189,189)}md-slider.md-default-theme.md-hue-3[disabled][readonly] .md-disabled-thumb, md-slider.md-hue-3[disabled][readonly] .md-disabled-thumb{border-color:transparent;background-color:transparent}.md-subheader.md-default-theme.md-hue-3, .md-subheader.md-hue-3{color:rgba(0,0,0,0.54);background-color:rgb(250,250,250)}md-switch.md-default-theme.md-hue-3 .md-ink-ripple, md-switch.md-hue-3 .md-ink-ripple{color:rgb(158,158,158)}md-switch.md-default-theme.md-hue-3 .md-thumb, md-switch.md-hue-3 .md-thumb{background-color:rgb(250,250,250)}md-switch.md-default-theme.md-hue-3 .md-bar, md-switch.md-hue-3 .md-bar{background-color:rgb(158,158,158)}md-switch.md-default-theme.md-hue-3[disabled] .md-thumb, md-switch.md-hue-3[disabled] .md-thumb{background-color:rgb(189,189,189)}md-switch.md-default-theme.md-hue-3[disabled] .md-bar, md-switch.md-hue-3[disabled] .md-bar{background-color:rgba(0,0,0,0.12)}md-tabs.md-default-theme.md-hue-3 md-tabs-wrapper, md-tabs.md-hue-3 md-tabs-wrapper{background-color:transparent;border-color:rgba(0,0,0,0.12)}md-toast.md-default-theme.md-hue-3 .md-toast-content, md-toast.md-hue-3 .md-toast-content{background-color:#323232;color:rgb(250,250,250)}md-toast.md-default-theme.md-hue-3 .md-toast-content .md-button, md-toast.md-hue-3 .md-toast-content .md-button{color:rgb(250,250,250)}.md-panel.md-tooltip.md-default-theme.md-hue-3, .md-panel.md-tooltip.md-hue-3{color:rgba(255,255,255,0.87);background-color:rgb(97,97,97)}body.md-default-theme.md-hue-3, body.md-hue-3,html.md-default-theme.md-hue-3, html.md-hue-3{color:rgba(0,0,0,0.87);background-color:rgb(224,224,224)}
\ No newline at end of file
diff --git a/data/Dockerfiles/sogo/theme-blue.js b/data/Dockerfiles/sogo/theme-blue.js
deleted file mode 100644
index 865443f9..00000000
--- a/data/Dockerfiles/sogo/theme-blue.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-(function() {
- 'use strict';
-
- angular.module('SOGo.Common')
- .config(configure)
-
- /**
- * @ngInject
- */
- configure.$inject = ['$mdThemingProvider'];
- function configure($mdThemingProvider) {
-
- // Overwrite values to prevent flipping colors on login screen
- $mdThemingProvider.definePalette('mailcow-blue', {
- '50': 'E3F2FD',
- '100': 'BBDEFB',
- '200': '90CAF9',
- '300': '64B5F6',
- '400': '42A5F5',
- '500': '2196F3',
- '600': '1E88E5',
- '700': '1976D2',
- '800': '1565C0',
- '900': '0D47A1',
- '1000': '0D47A1',
- 'A100': '82B1FF',
- 'A200': '448AFF',
- 'A400': '2979ff',
- 'A700': '2962ff',
- 'contrastDefaultColor': 'dark',
- 'contrastLightColors': ['700', '800', '900'],
- 'contrastDarkColors': undefined
- });
-
- $mdThemingProvider.definePalette('sogo-green', {
- '50': 'E3F2FD',
- '100': 'BBDEFB',
- '200': '90CAF9',
- '300': '64B5F6',
- '400': '42A5F5',
- '500': '2196F3',
- '600': '1E88E5',
- '700': '1976D2',
- '800': '1565C0',
- '900': '0D47A1',
- '1000': '0D47A1',
- 'A100': '82B1FF',
- 'A200': '448AFF',
- 'A400': '2979ff',
- 'A700': '2962ff',
- 'contrastDefaultColor': 'dark',
- 'contrastLightColors': ['700', '800', '900'],
- 'contrastDarkColors': undefined
- });
-
- $mdThemingProvider.definePalette('default', {
- '50': 'E3F2FD',
- '100': 'BBDEFB',
- '200': '90CAF9',
- '300': '64B5F6',
- '400': '42A5F5',
- '500': '2196F3',
- '600': '1E88E5',
- '700': '1976D2',
- '800': '1565C0',
- '900': '0D47A1',
- '1000': '0D47A1',
- 'A100': '82B1FF',
- 'A200': '448AFF',
- 'A400': '2979ff',
- 'A700': '2962ff',
- 'contrastDefaultColor': 'dark',
- 'contrastLightColors': ['700', '800', '900'],
- 'contrastDarkColors': undefined
- });
-
- $mdThemingProvider.theme('default')
- .primaryPalette('mailcow-blue', {
- 'default': '700', // top toolbar
- 'hue-1': '500',
- 'hue-2': '700', // sidebar toolbar
- 'hue-3': 'A200'
- })
- .accentPalette('mailcow-blue', {
- 'default': '800', // fab buttons
- 'hue-1': '50', // center list toolbar
- 'hue-2': '500',
- 'hue-3': 'A700'
- })
- .backgroundPalette('grey', {
- 'default': '50', // center list background
- 'hue-1': '100',
- 'hue-2': '200',
- 'hue-3': '300'
- });
-
- $mdThemingProvider.setDefaultTheme('default');
- $mdThemingProvider.generateThemesOnDemand(false);
- $mdThemingProvider.alwaysWatchTheme(true);
- }
-})();
diff --git a/data/Dockerfiles/solr/Dockerfile b/data/Dockerfiles/solr/Dockerfile
new file mode 100644
index 00000000..eae8f55a
--- /dev/null
+++ b/data/Dockerfiles/solr/Dockerfile
@@ -0,0 +1,13 @@
+FROM solr:7.7-alpine
+USER root
+COPY docker-entrypoint.sh /
+COPY solr-config-7.7.0.xml /
+COPY solr-schema-7.7.0.xml /
+
+
+RUN apk --no-cache add su-exec curl tzdata \
+ && chmod +x /docker-entrypoint.sh \
+ && sync \
+ && bash /docker-entrypoint.sh --bootstrap
+
+ENTRYPOINT ["/docker-entrypoint.sh"]
diff --git a/data/Dockerfiles/solr/docker-entrypoint.sh b/data/Dockerfiles/solr/docker-entrypoint.sh
new file mode 100755
index 00000000..5a33620d
--- /dev/null
+++ b/data/Dockerfiles/solr/docker-entrypoint.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+if [[ "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+ echo "SKIP_SOLR=y, skipping Solr..."
+ sleep 365d
+ exit 0
+fi
+
+MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
+
+if [[ "${1}" != "--bootstrap" ]]; then
+ if [ ${MEM_TOTAL} -lt "2097152" ]; then
+ echo "System memory less than 2 GB, skipping Solr..."
+ sleep 365d
+ exit 0
+ fi
+fi
+
+set -e
+
+# run the optional initdb
+. /opt/docker-solr/scripts/run-initdb
+
+# fixing volume permission
+[[ -d /opt/solr/server/solr/dovecot-fts/data ]] && chown -R solr:solr /opt/solr/server/solr/dovecot-fts/data
+if [[ "${1}" != "--bootstrap" ]]; then
+ sed -i '/SOLR_HEAP=/c\SOLR_HEAP="'${SOLR_HEAP:-1024}'m"' /opt/solr/bin/solr.in.sh
+else
+ sed -i '/SOLR_HEAP=/c\SOLR_HEAP="256m"' /opt/solr/bin/solr.in.sh
+fi
+
+if [[ "${1}" == "--bootstrap" ]]; then
+ echo "Creating initial configuration"
+ echo "Modifying default config set"
+ cp /solr-config-7.7.0.xml /opt/solr/server/solr/configsets/_default/conf/solrconfig.xml
+ cp /solr-schema-7.7.0.xml /opt/solr/server/solr/configsets/_default/conf/schema.xml
+ rm /opt/solr/server/solr/configsets/_default/conf/managed-schema
+
+ echo "Starting local Solr instance to setup configuration"
+ su-exec solr start-local-solr
+
+ echo "Creating core \"dovecot-fts\""
+ su-exec solr /opt/solr/bin/solr create -c "dovecot-fts"
+
+ # See https://github.com/docker-solr/docker-solr/issues/27
+ echo "Checking core"
+ while ! wget -O - 'http://localhost:8983/solr/admin/cores?action=STATUS' | grep -q instanceDir; do
+ echo "Could not find any cores, waiting..."
+ sleep 3
+ done
+
+ echo "Created core \"dovecot-fts\""
+
+ echo "Stopping local Solr"
+ su-exec solr stop-local-solr
+
+ exit 0
+fi
+
+exec su-exec solr solr-foreground
+
diff --git a/data/Dockerfiles/solr/solr-config-7.7.0.xml b/data/Dockerfiles/solr/solr-config-7.7.0.xml
new file mode 100644
index 00000000..3661874d
--- /dev/null
+++ b/data/Dockerfiles/solr/solr-config-7.7.0.xml
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+ 7.7.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${solr.data.dir:}
+
+
+
+
+
+
+ ${solr.ulog.dir:}
+ ${solr.ulog.numVersionBuckets:65536}
+
+
+
+
+ ${solr.autoCommit.maxTime:15000}
+ false
+
+
+
+
+ ${solr.autoSoftCommit.maxTime:-1}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ 20
+
+
+ 200
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ explicit
+ 10
+
+
+
+
+
+ _text_
+
+
+
+
+
+
diff --git a/data/Dockerfiles/solr/solr-schema-7.7.0.xml b/data/Dockerfiles/solr/solr-schema-7.7.0.xml
new file mode 100644
index 00000000..2c2e6343
--- /dev/null
+++ b/data/Dockerfiles/solr/solr-schema-7.7.0.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id
+
diff --git a/data/Dockerfiles/unbound/Dockerfile b/data/Dockerfiles/unbound/Dockerfile
index 72e86bc0..7658a8f8 100644
--- a/data/Dockerfiles/unbound/Dockerfile
+++ b/data/Dockerfiles/unbound/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.6
+FROM alpine:3.9
LABEL maintainer "Andre Peters "
@@ -8,8 +8,10 @@ RUN apk add --update --no-cache \
bash \
openssl \
drill \
+ tzdata \
&& curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache \
&& chown root:unbound /etc/unbound \
+ && adduser unbound tty \
&& chmod 775 /etc/unbound
EXPOSE 53/udp 53/tcp
diff --git a/data/Dockerfiles/unbound/docker-entrypoint.sh b/data/Dockerfiles/unbound/docker-entrypoint.sh
index b458cd8a..d179eaca 100755
--- a/data/Dockerfiles/unbound/docker-entrypoint.sh
+++ b/data/Dockerfiles/unbound/docker-entrypoint.sh
@@ -1,8 +1,11 @@
#!/bin/bash
+echo "Setting console permissions..."
+chown root:tty /dev/console
+chmod g+rw /dev/console
echo "Receiving anchor key..."
/usr/sbin/unbound-anchor -a /etc/unbound/trusted-key.key
echo "Receiving root hints..."
curl -#o /etc/unbound/root.hints https://www.internic.net/domain/named.cache
-
+/usr/sbin/unbound-control-setup
exec "$@"
diff --git a/data/Dockerfiles/watchdog/Dockerfile b/data/Dockerfiles/watchdog/Dockerfile
index 46130e5f..7ab29b68 100644
--- a/data/Dockerfiles/watchdog/Dockerfile
+++ b/data/Dockerfiles/watchdog/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.6
+FROM alpine:3.9
LABEL maintainer "Andrรฉ Peters "
# Installation
@@ -9,6 +9,7 @@ RUN apk add --update \
nagios-plugins-ping \
curl \
bash \
+ coreutils \
jq \
fcgi \
nagios-plugins-mysql \
diff --git a/data/Dockerfiles/watchdog/watchdog.sh b/data/Dockerfiles/watchdog/watchdog.sh
index c06abbc2..f56d3c4c 100755
--- a/data/Dockerfiles/watchdog/watchdog.sh
+++ b/data/Dockerfiles/watchdog/watchdog.sh
@@ -5,6 +5,8 @@ trap "kill 0" EXIT
# Prepare
BACKGROUND_TASKS=()
+echo "Waiting for containers to settle..."
+sleep 10
if [[ "${USE_WATCHDOG}" =~ ^([nN][oO]|[nN])+$ ]]; then
echo -e "$(date) - USE_WATCHDOG=n, skipping watchdog..."
@@ -30,65 +32,84 @@ progress() {
PERCENT=$(( 200 * ${CURRENT} / ${TOTAL} % 2 + 100 * ${CURRENT} / ${TOTAL} ))
redis-cli -h redis LPUSH WATCHDOG_LOG "{\"time\":\"$(date +%s)\",\"service\":\"${SERVICE}\",\"lvl\":\"${PERCENT}\",\"hpnow\":\"${CURRENT}\",\"hptotal\":\"${TOTAL}\",\"hpdiff\":\"${DIFF}\"}" > /dev/null
log_msg "${SERVICE} health level: ${PERCENT}% (${CURRENT}/${TOTAL}), health trend: ${DIFF}" no_redis
+ # Return 10 to indicate a dead service
+ [ ${CURRENT} -le 0 ] && return 10
}
log_msg() {
if [[ ${2} != "no_redis" ]]; then
redis-cli -h redis LPUSH WATCHDOG_LOG "{\"time\":\"$(date +%s)\",\"message\":\"$(printf '%s' "${1}" | \
- tr '%&;$"_[]{}-\r\n' ' ')\"}" > /dev/null
+ tr '\r\n%&;$"_[]{}-' ' ')\"}" > /dev/null
fi
echo $(date) $(printf '%s\n' "${1}")
}
function mail_error() {
[[ -z ${1} ]] && return 1
- [[ -z ${2} ]] && return 2
- RCPT_DOMAIN=$(echo ${1} | awk -F @ {'print $NF'})
- RCPT_MX=$(dig +short ${RCPT_DOMAIN} mx | sort -n | awk '{print $2; exit}')
- if [[ -z ${RCPT_MX} ]]; then
- log_msg "Cannot determine MX for ${1}, skipping email notification..."
- return 1
- fi
- ./smtp-cli --missing-modules-ok \
- --subject="Watchdog: ${2} service hit the error rate limit" \
- --body-plain="Service was restarted, please check your mailcow installation." \
- --to=${1} \
- --from="watchdog@${MAILCOW_HOSTNAME}" \
- --server="${RCPT_MX}" \
- --hello-host=${MAILCOW_HOSTNAME}
- log_msg "Sent notification email to ${1}"
+ [[ -z ${2} ]] && BODY="Service was restarted on $(date), please check your mailcow installation." || BODY="$(date) - ${2}"
+ WATCHDOG_NOTIFY_EMAIL=$(echo "${WATCHDOG_NOTIFY_EMAIL}" | sed 's/"//;s|"$||')
+ IFS=',' read -r -a MAIL_RCPTS <<< "${WATCHDOG_NOTIFY_EMAIL}"
+ for rcpt in "${MAIL_RCPTS[@]}"; do
+ RCPT_DOMAIN=
+ RCPT_MX=
+ RCPT_DOMAIN=$(echo ${rcpt} | awk -F @ {'print $NF'})
+ RCPT_MX=$(dig +short ${RCPT_DOMAIN} mx | sort -n | awk '{print $2; exit}')
+ if [[ -z ${RCPT_MX} ]]; then
+ log_msg "Cannot determine MX for ${rcpt}, skipping email notification..."
+ return 1
+ fi
+ [ -f "/tmp/${1}" ] && ATTACH="--attach /tmp/${1}@text/plain" || ATTACH=
+ ./smtp-cli --missing-modules-ok \
+ --subject="Watchdog: ${1} hit the error rate limit" \
+ --body-plain="${BODY}" \
+ --to=${rcpt} \
+ --from="watchdog@${MAILCOW_HOSTNAME}" \
+ --server="${RCPT_MX}" \
+ --hello-host=${MAILCOW_HOSTNAME} \
+ ${ATTACH}
+ log_msg "Sent notification email to ${rcpt}"
+ done
}
-
get_container_ip() {
# ${1} is container
CONTAINER_ID=()
+ CONTAINER_IPS=()
CONTAINER_IP=
LOOP_C=1
until [[ ${CONTAINER_IP} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] || [[ ${LOOP_C} -gt 5 ]]; do
- sleep 0.5
- # get long container id for exact match
- CONTAINER_ID=($(curl --silent http://dockerapi:8080/containers/json | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], id: .Id}" | jq -rc "select( .name | tostring == \"${1}\") | .id"))
- # returned id can have multiple elements (if scaled), shuffle for random test
- CONTAINER_ID=($(printf "%s\n" "${CONTAINER_ID[@]}" | shuf))
- if [[ ! -z ${CONTAINER_ID} ]]; then
- for matched_container in "${CONTAINER_ID[@]}"; do
- CONTAINER_IP=$(curl --silent http://dockerapi:8080/containers/${matched_container}/json | jq -r '.NetworkSettings.Networks[].IPAddress')
- # grep will do nothing if one of these vars is empty
- [[ -z ${CONTAINER_IP} ]] && continue
- [[ -z ${IPV4_NETWORK} ]] && continue
- # only return ips that are part of our network
- if ! grep -q ${IPV4_NETWORK} <(echo ${CONTAINER_IP}); then
- CONTAINER_IP=
- fi
- done
+ if [ ${IP_BY_DOCKER_API} -eq 0 ]; then
+ CONTAINER_IP=$(dig a "${1}" +short)
+ else
+ sleep 0.5
+ # get long container id for exact match
+ CONTAINER_ID=($(curl --silent --insecure https://dockerapi/containers/json | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], id: .Id}" | jq -rc "select( .name | tostring == \"${1}\") | .id"))
+ # returned id can have multiple elements (if scaled), shuffle for random test
+ CONTAINER_ID=($(printf "%s\n" "${CONTAINER_ID[@]}" | shuf))
+ if [[ ! -z ${CONTAINER_ID} ]]; then
+ for matched_container in "${CONTAINER_ID[@]}"; do
+ CONTAINER_IPS=($(curl --silent --insecure https://dockerapi/containers/${matched_container}/json | jq -r '.NetworkSettings.Networks[].IPAddress'))
+ for ip_match in "${CONTAINER_IPS[@]}"; do
+ # grep will do nothing if one of these vars is empty
+ [[ -z ${ip_match} ]] && continue
+ [[ -z ${IPV4_NETWORK} ]] && continue
+ # only return ips that are part of our network
+ if ! grep -q ${IPV4_NETWORK} <(echo ${ip_match}); then
+ continue
+ else
+ CONTAINER_IP=${ip_match}
+ break
+ fi
+ done
+ [[ ! -z ${CONTAINER_IP} ]] && break
+ done
+ fi
fi
LOOP_C=$((LOOP_C + 1))
done
[[ ${LOOP_C} -gt 5 ]] && echo 240.0.0.0 || echo ${CONTAINER_IP}
}
-# Check functions
nginx_checks() {
err_count=0
diff_c=0
@@ -96,15 +117,52 @@ nginx_checks() {
# Reduce error count by 2 after restarting an unhealthy container
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/nginx-mailcow; echo "$(tail -50 /tmp/nginx-mailcow)" > /tmp/nginx-mailcow
host_ip=$(get_container_ip nginx-mailcow)
err_c_cur=${err_count}
- /usr/lib/nagios/plugins/check_ping -4 -H ${host_ip} -w 2000,10% -c 4000,100% -p2 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_http -4 -H ${host_ip} -u / -p 8081 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_http -4 -H ${host_ip} -u / -p 8081 2>> /tmp/nginx-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
progress "Nginx" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
- diff_c=0
- sleep $(( ( RANDOM % 30 ) + 10 ))
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
+ done
+ return 1
+}
+
+unbound_checks() {
+ err_count=0
+ diff_c=0
+ THRESHOLD=8
+ # Reduce error count by 2 after restarting an unhealthy container
+ trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
+ while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/unbound-mailcow; echo "$(tail -50 /tmp/unbound-mailcow)" > /tmp/unbound-mailcow
+ host_ip=$(get_container_ip unbound-mailcow)
+ err_c_cur=${err_count}
+ /usr/lib/nagios/plugins/check_dns -s ${host_ip} -H stackoverflow.com 2>> /tmp/unbound-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ DNSSEC=$(dig com +dnssec | egrep 'flags:.+ad')
+ if [[ -z ${DNSSEC} ]]; then
+ echo "DNSSEC failure" 2>> /tmp/unbound-mailcow 1>&2
+ err_count=$(( ${err_count} + 1))
+ else
+ echo "DNSSEC check succeeded" 2>> /tmp/unbound-mailcow 1>&2
+ fi
+ [ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
+ [ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
+ progress "Unbound" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
done
return 1
}
@@ -116,15 +174,21 @@ mysql_checks() {
# Reduce error count by 2 after restarting an unhealthy container
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/mysql-mailcow; echo "$(tail -50 /tmp/mysql-mailcow)" > /tmp/mysql-mailcow
host_ip=$(get_container_ip mysql-mailcow)
err_c_cur=${err_count}
- /usr/lib/nagios/plugins/check_mysql -H ${host_ip} -P 3306 -u ${DBUSER} -p ${DBPASS} -d ${DBNAME} 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_mysql_query -H ${host_ip} -P 3306 -u ${DBUSER} -p ${DBPASS} -d ${DBNAME} -q "SELECT COUNT(*) FROM information_schema.tables" 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_mysql -s /var/run/mysqld/mysqld.sock -u ${DBUSER} -p ${DBPASS} -d ${DBNAME} 2>> /tmp/mysql-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_mysql_query -s /var/run/mysqld/mysqld.sock -u ${DBUSER} -p ${DBPASS} -d ${DBNAME} -q "SELECT COUNT(*) FROM information_schema.tables" 2>> /tmp/mysql-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
progress "MySQL/MariaDB" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
- diff_c=0
- sleep $(( ( RANDOM % 30 ) + 10 ))
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
done
return 1
}
@@ -132,19 +196,24 @@ mysql_checks() {
sogo_checks() {
err_count=0
diff_c=0
- THRESHOLD=20
+ THRESHOLD=10
# Reduce error count by 2 after restarting an unhealthy container
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/sogo-mailcow; echo "$(tail -50 /tmp/sogo-mailcow)" > /tmp/sogo-mailcow
host_ip=$(get_container_ip sogo-mailcow)
err_c_cur=${err_count}
- /usr/lib/nagios/plugins/check_http -4 -H ${host_ip} -u /WebServerResources/css/theme-default.css -p 9192 -R md-default-theme 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_http -4 -H ${host_ip} -u /SOGo.index/ -p 20000 -R "SOGo\.MainUI" 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_http -4 -H ${host_ip} -u /SOGo.index/ -p 20000 -R "SOGo\.MainUI" 2>> /tmp/sogo-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
progress "SOGo" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
- diff_c=0
- sleep $(( ( RANDOM % 30 ) + 10 ))
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
done
return 1
}
@@ -152,19 +221,50 @@ sogo_checks() {
postfix_checks() {
err_count=0
diff_c=0
- THRESHOLD=16
+ THRESHOLD=8
# Reduce error count by 2 after restarting an unhealthy container
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
while [ ${err_count} -lt ${THRESHOLD} ]; do
- host_ip=$(get_container_ip postfix-mailcow)
+ touch /tmp/postfix-mailcow; echo "$(tail -50 /tmp/postfix-mailcow)" > /tmp/postfix-mailcow
+ host_ip=$(get_container_ip postfix-mailcow)
err_c_cur=${err_count}
- /usr/lib/nagios/plugins/check_smtp -4 -H ${host_ip} -p 589 -f "watchdog@invalid" -C "RCPT TO:null@localhost" -C DATA -C . -R 250 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_smtp -4 -H ${host_ip} -p 589 -S 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_smtp -4 -H ${host_ip} -p 589 -f "watchdog@invalid" -C "RCPT TO:null@localhost" -C DATA -C . -R 250 2>> /tmp/postfix-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_smtp -4 -H ${host_ip} -p 589 -S 2>> /tmp/postfix-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
progress "Postfix" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
- diff_c=0
- sleep $(( ( RANDOM % 30 ) + 10 ))
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
+ done
+ return 1
+}
+
+clamd_checks() {
+ err_count=0
+ diff_c=0
+ THRESHOLD=15
+ # Reduce error count by 2 after restarting an unhealthy container
+ trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
+ while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/clamd-mailcow; echo "$(tail -50 /tmp/clamd-mailcow)" > /tmp/clamd-mailcow
+ host_ip=$(get_container_ip clamd-mailcow)
+ err_c_cur=${err_count}
+ /usr/lib/nagios/plugins/check_clamd -4 -H ${host_ip} 2>> /tmp/clamd-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ [ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
+ [ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
+ progress "Clamd" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 30 ))
+ fi
done
return 1
}
@@ -172,22 +272,28 @@ postfix_checks() {
dovecot_checks() {
err_count=0
diff_c=0
- THRESHOLD=24
+ THRESHOLD=20
# Reduce error count by 2 after restarting an unhealthy container
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/dovecot-mailcow; echo "$(tail -50 /tmp/dovecot-mailcow)" > /tmp/dovecot-mailcow
host_ip=$(get_container_ip dovecot-mailcow)
err_c_cur=${err_count}
- /usr/lib/nagios/plugins/check_smtp -4 -H ${host_ip} -p 24 -f "watchdog@invalid" -C "RCPT TO:" -L -R "User doesn't exist" 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_imap -4 -H ${host_ip} -p 993 -S -e "OK " 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_imap -4 -H ${host_ip} -p 143 -e "OK " 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_tcp -4 -H ${host_ip} -p 10001 -e "VERSION" 1>&2; err_count=$(( ${err_count} + $? ))
- /usr/lib/nagios/plugins/check_tcp -4 -H ${host_ip} -p 4190 -e "Dovecot ready" 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_smtp -4 -H ${host_ip} -p 24 -f "watchdog@invalid" -C "RCPT TO:" -L -R "User doesn't exist" 2>> /tmp/dovecot-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_imap -4 -H ${host_ip} -p 993 -S -e "OK " 2>> /tmp/dovecot-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_imap -4 -H ${host_ip} -p 143 -e "OK " 2>> /tmp/dovecot-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_tcp -4 -H ${host_ip} -p 10001 -e "VERSION" 2>> /tmp/dovecot-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_tcp -4 -H ${host_ip} -p 4190 -e "Dovecot ready" 2>> /tmp/dovecot-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
progress "Dovecot" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
- diff_c=0
- sleep $(( ( RANDOM % 30 ) + 10 ))
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
done
return 1
}
@@ -195,46 +301,143 @@ dovecot_checks() {
phpfpm_checks() {
err_count=0
diff_c=0
- THRESHOLD=10
+ THRESHOLD=5
# Reduce error count by 2 after restarting an unhealthy container
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/php-fpm-mailcow; echo "$(tail -50 /tmp/php-fpm-mailcow)" > /tmp/php-fpm-mailcow
host_ip=$(get_container_ip php-fpm-mailcow)
err_c_cur=${err_count}
- nc -z ${host_ip} 9001 ; err_count=$(( ${err_count} + ($? * 2)))
- nc -z ${host_ip} 9002 ; err_count=$(( ${err_count} + ($? * 2)))
- /usr/lib/nagios/plugins/check_ping -4 -H ${host_ip} -w 2000,10% -c 4000,100% -p2 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_tcp -H ${host_ip} -p 9001 2>> /tmp/php-fpm-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
+ /usr/lib/nagios/plugins/check_tcp -H ${host_ip} -p 9002 2>> /tmp/php-fpm-mailcow 1>&2; err_count=$(( ${err_count} + $? ))
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
progress "PHP-FPM" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
- diff_c=0
- sleep $(( ( RANDOM % 30 ) + 10 ))
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
done
return 1
}
-rspamd_checks() {
+ratelimit_checks() {
err_count=0
diff_c=0
- THRESHOLD=10
+ THRESHOLD=1
+ RL_LOG_STATUS=$(redis-cli -h redis LRANGE RL_LOG 0 0 | jq .qid)
# Reduce error count by 2 after restarting an unhealthy container
trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
while [ ${err_count} -lt ${THRESHOLD} ]; do
+ err_c_cur=${err_count}
+ RL_LOG_STATUS_PREV=${RL_LOG_STATUS}
+ RL_LOG_STATUS=$(redis-cli -h redis LRANGE RL_LOG 0 0 | jq .qid)
+ if [[ ${RL_LOG_STATUS_PREV} != ${RL_LOG_STATUS} ]]; then
+ err_count=$(( ${err_count} + 1 ))
+ fi
+ [ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
+ [ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
+ progress "Ratelimit" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
+ done
+ return 1
+}
+
+acme_checks() {
+ err_count=0
+ diff_c=0
+ THRESHOLD=1
+ ACME_LOG_STATUS=$(redis-cli -h redis GET ACME_FAIL_TIME)
+ if [[ -z "${ACME_LOG_STATUS}" ]]; then
+ redis-cli -h redis SET ACME_FAIL_TIME 0
+ ACME_LOG_STATUS=0
+ fi
+ # Reduce error count by 2 after restarting an unhealthy container
+ trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
+ while [ ${err_count} -lt ${THRESHOLD} ]; do
+ err_c_cur=${err_count}
+ ACME_LOG_STATUS_PREV=${ACME_LOG_STATUS}
+ ACME_LOG_STATUS=$(redis-cli -h redis GET ACME_FAIL_TIME)
+ if [[ ${ACME_LOG_STATUS_PREV} != ${ACME_LOG_STATUS} ]]; then
+ err_count=$(( ${err_count} + 1 ))
+ fi
+ [ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
+ [ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
+ progress "ACME" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep $(( ( RANDOM % 30 ) + 10 ))
+ fi
+ done
+ return 1
+}
+
+ipv6nat_checks() {
+ err_count=0
+ diff_c=0
+ THRESHOLD=1
+ # Reduce error count by 2 after restarting an unhealthy container
+ trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
+ while [ ${err_count} -lt ${THRESHOLD} ]; do
+ err_c_cur=${err_count}
+ CONTAINERS=$(curl --silent --insecure https://dockerapi/containers/json)
+ IPV6NAT_CONTAINER_ID=$(echo ${CONTAINERS} | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], id: .Id}" | jq -rc "select( .name | tostring | contains(\"ipv6nat-mailcow\")) | .id")
+ if [[ ! -z ${IPV6NAT_CONTAINER_ID} ]]; then
+ LATEST_STARTED="$(echo ${CONTAINERS} | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], StartedAt: .State.StartedAt}" | jq -rc "select( .name | tostring | contains(\"ipv6nat-mailcow\") | not)" | jq -rc .StartedAt | xargs -n1 date +%s -d | sort | tail -n1)"
+ LATEST_IPV6NAT="$(echo ${CONTAINERS} | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], StartedAt: .State.StartedAt}" | jq -rc "select( .name | tostring | contains(\"ipv6nat-mailcow\"))" | jq -rc .StartedAt | xargs -n1 date +%s -d | sort | tail -n1)"
+ DIFFERENCE_START_TIME=$(expr ${LATEST_IPV6NAT} - ${LATEST_STARTED} 2>/dev/null)
+ if [[ "${DIFFERENCE_START_TIME}" -lt 30 ]]; then
+ err_count=$(( ${err_count} + 1 ))
+ fi
+ fi
+ [ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
+ [ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
+ progress "IPv6 NAT" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
+ if [[ $? == 10 ]]; then
+ diff_c=0
+ sleep 1
+ else
+ diff_c=0
+ sleep 300
+ fi
+ done
+ return 1
+}
+
+
+rspamd_checks() {
+ err_count=0
+ diff_c=0
+ THRESHOLD=5
+ # Reduce error count by 2 after restarting an unhealthy container
+ trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1
+ while [ ${err_count} -lt ${THRESHOLD} ]; do
+ touch /tmp/rspamd-mailcow; echo "$(tail -50 /tmp/rspamd-mailcow)" > /tmp/rspamd-mailcow
host_ip=$(get_container_ip rspamd-mailcow)
err_c_cur=${err_count}
- SCORE=$(/usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/scan -d '
-To: null@localhost
+ SCORE=$(echo 'To: null@localhost
From: watchdog@localhost
Empty
-' | jq -rc .required_score)
+' | usr/bin/curl -s --data-binary @- --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd/scan | jq -rc .required_score)
if [[ ${SCORE} != "9999" ]]; then
- echo "Rspamd settings check failed" 1>&2
+ echo "Rspamd settings check failed" 2>> /tmp/rspamd-mailcow 1>&2
err_count=$(( ${err_count} + 1))
else
- echo "Rspamd settings check succeeded" 1>&2
+ echo "Rspamd settings check succeeded" 2>> /tmp/rspamd-mailcow 1>&2
fi
- /usr/lib/nagios/plugins/check_ping -4 -H ${host_ip} -w 2000,10% -c 4000,100% -p2 1>&2; err_count=$(( ${err_count} + $? ))
[ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1
[ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} ))
progress "Rspamd" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c}
@@ -249,7 +452,6 @@ Empty
while true; do
if ! nginx_checks; then
log_msg "Nginx hit error limit"
- [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${WATCHDOG_NOTIFY_EMAIL}" "nginx-mailcow"
echo nginx-mailcow > /tmp/com_pipe
fi
done
@@ -260,7 +462,6 @@ BACKGROUND_TASKS+=($!)
while true; do
if ! mysql_checks; then
log_msg "MySQL hit error limit"
- [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${WATCHDOG_NOTIFY_EMAIL}" "mysql-mailcow"
echo mysql-mailcow > /tmp/com_pipe
fi
done
@@ -271,7 +472,6 @@ BACKGROUND_TASKS+=($!)
while true; do
if ! phpfpm_checks; then
log_msg "PHP-FPM hit error limit"
- [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${WATCHDOG_NOTIFY_EMAIL}" "php-fpm-mailcow"
echo php-fpm-mailcow > /tmp/com_pipe
fi
done
@@ -282,18 +482,40 @@ BACKGROUND_TASKS+=($!)
while true; do
if ! sogo_checks; then
log_msg "SOGo hit error limit"
- [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${WATCHDOG_NOTIFY_EMAIL}" "sogo-mailcow"
echo sogo-mailcow > /tmp/com_pipe
fi
done
) &
BACKGROUND_TASKS+=($!)
+if [ ${CHECK_UNBOUND} -eq 1 ]; then
+(
+while true; do
+ if ! unbound_checks; then
+ log_msg "Unbound hit error limit"
+ echo unbound-mailcow > /tmp/com_pipe
+ fi
+done
+) &
+BACKGROUND_TASKS+=($!)
+fi
+
+if [[ "${SKIP_CLAMD}" =~ ^([nN][oO]|[nN])+$ ]]; then
+(
+while true; do
+ if ! clamd_checks; then
+ log_msg "Clamd hit error limit"
+ echo clamd-mailcow > /tmp/com_pipe
+ fi
+done
+) &
+BACKGROUND_TASKS+=($!)
+fi
+
(
while true; do
if ! postfix_checks; then
log_msg "Postfix hit error limit"
- [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${WATCHDOG_NOTIFY_EMAIL}" "postfix-mailcow"
echo postfix-mailcow > /tmp/com_pipe
fi
done
@@ -304,7 +526,6 @@ BACKGROUND_TASKS+=($!)
while true; do
if ! dovecot_checks; then
log_msg "Dovecot hit error limit"
- [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${WATCHDOG_NOTIFY_EMAIL}" "dovecot-mailcow"
echo dovecot-mailcow > /tmp/com_pipe
fi
done
@@ -315,13 +536,42 @@ BACKGROUND_TASKS+=($!)
while true; do
if ! rspamd_checks; then
log_msg "Rspamd hit error limit"
- [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${WATCHDOG_NOTIFY_EMAIL}" "rspamd-mailcow"
echo rspamd-mailcow > /tmp/com_pipe
fi
done
) &
BACKGROUND_TASKS+=($!)
+(
+while true; do
+ if ! ratelimit_checks; then
+ log_msg "Ratelimit hit error limit"
+ echo ratelimit > /tmp/com_pipe
+ fi
+done
+) &
+BACKGROUND_TASKS+=($!)
+
+(
+while true; do
+ if ! acme_checks; then
+ log_msg "ACME client hit error limit"
+ echo acme-tiny > /tmp/com_pipe
+ fi
+done
+) &
+BACKGROUND_TASKS+=($!)
+
+(
+while true; do
+ if ! ipv6nat_checks; then
+ log_msg "IPv6 NAT warning: ipv6nat-mailcow container was not started at least 30s after siblings (not an error)"
+ echo ipv6nat-mailcow > /tmp/com_pipe
+ fi
+done
+) &
+BACKGROUND_TASKS+=($!)
+
# Monitor watchdog agents, stop script when agents fails and wait for respawn by Docker (restart:always:n)
(
while true; do
@@ -338,12 +588,12 @@ done
# Monitor dockerapi
(
while true; do
- while nc -z dockerapi 8080; do
+ while nc -z dockerapi 443; do
sleep 3
done
log_msg "Cannot find dockerapi-mailcow, waiting to recover..."
kill -STOP ${BACKGROUND_TASKS[*]}
- until nc -z dockerapi 8080; do
+ until nc -z dockerapi 443; do
sleep 3
done
kill -CONT ${BACKGROUND_TASKS[*]}
@@ -354,17 +604,41 @@ done
# Restart container when threshold limit reached
while true; do
CONTAINER_ID=
+ HAS_INITDB=
read com_pipe_answer &2 "error: both $var and $fileVar are set (but are exclusive)"
+ exit 1
+ fi
+ local val="$def"
+ if [ "${!var:-}" ]; then
+ val="${!var}"
+ elif [ "${!fileVar:-}" ]; then
+ val="$(< "${!fileVar}")"
+ fi
+ export "$var"="$val"
+ unset "$fileVar"
+}
+
+_check_config() {
+ toRun=( "$@" --verbose --help --log-bin-index="$(mktemp -u)" )
+ if ! errors="$("${toRun[@]}" 2>&1 >/dev/null)"; then
+ cat >&2 <<-EOM
+
+ ERROR: mysqld failed while attempting to check config
+ command was: "${toRun[*]}"
+
+ $errors
+ EOM
+ exit 1
+ fi
+}
+
+# Fetch value from server config
+# We use mysqld --verbose --help instead of my_print_defaults because the
+# latter only show values present in config files, and not server defaults
+_get_config() {
+ local conf="$1"; shift
+ "$@" --verbose --help --log-bin-index="$(mktemp -u)" 2>/dev/null | awk '$1 == "'"$conf"'" { print $2; exit }'
+}
+
+# allow the container to be started with `--user`
+if [ "$1" = 'mysqld' -a -z "$wantHelp" -a "$(id -u)" = '0' ]; then
+ _check_config "$@"
+ DATADIR="$(_get_config 'datadir' "$@")"
+ mkdir -p "$DATADIR"
+ chown -R mysql:mysql "$DATADIR"
+ exec gosu mysql "$BASH_SOURCE" "$@"
+fi
+
+if [ "$1" = 'mysqld' -a -z "$wantHelp" ]; then
+ # still need to check config, container may have started with --user
+ _check_config "$@"
+ # Get config
+ DATADIR="$(_get_config 'datadir' "$@")"
+
+ if [ ! -d "$DATADIR/mysql" ]; then
+ file_env 'MYSQL_ROOT_PASSWORD'
+ if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
+ echo >&2 'error: database is uninitialized and password option is not specified '
+ echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'
+ exit 1
+ fi
+
+ mkdir -p "$DATADIR"
+
+ echo 'Initializing database'
+ # "Other options are passed to mysqld." (so we pass all "mysqld" arguments directly here)
+ mysql_install_db --datadir="$DATADIR" --rpm "${@:2}"
+ echo 'Database initialized'
+
+ SOCKET="$(_get_config 'socket' "$@")"
+ "$@" --skip-networking --socket="${SOCKET}" &
+ pid="$!"
+
+ mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )
+
+ for i in {30..0}; do
+ if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
+ break
+ fi
+ echo 'MySQL init process in progress...'
+ sleep 1
+ done
+ if [ "$i" = 0 ]; then
+ echo >&2 'MySQL init process failed.'
+ exit 1
+ fi
+
+ if [ -z "$MYSQL_INITDB_SKIP_TZINFO" ]; then
+ # sed is for https://bugs.mysql.com/bug.php?id=20545
+ mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql
+ fi
+
+ if [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
+ export MYSQL_ROOT_PASSWORD="$(pwgen -1 32)"
+ echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD"
+ fi
+
+ rootCreate=
+ # default root to listen for connections from anywhere
+ file_env 'MYSQL_ROOT_HOST' '%'
+ if [ ! -z "$MYSQL_ROOT_HOST" -a "$MYSQL_ROOT_HOST" != 'localhost' ]; then
+ # no, we don't care if read finds a terminating character in this heredoc
+ # https://unix.stackexchange.com/questions/265149/why-is-set-o-errexit-breaking-this-read-heredoc-expression/265151#265151
+ read -r -d '' rootCreate <<-EOSQL || true
+ CREATE USER 'root'@'${MYSQL_ROOT_HOST}' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
+ GRANT ALL ON *.* TO 'root'@'${MYSQL_ROOT_HOST}' WITH GRANT OPTION ;
+ EOSQL
+ fi
+
+ "${mysql[@]}" <<-EOSQL
+ -- What's done in this file shouldn't be replicated
+ -- or products like mysql-fabric won't work
+ SET @@SESSION.SQL_LOG_BIN=0;
+
+ DELETE FROM mysql.user WHERE user NOT IN ('mysql.sys', 'mysqlxsys', 'root') OR host NOT IN ('localhost') ;
+ SET PASSWORD FOR 'root'@'localhost'=PASSWORD('${MYSQL_ROOT_PASSWORD}') ;
+ GRANT ALL ON *.* TO 'root'@'localhost' WITH GRANT OPTION ;
+ ${rootCreate}
+ DROP DATABASE IF EXISTS test ;
+ FLUSH PRIVILEGES ;
+ EOSQL
+
+ if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then
+ mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
+ fi
+
+ file_env 'MYSQL_DATABASE'
+ if [ "$MYSQL_DATABASE" ]; then
+ echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
+ mysql+=( "$MYSQL_DATABASE" )
+ fi
+
+ file_env 'MYSQL_USER'
+ file_env 'MYSQL_PASSWORD'
+ if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
+ echo "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" | "${mysql[@]}"
+
+ if [ "$MYSQL_DATABASE" ]; then
+ echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;" | "${mysql[@]}"
+ fi
+ fi
+
+ echo
+ for f in /docker-entrypoint-initdb.d/*; do
+ case "$f" in
+ *.sh) echo "$0: running $f"; . "$f" ;;
+ *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;;
+ *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
+ *) echo "$0: ignoring $f" ;;
+ esac
+ echo
+ done
+
+ if ! kill -s TERM "$pid" || ! wait "$pid"; then
+ echo >&2 'MySQL init process failed.'
+ exit 1
+ fi
+
+ echo
+ echo 'MySQL init process done. Ready for start up.'
+ echo
+ fi
+fi
+
+exec "$@"
diff --git a/data/assets/nextcloud/nextcloud.conf b/data/assets/nextcloud/nextcloud.conf
index 72f30240..cf90a32b 100644
--- a/data/assets/nextcloud/nextcloud.conf
+++ b/data/assets/nextcloud/nextcloud.conf
@@ -5,11 +5,11 @@ map $http_x_forwarded_proto $client_req_scheme_nc {
server {
include /etc/nginx/conf.d/listen_ssl.active;
+ include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/mime.types;
charset utf-8;
override_charset on;
- ssl on;
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
ssl_protocols TLSv1.2;
@@ -24,7 +24,8 @@ server {
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
- add_header X-Frame-Options "SAMEORIGIN";
+ #add_header X-Frame-Options "SAMEORIGIN";
+ add_header Referrer-Policy "no-referrer";
server_name NC_SUBD;
diff --git a/data/assets/templates/quarantine.tpl b/data/assets/templates/quarantine.tpl
new file mode 100644
index 00000000..3af0e121
--- /dev/null
+++ b/data/assets/templates/quarantine.tpl
@@ -0,0 +1,49 @@
+
+
+
+
+
+
Hi!
+ {% if counter == 1 %}
+ There is 1 new message waiting in quarantine:
+ {% else %}
+ There are {{counter}} new messages waiting in quarantine:
+ {% endif %}
+
';
item.chkbox = '';
}
@@ -147,6 +148,7 @@ jQuery(function($){
"limit": 5,
"size": pagination_size
},
+ "state": {"enabled": true},
"sorting": {
"enabled": true
}
@@ -182,6 +184,7 @@ jQuery(function($){
});
}
}),
+ "state": {"enabled": true},
"paging": {
"enabled": true,
"limit": 5,
@@ -227,6 +230,7 @@ jQuery(function($){
"limit": 5,
"size": pagination_size
},
+ "state": {"enabled": true},
"sorting": {
"enabled": true
}
diff --git a/data/web/json_api.php b/data/web/json_api.php
index fba933c4..53ecf520 100644
--- a/data/web/json_api.php
+++ b/data/web/json_api.php
@@ -102,6 +102,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "relayhost":
process_add_return(relayhost('add', $attr));
break;
+ case "transport":
+ process_add_return(transport('add', $attr));
+ break;
case "rsetting":
process_add_return(rsettings('add', $attr));
break;
@@ -144,6 +147,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "domain-admin":
process_add_return(domain_admin('add', $attr));
break;
+ case "admin":
+ process_add_return(admin('add', $attr));
+ break;
case "syncjob":
process_add_return(mailbox('add', 'syncjob', $attr));
break;
@@ -153,6 +159,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "recipient_map":
process_add_return(recipient_map('add', $attr));
break;
+ case "tls-policy-map":
+ process_add_return(tls_policy_maps('add', $attr));
+ break;
}
break;
case "get":
@@ -164,7 +173,7 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
switch ($object) {
case "actions":
$curl = curl_init();
- curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, '/rspamd-sock/rspamd.sock');
+ curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, '/var/lib/rspamd/rspamd.sock');
curl_setopt($curl, CURLOPT_URL,"http://rspamd/stat");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($curl);
@@ -212,6 +221,20 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
}
break;
+ case "mailq":
+ switch ($object) {
+ case "all":
+ $mailq = mailq('get');
+ if (!empty($mailq)) {
+ echo $mailq;
+ }
+ else {
+ echo '{}';
+ }
+ break;
+ }
+ break;
+
case "rl-domain":
switch ($object) {
case "all":
@@ -300,6 +323,33 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
}
break;
+ case "transport":
+ switch ($object) {
+ case "all":
+ $transports = transport('get');
+ if (!empty($transports)) {
+ foreach ($transports as $transport) {
+ if ($details = transport('details', $transport['id'])) {
+ $data[] = $details;
+ }
+ else {
+ continue;
+ }
+ }
+ process_get_return($data);
+ }
+ else {
+ echo '{}';
+ }
+ break;
+
+ default:
+ $data = transport('details', $object);
+ process_get_return($data);
+ break;
+ }
+ break;
+
case "rsetting":
switch ($object) {
case "all":
@@ -367,6 +417,17 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
}
echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
break;
+ case "ratelimited":
+ // 0 is first record, so empty is fine
+ if (isset($extra)) {
+ $extra = preg_replace('/[^\d\-]/i', '', $extra);
+ $logs = get_logs('ratelimited', $extra);
+ }
+ else {
+ $logs = get_logs('ratelimited');
+ }
+ echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
+ break;
case "netfilter":
// 0 is first record, so empty is fine
if (isset($extra)) {
@@ -662,6 +723,31 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
break;
}
break;
+ case "tls-policy-map":
+ switch ($object) {
+ case "all":
+ $tls_policy_maps_items = tls_policy_maps('get');
+ if (!empty($tls_policy_maps_items)) {
+ foreach ($tls_policy_maps_items as $tls_policy_maps_item) {
+ if ($details = tls_policy_maps('details', $tls_policy_maps_item)) {
+ $data[] = $details;
+ }
+ else {
+ continue;
+ }
+ }
+ }
+ process_get_return($data);
+ break;
+ default:
+ $data = tls_policy_maps('details', $object);
+ if (!empty($data)) {
+ $data[] = $details;
+ }
+ process_get_return($data);
+ break;
+ }
+ break;
case "policy_wl_mailbox":
switch ($object) {
default:
@@ -829,6 +915,31 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
break;
}
break;
+ case "admin":
+ switch ($object) {
+ case "all":
+ $admins = admin('get');
+ if (!empty($admins)) {
+ foreach ($admins as $admin) {
+ if ($details = admin('details', $admin)) {
+ $data[] = $details;
+ }
+ else {
+ continue;
+ }
+ }
+ process_get_return($data);
+ }
+ else {
+ echo '{}';
+ }
+ break;
+
+ default:
+ process_get_return(admin('details', $object));
+ break;
+ }
+ break;
case "u2f-registration":
header('Content-Type: application/javascript');
if (($_SESSION["mailcow_cc_role"] == "admin" || $_SESSION["mailcow_cc_role"] == "domainadmin") && $_SESSION["mailcow_cc_username"] == $object) {
@@ -865,6 +976,14 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
return;
}
break;
+ case "dkim":
+ switch ($object) {
+ default:
+ $data = dkim('details', $object);
+ process_get_return($data);
+ break;
+ }
+ break;
default:
echo '{}';
break;
@@ -901,6 +1020,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "relayhost":
process_delete_return(relayhost('delete', array('id' => $items)));
break;
+ case "transport":
+ process_delete_return(transport('delete', array('id' => $items)));
+ break;
case "rsetting":
process_delete_return(rsettings('delete', array('id' => $items)));
break;
@@ -910,6 +1032,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "filter":
process_delete_return(mailbox('delete', 'filter', array('id' => $items)));
break;
+ case "mailq":
+ process_delete_return(mailq('delete', array('qid' => $items)));
+ break;
case "qitem":
process_delete_return(quarantine('delete', array('id' => $items)));
break;
@@ -919,6 +1044,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "recipient_map":
process_delete_return(recipient_map('delete', array('id' => $items)));
break;
+ case "tls-policy-map":
+ process_delete_return(tls_policy_maps('delete', array('id' => $items)));
+ break;
case "fwdhost":
process_delete_return(fwdhost('delete', array('forwardinghost' => $items)));
break;
@@ -950,9 +1078,18 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "eas_cache":
process_delete_return(mailbox('delete', 'eas_cache', array('username' => $items)));
break;
+ case "sogo_profile":
+ process_delete_return(mailbox('delete', 'sogo_profile', array('username' => $items)));
+ break;
case "domain-admin":
process_delete_return(domain_admin('delete', array('username' => $items)));
break;
+ case "admin":
+ process_delete_return(admin('delete', array('username' => $items)));
+ break;
+ case "rlhash":
+ echo ratelimit('delete', null, implode($items));
+ break;
}
break;
case "edit":
@@ -991,6 +1128,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "recipient_map":
process_edit_return(recipient_map('edit', array_merge(array('id' => $items), $attr)));
break;
+ case "tls-policy-map":
+ process_edit_return(tls_policy_maps('edit', array_merge(array('id' => $items), $attr)));
+ break;
case "alias":
process_edit_return(mailbox('edit', 'alias', array_merge(array('id' => $items), $attr)));
break;
@@ -1000,6 +1140,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "relayhost":
process_edit_return(relayhost('edit', array_merge(array('id' => $items), $attr)));
break;
+ case "transport":
+ process_edit_return(transport('edit', array_merge(array('id' => $items), $attr)));
+ break;
case "rsetting":
process_edit_return(rsettings('edit', array_merge(array('id' => $items), $attr)));
break;
@@ -1009,12 +1152,21 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "tls_policy":
process_edit_return(mailbox('edit', 'tls_policy', array_merge(array('username' => $items), $attr)));
break;
+ case "quarantine_notification":
+ process_edit_return(mailbox('edit', 'quarantine_notification', array_merge(array('username' => $items), $attr)));
+ break;
case "qitem":
process_edit_return(quarantine('edit', array_merge(array('id' => $items), $attr)));
break;
case "quarantine":
process_edit_return(quarantine('edit', $attr));
break;
+ case "quota_notification":
+ process_edit_return(quota_notification('edit', $attr));
+ break;
+ case "mailq":
+ process_edit_return(mailq('edit', array_merge(array('qid' => $items), $attr)));
+ break;
case "time_limited_alias":
process_edit_return(mailbox('edit', 'time_limited_alias', array_merge(array('address' => $items), $attr)));
break;
@@ -1039,6 +1191,12 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "rl-mbox":
process_edit_return(ratelimit('edit', 'mailbox', array_merge(array('object' => $items), $attr)));
break;
+ case "user-acl":
+ process_edit_return(acl('edit', 'user', array_merge(array('username' => $items), $attr)));
+ break;
+ case "da-acl":
+ process_edit_return(acl('edit', 'domainadmin', array_merge(array('username' => $items), $attr)));
+ break;
case "alias-domain":
process_edit_return(mailbox('edit', 'alias_domain', array_merge(array('alias_domain' => $items), $attr)));
break;
@@ -1048,6 +1206,9 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
case "domain-admin":
process_edit_return(domain_admin('edit', array_merge(array('username' => $items), $attr)));
break;
+ case "admin":
+ process_edit_return(admin('edit', array_merge(array('username' => $items), $attr)));
+ break;
case "fwdhost":
process_edit_return(fwdhost('edit', array_merge(array('fwdhost' => $items), $attr)));
break;
@@ -1064,9 +1225,6 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
elseif ($_SESSION['mailcow_cc_role'] == "user") {
process_edit_return(edit_user_account($attr));
}
- elseif ($_SESSION['mailcow_cc_role'] == "admin") {
- process_edit_return(edit_admin_account($attr));
- }
break;
}
break;
diff --git a/data/web/lang/lang.ca.php b/data/web/lang/lang.ca.php
index 32a10dad..91072ecf 100644
--- a/data/web/lang/lang.ca.php
+++ b/data/web/lang/lang.ca.php
@@ -204,8 +204,6 @@ $lang['mailbox']['target_address'] = 'Direcciรณ Goto';
$lang['mailbox']['username'] = "Nom d'usuari";
$lang['mailbox']['fname'] = 'Nom complert';
$lang['mailbox']['filter_table'] = 'Filtrar taula';
-$lang['mailbox']['yes'] = '✔';
-$lang['mailbox']['no'] = '✘';
$lang['mailbox']['in_use'] = 'En รบs (%)';
$lang['mailbox']['msg_num'] = 'Missatge #';
$lang['mailbox']['remove'] = 'Esborrar';
@@ -406,8 +404,6 @@ $lang['admin']['save'] = 'Desar els canvis';
$lang['admin']['admin'] = 'Administrador';
$lang['admin']['admin_details'] = "Editar detalls de l'administrador";
$lang['admin']['unchanged_if_empty'] = "Si no hi ha canvis, deixa'l en blanc";
-$lang['admin']['yes'] = '✔';
-$lang['admin']['no'] = '✘';
$lang['admin']['access'] = 'Accรฉs';
$lang['admin']['no_record'] = 'Cap registre';
$lang['admin']['filter_table'] = 'Filtrar taula';
diff --git a/data/web/lang/lang.cs.php b/data/web/lang/lang.cs.php
new file mode 100644
index 00000000..ca2a4684
--- /dev/null
+++ b/data/web/lang/lang.cs.php
@@ -0,0 +1,799 @@
+Dลฏleลพitรฉ: Mลฏลพe trvat dlouho neลพ bude "Graceful restart" dokonฤen, prosรญm ฤekejte...';
+
+$lang['footer']['confirm_delete'] = 'Potvrzenรญ smazรกnรญ';
+$lang['footer']['delete_these_items'] = 'Prosรญm potvrฤte vaลกe zmฤny objektu id:';
+$lang['footer']['delete_now'] = 'Smazat';
+$lang['footer']['cancel'] = 'Zruลกit';
+
+$lang['footer']['hibp_nok'] = 'Nalezeno! Toto je potenciรกlnฤ nebezpeฤnรฉ heslo!';
+$lang['footer']['hibp_ok'] = 'Nebyla nalezena ลพรกdnรก shoda.';
+
+$lang['danger']['mysql_error'] = "Chyba MySQL: %s";
+$lang['danger']['redis_error'] = "Chyba Redis: %s";
+$lang['danger']['unknown_tfa_method'] = "Neznรกmรก TFA metoda";
+$lang['danger']['totp_verification_failed'] = "TOTP ovฤลenรญ selhalo";
+$lang['success']['verified_totp_login'] = "TOTP pลihlรกลกenรญ ovฤลeno";
+$lang['danger']['u2f_verification_failed'] = "U2F ovฤลenรญ selhalo: %s";
+$lang['success']['verified_u2f_login'] = "U2F pลihlรกลกenรญ ovฤลeno";
+$lang['success']['verified_yotp_login'] = "Yubico OTP pลihlรกลกenรญ ovฤลeno";
+$lang['danger']['yotp_verification_failed'] = "Yubico OTP ovฤลenรญ selhalo: %s";
+$lang['danger']['ip_list_empty'] = "Seznam povolenรฝch IP nesmรญ bรฝt prรกzdnรฝ";
+$lang['danger']['invalid_destination'] = "Formรกt cรญle je ลกpatnรฝ";
+$lang['danger']['invalid_nexthop'] = "Formรกt skoku (Next hop) je ลกpatnรฝ";
+$lang['danger']['invalid_nexthop_authenticated'] = "Skok (Next hop) jiลพ existuje s rozรญlnรฝm pลihlaลกovacรญm รบdajem, nejdลรญve prosรญm aktualizujte existujรญcรญ pลihlaลกovacรญ รบdaje tohoto skoku.";
+$lang['danger']['next_hop_interferes'] = "%s koliduje se skokem %s";
+$lang['danger']['next_hop_interferes_any'] = "Existujรญcรญ skok koliduje s %s";
+$lang['danger']['rspamd_ui_pw_length'] = "Heslo pro Rspamd UI musรญ bรฝt minimรกlnฤ 6 znakลฏ dlouhรฉ";
+$lang['success']['rspamd_ui_pw_set'] = "Heslo k Rspamd UI nastaveno";
+$lang['success']['queue_command_success'] = "Pลรญkaz pro frontu รบspฤลกnฤ dokonฤen";
+$lang['danger']['unknown'] = "Doลกlo k neznรกmรฉ chybฤ";
+$lang['danger']['malformed_username'] = "Vadnรฉ jmรฉno uลพivatele";
+$lang['info']['awaiting_tfa_confirmation'] = "ฤekรก se na potvrzenรญ TFA";
+$lang['success']['logged_in_as'] = "Pลihlรกลกen jako %s";
+$lang['danger']['login_failed'] = "Pลihlรกลกenรญ selhalo";
+$lang['danger']['set_acl_failed'] = "Chyba pลi nastavenรญ ACL";
+$lang['danger']['no_user_defined'] = "ลฝรกdnรฝ uลพivatel nenรญ definovรกn";
+$lang['danger']['script_empty'] = "Skript nesmรญ bรฝt prรกzdnรฝ";
+$lang['danger']['sieve_error'] = "Chyba Sieve parseru: %s";
+$lang['danger']['value_missing'] = "Prosรญm, uveฤte vลกechny hodnoty";
+$lang['danger']['filter_type'] = "ล patnรฝ typ filtru";
+$lang['danger']['domain_cannot_match_hostname'] = "Domรฉna a hostname nesmรญ bรฝt stejnรฉ";
+$lang['warning']['domain_added_sogo_failed'] = "Domรฉna byla pลidรกna ale selhal restart SOGo kontejneru, prosรญm zkontrolujte logy serveru.";
+$lang['danger']['rl_timeframe'] = "Omezenรญ ฤasovรฉho rรกmce (Rate limit time frame) je ลกpatnรฉ";
+$lang['success']['rl_saved'] = "Omezenรญ provozu (Rate limit) pro objekt %s uloลพeno";
+$lang['success']['acl_saved'] = "ACL pro objekt %s uloลพeno";
+$lang['success']['deleted_syncjobs'] = "Smazanรฉ synchromizaฤnรญ รบlohy: %s";
+$lang['success']['deleted_syncjob'] = "Smazanรก synchronizaฤnรญ รบloha ID %s";
+$lang['success']['delete_filters'] = "Smazanรฉ filtry: %s";
+$lang['success']['delete_filter'] = "Smazanรฉ filtry ID %s";
+$lang['danger']['invalid_bcc_map_type'] = "ล patnรฝ typ BCC mapovรกnรญ";
+$lang['danger']['bcc_empty'] = "BCC cรญl nesmรญ bรฝt prรกzdnรฝ";
+$lang['danger']['bcc_must_be_email'] = "BCC mapovรกnรญ %s nenรญ sprรกvnรก email adresa";
+$lang['danger']['bcc_exists'] = "BCC mapovรกnรญ %s jiลพ existuje pro typ %s";
+$lang['success']['bcc_saved'] = "Poloลพka BCC mapovรกnรญ uloลพena";
+$lang['success']['bcc_edited'] = "Poloลพka BCC mapovรกnรญ %s upravena";
+$lang['success']['bcc_deleted'] = "Smazanรฉ poloลพky BCC mapovรกnรญ: %s";
+$lang['danger']['private_key_error'] = "Chyba soukromรฉhop klรญฤe: %s";
+$lang['danger']['map_content_empty'] = "Obsah mapovรกnรญ nesmรญ bรฝt prรกzdnรฝ";
+$lang['success']['settings_map_added'] = "Pลidรกna poloลพka mapovรกnรญ nastavenรญ";
+$lang['danger']['settings_map_invalid'] = "Poloลพka mapovรกnรญ nastavenรญ ID %s je ลกpatnรก";
+$lang['danger']['settings_map_removed'] = "Poloลพka mapovรกnรญ nastavenรญ: %s byla smazรกna";
+$lang['danger']['invalid_host'] = "Zadรกn neplatnรฝ klient (Host): %s";
+$lang['danger']['relayhost_invalid'] = "Nadลazenรฝ SMTP server (Relayhost) %s je ลกpatnรฝ";
+$lang['success']['saved_settings'] = "Nastavenรญ uloลพena";
+$lang['success']['db_init_complete'] = "Inicializace databรกze byla dokonฤena";
+
+$lang['warning']['session_ua'] = "Token formulรกลe nenรญ platnรฝ: User-Agent validation error";
+$lang['warning']['session_token'] = "Token formulรกลe nenรญ platnรฝ: Token mismatch";
+
+$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM nebo selektor domรฉnu je ลกpatnรฝ: %s";
+$lang['success']['dkim_removed'] = "DKIM klรญฤ %s byl odebrรกn";
+$lang['success']['dkim_added'] = "DKIM klรญฤ %s byl uloลพen";
+$lang['success']['dkim_duplicated'] = "DKIM klรญฤ domรฉny %s byl zkopรญrovรกn do %s";
+$lang['danger']['access_denied'] = "Pลรญstup byl odepลen nebo jsou neplatnรฉ data ve formulรกลi";
+$lang['danger']['domain_invalid'] = "Nรกzev domรฉny je prรกzdnรฝ nebo ลกpatnรฝ";
+$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. kvรณta pลektoฤila limit pro domรฉnu";
+$lang['danger']['object_is_not_numeric'] = "Hodnota %s nenรญ numerickรก";
+$lang['success']['domain_added'] = "Pลidรกna domรฉna %s";
+$lang['success']['items_deleted'] = "Poloลพka %s byla รบspฤลกnฤ smazรกna";
+$lang['success']['item_deleted'] = "Poloลพka %s byla รบspฤลกnฤ smazรกna";
+$lang['danger']['alias_empty'] = "Adresa aliasu nesmรญ bรฝt prรกzdnรก";
+$lang['danger']['last_key'] = 'Nelze smazat poslednรญ klรญฤ';
+$lang['danger']['goto_empty'] = "Cรญlovรก adresa nesmรญ bรฝt prรกzdnรก";
+$lang['danger']['policy_list_from_exists'] = "Zรกznam s danรฝm jmรฉnem ji6 existuje";
+$lang['danger']['policy_list_from_invalid'] = "Zรกznam mรก ลกpatnรฝ formรกt";
+$lang['danger']['alias_invalid'] = "Adresa aliasu %s je ลกpatnรก";
+$lang['danger']['goto_invalid'] = "Cรญlovรก adresa %s nenรญ sprรกvnรก";
+$lang['danger']['alias_domain_invalid'] = "Domรฉnovรฝ alias %s nenรญ sprรกvnรฝ";
+$lang['danger']['target_domain_invalid'] = "Cรญlovรก domรฉna %s nenรญ sprรกvnรก";
+$lang['danger']['object_exists'] = "Objekt %s jiลพ existuje";
+$lang['danger']['domain_exists'] = "Domรฉna %s jiลพ existuje";
+$lang['danger']['alias_goto_identical'] = "Alias a cรญlovรก adresa nesmรญ bรฝt stejnรก";
+$lang['danger']['aliasd_targetd_identical'] = "Domรฉnovรฝ alias nesmรญ bรฝt stejnรฝ jako cรญlovรก domรฉna: %s";
+$lang['danger']['maxquota_empty'] = 'Max. kvรณta poลกtovnรญ schrรกnky nesmรญ bรฝt 0.';
+$lang['success']['alias_added'] = "Byl pลidรกn alias %s";
+$lang['success']['alias_modified'] = "Zmฤny aliasu %s byly uloลพeny";
+$lang['success']['mailbox_modified'] = "Zmฤny poลกtovnรญ schrรกnky %s byly uloลพeny";
+$lang['success']['resource_modified'] = "Zmฤny poลกtovnรญ schrรกnky %s byly uloลพeny";
+$lang['success']['object_modified'] = "Zmฤny objektu %s byly uloลพeny";
+$lang['success']['f2b_modified'] = "Zmฤny Fail2ban parametrลฏ byly uloลพeny";
+$lang['danger']['targetd_not_found'] = "Cรญlovรก domรฉna %s nenalezena";
+$lang['success']['aliasd_added'] = "Pลidรกn domรฉnovรฝ alias %s";
+$lang['success']['aliasd_modified'] = "Zmฤny domรฉnovรฉho aliau %s byly uloลพeny";
+$lang['success']['domain_modified'] = "Zmฤny domรฉny %s byly uloลพeny";
+$lang['success']['domain_admin_modified'] = "Zmฤny domรฉnovรฉho administrรกtora %s byly uloลพeny";
+$lang['success']['domain_admin_added'] = "Domรฉnovรฝ administrรกtor %s byl pลidรกn";
+$lang['success']['admin_added'] = "Administrรกtor %s byl pลidรกn";
+$lang['success']['admin_modified'] = "Zmฤny administrรกtora byly uloลพeny";
+$lang['success']['admin_api_modified'] = "Zmฤna API byla uloลพena";
+$lang['danger']['username_invalid'] = "Jmรฉno uลพivatele %s nemลฏลพe bรฝt pouลพito";
+$lang['danger']['password_mismatch'] = "Potvrzenรญ hesla nesouhlasรญ";
+$lang['danger']['password_complexity'] = "Heslo nesplลuje pravidla";
+$lang['danger']['password_empty'] = "Heslo nesmรญ bรฝt prรกzdnรฉ";
+$lang['danger']['login_failed'] = "Pลihlรกลกenรญ selhalo";
+$lang['danger']['mailbox_invalid'] = "Nรกzev poลกtovnรญ chrรกnky nenรญ sprรกvnรฝ";
+$lang['danger']['description_invalid'] = 'Popis zdroje %s je ลกpatnรฝ';
+$lang['danger']['resource_invalid'] = "Nรกzev zdroje %s je ลกpatnรฝ";
+$lang['danger']['is_alias'] = "%s je jiลพ znรกma jako adresa aliasu";
+$lang['danger']['is_alias_or_mailbox'] = "%s je jiลพ znรกma jako adresa aliasu, poลกtovnรญ schrรกnky nebo aliasu zdฤdฤnรฉho z domรฉnovรฉho aliasu.";
+$lang['danger']['is_spam_alias'] = "%s je jiลพ znรกma jako adresa spam aliasu";
+$lang['danger']['quota_not_0_not_numeric'] = "Kvรณta musรญ bรฝt ฤรญslo >= 0";
+$lang['danger']['domain_not_found'] = 'Domรฉna %s nebyla nalezena';
+$lang['danger']['max_mailbox_exceeded'] = "Max. poฤet poลกtovnรญch schrรกnek pลekroฤen (%d z %d)";
+$lang['danger']['max_alias_exceeded'] = 'Pลekroฤeno max. mnoลพstvรญ aliasลฏ';
+$lang['danger']['mailbox_quota_exceeded'] = "Kvรณta pลekroฤila limit domรฉny (max. %d MiB)";
+$lang['danger']['mailbox_quota_left_exceeded'] = "Nenรญ dostatek volnรฉho mรญsta (zbรฝvรก: %d MiB)";
+$lang['success']['mailbox_added'] = "Poลกtovnรญ schrรกnka %s byla pลidรกna";
+$lang['success']['resource_added'] = "Zdroj %s byl pลidรกn";
+$lang['success']['domain_removed'] = "Domรฉna %s byla odebrรกna";
+$lang['success']['alias_removed'] = "Alias %s byl odebrรกn";
+$lang['success']['alias_domain_removed'] = "Domรฉnovรฝ alias %s byl odebrรกn";
+$lang['success']['domain_admin_removed'] = "Domรฉnovรฝ administrรกtor %s byl odebrรกn";
+$lang['success']['admin_removed'] = "Administrรกtor %s byl odebrรกn";
+$lang['success']['mailbox_removed'] = "Poลกtovnรญ schrรกnka %s byla odebrรกna";
+$lang['success']['eas_reset'] = "ActiveSync zaลรญzenรญ uลพivatele %s bylo vyresetovรกno";
+$lang['success']['sogo_profile_reset'] = "SOGo profil uลพivatele %s byl resetovรกn";
+$lang['success']['resource_removed'] = "Zdroj %s byl odebrรกn";
+$lang['warning']['cannot_delete_self'] = "Nelze smazat prรกvฤ pลihlรกลกenรฉho uลพivatele";
+$lang['warning']['no_active_admin'] = "Nelze deaktivovat poslednรญho aktivnรญho administrรกtora";
+$lang['danger']['max_quota_in_use'] = "Kvรณta poลกtovnรญ schrรกnky musรญ bรฝt vฤtลกรญ nebo rovna %d MiB";
+$lang['danger']['domain_quota_m_in_use'] = "Kvรณta domรฉny muรญ bรฝt vฤtลกรญ nebo rovna %s MiB";
+$lang['danger']['mailboxes_in_use'] = "Max. poฤet poลกtovnรญch schrรกnek musรญ bรฝt vฤtลกรญ nebo rovno %d";
+$lang['danger']['aliases_in_use'] = "Max. poฤet aliasลฏ musรญ bรฝt vฤtลกรญ nebo rovno %d";
+$lang['danger']['sender_acl_invalid'] = "ACL hodnota odesรญlatele %s je ลกpatnรก";
+$lang['danger']['domain_not_empty'] = "Nelze odebrat domรฉnu, kterรก nenรญ prรกzdnรก";
+$lang['danger']['validity_missing'] = 'Pลidejte dobu platnosti';
+$lang['user']['loading'] = "Naฤรญtรก se...";
+$lang['user']['force_pw_update'] = 'Pro pลรญstup k groupware funkcรญm musรญte zmฤnit heslo.';
+$lang['user']['active_sieve'] = "Aktivnรญ filtr";
+$lang['user']['show_sieve_filters'] = "Zobrazit aktivnรญ sieve filtr uลพivatele";
+$lang['user']['no_active_filter'] = "Nenรญ k dispozici ลพรกdnรฝ aktivnรญ filtr";
+$lang['user']['messages'] = "zprรกv"; // "123 messages"
+$lang['user']['in_use'] = "Obsazeno";
+$lang['user']['user_change_fn'] = "";
+$lang['user']['user_settings'] = 'Uลพivatelskรฉ nastavenรญ';
+$lang['user']['mailbox_details'] = 'Podrobnosti poลกtovnรญ schrรกnky';
+$lang['user']['change_password'] = 'Zmฤnit heslo';
+$lang['user']['client_configuration'] = 'Zobrazit prลฏvodce konfiguracรญ pro e-mailovรฉ klienty a smartphony';
+$lang['user']['new_password'] = 'Novรฉ heslo';
+$lang['user']['save_changes'] = 'Uloลพit zmฤny';
+$lang['user']['password_now'] = 'Souฤasnรฉ heslo (pro schvรกlenรญ zmฤny)';
+$lang['user']['new_password_repeat'] = 'Potvrzenรญ novรฉho hesla (opakujte)';
+$lang['user']['new_password_description'] = 'Poลพadavek: dรฉlka min. 6 znakลฏ, pรญsmena a ฤรญsla.';
+$lang['user']['spam_aliases'] = 'Doฤasnรฉ e-mailovรฉ aliasy';
+$lang['user']['alias'] = 'Alias';
+$lang['user']['shared_aliases'] = 'Sdรญlenรฉ aliasy';
+$lang['user']['shared_aliases_desc'] = 'Sdรญlenรฉ aliasy nejsou ovlivnฤny uลพivatelskรฝm nastavenรญm, jako je spam filtr nebo pravidla ลกifrovรกnรญ. Odpovรญdajรญcรญ nastavenรญ mohou provรกdฤt pouze sprรกvci na รบrovni domรฉny.';
+$lang['user']['direct_aliases'] = 'Pลรญmรฉ aliasy';
+$lang['user']['direct_aliases_desc'] = 'Pลรญmรฉ aliasy jsou ovlivnฤny filtrem spamu a nastavenรญm pravidel TLS';
+$lang['user']['is_catch_all'] = 'Catch-all pro domรฉnu/y';
+$lang['user']['aliases_also_send_as'] = 'Takรฉ smรญ odesรญlat jako uลพivatel';
+$lang['user']['aliases_send_as_all'] = 'Nekontroluje se pลรญstup odesรญlatele pro nรกsledujรญcรญ domรฉnu(y) a jejich alias domรฉny:';
+$lang['user']['alias_create_random'] = 'Generovat nรกhodnรฝ alias';
+$lang['user']['alias_extend_all'] = 'Prodlouลพit aliasy o 1 hodinu';
+$lang['user']['alias_valid_until'] = 'Platnรฝ do';
+$lang['user']['alias_remove_all'] = 'Odstranit vลกechny aliasy';
+$lang['user']['alias_time_left'] = 'Zbรฝvajรญcรญ ฤas';
+$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
+$lang['user']['alias_select_validity'] = 'Doba platnosti';
+$lang['user']['sync_jobs'] = 'Synchronizaฤnรญ รบlohy';
+$lang['user']['expire_in'] = 'Vyprลกรญ za';
+$lang['user']['hour'] = 'hodinu';
+$lang['user']['hours'] = 'hodin';
+$lang['user']['day'] = 'den';
+$lang['user']['week'] = 'tรฝden';
+$lang['user']['weeks'] = 'tรฝdny';
+$lang['user']['spamfilter'] = 'Spam filtr';
+$lang['admin']['spamfilter'] = 'Spam filtr';
+$lang['user']['spamfilter_wl'] = 'Seznam povolenรฝch (Whitelist)';
+$lang['user']['spamfilter_wl_desc'] = 'E-mailovรฉ adresy v seznamu povolenรฝch (Whitelist) nebudou nikdy klasifikovanรฉ jako spam. Mohou bรฝt pouลพity zรกstupnรฉ znaky (*). Filtr je aplikovรกn pouze na pลรญmรฉ aliasy (aliasy s jednou cรญlovou poลกtovnรญ schrรกnkou), s vรฝjimkou aliasลฏ typu catch-all a samotnรฉ poลกtovnรญ schrรกnky.';
+$lang['user']['spamfilter_bl'] = 'Seznam zakรกzanรฝch (Blacklist)';
+$lang['user']['spamfilter_bl_desc'] = 'E-mailovรฉ adresy v seznamu zakรกzanรฝch (Blacklist) budou vลพdy klasifikovanรฉ jako spam a odmรญtnutรฉ. Mohou bรฝt pouลพity zรกstupnรฉ znaky(*). Filtr je aplikovรกn pouze na pลรญmรฉ aliasy (aliasy s jednou cรญlovou poลกtovnรญ schrรกnkou), s vรฝjimkou aliasลฏ typu catch-all a samotnรฉ poลกtovnรญ schrรกnky.';
+$lang['user']['spamfilter_behavior'] = 'Hodnocenรญ';
+$lang['user']['spamfilter_table_rule'] = 'Pravidlo';
+$lang['user']['spamfilter_table_action'] = 'Akce';
+$lang['user']['spamfilter_table_empty'] = 'ลฝรกdnรก data k zobrazenรญ';
+$lang['user']['spamfilter_table_remove'] = 'smazat';
+$lang['user']['spamfilter_table_add'] = 'Pลidat poloลพku';
+$lang['user']['spamfilter_green'] = 'Zelenรก: tato zprรกva nenรญ spam';
+$lang['user']['spamfilter_yellow'] = 'ลฝlutรก: tato zprรกva mลฏลพe bรฝt spam, bude oznaฤena jako spam a pลesunuta do sloลพky nevyลพรกdanรก poลกta';
+$lang['user']['spamfilter_red'] = 'ฤervenรก: Tato zprรกva je spam a server ji odmรญtne';
+$lang['user']['spamfilter_default_score'] = 'Vรฝchozรญ hodnoty:';
+$lang['user']['spamfilter_hint'] = 'Prvnรญ hodnota pลedstavuje "nรญzkรฉ spam skรณre" a druhรก "vysokรฉ spam skรณre".';
+$lang['user']['spamfilter_table_domain_policy'] = "n/a (domรฉnovรก politika)";
+$lang['user']['waiting'] = "ฤekรกnรญ";
+$lang['user']['status'] = "Stav";
+$lang['user']['running'] = "Bฤลพรญ";
+
+$lang['user']['tls_policy_warning'] = 'Upozornฤnรญ: Pokud se rozhodnete vynutit ลกifrovanรฝ pลenos poลกty, mลฏลพe dojรญt ke ztrรกtฤ e-mailลฏ. Zprรกvy, kterรฉ nesplลujรญ tuto politiku, budou poลกtovnรญm systรฉmem odmรญtnuty. Tato volba se vztahuje k vaลกรญ primรกrnรญ e-mailovรฉ adrese (pลihlaลกovacรญ jmรฉno), vลกem adresรกm odvozenรฝch z domรฉnovรฝch aliasลฏ i aliasลฏ majรญcรญch tuto poลกtovnรญ chrรกnku jako cรญl.';
+$lang['user']['tls_policy'] = 'Politika ลกifrovรกnรญ';
+$lang['user']['tls_enforce_in'] = 'Vynutit TLS pro pลรญchozรญ poลกtu ';
+$lang['user']['tls_enforce_out'] = 'Vynutit TLS pro odchozรญ poลกtu';
+$lang['user']['no_record'] = 'ลฝรกdnรฝ zรกznam';
+
+
+$lang['user']['tag_handling'] = 'Chovรกnรญ oznaฤenรฉ (tagged) poลกty';
+$lang['user']['tag_in_subfolder'] = 'V podsloลพce';
+$lang['user']['tag_in_subject'] = 'V pลedmฤtu';
+$lang['user']['tag_in_none'] = 'Nedฤlat nic';
+$lang['user']['tag_help_explain'] = 'V podsloลพce: v INBOXU bude vytvoลena novรก podsloลพka pojmenovanรก po oznaฤenรญ (tagu) zprรกvy ("INBOX / Facebook").
+V pลedmฤtu: nรกzev znaฤky (tagu) bude pลidรกvรกn k pลedmฤtu mailu, napลรญklad: "[Facebook] Moje zprรกvy".';
+$lang['user']['tag_help_example'] = 'Pลรญklad e-mailovรฉ adresy s oznaฤenรญm (tagem): me+Facebook@example.org';
+
+$lang['user']['eas_reset'] = 'Smazat mezipamฤลฅ (cache) zaลรญzenรญ ActiveSync';
+$lang['user']['eas_reset_now'] = 'Smazat';
+$lang['user']['eas_reset_help'] = 'Obnovenรญ mezipamฤti zaลรญzenรญ pomลฏลพe obnovit poลกkozenรฝ profil sluลพby ActiveSync. Upozornฤnรญ: Vลกechna data budou opฤtovnฤ staลพena!';
+
+$lang['user']['sogo_profile_reset'] = 'Resetovat profil SOGo';
+$lang['user']['sogo_profile_reset_now'] = 'Resetovat profil';
+$lang['user']['sogo_profile_reset_help'] = 'Tato volba odstranรญ uลพivatelskรฝ profil SOGo a nenรกvratnฤ vymaลพe vลกechna data.';
+
+$lang['user']['encryption'] = 'ล ifrovรกnรญ';
+$lang['user']['username'] = 'Jmรฉno uลพivatele';
+$lang['user']['last_run'] = 'Naposledy spuลกtฤno';
+$lang['user']['excludes'] = 'Vylouฤenรฉ';
+$lang['user']['interval'] = 'Interval';
+$lang['user']['active'] = 'Aktivnรญ';
+$lang['user']['action'] = 'Akce';
+$lang['user']['edit'] = 'Upravit';
+$lang['user']['remove'] = 'Smazat';
+$lang['user']['create_syncjob'] = 'Vytvoลit novou synchronizaฤnรญ รบlohu';
+
+$lang['start']['mailcow_apps_detail'] = 'Pouลพijte mailcow aplikace pro pลรญstup k vaลกim e-mailลฏm, kalendรกลi, kontaktลฏm a dalลกรญm funkcรญm.';
+$lang['start']['mailcow_panel_detail'] = 'Administrรกtoลi domรฉn mohou vytvรกลet, upravovat nebo mazat mailboxy a aliasy. Dรกle mohou upravovat parametry domรฉny a zobrazovat dalลกรญ informace o jejich pลidฤlenรฝch domรฉnรกch.
+Uลพivatelรฉ mohou vytvรกลet ฤasovฤ omezenรฉ aliasy (spam aliases), mฤnit jejich heslo a nastavovat spam filtr.';
+$lang['start']['imap_smtp_server_auth_info'] = 'Pouลพijte prosรญm vaลกรญ celou e-mailovou adresu a zpลฏsob ovฤลovรกnรญ PLAIN.
+Vaลกe pลihlaลกovacรญ รบdaje budou zaลกifrovรกny na stranฤ serveru.';
+$lang['start']['help'] = 'Zobrazit/Skrรฝt panel nรกpovฤdy';
+$lang['header']['mailcow_settings'] = 'Nastavenรญ';
+$lang['header']['administration'] = 'Hlavnรญ nastavenรญ';
+$lang['header']['mailboxes'] = 'Nastavenรญ poลกty';
+$lang['header']['user_settings'] = 'Uลพivatelskรก nastavenรญ';
+$lang['header']['quarantine'] = "Karantรฉna";
+$lang['header']['debug'] = "Systรฉmovรฉ informace";
+$lang['quarantine']['disabled_by_config'] = "Funkce karantรฉna je momentรกlnฤ zakรกzanรก.";
+$lang['mailbox']['tls_policy_maps'] = 'Pลetฤลพovรกnรญ TLS pravidel';
+$lang['mailbox']['tls_policy_maps_long'] = 'Pลetฤลพovรกnรญ odchozรญch TLS pravidel (TLS policy map overrides).';
+$lang['mailbox']['tls_policy_maps_info'] = 'Tato mapa pravidel pลetฤลพuje odchozรญ transportnรญ TLS pravidla nezรกvisle na TLS nastavenรญ uลพivatele.
+ Prosรญm prostudujte the "smtp_tls_policy_maps" dokumentaci pro dalลกรญ informace.';
+$lang['mailbox']['tls_enforce_in'] = 'Vynucenรญ TLS pro pลรญchozรญ';
+$lang['mailbox']['tls_enforce_out'] = 'Vynucenรญ TLS pro odchozรญ';
+$lang['mailbox']['tls_map_dest'] = 'Cรญl';
+$lang['mailbox']['tls_map_dest_info'] = 'Pลรญklady: example.org, .example.org, mail@example.org, [mail.example.org]:25';
+$lang['mailbox']['tls_map_policy'] = 'Pravidlo';
+$lang['mailbox']['tls_map_parameters'] = 'Parametry';
+$lang['mailbox']['tls_map_parameters_info'] = 'Prรกzdnรฉ nebo parametry, napลรญklad: protocols=!SSLv2 ciphers=medium exclude=3DES';
+$lang['mailbox']['booking_0'] = 'Vลพdy zobrazovat jako volnรฝ';
+$lang['mailbox']['booking_lt0'] = 'Neomezenรฝ, ale pลi rezervaci je zaneprรกzdnฤn (booked)';
+$lang['mailbox']['booking_custom'] = 'Hard-limit na vlastnรญ poฤet rezervacรญ';
+$lang['mailbox']['booking_0_short'] = 'Vลพdy volnรฝ';
+$lang['mailbox']['booking_lt0_short'] = 'Soft limit';
+$lang['mailbox']['booking_custom_short'] = 'Hard limit';
+$lang['mailbox']['domain'] = 'Domรฉna';
+$lang['mailbox']['spam_aliases'] = 'Doฤasnรฝ alias';
+$lang['mailbox']['multiple_bookings'] = 'Vรญcenรกsobnรฉ rezervace';
+$lang['mailbox']['kind'] = 'Druh';
+$lang['mailbox']['description'] = 'Popis';
+$lang['mailbox']['alias'] = 'Alias';
+$lang['mailbox']['aliases'] = 'Aliasy';
+$lang['mailbox']['domains'] = 'Domรฉny';
+$lang['admin']['domain'] = 'Domรฉna';
+$lang['admin']['domain_s'] = 'Domรฉna/y';
+$lang['mailbox']['mailboxes'] = 'Poลกtovnรญ schrรกnky';
+$lang['mailbox']['resources'] = 'Zdroje';
+$lang['mailbox']['mailbox_quota'] = 'Max. velikost poลกtovnรญ schrรกnky';
+$lang['mailbox']['domain_quota'] = 'Kvรณta';
+$lang['mailbox']['active'] = 'Aktivnรญ';
+$lang['mailbox']['action'] = 'Akce';
+$lang['mailbox']['backup_mx'] = 'Zรกloลพnรญ MX';
+$lang['mailbox']['domain_aliases'] = 'Domรฉnovรฉ aliasy';
+$lang['mailbox']['target_domain'] = 'Cรญlovรก domรฉna';
+$lang['mailbox']['target_address'] = 'Cรญlovรก adresa';
+$lang['mailbox']['username'] = 'Jmรฉno uลพivatele';
+$lang['mailbox']['fname'] = 'Celรฉ jmรฉno';
+$lang['mailbox']['filter_table'] = 'Tabulka filtrลฏ';
+$lang['mailbox']['yes'] = '✓';
+$lang['mailbox']['no'] = '✕';
+$lang['mailbox']['in_use'] = 'Obsazeno (%)';
+$lang['mailbox']['msg_num'] = 'Zprรกva #';
+$lang['mailbox']['remove'] = 'Smazat';
+$lang['mailbox']['edit'] = 'Upravit';
+$lang['mailbox']['no_record'] = 'ลฝรกdnรฝ zรกznam pro objekt %s';
+$lang['mailbox']['no_record_single'] = 'ลฝรกdnรฝ zรกznam';
+$lang['mailbox']['add_domain'] = 'Pลidat domรฉnu';
+$lang['mailbox']['add_domain_alias'] = 'Pลidat domรฉnovรฝ alias';
+$lang['mailbox']['add_mailbox'] = 'Pลidat poลกtovnรญ schrรกnku';
+$lang['mailbox']['add_resource'] = 'Pลidat zdroj';
+$lang['mailbox']['add_alias'] = 'Pลidat alias';
+$lang['mailbox']['add_domain_record_first'] = 'Prosรญm vytvoลte nejdลรญve domรฉnu';
+$lang['mailbox']['empty'] = 'ลฝรกdnรฉ vรฝsledky';
+$lang['mailbox']['toggle_all'] = 'Oznaฤit vลกe';
+$lang['mailbox']['quick_actions'] = 'Akce';
+$lang['mailbox']['activate'] = 'Zapnout';
+$lang['mailbox']['deactivate'] = 'Vypnout';
+$lang['mailbox']['owner'] = 'Vlastnรญk';
+$lang['mailbox']['mins_interval'] = 'Interval (min)';
+$lang['mailbox']['last_run'] = 'Naposledy spuลกtฤno';
+$lang['mailbox']['excludes'] = 'Vylouฤenรฉ';
+$lang['mailbox']['last_run_reset'] = 'Plรกnovat dalลกรญ';
+$lang['mailbox']['sieve_info'] = 'Mลฏลพete uloลพit vรญce filtrลฏ pro kaลพdรฉho uลพivatele, ale souฤasnฤ mลฏลพe bรฝt aktivnรญ pouze jeden prefilter a jeden postfilter.
+Kaลพdรฝ filtr bude zpracovรกn v danรฉm poลadรญ. Ani chyba pลi vykonรกvรกnรญ skriptu nebo snaha o pozdrลพenรญ nezastavรญ vykonรกnรญ dalลกรญch skriptลฏ.
+Prefilter โ Uลพivatelskรฉ skripty โ Postfilter โ global sieve postfilter';
+$lang['info']['no_action'] = 'Nenรญ pouลพitelnรก ลพรกdnรก akce';
+
+$lang['edit']['syncjob'] = 'Upravit synchronizaฤnรญ รบlohu';
+$lang['edit']['client_id'] = 'ID klienta';
+$lang['edit']['client_secret'] = 'Client secret';
+$lang['edit']['scope'] = 'Rozsah (Scope)';
+$lang['edit']['grant_types'] = 'Grant types';
+$lang['edit']['redirect_uri'] = 'Redirect/Callback URL';
+$lang['edit']['hostname'] = 'Jmรฉno hostitele (Hostname)';
+$lang['edit']['encryption'] = 'ล ifrovรกnรญ';
+$lang['edit']['maxage'] = 'Maximรกlnรญ stรกลรญ zprรกv ve dnech, kterรฉ budou staลพeny ze vzdรกlenรฉho umรญstฤnรญ (0 = ignorovat stรกลรญ)';
+$lang['edit']['maxbytespersecond'] = 'Max. bajtลฏ za sekundu (0 = neomezeno)';
+$lang['edit']['automap'] = 'Pokusit se automaticky mapovat sloลพky ("Sent items", "Sent" => "Sent" etc.)';
+$lang['edit']['skipcrossduplicates'] = 'Pลeskoฤit duplicitnรญ zprรกvy mezi sloลพkami (first come, first serve)';
+$lang['add']['automap'] = 'Pokusit se automaticky mapovat sloลพky ("Sent items", "Sent" => "Sent" etc.)';
+$lang['add']['skipcrossduplicates'] = 'Pลeskoฤit duplicitnรญ zprรกvy mezi sloลพkami (first come, first serve)';
+$lang['edit']['subfolder2'] = 'Synchronizace do podsloลพky v cรญlovรฉm umรญstฤnรญ (prรกzdnรฉ = nepouลพรญvat podsloลพku)';
+$lang['edit']['mins_interval'] = 'Interval (min)';
+$lang['edit']['exclude'] = 'Vylouฤit objekty (regex)';
+$lang['edit']['save'] = 'Uloลพit zmฤny';
+$lang['edit']['username'] = 'Jmรฉno uลพivatele';
+$lang['edit']['max_mailboxes'] = 'Max. mnoลพstvรญ poลกtovnรญch schrรกnek';
+$lang['edit']['title'] = 'รprava objektu';
+$lang['edit']['target_address'] = 'Cรญlovรก adresa/y (odฤlenรฉ ฤรกrkou)';
+$lang['edit']['active'] = 'Aktivnรญ';
+$lang['edit']['force_pw_update'] = 'Vynucenรญ zmฤny hesla pลi pลรญลกtรญm pลihlรกลกenรญ';
+$lang['edit']['force_pw_update_info'] = 'Uลพivatel se bude moci pลihlรกsit pouze do administrace รบฤtu.';
+$lang['edit']['sogo_access'] = 'Udฤlit pลรญstup k Sogo';
+$lang['edit']['sogo_access_info'] = 'Toto nastavenรญ neovlivลuje pลรญstup k ostatnรญm sluลพbรกm, ani nezmฤnรญ existujรญcรญ profil uลพivatele SOGo.';
+$lang['edit']['target_domain'] = 'Cรญlovรก domรฉna';
+$lang['edit']['password'] = 'Heslo';
+$lang['edit']['password_repeat'] = 'Potvrzenรญ novรฉho hesla (opakujte)';
+$lang['edit']['domain_admin'] = 'Upravit domรฉnovรฉho administrรกtora';
+$lang['edit']['domain'] = 'รprava domรฉny';
+$lang['edit']['edit_alias_domain'] = 'Upravit domรฉnovรฝ alias';
+$lang['edit']['domains'] = 'Domรฉny';
+$lang['edit']['alias'] = 'Upravit alias';
+$lang['edit']['mailbox'] = 'รprava poลกtovnรญ schrรกnky';
+$lang['edit']['description'] = 'Popis';
+$lang['edit']['max_aliases'] = 'Max. mnoลพstvรญ aliasลฏ';
+$lang['edit']['max_quota'] = 'Max. kvรณta poลกtovnรญ schrรกnky (MiB)';
+$lang['edit']['domain_quota'] = 'Kvรณta domรฉny';
+$lang['edit']['backup_mx_options'] = 'Moลพnosti zรกloลพnรญho MX';
+$lang['edit']['relay_domain'] = 'Pลesmฤrovรกnรญ provozu (Relay) domรฉny';
+$lang['edit']['relay_all'] = 'Pลesmฤrovรกnรญ provozu (Relay) pro vลกechny pลรญjemce';
+$lang['edit']['relay_all_info'] = 'Pokud se rozhodnete nepลesmฤrovat provoz pro vลกechny pลรญjemce, bude nutnรฉ pลidat prรกzdnou ("blind") poลกtovnรญ schrรกnku pro kaลพdรฉho pลรญjemce, kterรฝ se mรก pลesmฤrovรกvat.';
+$lang['edit']['full_name'] = 'Celรฉ jmรฉno';
+$lang['edit']['quota_mb'] = 'Kvรณta (MiB)';
+$lang['edit']['sender_acl'] = 'Povolit odeslรกnรญ jako';
+$lang['edit']['sender_acl_disabled'] = 'โณ Sender check is disabled';
+$lang['user']['sender_acl_disabled'] = 'Sender check is disabled';
+$lang['edit']['previous'] = 'Pลedchozรญ strรกnka';
+$lang['edit']['unchanged_if_empty'] = 'Pokud se nemฤnรญ, ponechte prรกzdnรฉ';
+$lang['edit']['dont_check_sender_acl'] = "Disable sender check for domain %s (+ alias domains)";
+$lang['edit']['multiple_bookings'] = 'Vรญcenรกsobnรฉ rezervace';
+$lang['edit']['kind'] = 'Druh';
+$lang['edit']['resource'] = 'Zdroje';
+$lang['edit']['relayhost'] = 'Pลeposรญlรกnรญ zรกvislรฉ na odesรญlateli';
+
+$lang['acl']['spam_alias'] = 'Doฤasnรฉ aliasy';
+$lang['acl']['tls_policy'] = 'Pravidla TLS';
+$lang['acl']['spam_score'] = 'Spam skรณre';
+$lang['acl']['spam_policy'] = 'Blacklist/Whitelist';
+$lang['acl']['delimiter_action'] = 'Delimiter akce';
+$lang['acl']['syncjobs'] = 'Synchronizaฤnรญ รบlohy';
+$lang['acl']['eas_reset'] = 'Resetovรกnรญ EAS zaลรญzenรญ';
+$lang['acl']['sogo_profile_reset'] = 'Resetovรกnรญ profilu SOGo';
+$lang['acl']['quarantine'] = 'Karantรฉna';
+$lang['acl']['login_as'] = 'Pลihlรกsit jako uลพivatel poลกtovnรญ schrรกnky';
+$lang['acl']['bcc_maps'] = 'BCC maps';
+$lang['acl']['filters'] = 'Filtry';
+$lang['acl']['ratelimit'] = 'Omezovรกnรญ provozu';
+$lang['acl']['recipient_maps'] = 'Recipient maps';
+$lang['acl']['prohibited'] = 'Zakรกzรกno z dลฏvodu ACL';
+
+$lang['add']['generate'] = 'generovat';
+$lang['add']['syncjob'] = 'Pลidat synchronizaฤnรญ รบlohu';
+$lang['add']['syncjob_hint'] = 'Upozornฤnรญ: Heslo bude uloลพeno v prostรฉm textu!';
+$lang['add']['hostname'] = 'Jmรฉno hostitele (Host)';
+$lang['add']['destination'] = 'Cรญl';
+$lang['add']['nexthop'] = 'Dalลกรญ skok (Next hop)';
+$lang['edit']['nexthop'] = 'Dalลกรญ skok (Next hop)';
+$lang['add']['port'] = 'Port';
+$lang['add']['username'] = 'Jmรฉno uลพivatele';
+$lang['add']['enc_method'] = 'Metoda ลกifrovรกnรญ';
+$lang['add']['mins_interval'] = 'Interval dotazu (Polling interval) (minuty)';
+$lang['add']['exclude'] = 'Vylouฤit objekty (regex)';
+$lang['add']['delete2duplicates'] = 'Odstranit duplicity v cรญlovรฉm mรญstฤ';
+$lang['add']['delete1'] = 'Odstranit ze zdroje po dokonฤenรญ';
+$lang['add']['delete2'] = 'Smazat zprรกvy v cรญli, kterรฉ nejsou ve zdroji';
+$lang['add']['custom_params'] = 'Vlastnรญ parametry';
+$lang['add']['subscribeall'] = 'Odebรญrat vลกechny sloลพky';
+$lang['add']['timeout1'] = 'ฤasovรฝ limit pro pลipojenรญ ke vzdรกlenรฉmu hostiteli';
+$lang['add']['timeout2'] = 'ฤasovรฝ limit pro pลipojenรญ k lokรกlnรญmu hostiteli';
+$lang['edit']['timeout1'] = 'ฤasovรฝ limit pro pลipojenรญ ke vzdรกlenรฉmu hostiteli';
+$lang['edit']['timeout2'] = 'ฤasovรฝ limit pro pลipojenรญ k lokรกlnรญmu hostiteli';
+
+$lang['edit']['delete2duplicates'] = 'Odstranit duplicity v cรญlovรฉm mรญstฤ';
+$lang['edit']['delete1'] = 'Odstranit ze zdroje po dokonฤenรญ';
+$lang['edit']['delete2'] = 'Smazat zprรกvy v cรญli, kterรฉ nejsou ve zdroji';
+
+$lang['add']['domain_matches_hostname'] = 'Domรฉna %s se shoduje s hostname';
+$lang['add']['domain'] = 'Domรฉna';
+$lang['add']['active'] = 'Aktivnรญ';
+$lang['add']['multiple_bookings'] = 'Vรญcenรกsobnรฉ rezervace';
+$lang['add']['description'] = 'Popis';
+$lang['add']['max_aliases'] = 'Max. mnoลพstvรญ aliasลฏ';
+$lang['add']['max_mailboxes'] = 'Max. mnoลพstvรญ poลกtovnรญch schrรกnek';
+$lang['add']['mailbox_quota_m'] = 'Max. kvรณta poลกtovnรญ schrรกnky (MiB)';
+$lang['add']['domain_quota_m'] = 'Celkovรก kvรณta domรฉny (MiB)';
+$lang['add']['backup_mx_options'] = 'Moลพnosti zรกloลพnรญho MX';
+$lang['add']['relay_all'] = 'Pลesmฤrovรกnรญ provozy (Relay) pro vลกechny pลรญjemce';
+$lang['add']['relay_domain'] = 'Pลesmฤrovรกnรญ provozu domรฉny';
+$lang['add']['relay_all_info'] = 'Pokud se rozhodnete nepลesmฤrovat provoz pro vลกechny pลรญjemce, bude nutnรฉ pลidat prรกzdnou ("blind") poลกtovnรญ schrรกnku pro kaลพdรฉho pลรญjemce, kterรฝ se mรก pลesmฤrovรกvat.';
+$lang['add']['alias_address'] = 'Adresa/y aliasลฏ';
+$lang['add']['alias_address_info'] = 'Kompletnรญ email adresa/y nebo @example.com pro zachycenรญ vลกech zprรกv pro domรฉnu (oddฤlenรฉ ฤรกrkami). pouze mailcow domรฉny.';
+$lang['add']['alias_domain_info'] = 'Platnรฉ nรกzvy domรฉn (oddฤlenรฉ ฤรกrkami).';
+$lang['add']['target_address'] = 'Cรญlovรฉ adresy';
+$lang['add']['target_address_info'] = 'Kompletnรญ email adresa/y (oddฤlenรฉ ฤรกrkami).';
+$lang['add']['alias_domain'] = 'Domรฉnovรฝ alias';
+$lang['add']['select'] = 'Prosรญm vyberte...';
+$lang['add']['target_domain'] = 'Cรญlovรก domรฉna';
+$lang['add']['kind'] = 'Druh';
+$lang['add']['mailbox_username'] = 'Jmรฉno uลพivatele (levรก ฤรกst email adresy)';
+$lang['add']['full_name'] = 'Celรฉ jmรฉno';
+$lang['add']['quota_mb'] = 'Kvรณta (MiB)';
+$lang['add']['select_domain'] = 'Nejdลรญve vyberte domรฉnu';
+$lang['add']['password'] = 'Heslo';
+$lang['add']['password_repeat'] = 'Potvrzenรญ novรฉho hesla (opakujte)';
+$lang['add']['restart_sogo_hint'] = 'Po pลidรกnรญ novรฉ domรฉny je nutnรฉ restartovat SOGo kontejner!';
+$lang['add']['goto_null'] = 'Tiลกe odmรญtat poลกtu';
+$lang['add']['goto_ham'] = 'Uฤit se jako ham';
+$lang['add']['goto_spam'] = 'Uฤit se jako spam';
+$lang['add']['validation_success'] = 'รspฤลกnฤ ovฤลeno';
+$lang['add']['activate_filter_warn'] = 'Pokud je zaลกkrtlรก volba "Aktivnรญ", budou vลกechny ostatnรญ filtry deaktivovรกny.';
+$lang['add']['validate'] = 'Ovฤลit';
+$lang['mailbox']['add_filter'] = 'Pลidat filtr';
+$lang['add']['sieve_desc'] = 'Krรกtkรฝ popis';
+$lang['edit']['sieve_desc'] = 'Krรกtkรฝ popis';
+$lang['add']['sieve_type'] = 'Typ filtru';
+$lang['edit']['sieve_type'] = 'Typ filtru';
+$lang['mailbox']['set_prefilter'] = 'Oznaฤit jako (prefilter)';
+$lang['mailbox']['set_postfilter'] = 'Oznaฤit jako (postfilter)';
+$lang['mailbox']['filters'] = 'Filtry';
+$lang['mailbox']['sync_jobs'] = 'Synchronizaฤnรญ รบlohy';
+$lang['mailbox']['inactive'] = 'Neaktivnรญ';
+$lang['edit']['validate_save'] = 'Ovฤลit a uloลพit';
+
+$lang['login']['username'] = 'Jmรฉno uลพivatele';
+$lang['login']['password'] = 'Heslo';
+$lang['login']['login'] = 'Pลihlรกsit';
+$lang['login']['delayed'] = 'Pลihlรกลกenรญ bylo pozdrลพeno o %s sekund.';
+
+$lang['tfa']['tfa'] = "Dvoufaktorovรฉ ovฤลovรกnรญ";
+$lang['tfa']['set_tfa'] = "Nastavenรญ zpลฏsobu dvoufaktorovรฉho ovฤลovรกnรญ";
+$lang['tfa']['yubi_otp'] = "Yubico OTP ovฤลovรกnรญ";
+$lang['tfa']['key_id'] = "Identifikรกtor vaลกeho YubiKey";
+$lang['tfa']['key_id_totp'] = "Identifikรกtor vaลกeho klรญฤe";
+$lang['tfa']['api_register'] = 'mailcow pouลพรญvรก Yubico Cloud API. Prosรญm zรญskejte API klรญฤ pro vaลกe Yubico ZDE';
+$lang['tfa']['u2f'] = "U2F ovฤลovรกnรญ";
+$lang['tfa']['none'] = "Deaktivovat";
+$lang['tfa']['delete_tfa'] = "Zakรกzat TFA";
+$lang['tfa']['disable_tfa'] = "Zakรกzat TFA do pลรญลกtรญho รบspฤลกnรฉho pลihlรกลกenรญ";
+$lang['tfa']['confirm'] = "Potvrdit";
+$lang['tfa']['totp'] = "ฤasovฤ zaloลพenรฉ OTP (Google ovฤลovรกnรญ apod.)";
+$lang['tfa']['select'] = "Prosรญm vyberte...";
+$lang['tfa']['waiting_usb_auth'] = "Probรญhรก ฤekรกnรญ na USB zaลรญzenรญ...
Prosรญm stisknฤte tlaฤรญtko na vaลกem U2F USB zaลรญzenรญ.";
+$lang['tfa']['waiting_usb_register'] = "Probรญhรก ฤekรกnรญ na USB zaลรญzenรญ...
Prosรญm zadejte vaลกe heslo vรฝลกe a potvrฤte U2F registraci stiskem tlaฤรญtka na vaลกem U2F USB zaลรญzenรญ.";
+$lang['tfa']['scan_qr_code'] = "Prosรญm oscanujte nรกsledujรญcรญ kรณd vaลกรญ aplikacรญ na ovฤลovรกnรญ nebo zadejte kรณd ruฤnฤ.";
+$lang['tfa']['enter_qr_code'] = "Vรฝลก kรณd TOTP pokud vaลกe zaลรญzenรญ nemลฏลพe scanovat QR kรณdy";
+$lang['tfa']['confirm_totp_token'] = "Prosรญm potvrฤte zmฤny zadรกnรญm vygenerovanรฉho tokenu";
+
+$lang['admin']['rspamd-com_settings'] = 'Rspamd dokumentace
+ - Nรกzev nastavenรญ bude automaticky generovรกn, viz nรญลพe uvedenรฉ pลedvolby.';
+
+$lang['admin']['queue_manager'] = 'Sprรกvce fronty';
+$lang['admin']['no_new_rows'] = 'ลฝรกdnรฉ dalลกรญ ลรกdky nejsou k dispozici';
+$lang['admin']['additional_rows'] = ' ลรกdkลฏ pลidรกno'; // parses to 'n additional rows were added'
+$lang['admin']['private_key'] = 'Soukromรฝ klรญฤ';
+$lang['admin']['import'] = 'Importovat';
+$lang['admin']['duplicate'] = 'Duplikovat';
+$lang['admin']['import_private_key'] = 'Importovat soukromรฝ klรญฤ';
+$lang['admin']['duplicate_dkim'] = 'Duplikovat DKIM zรกznam';
+$lang['admin']['dkim_from'] = 'Od';
+$lang['admin']['dkim_to'] = 'Komu';
+$lang['admin']['dkim_from_title'] = 'Zdrojovรก domรฉna z kterรฉ se budou kopรญrovat data';
+$lang['admin']['dkim_to_title'] = 'Cรญlovรก domรฉna/y - budou pลepsรกny';
+$lang['admin']['f2b_parameters'] = 'Fail2ban';
+$lang['admin']['f2b_ban_time'] = 'ฤas blokovรกnรญ (s)';
+$lang['admin']['f2b_max_attempts'] = 'Max. pokusลฏ';
+$lang['admin']['f2b_retry_window'] = 'Retry window (s). Interval bฤhem kterรฉho se poฤรญtajรญ neรบspฤลกnรฉ pokusy o pลihlรกลกenรญ';
+$lang['admin']['f2b_netban_ipv4'] = 'Rozsah IPv4 podsรญtฤ pro provedenรญ blokovรกnรญ (8-32)';
+$lang['admin']['f2b_netban_ipv6'] = 'Rozsah IPv6 podsรญtฤ pro provedenรญ blokovรกnรญ (8-128)';
+$lang['admin']['f2b_whitelist'] = 'Sรญtฤ/klienti na Whitelistu';
+$lang['admin']['f2b_blacklist'] = 'Sรญtฤ/klienti na Blacklistu';
+$lang['admin']['f2b_list_info'] = 'Sรญt nebo klienti na blacklistu budou mรญt vลพdy vฤtลกรญ vรกhu neลพ poloลพky na whitelistu. Zรกznamy z blacklistu jsou vytvรกลeny pลi startu kontejneru. Zรกznamy ve whitelistu jsou ฤteny pokaลพdรฉ, kdyลพ je aplikovรกno blokovรกnรญ.';
+$lang['admin']['search_domain_da'] = 'Hledat domรฉny';
+$lang['admin']['r_inactive'] = 'Neaktivnรญ restrikce';
+$lang['admin']['r_active'] = 'Aktivnรญ restrikce';
+$lang['admin']['r_info'] = 'ล edรฉ/zakรกzanรฉ poloลพky v seznamu aktivnรญch omezenรญ nejsou mailcow systรฉmu znรกmy jako platnรก a nelze je pลesouvat. Neznรกmรก omezenรญ budou stejnฤ seลazena dle ฤasu jejich vรฝskytu. Pro nastavenรญ lze pลidat novรฉ zรกznamy do inc/vars.local.inc.php.';
+$lang['admin']['dkim_key_length'] = 'Dรฉlka DKIM klรญฤe (bits)';
+$lang['admin']['dkim_key_valid'] = 'Klรญฤ je platnรฝ';
+$lang['admin']['dkim_key_unused'] = 'Klรญฤ nepouลพitรฝ';
+$lang['admin']['dkim_key_missing'] = 'Klรญฤ chybรญ';
+$lang['admin']['dkim_add_key'] = 'Pลidat ARC/DKIM klรญฤ';
+$lang['admin']['dkim_keys'] = 'ARC/DKIM klรญฤe';
+$lang['admin']['dkim_private_key'] = 'Soukromรฝ klรญฤ';
+$lang['admin']['dkim_domains_wo_keys'] = "Vybrat domรฉny bez klรญฤe";
+$lang['admin']['dkim_domains_selector'] = "Selektor";
+$lang['admin']['add'] = 'Pลidat';
+$lang['add']['add_domain_restart'] = 'Pลidat domรฉnu a restartovat SOGo';
+$lang['add']['add_domain_only'] = 'Pลidat domรฉnu';
+$lang['admin']['configuration'] = 'Nastavenรญ';
+$lang['admin']['password'] = 'Heslo';
+$lang['admin']['password_repeat'] = 'Potvrzenรญ novรฉho hesla (opakujte)';
+$lang['admin']['active'] = 'Aktivnรญ';
+$lang['admin']['inactive'] = 'Neaktivnรญ';
+$lang['admin']['action'] = 'Akce';
+$lang['admin']['add_domain_admin'] = 'Pลidat domรฉnovรฉho administrรกtora';
+$lang['admin']['add_admin'] = 'Pลidat administrรกtora';
+$lang['admin']['add_settings_rule'] = 'Pลidat nastavenรญ';
+$lang['admin']['rsetting_desc'] = 'Krรกtkรฝ popis';
+$lang['admin']['rsetting_content'] = 'Obsah pravidla';
+$lang['admin']['rsetting_none'] = 'ลฝรกdnรฉ pravidlo nenรญ k dispozici';
+$lang['admin']['rsetting_no_selection'] = 'Prosรญm vyberte pravidlo';
+$lang['admin']['rsettings_preset_1'] = 'Pro pลihlรกลกenรฉ uลพivatele vypnuto vลกe kromฤ DKIM a omezovรกnรญ provozu';
+$lang['admin']['rsettings_preset_2'] = 'Poลกtmistลi chtฤjรญ spam';
+$lang['admin']['rsettings_insert_preset'] = 'Vloลพit pลรญklad nastavenรญ "%s"';
+$lang['admin']['rsetting_add_rule'] = 'Pลidat pravidlo';
+$lang['admin']['queue_ays'] = 'Potvrฤte prosรญm, ลพe chcete odstranit vลกechny poloลพky z aktuรกlnรญ fronty.';
+$lang['admin']['arrival_time'] = 'ฤas zaลazenรญ do fronty (ฤas serveru)';
+$lang['admin']['message_size'] = 'Velikost zprรกvy';
+$lang['admin']['sender'] = 'Odesรญlatel';
+$lang['admin']['recipients'] = 'Pลรญjemci';
+$lang['admin']['admin_domains'] = 'Pลidฤlฤnรฉ domรฉny';
+$lang['admin']['domain_admins'] = 'Administrรกtoลi domรฉn';
+$lang['admin']['flush_queue'] = 'Zkusit opฤtovnฤ doruฤit frontu. (Flush queue)';
+$lang['admin']['delete_queue'] = 'Smazat vลกe';
+$lang['admin']['queue_deliver_mail'] = 'Doruฤit';
+$lang['admin']['queue_hold_mail'] = "Zadrลพet";
+$lang['admin']['queue_unhold_mail'] = 'Propustit';
+$lang['admin']['username'] = 'Jmรฉno uลพivatele';
+$lang['admin']['edit'] = 'Upravit';
+$lang['admin']['remove'] = 'Smazat';
+$lang['admin']['save'] = 'Uloลพit zmฤny';
+$lang['admin']['admin'] = 'Administrator';
+$lang['admin']['admin_details'] = 'Administrรกtoลi mailserveru';
+$lang['admin']['unchanged_if_empty'] = 'Pokud se nemฤnรญ, ponechte prรกzdnรฉ';
+$lang['admin']['yes'] = '✓';
+$lang['admin']['no'] = '✕';
+$lang['admin']['access'] = 'Pลรญstupy';
+$lang['admin']['no_record'] = 'ลฝรกdnรฝ zรกznam';
+$lang['admin']['filter_table'] = 'Tabulka filtrลฏ';
+$lang['admin']['empty'] = 'ลฝรกdnรฉ vรฝsledky';
+$lang['admin']['time'] = 'ฤas';
+$lang['admin']['last_applied'] = 'Naposledy pouลพitรฉ';
+$lang['admin']['reset_limit'] = 'Odebrat hash';
+$lang['admin']['hash_remove_info'] = 'Odebrรกnรญ hashe omezovรกnรญ provozu (pokud stรกle existuje) vyresetuje kompletnฤ jeho ฤรญtaฤ.
+ Kaลพdรฝ hash je oznaฤen jedineฤnou barvou.';
+$lang['warning']['hash_not_found'] = 'Hash nenalezen';
+$lang['success']['hash_deleted'] = 'Hash byl smazรกn';
+$lang['admin']['authed_user'] = 'Pลihlรกลกenรฝ uลพivatel';
+$lang['admin']['priority'] = 'Priorita';
+$lang['admin']['message'] = 'Zprรกva';
+$lang['admin']['rate_name'] = 'Nรกzev (Rate name)';
+$lang['admin']['refresh'] = 'Obnovit';
+$lang['admin']['to_top'] = 'Zpฤt na zaฤรกtek';
+$lang['admin']['in_use_by'] = 'Pouลพรญvรกno';
+$lang['admin']['forwarding_hosts'] = 'Pลesmฤrovรกnรญ klientลฏ (Forwarding Hosts)';
+$lang['admin']['forwarding_hosts_hint'] = 'Pลรญchozรญ zprรกvy jsou bezpodmรญneฤnฤ akceptovรกny od vลกech zde uvedenรฝch klientลฏ. Tito klienti nebudou kontrolovรกni proti DNSBL nebo podrobeni greylistingu. Spam obdrลพenรฝ od tฤchto klientลฏ nebude nikdy odmรญtnut, ale pลรญleลพitostnฤ mลฏลพe bรฝt uloลพen do sloลพky se spamem. Nejฤastฤjลกรญm รบฤelem je zadat poลกtovnรญ servery, pro kterรฉ jste nastavili pravidlo, kterรฉ pลedรกvรก pลรญchozรญ e-maily na vรกลก poลกtovnรญ server.';
+$lang['admin']['forwarding_hosts_add_hint'] = 'Lze zadat IPv4/IPv6 adresy, sรญtฤ ve formรกtu CIDR, nรกzvy klientลฏ (kterรฉ budou pลevedeny na IP adresy) nebo nรกzvy domรฉn (kterรฉ budou pลevedeny na IP dotazovรกnรญm se DNS na SPF zรกznam nebo pokud neexistuje tak na MX zรกznam).';
+$lang['admin']['relayhosts_hint'] = 'Nastavte zde pลeposรญlรกnรญ zรกvislรฉ na odesรญlateli (sender-dependent transports), pro moลพnost je vybrat v oknฤ pro nastavenรญ domรฉny.
+Sluลพba pลeposรญlรกnรญ je vลพdy "smtp:". Individuรกlnรญ uลพivatelskรก nastavenรญ odchozรญch TLS politik jsou takรฉ povolena.';
+$lang['admin']['transports_hint'] = 'Poloลพky seznamu pลeposรญlรกnรญ (transport map) pลetฤลพujรญ poloลพky seznamu pลeposรญlรกnรญ zรกvislรฉm na odesรญlateli (sender-dependent transport).
+Individuรกlnรญ uลพivatelskรก nastavenรญ odchozรญch TLS politik jsou ignorovรกna a lze je vynutit pลes pลetฤลพovรกnรญ odchozรญch TLS pravidel (TLS policy map overrides). Sluลพba pลeposรญlรกnรญ je vลพdy "smtp:".
+Pro zjiลกtฤnรญ pลihlaลกovacรญch รบdajลฏ dalลกรญho skoku "[host]:25" se Postfix vลพdy dotรกลพe na "nexthop" pลed hledรกnรญm "[nexthop]:25". Toto chovรกnรญ znemoลพnuje pouลพรญt "nexthop" a "[nexthop]:25" souฤasnฤ.';
+$lang['admin']['add_relayhost_hint'] = 'Upozornฤnรญ: pลihlaลกovacรญ รบdaje (pokud existujรญ) budou uloลพeny jako prostรฝ text.';
+$lang['admin']['add_transports_hint'] = 'Upozornฤnรญ: pลihlaลกovacรญ รบdaje budou uloลพeny jako prostรฝ text.';
+$lang['admin']['host'] = 'Klient (Host)';
+$lang['admin']['source'] = 'Zdroj';
+$lang['admin']['add_forwarding_host'] = 'Pลidat pลesmฤrovรกnรญ klientลฏ (Forwarding Hosts)';
+$lang['admin']['add_relayhost'] = 'Pลidat pลeposรญlรกnรญ zรกvislรฉ na odesรญlateli (sender-dependent transport)';
+$lang['admin']['add_transport'] = 'Pลidat pลeposรญlรกnรญ (Transport)';
+$lang['admin']['relayhosts'] = 'Pลeposรญlรกnรญ zรกvislรฉ na odesรญlateli (Sender-dependent transports)';
+$lang['admin']['transport_maps'] = 'Pลeposรญlรกnรญ (Transport Maps)';
+$lang['admin']['routing'] = 'Smฤrovรกnรญ';
+$lang['admin']['credentials_transport_warning'] = 'Upozornฤnรญ: Pลidรกnรญ poloลพky do seznamu pลeposรญlรกnรญ aktualizuje takรฉ pลihlaลกovacรญ รบdaje vลกech zรกznamลฏ s odpovรญdajรญcรญm sloupcem (nexthop).';
+
+$lang['admin']['destination'] = 'Cรญl';
+$lang['admin']['nexthop'] = 'Dalลกรญ skok (Next hop)';
+
+$lang['success']['forwarding_host_removed'] = "Pลesmฤrovanรฝ klient %s byl odebrรกn";
+$lang['success']['forwarding_host_added'] = "Pลesmฤrovanรฝ klient %s byl pลidรกn";
+$lang['success']['relayhost_removed'] = "Poloลพka seznamu pลeposรญlรกnรญ %s byla odebrรกna";
+$lang['success']['relayhost_added'] = "Poloลพky seznamu pลeposรญlรกnรญ %s byla pลidรกna";
+$lang['diagnostics']['dns_records'] = 'DNS zรกznamy';
+$lang['diagnostics']['dns_records_24hours'] = 'Upozornฤnรญ: Zmฤnรกm provedenรฝm v systรฉmu DNS mลฏลพe trvat aลพ 24 hodin, neลพ se na tรฉto strรกnce sprรกvnฤ zobrazรญ jejich aktuรกlnรญ stav. Tato strรกnka je urฤena pro snadnรฉ zjiลกtฤnรญ, jak nakonfigurovat DNS zรกznamy a zda jsou vลกechny vaลกe zรกznamy sprรกvnฤ uloลพeny.';
+$lang['diagnostics']['dns_records_name'] = 'Nรกzev';
+$lang['diagnostics']['dns_records_type'] = 'Typ';
+$lang['diagnostics']['dns_records_data'] = 'Sprรกvnรฝ zรกznam';
+$lang['diagnostics']['dns_records_status'] = 'Souฤasnรฝ stav';
+$lang['diagnostics']['optional'] = 'Tento zรกznam je volitelnรฝ.';
+$lang['diagnostics']['cname_from_a'] = 'Hodnota odvozena z A/AAAA zรกznamu. Toto je podporovรกno dokud zรกznam mรญลรญ na sprรกvnรฝ zdroj.';
+
+$lang['admin']['relay_from'] = '"Od:" adresa';
+$lang['admin']['relay_run'] = "Provedenรญ testu";
+$lang['admin']['api_allow_from'] = "Povolenรญ pลรญstupu k API z tฤchto IP adres (oddฤlenรฉ ฤรกrkou nebo novรฝm ลรกdkem)";
+$lang['admin']['api_key'] = "API klรญฤ";
+$lang['admin']['activate_api'] = "Zapnout API";
+$lang['admin']['regen_api_key'] = "Generovat API klรญฤ";
+$lang['admin']['ban_list_info'] = "Seznam blokovanรฝch IP adres je zobrazen nรญลพe: sรญลฅ (zbรฝvajรญcรญ ฤas blokovรกnรญ) - [akce]. IP adresy zaลazenรฉ pro odblokovรกnรญ budou odebrรกny z aktivnรญho seznamu bฤhem nฤkolika sekund. ฤervenฤ oznaฤenรฉ poloลพky jsou pernamentnฤ blokovanรฉ blacklistem.";
+$lang['admin']['unban_pending'] = "ฤekรก na odblokovรกnรญ";
+$lang['admin']['queue_unban'] = "odblokovat";
+$lang['admin']['no_active_bans'] = "ลฝรกdnรก aktivnรญ blokovรกnรญ";
+
+$lang['admin']['quarantine'] = "Karantรฉna";
+$lang['admin']['quarantine_retention_size'] = "Poฤet zadrลพenรฝch zprรกv na poลกtovnรญ schrรกnku 0 znamenรก neaktivnรญ!";
+$lang['admin']['quarantine_max_size'] = "Maximรกlnรญ velikost v MiB (vฤtลกรญ prvky budou smazรกny) 0 neznamenรก neomezeno!";
+$lang['admin']['quarantine_exclude_domains'] = "Vylouฤenรฉ domรฉny a domรฉnovรฉ aliasy";
+$lang['admin']['quarantine_release_format'] = "Formรกt propuลกtฤnรฝch poloลพek";
+$lang['admin']['quarantine_release_format_raw'] = "Nezmฤnฤnรฝ originรกl";
+$lang['admin']['quarantine_release_format_att'] = "Jako pลรญloha";
+
+$lang['admin']['ui_texts'] = "รpravy UI textลฏ";
+$lang['admin']['help_text'] = "Pลetรญลพรญ text nรกpovฤdy pod pลihlaลกovacรญm formulรกลem (HTML povoleno)";
+$lang['admin']['title_name'] = 'Nรกzev webu ("mailcow UI" title)';
+$lang['admin']['main_name'] = 'Popis pลihlaลกovacรญho formulรกลe ("mailcow UI")';
+$lang['admin']['apps_name'] = 'Popis sekce aplikacรญ ("mailcow Apps")';
+
+$lang['admin']['customize'] = "Pลizpลฏsobenรญ";
+$lang['admin']['change_logo'] = "Zmฤna loga";
+$lang['admin']['logo_info'] = "Vรกลก obrรกzek bude zmenลกen na vรฝลกku 40 pixelลฏ pro hornรญ navigaฤnรญ liลกtu a na max. ลกรญลku 250px pro รบvodnรญ strรกnku.";
+$lang['admin']['upload'] = "Nahrรกt";
+$lang['admin']['app_links'] = "Odkazy na aplikace";
+$lang['admin']['app_name'] = "Nรกzev aplikace";
+$lang['admin']['link'] = "Odkaz";
+$lang['admin']['remove_row'] = "Smazat ลรกdek";
+$lang['admin']['add_row'] = "Pลidat ลรกdek";
+$lang['admin']['reset_default'] = "Obnovit vรฝchozรญ nastavenรญ";
+$lang['admin']['merged_vars_hint'] = 'ล edรฉ ลรกdky byly pลidรกny z vars.(local.)inc.php a nelze je upravit.';
+$lang['mailbox']['waiting'] = "ฤekรกnรญ";
+$lang['mailbox']['status'] = "Stav";
+$lang['mailbox']['running'] = "Bฤลพรญ";
+
+$lang['edit']['spam_score'] = "Nastavte vlastnรญ skรณre spamu";
+$lang['user']['spam_score_reset'] = "Obnovit vรฝchozรญ nastavenรญ serveru";
+$lang['edit']['spam_policy'] = "Pลidat nebo odebrat poloลพky whitelistu/blacklistu";
+$lang['edit']['spam_alias'] = "Vytvoลit nebo zmฤnit ฤasovฤ omezenรฉ (spam) aliasy";
+
+$lang['danger']['img_tmp_missing'] = "Nelze ovฤลit soubor s obrรกzkem: Doฤasnรฝ soubor nenalezen";
+$lang['danger']['img_invalid'] = "Nelze ovฤลit soubor s obrรกzkem";
+$lang['danger']['invalid_mime_type'] = "ล patnรฝ mime typ";
+$lang['success']['upload_success'] = "Soubor byl รบspฤลกnฤ nahrรกn";
+$lang['success']['app_links'] = "Zmฤny odkazลฏ na aplikace uloลพeny";
+$lang['success']['ui_texts'] = "Zmฤny UI textลฏ uloลพeny";
+$lang['success']['reset_main_logo'] = "Obnovit vรฝchozรญ logo";
+$lang['success']['items_released'] = "Vybranรก poloลพka byla propuลกtฤna";
+$lang['success']['item_released'] = "Poloลพka %s byla propuลกtฤna";
+$lang['danger']['imagick_exception'] = "Chyba: Vรฝjimka programu Imagick pลi ฤtenรญ obrรกzku";
+$lang['quarantine']['quarantine'] = "Karantรฉna";
+$lang['quarantine']['learn_spam_delete'] = "Nauฤit jako spam a smazat";
+$lang['quarantine']['qinfo'] = 'Karantรฉnnรญ systรฉm uloลพรญ odmรญtnutou poลกtu do databรกze a odesรญlatel nebude informovรกn o nedoruฤenรฉ poลกtฤ.
+ "' . $lang['quarantine']['learn_spam_delete'] . '" nauฤรญ systรฉm ลพe zprรกva je spam pomocรญ Bayes theoremu a takรฉ vypoฤรญtรก "fuzzy hashes" pro zakรกzรกnรญ podobnรฝch zprรกv v budoucnu.
+ Upozornฤnรญ: Uฤenรญ se vรญcero zprรกv najednou mลฏลพe bรฝt v zรกvislosti na vaลกem systรฉmu ฤasovฤ nรกroฤnรฉ.';
+$lang['quarantine']['release'] = "Propustit";
+$lang['quarantine']['empty'] = 'ลฝรกdnรฉ vรฝsledky';
+$lang['quarantine']['toggle_all'] = 'Oznaฤit vลกe';
+$lang['quarantine']['quick_actions'] = 'Akce';
+$lang['quarantine']['remove'] = 'Smazat';
+$lang['quarantine']['received'] = "Pลijato";
+$lang['quarantine']['action'] = "Akce";
+$lang['quarantine']['rcpt'] = "Pลรญjemce";
+$lang['quarantine']['qid'] = "Rspamd QID";
+$lang['quarantine']['sender'] = "Odesรญlatel";
+$lang['quarantine']['show_item'] = "Zobrazit poloลพku";
+$lang['quarantine']['check_hash'] = "Hledat hash @ VT souboru";
+$lang['quarantine']['qitem'] = "Poloลพka v karantรฉnฤ";
+$lang['quarantine']['subj'] = "Pลedmฤt";
+$lang['quarantine']['text_plain_content'] = "Obsah (text/plain)";
+$lang['quarantine']['text_from_html_content'] = "Obsah (konvertovanรฉ html)";
+$lang['quarantine']['atts'] = "Pลรญlohy";
+$lang['warning']['fuzzy_learn_error'] = "Chyba pลi uฤenรญ Fuzzy hash: %s";
+$lang['danger']['spam_learn_error'] = "Chyba pลi uฤenรญ spamu: %s";
+$lang['success']['qlearn_spam'] = "Zprรกva ID %s byla nauฤena jako spam a smazรกna";
+
+$lang['debug']['system_containers'] = 'Systรฉm a docker kontejnery';
+$lang['debug']['logs'] = 'Logy';
+$lang['debug']['log_info'] = '
Logy v pamฤti jsou schromaลพฤovรกny pomocรญ Redis seznamลฏ a jsou omezeny na LOG_LINES (%d) kaลพdou minutu pro zabrรกnฤnรญ pลetฤลพovรกnรญ serveru. Nejsou navrลพeny jako trvalรฉ. Vลกechny aplikace, kterรฉ logujรญ do pamฤti zรกroveล logujรญ i do docker sluลพby podle nastavenรญ logging driveru. Logy v pamฤti jsou navrลพeny pro ladฤnรญ menลกรญch problรฉmลฏ s kontejnery.
+
Externรญ logy jsou schromaลพฤovรกny pomocรญ API danรฉ aplikace.
+
Statickรฉ logy jsou vฤtลกinou logy ฤinnostรญ, kterรฉ nejsou zaznamenรกvรกny do Docker sluลพby, ale je potลeba aby byly trvalรฉ (vyjรญmkou jsou API logy).
';
+
+$lang['debug']['in_memory_logs'] = 'Logy v pamฤti';
+$lang['debug']['external_logs'] = 'Externรญ logy';
+$lang['debug']['static_logs'] = 'Statickรฉ logy';
+
+$lang['debug']['disk_usage'] = 'Vyuลพitรญ disku';
+$lang['debug']['containers_info'] = "Informace o docker kontejnerech";
+$lang['debug']['restart_container'] = 'Restartovat';
+
+$lang['quarantine']['release_body'] = "Vรกลก email byla pลipojen jako soubor eml k tรฉto zprรกvฤ.";
+$lang['danger']['release_send_failed'] = "Zprรกvu nelze propustit: %s";
+$lang['quarantine']['release_subject'] = "Potenciรกlnฤ ลกkodlivรก poloลพka v karantรฉnฤ %s";
+
+$lang['mailbox']['bcc_map'] = "BCC mapovรกnรญ";
+$lang['mailbox']['bcc_map_type'] = "Typ BCC";
+$lang['mailbox']['bcc_type'] = "Typ BCC";
+$lang['mailbox']['bcc_sender_map'] = "Mapovรกnรญ odesรญlatele (Sender map)";
+$lang['mailbox']['bcc_rcpt_map'] = "Mapovรกnรญ pลรญjemce (Recipient map)";
+$lang['mailbox']['bcc_local_dest'] = "Mรญstnรญ cรญl";
+$lang['mailbox']['bcc_destinations'] = "BCC cรญl";
+$lang['mailbox']['bcc_destination'] = "BCC cรญl";
+$lang['edit']['bcc_dest_format'] = 'BCC cรญl musรญ bรฝt jedna platnรก email adresa.';
+
+$lang['mailbox']['bcc'] = "BCC";
+$lang['mailbox']['bcc_maps'] = "BCC mapovรกnรญ";
+$lang['mailbox']['bcc_to_sender'] = "Pลepnout na mapovรกnรญ odesรญlatele (sender map)";
+$lang['mailbox']['bcc_to_rcpt'] = "Pลepnout na mapovรกnรญ pลรญjemce (recipient map)";
+$lang['mailbox']['add_bcc_entry'] = "Pลidat BCC mapovรกnรญ";
+$lang['mailbox']['add_tls_policy_map'] = "Pลidat mapovรกnรญ TLS pravidel";
+$lang['mailbox']['bcc_info'] = "Mapovรกnรญ BCC se pouลพรญvรก pro tichรฉ pลedรกvรกnรญ kopiรญ vลกech zprรกv na jinou adresu. Mapovรกnรญ pลรญjemcลฏ (Recipient map) se pouลพรญvรก, pokud mรญstnรญ cรญl (local destination) pลฏsobรญ jako pลรญjemce zprรกvy.
+Mapovรกnรญ odesรญlatelลฏ (Sender maps) podlรฉhรก stejnรฉmu principu. Mรญstnรญ cรญl nebude informovรกn o neรบspฤลกnรฉm doruฤenรญ.";
+$lang['mailbox']['address_rewriting'] = 'รpravy adresovรกnรญ (Address rewriting)';
+$lang['mailbox']['recipient_maps'] = 'Mapovรกnรญ pลรญjemcลฏ (Recipient maps)';
+$lang['mailbox']['recipient_map'] = 'Mapovรกnรญ pลรญjemce (Recipient map)';
+$lang['mailbox']['recipient_map_info'] = 'Mapovรกnรญ pลรญjemcลฏ slouลพรญ k nahrazenรญ cรญlovรฉ adresy zprรกvy pลed doruฤenรญm.';
+$lang['mailbox']['recipient_map_old_info'] = 'Pลฏvodnรญ pลรญjemce musรญ bรฝt musรญ bรฝt platnรก email adresa nebo nรกzev domรฉny.';
+$lang['mailbox']['recipient_map_new_info'] = 'Novรฝ pลรญjemce musรญ bรฝt platnรก email adresa.';
+$lang['mailbox']['recipient_map_old'] = 'Pลฏvodnรญ pลรญjemce';
+$lang['mailbox']['recipient_map_new'] = 'Novรฝ pลijemce';
+$lang['danger']['invalid_recipient_map_new'] = 'Byl specifikovรกn ลกpatnรฝ novรฝ pลรญjemce: %s';
+$lang['danger']['invalid_recipient_map_old'] = 'Byl specifikovรกn ลกpatnรฝ pลฏvodnรญ pลรญjemce: %s';
+$lang['danger']['recipient_map_entry_exists'] = 'Poloลพka mapovรกnรญ pลรญjemcลฏ "%s" jiลพ existuje';
+$lang['success']['recipient_map_entry_saved'] = 'Poloลพka mapovรกnรญ pลรญjemcลฏ "%s" byla uloลพena';
+$lang['success']['recipient_map_entry_deleted'] = 'Mapovanรก poloลพka ID %s byla smazรกna';
+$lang['danger']['tls_policy_map_entry_exists'] = 'Poloลพka mapovรกnรญ TLS pravidel "%s" jiลพ existuje';
+$lang['success']['tls_policy_map_entry_saved'] = 'Poloลพka mapovรกnรญ TLS pravidel "%s" byla uloลพena';
+$lang['success']['tls_policy_map_entry_deleted'] = 'Mapovanรก poloลพka TLS pravidel ID %s byla smazรกna';
+$lang['mailbox']['add_recipient_map_entry'] = 'Pลidat mapovรกnรญ pลรญjemce';
+$lang['danger']['tls_policy_map_parameter_invalid'] = "Parametr zaรกsad je ลกpatnรฝ";
+
+$lang['oauth2']['scope_ask_permission'] = 'Aplikace poลพรกdala o nรกsledujรญcรญ oprรกvnฤnรญ';
+$lang['oauth2']['profile'] = 'Profil';
+$lang['oauth2']['profile_desc'] = 'Zobrazenรญ osobnรญch informacรญ: uลพivatelskรฉ jmรฉno, celรฉ jmรฉno, vytvoลeno, upraveno, aktivnรญ';
+$lang['oauth2']['permit'] = 'Ovฤลenรญ aplikace';
+$lang['oauth2']['authorize_app'] = 'Ovฤลenรญ aplikace';
+$lang['oauth2']['deny'] = 'Zakรกzรกno';
+$lang['oauth2']['access_denied'] = 'Pro povolenรญ pลรญstupu pลes OAuth2 se pลihlaลกte jako vlastnรญk poลกtovnรญ schrรกnky.';
+
+$lang['admin']['sys_mails'] = 'Systรฉmovรก poลกta';
+$lang['admin']['subject'] = 'Pลedmฤt';
+$lang['admin']['from'] = 'Od';
+$lang['admin']['include_exclude'] = 'Zahrnout/Vylouฤit';
+$lang['admin']['include_exclude_info'] = 'Ve vรฝchozรญm nastavenรญ (bez vรฝbฤru), jsou adresovรกny vลกechny poลกtovnรญ schrรกnky';
+$lang['admin']['excludes'] = 'Vylouฤit tyto pลรญjemce';
+$lang['admin']['includes'] = 'Zahrnout tyto pลijemce';
+$lang['admin']['text'] = 'Text';
+$lang['admin']['activate_send'] = 'Povolit tlaฤรญtko "Odeslat"';
+$lang['admin']['send'] = 'Odeslat';
+
+$lang['warning']['ip_invalid'] = 'Pลeskoฤeno, vadnรก IP: %s';
+$lang['danger']['text_empty'] = 'Text nesmรญ bรฝt prรกzdnรฝ';
+$lang['danger']['subject_empty'] = 'Pลedmฤt nesmรญ bรฝt prรกzdnรฝ';
+$lang['danger']['from_invalid'] = 'Odesรญlat nesmรญ bรฝt prรกzdnรฝ';
diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index 5741f968..4d0352d0 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -16,6 +16,10 @@ $lang['footer']['delete_these_items'] = 'Sind Sie sicher, dass die รnderungen a
$lang['footer']['delete_now'] = 'Jetzt lรถschen';
$lang['footer']['cancel'] = 'Abbrechen';
+$lang['footer']['hibp_nok'] = 'รbereinstimmung gefunden! Dieses Passwort ist potentiell gefรคhrlich!';
+$lang['footer']['hibp_ok'] = 'Keine รbereinstimmung gefunden.';
+
+$lang['danger']['unlimited_quota_acl'] = "Unendliche Quota untersagt durch ACL";
$lang['danger']['mysql_error'] = "MySQL Fehler: %s";
$lang['danger']['redis_error'] = "Redis Fehler: %s";
$lang['danger']['unknown_tfa_method'] = "Unbekannte TFA Methode";
@@ -26,10 +30,16 @@ $lang['success']['verified_u2f_login'] = "U2F Anmeldung verifiziert";
$lang['success']['verified_yotp_login'] = "Yubico OTP Anmeldung verifiziert";
$lang['danger']['yotp_verification_failed'] = "Yubico OTP Verifizierung fehlgeschlagen: %s";
$lang['danger']['ip_list_empty'] = "Liste erlaubter IPs darf nicht leer sein";
+$lang['danger']['invalid_destination'] = "Ziel-Format ist ungรผltig";
+$lang['danger']['invalid_nexthop'] = "Next Hop ist ungรผltig";
+$lang['danger']['invalid_nexthop_authenticated'] = 'Dieser Next Hop existiert bereits mit abweichenden Authentifizierungsdaten. Die bestehenden Authentifizierungsdaten dieses "Next Hops" mรผssen vorab angepasst werden.';
+$lang['danger']['next_hop_interferes'] = "%s verhindert das Hinzufรผgen von Next Hop %s";
+$lang['danger']['next_hop_interferes_any'] = "Ein vorhandener Eintrag verhindert das Hinzufรผgen von Next Hop %s";
$lang['danger']['rspamd_ui_pw_length'] = "Rspamd UI Passwort muss mindestens 6 Zeichen lang sein";
$lang['success']['rspamd_ui_pw_set'] = "Rspamd UI Passwort wurde gesetzt";
+$lang['success']['queue_command_success'] = "Queue-Aufgabe erfolgreich ausgefรผhrt";
$lang['danger']['unknown'] = "Ein unbekannter Fehler trat auf";
-$lang['danger']['malformed_username'] = "Benutzername hat falsches Format";
+$lang['danger']['malformed_username'] = "Benutzername hat ein falsches Format";
$lang['info']['awaiting_tfa_confirmation'] = "Warte auf TFA Verifizierung";
$lang['success']['logged_in_as'] = "Eingeloggt als %s";
$lang['danger']['login_failed'] = "Anmeldung fehlgeschlagen";
@@ -40,9 +50,10 @@ $lang['danger']['sieve_error'] = "Sieve Parser: %s";
$lang['danger']['value_missing'] = "Bitte alle Felder ausfรผllen";
$lang['danger']['filter_type'] = "Falscher Filtertyp";
$lang['danger']['domain_cannot_match_hostname'] = "Domain darf nicht dem Hostnamen entsprechen";
-$lang['warning']['domain_added_sogo_failed'] = "Domain wurde hinzugefรผgt; SOGo konnte nicht neugestartet werden";
+$lang['warning']['domain_added_sogo_failed'] = "Domain wurde hinzugefรผgt, aber SOGo konnte nicht neugestartet werden";
$lang['danger']['rl_timeframe'] = "Ratelimit Zeitraum ist inkorrekt";
$lang['success']['rl_saved'] = "Ratelimit fรผr Objekt %s wurde gesetzt";
+$lang['success']['acl_saved'] = "ACL fรผr Objekt %s wurde gesetzt";
$lang['success']['deleted_syncjobs'] = "Syncjobs gelรถscht: %s";
$lang['success']['deleted_syncjob'] = "Syncjobs ID %s gelรถscht";
$lang['success']['delete_filters'] = "Filter gelรถscht: %s";
@@ -58,17 +69,17 @@ $lang['danger']['private_key_error'] = "Schlรผsselfehler: %s";
$lang['danger']['map_content_empty'] = "Inhalt darf nicht leer sein";
$lang['success']['settings_map_added'] = "Regel wurde gespeichert";
$lang['danger']['settings_map_invalid'] = "Regel ID %s ist ungรผltig";
-$lang['danger']['settings_map_removed'] = "Regeln wurden entfernt: %s";
+$lang['success']['settings_map_removed'] = "Regeln wurden entfernt: %s";
$lang['danger']['invalid_host'] = "Ungรผltiger Host: %s";
-$lang['danger']['relayhost_invalid'] = "Relayhost %s ist ungรผltig";
+$lang['danger']['relayhost_invalid'] = "Mapeintrag %s ist ungรผltig";
$lang['success']['saved_settings'] = "Regel wurde gespeichert";
$lang['danger']['dkim_domain_or_sel_invalid'] = 'DKIM-Domain oder Selektor nicht korrekt: %s';
-$lang['success']['dkim_removed'] = 'DKIM-Key wurde entfernt';
-$lang['success']['dkim_added'] = 'DKIM-Key wurde hinzugefรผgt';
+$lang['success']['dkim_removed'] = 'DKIM-Key %s wurde entfernt';
+$lang['success']['dkim_added'] = 'DKIM-Key %s wurde hinzugefรผgt';
$lang['success']['dkim_duplicated'] = "DKIM-Key der Domain %s wurde auf Domain %s kopiert";
$lang['danger']['access_denied'] = 'Zugriff verweigert oder unvollstรคndige/ungรผltige Daten';
-$lang['danger']['domain_invalid'] = 'Domainname %s ist ungรผltig';
+$lang['danger']['domain_invalid'] = 'Domainname ist leer oder ungรผltig';
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = 'Maximale Grรถรe fรผr Mailboxen รผberschreitet das Domain Speicherlimit';
$lang['danger']['object_is_not_numeric'] = 'Wert %s ist nicht numerisch';
$lang['success']['domain_added'] = 'Domain %s wurde angelegt';
@@ -77,7 +88,7 @@ $lang['success']['item_deleted'] = "Objekt %s wurde entfernt";
$lang['danger']['alias_empty'] = 'Alias-Adresse darf nicht leer sein';
$lang['danger']['goto_empty'] = 'Ziel-Adresse darf nicht leer sein';
$lang['danger']['policy_list_from_exists'] = 'Ein Eintrag mit diesem Wert existiert bereits';
-$lang['danger']['policy_list_from_invalid'] = 'Eintrag hat ungรผltiges Format';
+$lang['danger']['policy_list_from_invalid'] = 'Eintrag hat ein ungรผltiges Format';
$lang['danger']['alias_invalid'] = 'Alias-Adresse %s ist ungรผltig';
$lang['danger']['goto_invalid'] = 'Ziel-Adresse %s ist ungรผltig';
$lang['danger']['last_key'] = 'Letzter Key kann nicht gelรถscht werden';
@@ -94,14 +105,16 @@ $lang['success']['aliasd_modified'] = 'รnderungen an Alias-Domain %s wurden ges
$lang['success']['mailbox_modified'] = 'รnderungen an Mailbox %s wurden gespeichert';
$lang['success']['resource_modified'] = "รnderungen an Ressource %s wurden gespeichert";
$lang['success']['object_modified'] = "รnderungen an Objekt %s wurden gespeichert";
-$lang['success']['f2b_modified'] = "รnderungen an Fail2ban Parametern wurden gespeichert";
+$lang['success']['f2b_modified'] = "รnderungen an Fail2ban-Parametern wurden gespeichert";
$lang['danger']['targetd_not_found'] = 'Ziel-Domain %s nicht gefunden';
$lang['success']['aliasd_added'] = 'Alias-Domain %s wurde angelegt';
$lang['success']['aliasd_modified'] = 'รnderungen an Alias-Domain %s wurden gespeichert';
$lang['success']['domain_modified'] = 'รnderungen an Domain %s wurden gespeichert';
$lang['success']['domain_admin_modified'] = 'รnderungen an Domain-Administrator %s wurden gespeichert';
$lang['success']['domain_admin_added'] = 'Domain-Administrator %s wurde angelegt';
+$lang['success']['admin_added'] = 'Administrator %s wurde angelegt';
$lang['success']['admin_modified'] = 'รnderungen am Administrator wurden gespeichert';
+$lang['success']['admin_api_modified'] = "รnderungen an API wurden gespeichert";
$lang['danger']['username_invalid'] = 'Benutzername %s kann nicht verwendet werden';
$lang['danger']['password_mismatch'] = 'Passwort-Wiederholung stimmt nicht รผberein';
$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Richtlinien';
@@ -125,9 +138,13 @@ $lang['success']['domain_removed'] = 'Domain %s wurde entfernt';
$lang['success']['alias_removed'] = 'Alias-Adresse %s wurde entfernt';
$lang['success']['alias_domain_removed'] = 'Alias-Domain %s wurde entfernt';
$lang['success']['domain_admin_removed'] = 'Domain-Administrator %s wurde entfernt';
+$lang['success']['admin_removed'] = 'Administrator %s wurde entfernt';
$lang['success']['mailbox_removed'] = 'Mailbox %s wurde entfernt';
-$lang['success']['eas_reset'] = "ActiveSync Gerรคt des Benutzers %s wurden zurรผckgesetzt";
+$lang['success']['eas_reset'] = "ActiveSync Gerรคt des Benutzers %s wurde zurรผckgesetzt";
+$lang['success']['sogo_profile_reset'] = "ActiveSync Gerรคt des Benutzers %s wurde zurรผckgesetzt";
$lang['success']['resource_removed'] = 'Ressource %s wurde entfernt';
+$lang['warning']['cannot_delete_self'] = 'Kann derzeit eingeloggten Benutzer nicht entfernen';
+$lang['warning']['no_active_admin'] = 'Kann letzten aktiven Administrator nicht deaktivieren';
$lang['danger']['max_quota_in_use'] = 'Mailbox Speicherplatzlimit muss grรถรer oder gleich %d MiB sein';
$lang['danger']['domain_quota_m_in_use'] = 'Domain Speicherplatzlimit muss grรถรer oder gleich %d MiB sein';
$lang['danger']['mailboxes_in_use'] = 'Maximale Anzahl an Mailboxen muss grรถรer oder gleich %d sein';
@@ -155,7 +172,7 @@ $lang['user']['new_password_description'] = 'Mindestanforderung: 6 Zeichen lang,
$lang['user']['spam_aliases'] = 'Temporรคre E-Mail Aliasse';
$lang['user']['alias'] = 'Alias';
$lang['user']['shared_aliases'] = 'Geteilte Alias-Adressen';
-$lang['user']['shared_aliases_desc'] = 'Geteilte Alias-Adressen werden nicht bei benutzerdefinierten Einstellungen wie die des Spam-Filters oder der Verschlรผsselungsrichtlinie berรผcksichtigt. Entsprechende Spam-Filter kรถnnen lediglich von einem Administrator vorgenommen werden.';
+$lang['user']['shared_aliases_desc'] = 'Geteilte Alias-Adressen werden nicht bei benutzerdefinierten Einstellungen, wie die des Spam-Filters oder der Verschlรผsselungsrichtlinie, berรผcksichtigt. Entsprechende Spam-Filter kรถnnen lediglich von einem Administrator vorgenommen werden.';
$lang['user']['direct_aliases'] = 'Direkte Alias-Adressen';
$lang['user']['direct_aliases_desc'] = 'Nur direkte Alias-Adressen werden fรผr benutzerdefinierte Einstellungen berรผcksichtigt.';
$lang['user']['is_catch_all'] = 'Ist Catch-All Adresse fรผr Domain(s)';
@@ -169,6 +186,7 @@ $lang['user']['alias_time_left'] = 'Zeit verbleibend';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Bitte Gรผltigkeit auswรคhlen';
$lang['user']['sync_jobs'] = 'Sync Jobs';
+$lang['user']['expire_in'] = 'Ungรผltig in';
$lang['user']['hour'] = 'Stunde';
$lang['user']['hours'] = 'Stunden';
$lang['user']['day'] = 'Tag';
@@ -183,10 +201,9 @@ $lang['user']['spamfilter_bl_desc'] = 'Fรผr E-Mail-Adressen, die vom Spamfilter
$lang['user']['spamfilter_table_rule'] = 'Regel';
$lang['user']['spamfilter_table_action'] = 'Aktion';
$lang['user']['spamfilter_table_empty'] = 'Keine Eintrรคge vorhanden';
-$lang['user']['spamfilter_table_remove'] = 'entfernen';
+$lang['user']['spamfilter_table_remove'] = 'Entfernen';
$lang['user']['spamfilter_table_add'] = 'Eintrag hinzufรผgen';
$lang['user']['spamfilter_behavior'] = 'Bewertung';
-$lang['user']['spamfilter_default_score'] = 'Spam-Score:';
$lang['user']['spamfilter_green'] = 'Grรผn: Die Nachricht ist kein Spam';
$lang['user']['spamfilter_yellow'] = 'Gelb: Die Nachricht ist vielleicht Spam, wird als Spam markiert und in den Junk-Ordner verschoben';
$lang['user']['spamfilter_red'] = 'Rot: Die Nachricht ist eindeutig Spam und wird vom Server abgelehnt';
@@ -211,10 +228,15 @@ $lang['user']['tag_in_none'] = 'Nichts tun';
$lang['user']['tag_help_explain'] = 'Als Unterordner: Es wird ein Ordner mit dem Namen des Tags unterhalb der Inbox erstellt ("INBOX/Facebook").
In Betreff: Der Name des Tags wird dem Betreff angefรผgt, etwa "[Facebook] Meine Neuigkeiten".';
$lang['user']['tag_help_example'] = 'Beispiel fรผr eine getaggte E-Mail-Adresse: ich+Facebook@example.org';
+
$lang['user']['eas_reset'] = 'ActiveSync Gerรคte-Cache zurรผcksetzen';
$lang['user']['eas_reset_now'] = 'Jetzt zurรผcksetzen';
$lang['user']['eas_reset_help'] = 'In vielen Fรคllen kann ein ActiveSync Profil durch das Zurรผcksetzen des Caches repariert werden. Vorsicht: Alle Elemente werden erneut heruntergeladen!';
+$lang['user']['sogo_profile_reset'] = 'SOGo Profil zurรผcksetzen';
+$lang['user']['sogo_profile_reset_now'] = 'Profil jetzt zurรผcksetzen';
+$lang['user']['sogo_profile_reset_help'] = 'Das Profil wird zuzรผglich aller Daten unwiederbringlich gelรถscht.';
+
$lang['user']['encryption'] = 'Verschlรผsselung';
$lang['user']['username'] = 'Benutzername';
$lang['user']['last_run'] = 'Letzte Ausfรผhrung';
@@ -226,16 +248,30 @@ $lang['user']['edit'] = 'Bearbeiten';
$lang['user']['remove'] = 'Entfernen';
$lang['user']['create_syncjob'] = 'Neuen Sync-Job erstellen';
-$lang['start']['mailcow_apps_detail'] = 'Verwenden Sie mailcow Apps, um E-Mails abzurufen, Kalender- und Kontakte zu verwalten und vieles mehr.';
+$lang['start']['mailcow_apps_detail'] = 'Verwenden Sie mailcow Apps, um E-Mails abzurufen, Kalender und Kontakte zu verwalten und vieles mehr.';
$lang['start']['mailcow_panel_detail'] = 'Domain-Administratoren erstellen, verรคndern oder lรถschen Mailboxen, verwalten die Domรคne und sehen sonstige Einstellungen ein.
Als Mailbox-Benutzer erstellen Sie hier zeitlich limitierte Aliasse, รคndern das Verhalten des Spamfilters, setzen ein neues Passwort und vieles mehr.';
$lang['start']['imap_smtp_server_auth_info'] = 'Bitte verwenden Sie Ihre vollstรคndige E-Mail-Adresse sowie das PLAIN-Authentifizierungsverfahren.
Ihre Anmeldedaten werden durch die obligatorische Verschlรผsselung entgegen des Begriffes "PLAIN" nicht unverschlรผsselt รผbertragen.';
$lang['start']['help'] = 'Hilfe ein-/ausblenden';
$lang['header']['mailcow_settings'] = 'Konfiguration';
-$lang['header']['administration'] = 'Administration';
-$lang['header']['mailboxes'] = 'Mailboxen';
+$lang['header']['administration'] = 'Server-Konfiguration';
+$lang['header']['mailboxes'] = 'E-Mail-Setup';
$lang['header']['user_settings'] = 'Benutzereinstellungen';
+$lang['header']['quarantine'] = "Quarantรคne";
+$lang['header']['debug'] = "Systeminformation";
+$lang['quarantine']['disabled_by_config'] = "Die derzeitige Konfiguration deaktiviert die Funktion des Quarantรคne-Systems.";
+$lang['mailbox']['tls_policy_maps'] = 'TLS-Richtlinien';
+$lang['mailbox']['tls_policy_maps_long'] = 'Ausgehende TLS-Richtlinien';
+$lang['mailbox']['tls_policy_maps_info'] = 'Nachstehende Richtlinien erzwingen TLS-Transportregeln unabhรคngig von TLS-Richtlinieneinstellungen eines Benutzers.
+ Fรผr weitere Informationen zur Syntax sollte die "smtp_tls_policy_maps" Dokumentation konsultiert werden.';
+$lang['mailbox']['tls_enforce_in'] = 'TLS eingehend erzwingen';
+$lang['mailbox']['tls_enforce_out'] = 'TLS ausgehend erzwingen';
+$lang['mailbox']['tls_map_dest'] = 'Ziel';
+$lang['mailbox']['tls_map_dest_info'] = 'Beispiele: example.org, .example.org, mail@example.org, [mail.example.org]:25';
+$lang['mailbox']['tls_map_policy'] = 'Richtlinie';
+$lang['mailbox']['tls_map_parameters'] = 'Parameter';
+$lang['mailbox']['tls_map_parameters_info'] = 'Leer oder Parameter, Beispiele: protocols=!SSLv2 ciphers=medium exclude=3DES';
$lang['mailbox']['booking_0'] = 'Immer als verfรผgbar anzeigen';
$lang['mailbox']['booking_lt0'] = 'Unbegrenzt, jedoch anzeigen, wenn gebucht';
$lang['mailbox']['booking_custom'] = 'Benutzerdefiniertes Limit';
@@ -252,6 +288,7 @@ $lang['mailbox']['description'] = 'Beschreibung';
$lang['mailbox']['resources'] = 'Ressourcen';
$lang['mailbox']['domains'] = 'Domains';
$lang['admin']['domain_s'] = 'Domain(s)';
+$lang['mailbox']['mailbox'] = 'Mailbox';
$lang['mailbox']['mailboxes'] = 'Mailboxen';
$lang['mailbox']['mailbox_quota'] = 'Max. Grรถรe einer Mailbox';
$lang['mailbox']['domain_quota'] = 'Gesamtspeicher';
@@ -264,8 +301,6 @@ $lang['mailbox']['target_address'] = 'Ziel-Adresse';
$lang['mailbox']['username'] = 'Benutzername';
$lang['mailbox']['fname'] = 'Name';
$lang['mailbox']['filter_table'] = 'Filtern';
-$lang['mailbox']['yes'] = '✔';
-$lang['mailbox']['no'] = '✘';
$lang['mailbox']['in_use'] = 'Prozentualer Gebrauch';
$lang['mailbox']['msg_num'] = 'Anzahl Nachrichten';
$lang['mailbox']['remove'] = 'Entfernen';
@@ -286,6 +321,7 @@ $lang['mailbox']['owner'] = 'Besitzer';
$lang['mailbox']['mins_interval'] = 'Intervall (min)';
$lang['mailbox']['last_run'] = 'Letzte Ausfรผhrung';
$lang['mailbox']['last_run_reset'] = 'Als nรคchstes ausfรผhren';
+$lang['mailbox']['excludes'] = 'Ausschlรผsse';
$lang['mailbox']['sieve_info'] = 'Es kรถnnen mehrere Filter pro Benutzer existieren, aber nur ein Filter eines Typs (Pre-/Postfilter) kann gleichzeitig aktiv sein.
Die Ausfรผhrung erfolgt in nachstehender Reihenfolge. Ein fehlgeschlagenes Script sowie der Befehl "keep;" stoppen die weitere Verarbeitung nicht.
Prefilter โ User scripts โ Postfilter โ global sieve postfilter';
@@ -310,8 +346,12 @@ $lang['edit']['max_mailboxes'] = 'Max. Mailboxanzahl:';
$lang['edit']['title'] = 'Objekt bearbeiten';
$lang['edit']['target_address'] = 'Ziel-Adresse(n) (getrennt durch Komma):';
$lang['edit']['active'] = 'Aktiv';
+$lang['edit']['gal'] = 'Globales Adressbuch';
+$lang['edit']['gal_info'] = 'Das Globale Adressbuch enthรคlt alle Objekte einer Domain und kann durch keinen Benutzer editiert werden. Zum Anwenden einer รnderung muss SOGo neugestartet werden.';
$lang['edit']['force_pw_update'] = 'Erzwinge Passwortรคnderung bei nรคchstem Login';
$lang['edit']['force_pw_update_info'] = 'Dem Benutzer wird lediglich der Zugang zur mailcow UI ermรถglicht.';
+$lang['edit']['sogo_access'] = 'SOGo Zugriffsrecht';
+$lang['edit']['sogo_access_info'] = 'Zugriff auf SOGo erlauben oder verbieten. Diese Einstellung hat weder Einfluss auf den Zugang sonstiger Dienste noch entfernt sie ein vorhandenes SOGo Benutzerprofil.';
$lang['edit']['target_domain'] = 'Ziel-Domain:';
$lang['edit']['password'] = 'Passwort:';
$lang['edit']['password_repeat'] = 'Passwort (Wiederholung):';
@@ -332,16 +372,62 @@ $lang['edit']['relay_all_info'] = 'Wenn Sie nicht alle Empfรคnger-
$lang['edit']['full_name'] = 'Voller Name';
$lang['edit']['quota_mb'] = 'Speicherplatz (MiB)';
$lang['edit']['sender_acl'] = 'Darf Nachrichten versenden als';
+$lang['edit']['sender_acl_disabled'] = 'โณ Absenderprรผfung deaktiviert';
+$lang['user']['sender_acl_disabled'] = 'Absenderprรผfung deaktiviert';
$lang['edit']['previous'] = 'Vorherige Seite';
$lang['edit']['unchanged_if_empty'] = 'Unverรคndert, wenn leer';
$lang['edit']['dont_check_sender_acl'] = 'Absender fรผr Domain %s u. Alias-Dom. nicht prรผfen';
$lang['edit']['multiple_bookings'] = 'Mehrfaches Buchen';
$lang['edit']['kind'] = 'Art';
$lang['edit']['resource'] = 'Ressource';
+$lang['edit']['public_comment'] = 'รffentlicher Kommentar';
+$lang['mailbox']['public_comment'] = 'รffentlicher Kommentar';
+$lang['edit']['private_comment'] = 'Privater Kommentar';
+$lang['mailbox']['private_comment'] = 'Privater Kommentar';
+$lang['edit']['comment_info'] = 'Ein privater Kommentar ist fรผr den Benutzer nicht einsehbar. Ein รถffentlicher Kommentar wird als Tooltip im Interface des Benutzers angezeigt.';
+$lang['add']['public_comment'] = 'รffentlicher Kommentar';
+$lang['add']['private_comment'] = 'Privater Kommentar';
+$lang['add']['comment_info'] = 'Ein privater Kommentar ist fรผr den Benutzer nicht einsehbar. Ein รถffentlicher Kommentar wird als Tooltip im Interface des Benutzers angezeigt.';
-$lang['add']['syncjob'] = 'Sync-Job erstellen';
+$lang['acl']['spam_alias'] = 'Temporรคre E-Mail Aliasse';
+$lang['acl']['tls_policy'] = 'Verschlรผsselungsrichtlinie';
+$lang['acl']['spam_score'] = 'Spam-Bewertung';
+$lang['acl']['spam_policy'] = 'Blacklist/Whitelist';
+$lang['acl']['delimiter_action'] = 'Delimiter Aktionen (tags)';
+$lang['acl']['syncjobs'] = 'Sync Jobs';
+$lang['acl']['eas_reset'] = 'EAS-Cache zurรผcksetzen';
+$lang['acl']['sogo_profile_reset'] = 'SOGo Profil zurรผcksetzen';
+$lang['acl']['quarantine'] = 'Quarantรคne-Aktionen';
+$lang['acl']['quarantine_notification'] = 'Quarantรคne-Benachrichtigung';
+$lang['acl']['quarantine_attachments'] = 'Anhรคnge aus Quarantรคne';
+$lang['acl']['alias_domains'] = 'Alias-Domains hinzufรผgen';
+$lang['acl']['login_as'] = 'Einloggen als Mailbox-Benutzer';
+$lang['acl']['bcc_maps'] = 'BCC Maps';
+$lang['acl']['filters'] = 'Filter';
+$lang['acl']['ratelimit'] = 'Rate limit';
+$lang['acl']['recipient_maps'] = 'Empfรคngerumschreibungen';
+$lang['acl']['unlimited_quota'] = 'Unendliche Quota fรผr Mailboxen';
+$lang['acl']['prohibited'] = 'Untersagt durch Richtlinie';
+
+$lang['mailbox']['quarantine_notification'] = 'Quarantรคne-Benachrichtigung';
+$lang['mailbox']['never'] = 'Niemals';
+$lang['mailbox']['hourly'] = 'Stรผndlich';
+$lang['mailbox']['daily'] = 'Tรคglich';
+$lang['mailbox']['weekly'] = 'Wรถchentlich';
+$lang['user']['quarantine_notification'] = 'Quarantรคne-Benachrichtigung';
+$lang['user']['never'] = 'Niemals';
+$lang['user']['hourly'] = 'Stรผndlich';
+$lang['user']['daily'] = 'Tรคglich';
+$lang['user']['weekly'] = 'Wรถchentlich';
+$lang['user']['quarantine_notification_info'] = 'Wurde รผber eine E-Mail in Quarantรคne informiert, wird sie als "benachrichtigt" markiert und keine weitere Benachrichtigung zu dieser E-Mail versendet.';
+
+$lang['add']['generate'] = 'generieren';
+$lang['add']['syncjob'] = 'Syncjob hinzufรผgen';
$lang['add']['syncjob_hint'] = 'Passwรถrter werden unverschlรผsselt abgelegt!';
-$lang['add']['hostname'] = 'Servername';
+$lang['add']['hostname'] = 'Host';
+$lang['add']['destination'] = 'Ziel';
+$lang['add']['nexthop'] = 'Next Hop';
+$lang['edit']['nexthop'] = 'Next Hop';
$lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Benutzername';
$lang['add']['enc_method'] = 'Verschlรผsselung';
@@ -382,7 +468,7 @@ $lang['add']['select'] = 'Bitte auswรคhlen';
$lang['add']['target_domain'] = 'Ziel-Domain';
$lang['add']['kind'] = 'Art';
$lang['add']['mailbox_username'] = 'Benutzername (linker Teil der E-Mail-Adresse)';
-$lang['add']['full_name'] = 'Vor- und Zuname';
+$lang['add']['full_name'] = 'Vor- und Nachname';
$lang['add']['quota_mb'] = 'Speicherplatz (MiB)';
$lang['add']['select_domain'] = 'Bitte zuerst eine Domain auswรคhlen';
$lang['add']['password'] = 'Passwort';
@@ -442,12 +528,12 @@ $lang['admin']['import'] = 'Importieren';
$lang['admin']['duplicate'] = 'Duplizieren';
$lang['admin']['import_private_key'] = 'Private Key importieren';
$lang['admin']['duplicate_dkim'] = 'DKIM duplizieren';
-$lang['admin']['f2b_parameters'] = 'Fail2ban Parameter';
-$lang['admin']['f2b_ban_time'] = 'Banzeit (s)';
+$lang['admin']['f2b_parameters'] = 'Fail2ban-Parameter';
+$lang['admin']['f2b_ban_time'] = 'Bannzeit (s)';
$lang['admin']['f2b_max_attempts'] = 'Max. Versuche';
$lang['admin']['f2b_retry_window'] = 'Wiederholungen im Zeitraum von (s)';
-$lang['admin']['f2b_netban_ipv4'] = 'Netzbereich fรผr IPv4 Bans (8-32)';
-$lang['admin']['f2b_netban_ipv6'] = 'Netzbereich fรผr IPv6 Bans (8-128)';
+$lang['admin']['f2b_netban_ipv4'] = 'Netzbereich fรผr IPv4-Bans (8-32)';
+$lang['admin']['f2b_netban_ipv6'] = 'Netzbereich fรผr IPv6-Bans (8-128)';
$lang['admin']['f2b_whitelist'] = 'Whitelist fรผr Netzwerke und Hosts';
$lang['admin']['r_inactive'] = 'Inaktive Restriktionen';
$lang['admin']['r_active'] = 'Aktive Restriktionen';
@@ -464,6 +550,7 @@ $lang['admin']['dkim_from_title'] = 'Quellobjekt fรผr Duplizierung';
$lang['admin']['dkim_to_title'] = 'Ziel-Objekt(e) werden รผberschrieben';
$lang['admin']['dkim_domains_wo_keys'] = "Domains mit fehlenden Keys auswรคhlen";
$lang['admin']['add'] = 'Hinzufรผgen';
+$lang['admin']['queue_manager'] = 'Queue Manager';
$lang['add']['add_domain_restart'] = 'Domain hinzufรผgen und SOGo neustarten';
$lang['add']['add_domain_only'] = 'Nur Domain hinzufรผgen';
$lang['admin']['configuration'] = 'Konfiguration';
@@ -473,6 +560,7 @@ $lang['admin']['active'] = 'Aktiv';
$lang['admin']['inactive'] = 'Inaktiv';
$lang['admin']['action'] = 'Aktion';
$lang['admin']['add_domain_admin'] = 'Domain-Administrator hinzufรผgen';
+$lang['admin']['domain_admin'] = 'Administrator hinzufรผgen';
$lang['admin']['add_settings_rule'] = 'Rspamd Regel hinzufรผgen';
$lang['admin']['rsetting_desc'] = 'Kurze Beschreibung';
$lang['admin']['rsetting_content'] = 'Regelinhalt';
@@ -483,6 +571,13 @@ $lang['admin']['rsettings_preset_2'] = 'Spam an Postmaster-Addressen nicht block
$lang['admin']['rsettings_insert_preset'] = 'Beispiel "%s" laden';
$lang['admin']['rsetting_add_rule'] = 'Regel hinzufรผgen';
$lang['admin']['admin_domains'] = 'Domain-Zuweisungen';
+$lang['admin']['queue_ays'] = 'Soll die derzeitige Queue wirklich komplett bereinigt werden?';
+$lang['admin']['arrival_time'] = 'Ankunftszeit (Serverzeit)';
+$lang['admin']['message_size'] = 'Nachrichtengrรถรe';
+$lang['admin']['sender'] = 'Sender';
+$lang['admin']['recipients'] = 'Empfรคnger';
+$lang['admin']['flush_queue'] = 'Flush Queue';
+$lang['admin']['delete_queue'] = 'Alle lรถschen';
$lang['admin']['domain_admins'] = 'Domain-Administratoren';
$lang['admin']['username'] = 'Benutzername';
$lang['admin']['edit'] = 'Bearbeiten';
@@ -491,27 +586,51 @@ $lang['admin']['save'] = 'รnderungen speichern';
$lang['admin']['admin'] = 'Administrator';
$lang['admin']['admin_details'] = 'Administrator bearbeiten';
$lang['admin']['unchanged_if_empty'] = 'Unverรคndert, wenn leer';
-$lang['admin']['yes'] = '✔';
-$lang['admin']['no'] = '✘';
$lang['admin']['access'] = 'Zugang';
$lang['admin']['no_record'] = 'Kein Eintrag';
$lang['admin']['filter_table'] = 'Tabelle Filtern';
$lang['admin']['empty'] = 'Keine Eintrรคge vorhanden';
$lang['admin']['time'] = 'Zeit';
+$lang['admin']['last_applied'] = 'Zuletzt angewendet';
+$lang['admin']['reset_limit'] = 'Hash entfernen';
+$lang['admin']['hash_remove_info'] = 'Das Entfernen eines Ratelimit Hashes - sofern noch existent - bewirkt den Reset gezรคhlter Nachrichten dieses Elements.
+ Jeder Hash wird durch eine eindeutige Farbe gekennzeichnet.';
+$lang['warning']['hash_not_found'] = 'Hash nicht gefunden';
+$lang['success']['hash_deleted'] = 'Hash wurde gelรถscht';
+$lang['admin']['authed_user'] = 'Auth. Benutzer';
$lang['admin']['priority'] = 'Gewichtung';
$lang['admin']['refresh'] = 'Neu laden';
$lang['admin']['to_top'] = 'Nach oben';
$lang['admin']['in_use_by'] = 'Verwendet von';
+$lang['admin']['rate_name'] = 'Rate name';
$lang['admin']['message'] = 'Nachricht';
$lang['admin']['forwarding_hosts'] = 'Weiterleitungs-Hosts';
$lang['admin']['forwarding_hosts_hint'] = 'Eingehende Nachrichten werden von den hier gelisteten Hosts bedingungslos akzeptiert. Diese Hosts werden dann nicht mit DNSBLs abgeglichen oder Greylisting unterworfen. Von ihnen empfangener Spam wird nie abgelehnt, optional kann er aber in den Spam-Ordner einsortiert werden. Die รผbliche Verwendung fรผr diese Funktion ist, um Mailserver anzugeben, auf denen eine Weiterleitung zu Ihrem mailcow-Server eingerichtet wurde.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Sie kรถnnen entweder IPv4/IPv6-Adressen, Netzwerke in CIDR-Notation, Hostnamen (die zu IP-Adressen aufgelรถst werden), oder Domainnamen (die zu IP-Adressen aufgelรถst werden, indem ihr SPF-Record abgefragt wird oder, in dessen Abwesenheit, ihre MX-Records) angeben.';
-$lang['admin']['relayhosts_hint'] = 'Erstellen Sie Relayhosts, um diese im Einstellungsdialog einer Domain auszuwรคhlen.';
-$lang['admin']['add_relayhost_add_hint'] = 'Bitte beachten Sie, dass Relayhost Anmeldedaten im Klartext gespeichert werden.';
+$lang['admin']['relayhosts_hint'] = 'Erstellen Sie senderabhรคngige Transporte, um diese im Einstellungsdialog einer Domain auszuwรคhlen.
+ Der Transporttyp lautet immer "smtp:". Benutzereinstellungen bezรผglich Verschlรผsselungsrichtlinie werden beim Transport berรผcksichtigt.';
+$lang['admin']['transports_hint'] = 'โ Transport Maps รผberwiegen senderabhรคngige Transport Maps.
+โ Transport Maps ignorieren Mailbox-Einstellungen fรผr ausgehende Verschlรผsselung. Eine serverweite TLS-Richtlinie wird jedoch angewendet.
+โ Der Transport erfolgt immer via "smtp:".
+โ Adressen, die mit "/localhost$/" รผbereinstimmen, werden immer via "local:" transportiert, daher sind sie von einer Zieldefinition "*" ausgeschlossen.
+โ Die Authentifizierung wird anhand des "Next hop" Parameters ermittelt. Hierbei wรผrde bei einem beispielhaften Wert "[host]:25" immer zuerst "host" abfragt und erst im Anschluss "[host]:25". Dieses Verhalten schlieรt die gleichzeitige Verwendung von Eintrรคgen der Art "host" sowie "[host]:25" aus.';
+$lang['admin']['add_relayhost_hint'] = 'Bitte beachten Sie, dass Anmeldedaten unverschlรผsselt gespeichert werden.
+ Angelegte Transporte dieser Art sind senderabhรคngig und mรผssen erst einer Domain zugewiesen werden, bevor sie als Transport verwendet werden.
+ Diese Einstellungen entsprechen demach nicht dem "relayhost" Parameter in Postfix.';
+$lang['admin']['add_transports_hint'] = 'Bitte beachten Sie, dass Anmeldedaten unverschlรผsselt gespeichert werden.';
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Quelle';
$lang['admin']['add_forwarding_host'] = 'Weiterleitungs-Host hinzufรผgen';
-$lang['admin']['add_relayhost'] = 'Relayhost hinzufรผgen';
+$lang['admin']['add_relayhost'] = 'Senderabhรคngigen Transport hinzufรผgen';
+$lang['admin']['add_transport'] = 'Transport hinzufรผgen';
+$lang['admin']['relayhosts'] = 'Senderabhรคngige Transport Maps';
+$lang['admin']['transport_maps'] = 'Transport Maps';
+$lang['admin']['routing'] = 'Routing';
+$lang['admin']['credentials_transport_warning'] = 'Warnung: Das Hinzufรผgen einer neuen Regel bewirkt die Aktualisierung der Authentifizierungsdaten aller vorhandenen Eintrรคge mit identischem Host.';
+
+$lang['admin']['destination'] = 'Ziel';
+$lang['admin']['nexthop'] = 'Next Hop';
+
$lang['admin']['api_allow_from'] = "IP-Adressen fรผr Zugriff";
$lang['admin']['api_key'] = "API-Key";
$lang['admin']['activate_api'] = "API aktivieren";
@@ -521,17 +640,31 @@ $lang['admin']['unban_pending'] = "ausstehend";
$lang['admin']['queue_unban'] = "Unban einreihen";
$lang['admin']['no_active_bans'] = "Keine aktiven Bans";
+$lang['admin']['quota_notifications'] = "Quota Benachrichtigungen";
+$lang['admin']['quota_notifications_vars'] = "{{percent}} entspricht der aktuellen Quota in Prozent {{username}} entspricht dem Mailbox-Namen";
+$lang['admin']['rspamd_settings_map'] = "Rspamd Settings Map";
$lang['admin']['quarantine'] = "Quarantรคne";
-$lang['admin']['quarantine_retention_size'] = "Rรผckhaltungen pro Mailbox 0 bedeutet inaktiv!";
-$lang['admin']['quarantine_max_size'] = "Maximale Grรถรe in MiB (grรถรere Elemente werden verworfen) 0 bedeutet nicht unlimitert!";
-$lang['admin']['quarantine_exclude_domains'] = "Domains und Alias-Domains ausschlieรen:";
+$lang['admin']['active_rspamd_settings_map'] = "Derzeit aktive Settings Map";
+$lang['admin']['quota_notifications_info'] = "Quota Benachrichtigungen werden an Mailboxen versendet, die 80 respektive 95 Prozent der zur Verfรผgung stehenden Quota รผberschreiten.";
+$lang['admin']['quarantine_retention_size'] = "Rรผckhaltungen pro Mailbox: 0 bedeutet inaktiv.";
+$lang['admin']['quarantine_max_size'] = "Maximale Grรถรe in MiB (grรถรere Elemente werden verworfen): 0 bedeutet nicht unlimitert.";
+$lang['admin']['quarantine_exclude_domains'] = "Domains und Alias-Domains ausschlieรen";
+$lang['admin']['quarantine_notification_sender'] = "Benachrichtigungs-E-Mail Absender";
+$lang['admin']['quota_notification_sender'] = "Benachrichtigungs-E-Mail Absender";
+$lang['admin']['quarantine_notification_subject'] = "Benachrichtigungs-E-Mail Betreff";
+$lang['admin']['quota_notification_subject'] = "Benachrichtigungs-E-Mail Betreff";
+$lang['admin']['quarantine_notification_html'] = "Benachrichtigungs-E-Mail Inhalt: Leer lassen, um Standard-Template wiederherzustellen.";
+$lang['admin']['quota_notification_html'] = "Benachrichtigungs-E-Mail Inhalt: Leer lassen, um Standard-Template wiederherzustellen.";
+$lang['admin']['quarantine_release_format'] = "Format freigegebener Mails";
+$lang['admin']['quarantine_release_format_raw'] = "Unverรคndertes Original";
+$lang['admin']['quarantine_release_format_att'] = "Als Anhang";
$lang['success']['forwarding_host_removed'] = "Weiterleitungs-Host %s wurde entfernt";
$lang['success']['forwarding_host_added'] = "Weiterleitungs-Host %s wurde hinzugefรผgt";
-$lang['success']['relayhost_removed'] = "Relayhost %s wurde entfernt";
-$lang['success']['relayhost_added'] = "Relayhost %s wurde hinzugefรผgt";
+$lang['success']['relayhost_removed'] = "Mapeintrag %s wurde entfernt";
+$lang['success']['relayhost_added'] = "Mapeintrag %s wurde hinzugefรผgt";
$lang['diagnostics']['dns_records'] = 'DNS-Eintrรคge';
-$lang['diagnostics']['dns_records_24hours'] = 'Bitte beachten Sie, dass es bis zu 24 Stunden dauern kann, bis รnderungen an Ihren DNS-Eintrรคgen als aktueller Status auf dieser Seite dargestellt werden. Diese Seite ist nur als Hilfsmittel gedacht, um die korrekten Werte fรผr DNS-Eintrรคge zu anzuzeigen und zu รผberprรผfen, ob die Daten im DNS hinterlegt sind.';
+$lang['diagnostics']['dns_records_24hours'] = 'Bitte beachten Sie, dass es bis zu 24 Stunden dauern kann, bis รnderungen an Ihren DNS-Eintrรคgen als aktueller Status auf dieser Seite dargestellt werden. Diese Seite ist nur als Hilfsmittel gedacht, um die korrekten Werte fรผr DNS-Eintrรคge anzuzeigen und zu รผberprรผfen, ob die Daten im DNS hinterlegt sind.';
$lang['diagnostics']['dns_records_name'] = 'Name';
$lang['diagnostics']['dns_records_type'] = 'Typ';
$lang['diagnostics']['dns_records_data'] = 'Korrekte Daten';
@@ -543,6 +676,8 @@ $lang['admin']['relay_run'] = "Test durchfรผhren";
$lang['mailbox']['waiting'] = "Wartend";
$lang['mailbox']['status'] = "Status";
$lang['mailbox']['running'] = "In Ausfรผhrung";
+$lang['mailbox']['enable_x'] = "Aktiviere";
+$lang['mailbox']['disable_x'] = "Deaktiviere";
$lang['admin']['ui_texts'] = "UI Label und Texte";
$lang['admin']['help_text'] = "Hilfstext unter Login-Maske (HTML zulรคssig)";
@@ -563,10 +698,12 @@ $lang['admin']['reset_default'] = "Zurรผcksetzen auf Standard";
$lang['admin']['merged_vars_hint'] = 'Ausgegraute Reihen wurden aus der Datei vars.(local.)inc.php gelesen und kรถnnen hier nicht verรคndert werden.';
$lang['edit']['spam_score'] = "Einen benutzerdefiniterten Spam-Score festlegen";
+$lang['user']['spam_score_reset'] = "Auf Server-Standard zurรผcksetzen";
$lang['edit']['spam_policy'] = "Hinzufรผgen und Entfernen von Eintrรคgen in White- und Blacklists";
$lang['edit']['spam_alias'] = "Anpassen temporรคrer Alias-Adressen";
$lang['danger']['img_tmp_missing'] = "Grafik konnte nicht validiert werden: Erstellung temporรคrer Datei fehlgeschlagen";
+$lang['danger']['comment_too_long'] = "Kommentarfeld darf maximal 160 Zeichen enthalten";
$lang['danger']['img_invalid'] = "Grafik konnte nicht validiert werden";
$lang['danger']['invalid_mime_type'] = "Grafik konnte nicht validiert werden: Ungรผltiger MIME-Type";
$lang['success']['upload_success'] = "Datei wurde erfolgreich hochgeladen";
@@ -597,13 +734,16 @@ $lang['quarantine']['subj'] = "Betreff";
$lang['quarantine']['text_plain_content'] = "Inhalt (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Inhalt (html, konvertiert)";
$lang['quarantine']['atts'] = "Anhรคnge";
-$lang['danger']['fuzzy_learn_error'] = "Fuzzy Lernfehler: %s";
+$lang['quarantine']['low_danger'] = "Niedrige Gefahr";
+$lang['quarantine']['neutral_danger'] = "Neutral/ohne Bewertung";
+$lang['quarantine']['medium_danger'] = "Mittlere Gefahr";
+$lang['quarantine']['high_danger'] = "Hohe Gefahr";
+$lang['quarantine']['danger'] = "Gefahr";
+$lang['quarantine']['qhandler_success'] = "Aktion wurde an das System รผbergeben. Sie dรผrfen dieses Fenster nun schlieรen.";
+$lang['warning']['fuzzy_learn_error'] = "Fuzzy Lernfehler: %s";
$lang['danger']['spam_learn_error'] = "Spam Lernfehler: %s";
$lang['success']['qlearn_spam'] = "Nachricht ID %s wurde als Spam gelernt und gelรถscht";
-$lang['header']['quarantine'] = "Quarantรคne";
-$lang['header']['debug'] = "Debugging";
-
$lang['debug']['log_info'] = '
mailcow in-memory Logs werden in Redis Listen gespeichert, die maximale Anzahl der Eintrรคge pro Anwendung richtet sich nach LOG_LINES (%d).
In-memory Logs sind vergรคnglich und nicht zur stรคndigen Aufbewahrung bestimmt. Alle Anwendungen, die in-memory protokollieren, schreiben ebenso in den Docker Daemon.
Das in-memory Protokoll versteht sich als schnelle รbersicht zum Debugging eines Containers, fรผr komplexere Protokolle sollte der Docker Daemon konsultiert werden.
Druk nu op de knop van uw U2F-apparaat.";
-$lang['tfa']['waiting_usb_register'] = "In afwachting van USB-apparaat...
Voer uw wachtwoord hierboven in en bevestig de registratie van het U2F-apparaat door op de knop van het apparaat te drukken.";
-$lang['tfa']['scan_qr_code'] = "Scan de volgende QR-code met uw authenticatie-app:";
-$lang['tfa']['enter_qr_code'] = "Voer deze code in als uw apparaat geen QR-codes kan scannen:";
-$lang['tfa']['confirm_totp_token'] = "Bevestig de wijzigingen door de, door uw authenticatie-app gegenereerde code, in te voeren.";
+$lang['tfa']['waiting_usb_auth'] = "In afwachting van USB-apparaat...
Druk nu op de knop van je U2F-apparaat.";
+$lang['tfa']['waiting_usb_register'] = "In afwachting van USB-apparaat...
Voer je wachtwoord hierboven in en bevestig de registratie van het U2F-apparaat door op de knop van het apparaat te drukken.";
+$lang['tfa']['scan_qr_code'] = "Scan de volgende QR-code met je authenticatie-app:";
+$lang['tfa']['enter_qr_code'] = "Voer deze code in als je apparaat geen QR-codes kan scannen:";
+$lang['tfa']['confirm_totp_token'] = "Bevestig de wijzigingen door de, door je authenticatie-app gegenereerde code, in te voeren.";
$lang['admin']['rspamd-com_settings'] = 'Rspamd documentatie - Een beschrijving voor deze instelling zal automatisch worden gegenereerd, bekijk de onderstaande presets voor meer info.';
$lang['admin']['no_new_rows'] = 'Er zijn geen extra rijen beschikbaar';
+$lang['admin']['queue_manager'] = 'Wachtrijbeheerder';
$lang['admin']['additional_rows'] = ' extra rijen zijn toegevoegd'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Privรฉsleutel';
$lang['admin']['import'] = 'Importeer';
+$lang['admin']['duplicate'] = 'Dupliceer';
$lang['admin']['import_private_key'] = 'Importeer privรฉsleutel';
-$lang['admin']['f2b_parameters'] = 'Fail2ban parameters';
+$lang['admin']['duplicate_dkim'] = 'Dupliceer DKIM-sleutel';
+$lang['admin']['dkim_from'] = 'Van';
+$lang['admin']['dkim_to'] = 'Naar';
+$lang['admin']['dkim_from_title'] = 'Kopieer data van domein';
+$lang['admin']['dkim_to_title'] = 'Doeldomein(en) - worden overgeschreven';
+$lang['admin']['f2b_parameters'] = 'Fail2ban-instellingen';
$lang['admin']['f2b_ban_time'] = 'Verbanningstijd (s)';
-$lang['admin']['f2b_max_attempts'] = 'Max. pogingen';
-$lang['admin']['f2b_retry_window'] = 'Tijdsbestek voor max. pogingen (s)';
+$lang['admin']['f2b_max_attempts'] = 'Maximaal aantal pogingen';
+$lang['admin']['f2b_retry_window'] = 'Tijdsbestek voor maximale pogingen (s)';
$lang['admin']['f2b_netban_ipv4'] = 'Voer de IPv4-subnetgrootte in waar de verbanning van kracht moet zijn (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'Voer de IPv6-subnetgrootte in waar de verbanning van kracht moet zijn (8-128)';
$lang['admin']['f2b_whitelist'] = 'Netwerken/hosts op de witte lijst';
$lang['admin']['f2b_blacklist'] = 'Netwerken/hosts op de zwarte lijst';
-$lang['admin']['f2b_list_info'] = 'Een host of netwerk op de zwarte lijst heeft altijd hogere prioriteit dan eenzelfde op de witte lijst. Vermeldingen op de zwarte lijst worden aangemaakt bij het opstarten van de container, terwijl vermeldingen op de witte lijst elke keer vรณรณrdat een verbanning wordt toegepast worden gecheckt.';
-$lang['admin']['search_domain_da'] = 'Zoekdomeinen';
+$lang['admin']['f2b_list_info'] = 'Wees ervan bewust dat een host of netwerk op de zwarte lijst altijd hogere prioriteit heeft dan eenzelfde op de witte lijst.';
+$lang['admin']['search_domain_da'] = 'Zoek domeinen';
$lang['admin']['r_inactive'] = 'Inactieve beperkingen';
$lang['admin']['r_active'] = 'Actieve beperkingen';
$lang['admin']['r_info'] = 'Grijze elementen op de lijst van actieve beperkingen zijn niet geldig en kunnen niet worden verplaatst. Onbekende beperkingen zullen hoe dan ook in volgorde van weergave worden ingesteld. Er kunnen nieuwe elementen worden toegevoegd in inc/vars.local.inc.php om ze te kunnen gebruiken.';
@@ -455,8 +553,11 @@ $lang['admin']['dkim_key_length'] = 'DKIM-sleutelgrootte (bits)';
$lang['admin']['dkim_key_valid'] = 'Sleutel geldig';
$lang['admin']['dkim_key_unused'] = 'Sleutel ongebruikt';
$lang['admin']['dkim_key_missing'] = 'Sleutel ontbreekt';
-$lang['admin']['dkim_add_key'] = 'Voeg ARC/DKIM-sleutel toe';
-$lang['admin']['dkim_keys'] = 'ARC/DKIM-sleutels';
+$lang['admin']['dkim_add_key'] = 'Voeg DKIM-sleutel toe';
+$lang['admin']['dkim_keys'] = 'DKIM-sleutels';
+ $lang['admin']['dkim_private_key'] = 'Privรฉsleutel';
+$lang['admin']['dkim_domains_wo_keys'] = "Selecteer domeinen met ontbrekende sleutels";
+$lang['admin']['dkim_domains_selector'] = "Noemer";
$lang['admin']['add'] = 'Toevoegen';
$lang['add']['add_domain_restart'] = 'Voeg domein toe en herstart SOGo';
$lang['add']['add_domain_only'] = 'Voeg enkel domein toe';
@@ -467,52 +568,77 @@ $lang['admin']['active'] = 'Actief';
$lang['admin']['inactive'] = 'Inactief';
$lang['admin']['action'] = 'Handeling';
$lang['admin']['add_domain_admin'] = 'Voeg domeinbeheerder toe';
+$lang['admin']['add_admin'] = 'Voeg administrator toe';
$lang['admin']['add_settings_rule'] = 'Voeg regel toe';
$lang['admin']['rsetting_desc'] = 'Korte beschrijving';
$lang['admin']['rsetting_content'] = 'Regelinhoud';
$lang['admin']['rsetting_none'] = 'Geen regel beschikbaar';
$lang['admin']['rsetting_no_selection'] = 'Selecteer een regel';
-$lang['admin']['rsettings_preset_1'] = 'Zet alles uit voor geauthenticeerde gebruikers, behalve DKIM en ratelimiting';
+$lang['admin']['rsettings_preset_1'] = 'Schakel alles uit voor geauthenticeerde gebruikers, behalve DKIM en ratelimiting';
$lang['admin']['rsettings_preset_2'] = 'Postmeesters willen spam';
$lang['admin']['rsettings_insert_preset'] = 'Voeg voorbeeld "%s" in';
$lang['admin']['rsetting_add_rule'] = 'Voeg regel toe';
+$lang['admin']['queue_ays'] = 'Bevestig het verwijderen van alle onderdelen uit de wachtrij.';
+$lang['admin']['arrival_time'] = 'Aankomsttijd';
+$lang['admin']['message_size'] = 'Berichtgrootte';
+$lang['admin']['sender'] = 'Afzender';
+$lang['admin']['recipients'] = 'Ontvangers';
$lang['admin']['admin_domains'] = 'Domeintoewijzingen';
$lang['admin']['domain_admins'] = 'Domeinbeheerders';
+$lang['admin']['flush_queue'] = 'Leeg wachtrij';
+$lang['admin']['delete_queue'] = 'Verwijder alles';
+$lang['admin']['queue_deliver_mail'] = 'Lever af';
+$lang['admin']['queue_hold_mail'] = 'Houd vast';
+$lang['admin']['queue_unhold_mail'] = 'Geef vrij';
$lang['admin']['username'] = 'Gebruikersnaam';
$lang['admin']['edit'] = 'Wijzig';
$lang['admin']['remove'] = 'Verwijder';
$lang['admin']['save'] = 'Sla wijzigingen op';
-$lang['admin']['admin'] = 'Beheerder';
-$lang['admin']['admin_details'] = 'Wijzig beheerderdetails';
+$lang['admin']['admin'] = 'Administrator';
+$lang['admin']['admin_details'] = 'Toegangsinstellingen';
$lang['admin']['unchanged_if_empty'] = 'Laat leeg wanneer onveranderd';
-$lang['admin']['yes'] = '✔';
-$lang['admin']['no'] = '✘';
$lang['admin']['access'] = 'Toegang';
$lang['admin']['no_record'] = 'Geen vermelding';
$lang['admin']['filter_table'] = 'Filtertabel';
$lang['admin']['empty'] = 'Geen resultaten';
$lang['admin']['time'] = 'Tijd';
+$lang['admin']['last_applied'] = 'Voor het laatst toegepast';
+$lang['admin']['reset_limit'] = 'Verwijder hash';
+$lang['admin']['hash_remove_info'] = 'Het verwijderen van een ratelimit-hash, indien nog aanwezig, zal zijn teller volledig herstellen. Elke hash wordt aangeduid met een aparte kleur.';
+$lang['warning']['hash_not_found'] = 'Hash niet gevonden';
+$lang['success']['hash_deleted'] = 'Hash verwijderd';
+$lang['admin']['authed_user'] = 'Geauthenticeerde gebruiker';
$lang['admin']['priority'] = 'Prioriteit';
$lang['admin']['message'] = 'Bericht';
+$lang['admin']['rate_name'] = 'Rate-naam';
$lang['admin']['refresh'] = 'Ververs';
-$lang['admin']['to_top'] = 'Terug naar boven';
+$lang['admin']['to_top'] = 'Naar boven';
$lang['admin']['in_use_by'] = 'In gebruik door';
$lang['admin']['forwarding_hosts'] = 'Doorstuurhosts';
-$lang['admin']['forwarding_hosts_hint'] = 'Inkomende berichten worden onvoorwaardelijk geaccepteerd vanaf iedere host hieronder vermeld. Deze hosts worden vervolgens niet gecontroleerd op DNSBLs of onderworpen aan greylisting. Spam ontvangen van hen wordt nooit geweigerd, maar het kan optioneel in de spam-map worden geplaatst. Het meest gebruikelijke gebruik hiervoor is het specificeren van mailservers waarop een regel is ingesteld die inkomende e-mails doorstuurt naar uw Mailcow-server.';
-$lang['admin']['forwarding_hosts_add_hint'] = 'Het is mogelijk om IPv4- of IPv6-adressen, netwerken in CIDR-notatie, hostnamen (die worden omgezet naar IP-adressen) of domeinnamen (die worden omgezet naar IP-adressen door SPF-records op te vragen of, bij gebrek daaraan, MX-records) op te geven.';
-$lang['admin']['relayhosts_hint'] = 'Stel relayhosts hier in om ze te kunnen selecteren in een domeinconfiguratiedialoog.';
-$lang['admin']['add_relayhost_add_hint'] = 'Wees ervan bewust dat relayhost authenticatiedata onversleuteld moeten worden opgeslagen.';
+$lang['admin']['forwarding_hosts_hint'] = 'Inkomende berichten worden onvoorwaardelijk geaccepteerd vanaf iedere host hieronder vermeld. Deze hosts worden hierdoor niet gecontroleerd op DNSBLs, en zullen de greylisting omzeilen. Spam wordt daarentegen zoals gebruikelijk in de spamfolder geplaatst. Dit wordt vaak gebruikt om mailservers te specificeren die mails doorsturen naar deze Mailcow-server.';
+$lang['admin']['forwarding_hosts_add_hint'] = 'Het is mogelijk om IPv4- of IPv6-adressen, netwerken in CIDR-notatie, hostnames (worden omgezet naar IP-adressen) of domeinnamen (worden tevens omgezet naar IP-adressen of, bij gebrek daaraan, MX-records) op te geven.';
+$lang['admin']['relayhosts_hint'] = 'Stel afzender-afhankelijke transportkaarten in om deze te kunnen gebruiken bij de configuratie van een domein. De transportservice is altijd "smtp:". Er wordt rekening gehouden met het uitgaande versleutelingsbeleid van individuele gebruikers.';
+$lang['admin']['transports_hint'] = 'Een transportkaart wordt boven een afzender-afhankelijke transportkaart verkozen. Het uitgaande versleutelingsbeleid van individuele gebruikers wordt genegeerd en kan enkel worden gehandhaafd doormiddel van globaal versleutelingsbeleid. De transportservice is altijd "smtp:". Om de inloggegevens van een (voorbeeld) nexthop "[host]:25" te bepalen, zoekt Postfix altijd naar "nexthop" voodat er wordt gekeken naar "[nexthop]:25". Dit maakt het onmogelijk om "nexthop" en "[nexthop]:25" tegelijkertijd te gebruiken.';
+$lang['admin']['add_relayhost_hint'] = 'Wees ervan bewust dat de authenticatiedata onversleuteld wordt opgeslagen!';
+$lang['admin']['add_transports_hint'] = 'Wees ervan bewust dat de authenticatiedata onversleuteld wordt opgeslagen!';
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Bron';
$lang['admin']['add_forwarding_host'] = 'Voeg doorstuurhost toe';
-$lang['admin']['add_relayhost'] = 'Voeg relayhost toe';
+$lang['admin']['add_relayhost'] = 'Voeg afzender-afhankelijke transportkaart toe';
+$lang['admin']['add_transport'] = 'Voeg transportkaart toe';
+$lang['admin']['relayhosts'] = 'Afzender-afhankelijke transportkaarten';
+$lang['admin']['transport_maps'] = 'Transportkaarten';
+$lang['admin']['routing'] = 'Routing';
+$lang['admin']['credentials_transport_warning'] = 'Waarschuwing: Bij het toevoegen van een nieuwe transportkaart zullen de inloggegevens voor alle items met een overeenkomende nexthop-kolom worden overgeschreven.';
+
+$lang['admin']['destination'] = 'Bestemming';
+$lang['admin']['nexthop'] = 'Nexthop';
$lang['success']['forwarding_host_removed'] = "Doorstuurhost %s is verwijderd";
$lang['success']['forwarding_host_added'] = "Doorstuurhost %s is toegevoegd";
-$lang['success']['relayhost_removed'] = "Relayhost %s is verwijderd";
-$lang['success']['relayhost_added'] = "Relayhost %s is toegevoegd";
+$lang['success']['relayhost_removed'] = "Invoer %s is verwijderd";
+$lang['success']['relayhost_added'] = "Invoer %s is toegevoegd";
$lang['diagnostics']['dns_records'] = 'DNS-vermeldingen';
-$lang['diagnostics']['dns_records_24hours'] = 'Please note that changes made to DNS may take up to 24 hours to correctly have their current state reflected on this page. It is intended as a way for you to easily see how to configure your DNS records and to check whether all your records are correctly stored in DNS.';
-$lang['diagnostics']['dns_records_24hours'] = 'Houd er rekening mee dat veranderingen aan DNS tot wel 24 uur in beslag kunnen nemen voordat ze op deze pagina worden weergegeven. Het is bedoeld als een manier om gemakkelijk te zien hoe de DNS-vermeldingen zijn geconfigureerd en om te controleren of alle records correct zijn opgeslagen in DNS.';
+$lang['diagnostics']['dns_records_24hours'] = 'Houd er rekening mee dat veranderingen aan DNS tot wel 24 uur in beslag kunnen nemen voordat ze op deze pagina worden weergegeven. Deze informatie is bedoeld om gemakkelijk in te zien of de DNS-vermeldingen correct zijn geconfigureerd.';
$lang['diagnostics']['dns_records_name'] = 'Naam';
$lang['diagnostics']['dns_records_type'] = 'Type';
$lang['diagnostics']['dns_records_data'] = 'Correcte gegevens';
@@ -526,27 +652,40 @@ $lang['admin']['api_allow_from'] = "Sta API-toegang toe vanaf deze IP-adressen";
$lang['admin']['api_key'] = "API-sleutel";
$lang['admin']['activate_api'] = "Activeer API";
$lang['admin']['regen_api_key'] = "Vernieuw API-sleutel";
-$lang['admin']['ban_list_info'] = "Bekijk een lijst met verbannen IP-adressen hieronder: netwerk (resterende tijd) - [actions]. IP-adressen gemarkeerd om te worden toegestaan, zullen worden verwijderd van de verbanningslijst binnen enkele seconden. Rode labels geven een permanente verbanning aan.";
+$lang['admin']['ban_list_info'] = "Bekijk de lijst met verbannen IP-adressen hieronder: netwerk (resterende tijd) - [acties]. Rode labels geven een permanente verbanning aan. Het kan enkele seconden duren voordat wijzigingen hieronder zichtbaar zijn.";
$lang['admin']['unban_pending'] = "bezig met toestaan";
$lang['admin']['queue_unban'] = "markeer om toe te staan";
$lang['admin']['no_active_bans'] = "Geen actieve verbanningen";
$lang['admin']['quarantine'] = "Quarantaine";
-$lang['admin']['quarantine_retention_size'] = "Retenties per postvak 0 betekent inactief!";
-$lang['admin']['quarantine_max_size'] = "Max. grootte in MiB (grotere elementen worden verwijderd) 0 betekent niet onbeperkt!";
-$lang['admin']['quarantine_exclude_domains'] = "Sluit domeinen en aliasdomeinen uit:";
-
-$lang['admin']['ui_texts'] = "UI-labels en teksten";
+$lang['admin']['rspamd_settings_map'] = "Rspamd-instellingen";
+$lang['admin']['quota_notifications'] = "Quotum-notificaties";
+$lang['admin']['quota_notifications_vars'] = "{{percent}} toont het huidige quotum van van de gebruiker {{username}} staat voor de naam van het desbetreffende postvak";
+$lang['admin']['active_rspamd_settings_map'] = "Huidige instellingen";
+$lang['admin']['quota_notifications_info'] = "Quotum-notificaties worden verstuurd naar gebruikers wanneer deze 80% of 95% van hun opslagcapaciteit overschreden hebben.";
+$lang['admin']['quarantine_retention_size'] = "Maximale retenties per postvak: Gebruik 0 om deze functionaliteit uit te schakelen.";
+$lang['admin']['quarantine_max_size'] = "Maximale grootte in MiB (mail die de limiet overschrijdt zal worden verwijderd): 0 betekent niet onbeperkt!";
+$lang['admin']['quarantine_exclude_domains'] = "Sluit de volgende domeinen en aliasdomeinen uit";
+$lang['admin']['quarantine_release_format'] = "Verstuur vrijgegeven items als";
+$lang['admin']['quarantine_release_format_raw'] = "Origineel";
+$lang['admin']['quarantine_release_format_att'] = "Bijlage";
+$lang['admin']['quarantine_notification_sender'] = "Afzender van notificaties";
+$lang['admin']['quarantine_notification_subject'] = "Onderwerp van notificaties";
+$lang['admin']['quarantine_notification_html'] = "Notificatiesjabloon: Laat leeg om de standaardsjabloon te herstellen.";
+$lang['admin']['quota_notification_sender'] = "Afzender van notificaties";
+$lang['admin']['quota_notification_subject'] = "Onderwerp van notificaties";
+$lang['admin']['quota_notification_html'] = "Notificatiesjabloon: Laat leeg om de standaardsjabloon te herstellen.";
+$lang['admin']['ui_texts'] = "Labels en teksten";
$lang['admin']['help_text'] = "Pas hulpteksten onder inlogvenster aan (HTML toegestaan)";
-$lang['admin']['title_name'] = '"Mailcow UI" website-titel';
-$lang['admin']['main_name'] = '"Mailcow UI" naam';
-$lang['admin']['apps_name'] = '"Mailcow Apps" naam';
+$lang['admin']['title_name'] = '"Mailcow" (website-titel)';
+$lang['admin']['main_name'] = '"Mailcow"';
+$lang['admin']['apps_name'] = '"Mailcow-apps"';
-$lang['admin']['customize'] = "Uiterlijk aanpassen";
-$lang['admin']['change_logo'] = "Verander logo";
-$lang['admin']['logo_info'] = "Het plaatje zal worden geschaald naar een hoogte van 40px voor de navigatiebar en een breedte van 250px voor de startpagina.";
+$lang['admin']['customize'] = "Uiterlijk";
+$lang['admin']['change_logo'] = "Logo";
+$lang['admin']['logo_info'] = "De afbeelding zal worden geschaald naar een hoogte van 40px voor de navigatiebar, en naar een breedte van 250px voor de startpagina.";
$lang['admin']['upload'] = "Upload";
-$lang['admin']['app_links'] = "App links";
+$lang['admin']['app_links'] = "Applicatielinks";
$lang['admin']['app_name'] = "Naam";
$lang['admin']['link'] = "Link";
$lang['admin']['remove_row'] = "Verwijder rij";
@@ -556,11 +695,15 @@ $lang['admin']['merged_vars_hint'] = 'Grijze rijen zijn samengevoegd van v
$lang['mailbox']['waiting'] = "Wachten";
$lang['mailbox']['status'] = "Status";
$lang['mailbox']['running'] = "Wordt uitgevoerd";
+$lang['mailbox']['enable_x'] = "Schakel in";
+$lang['mailbox']['disable_x'] = "Schakel uit";
$lang['edit']['spam_score'] = "Stel een aangepaste spamscore in";
+$lang['user']['spam_score_reset'] = "Herstel naar standaardwaarde";
$lang['edit']['spam_policy'] = "Voeg onderdelen toe, of verwijder onderdelen van de witte en zwarte lijst";
$lang['edit']['spam_alias'] = "Maak een nieuw tijdelijk alias aan, of pas deze aan";
+$lang['danger']['comment_too_long'] = "Opmerkingen mogen niet langer dan 160 karakters zijn";
$lang['danger']['img_tmp_missing'] = "Kan afbeelding niet valideren, tijdelijk bestand niet gevonden";
$lang['danger']['img_invalid'] = "Kan afbeelding niet valideren";
$lang['danger']['invalid_mime_type'] = "Ongeldig mime-type";
@@ -571,11 +714,10 @@ $lang['success']['reset_main_logo'] = "Het standaardlogo is hersteld";
$lang['success']['items_released'] = "Geselecteerde onderdelen zijn vrijgegeven";
$lang['success']['item_released'] = "Onderdeel %s vrijgegeven";
$lang['danger']['imagick_exception'] = "Error: Er is een probleem opgetreden met Imagick tijdens het lezen van de afbeelding";
-
$lang['quarantine']['quarantine'] = "Quarantaine";
$lang['quarantine']['learn_spam_delete'] = "Onthoud als spam en verwijder";
-$lang['quarantine']['qinfo'] = 'Het quarantainesysteem slaat geweigerde e-mail op, terwijl het voor de afzender als niet ontvangen bestempeld is. "' . $lang['quarantine']['learn_spam_delete'] . '" traint het systeem om toekomstige soortgelijke e-mails direct als spam te classificeren. Wees er van bewust dat wanneer er meerdere berichten worden onderzocht, dit mogelijk enige tijd kan duren.';
-$lang['quarantine']['release'] = "Vrijgeven";
+$lang['quarantine']['qinfo'] = 'Het quarantainesysteem slaat geweigerde e-mail op, terwijl het voor de afzender lijkt alsof deze niet ontvangen is. "' . $lang['quarantine']['learn_spam_delete'] . '" traint het systeem om soortgelijke e-mails in de toekomst weer als spam te markeren. Wees er van bewust dat wanneer er meerdere berichten worden onderzocht, dit mogelijk enige tijd kan duren.';
+$lang['quarantine']['release'] = "Geef vrij";
$lang['quarantine']['empty'] = 'Geen resultaten';
$lang['quarantine']['toggle_all'] = 'Selecteer alles';
$lang['quarantine']['quick_actions'] = 'Handelingen';
@@ -592,20 +734,38 @@ $lang['quarantine']['subj'] = "Onderwerp";
$lang['quarantine']['text_plain_content'] = "Inhoud (tekst)";
$lang['quarantine']['text_from_html_content'] = "Inhoud (geconverteerde html)";
$lang['quarantine']['atts'] = "Bijlagen";
-$lang['danger']['fuzzy_learn_error'] = "Fuzzy hash training-fout: %s";
+$lang['quarantine']['low_danger'] = "Laag risico";
+$lang['quarantine']['neutral_danger'] = "Neutraal/geen beoordeling";
+$lang['quarantine']['medium_danger'] = "Middelmatig risico";
+$lang['quarantine']['high_danger'] = "Hoog risico";
+$lang['quarantine']['danger'] = "Risico";
+$lang['quarantine']['confirm_delete'] = "Bevestig de verwijdering van dit item.";
+$lang['quarantine']['qhandler_success'] = "Verzoek met succes verzonden naar het systeem. Je kunt het venster nu veilig sluiten.";
+
+$lang['warning']['fuzzy_learn_error'] = "Fuzzy hash training-fout: %s";
$lang['danger']['spam_learn_error'] = "Spamtraining-fout: %s";
-$lang['success']['qlearn_spam'] = "Bericht %s werd als spam geclassificeerd en is verwijderd";
+$lang['success']['qlearn_spam'] = "Bericht %s werd als spam gemarkeerd en is verwijderd";
-$lang['header']['quarantine'] = "Quarantaine";
-$lang['header']['debug'] = "Debug";
-
-$lang['debug']['log_info'] = '
Mailcow in-geheugen logs worden verzameld in Redis-lijsten en worden elke minuut bijgesneden naar LOG_LINES (%d) om de stabiliteit te garanderen. Logs in-geheugen zijn niet bedoeld om te blijven staan. Alle applicaties die in-geheugen loggen, worden ook naar het Docker-proces gelogd. De in-geheugen logs zouden gebruikt moeten worden voor het oplossen van kleine problemen met containers.
Externe logs worden verzameld doormiddel van de API van de applicaties.
Statische logs zijn over het algemeen activiteitenlogs, die niet naar het Docker-proces worden gestuurd
';
+$lang['debug']['system_containers'] = 'Systeem & containers';
+$lang['debug']['solr_status'] = 'Status van Solr';
+$lang['debug']['solr_dead'] = 'Solr is uitgeschakeld, uitgevallen of nog bezig met opstarten.';
+$lang['debug']['logs'] = 'Logs';
+$lang['debug']['log_info'] = '
Mailcows geheugenlogs worden elke minuut afgesneden naar maximaal %d regels om de stabiliteit te garanderen. Geheugenlogs zijn niet bedoeld om opgeslagen te worden. Alle applicaties die geheugenlogs verzamelen, worden ook naar het Docker-proces gelogd. De geheugenlogs kunnen gebruikt worden voor het oplossen van kleine problemen met specifieke containers.
Externe logs worden verzameld doormiddel van de API van deze applicaties.
Statische logs zijn activiteitenlogs. Deze worden niet naar het Docker-proces gestuurd.
';
-$lang['debug']['in_memory_logs'] = 'Logs in-geheugen';
+$lang['debug']['in_memory_logs'] = 'Geheugenlogs';
$lang['debug']['external_logs'] = 'Externe logs';
$lang['debug']['static_logs'] = 'Statische logs';
+$lang['debug']['solr_uptime'] = 'Uptime';
+$lang['debug']['solr_started_at'] = 'Opgestart op';
+$lang['debug']['solr_last_modified'] = 'Voor het laatst bijgewerkt op';
+$lang['debug']['solr_size'] = 'Grootte';
+$lang['debug']['solr_docs'] = 'Documenten';
-$lang['quarantine']['release_body'] = "We hebben het oorspronkelijke bericht als eml-bestand meegestuurd.";
+$lang['debug']['disk_usage'] = 'Schijfgebruik';
+$lang['debug']['containers_info'] = "Containerinformatie";
+$lang['debug']['restart_container'] = 'Herstart';
+
+$lang['quarantine']['release_body'] = "We hebben het oorspronkelijke bericht als los bestand meegestuurd. Klik erop om deze weer te geven.";
$lang['danger']['release_send_failed'] = "Het volgende bericht kon niet worden vrijgegeven: %s";
$lang['quarantine']['release_subject'] = "Mogelijk schadelijk quarantaine-item %s";
@@ -624,8 +784,9 @@ $lang['mailbox']['bcc_maps'] = "BCC-kaarten";
$lang['mailbox']['bcc_to_sender'] = "Schakel over naar afzenderkaarten";
$lang['mailbox']['bcc_to_rcpt'] = "Schakel over naar ontvangerkaarten";
$lang['mailbox']['add_bcc_entry'] = "Voeg BCC-kaart toe";
-$lang['mailbox']['bcc_info'] = "BCC-kaarten worden gebruikt om kopieรซn van alle berichten naar een ander adres door te sturen. Een ontvangerkaart wordt gebruikt zodra de lokale bestemming fungeert als ontvanger van een mail. Afzenderkaarten werken conform het zelfde principe. De lokale bestemming zal niet worden geรฏnformeerd bij een mislukte aflevering.";
-$lang['mailbox']['address_rewriting'] = 'Adres omleiden';
+$lang['mailbox']['add_tls_policy_map'] = "Voeg versleutelingsbeleid toe";
+$lang['mailbox']['bcc_info'] = "BCC-kaarten worden gebruikt om kopieรซn van alle berichten naar een ander adres door te sturen. Wees er van bewust dat er geen melding wordt gedaan van een mislukte aflevering.";
+$lang['mailbox']['address_rewriting'] = 'Adresomleidingen';
$lang['mailbox']['recipient_maps'] = 'Ontvangerkaarten';
$lang['mailbox']['recipient_map'] = 'Ontvangerkaart';
$lang['mailbox']['recipient_map_info'] = 'Ontvangerkaarten worden gebruikt om het doeladres van een bericht te vervangen voordat het in een postvak terecht komt.';
@@ -635,10 +796,14 @@ $lang['mailbox']['recipient_map_old'] = 'Oorspronkelijke ontvanger';
$lang['mailbox']['recipient_map_new'] = 'Nieuwe ontvanger';
$lang['danger']['invalid_recipient_map_new'] = 'Ongeldige nieuwe ontvanger ingevoerd: %s';
$lang['danger']['invalid_recipient_map_old'] = 'Ongeldige oorspronkelijke ontvanger ingevoerd: %s';
-$lang['danger']['recipient_map_entry_exists'] = 'Een ontvangerkaart voor %s bestaat al';
-$lang['success']['recipient_map_entry_saved'] = 'Ontvangerkaart voor %s is opgeslagen';
-$lang['success']['recipient_map_entry_deleted'] = 'Ontvangerkaart voor %s is verwijderd';
+$lang['danger']['recipient_map_entry_exists'] = 'Ontvangerkaart met "%s" bestaat reeds';
+$lang['success']['recipient_map_entry_saved'] = 'Ontvangerkaart %s is opgeslagen';
+$lang['success']['recipient_map_entry_deleted'] = 'Ontvangerkaart %s is verwijderd';
+$lang['danger']['tls_policy_map_entry_exists'] = 'Versleutelingsbeleid met "%s" bestaat reeds';
+$lang['success']['tls_policy_map_entry_saved'] = 'Versleutelingsbeleid "%s" is opgeslagen';
+$lang['success']['tls_policy_map_entry_deleted'] = 'Versleutelingsbeleid %s is verwijderd';
$lang['mailbox']['add_recipient_map_entry'] = 'Voeg ontvangerkaart toe';
+$lang['danger']['tls_policy_map_parameter_invalid'] = "Beleidsparameter is ongeldig";
$lang['oauth2']['scope_ask_permission'] = 'Een applicatie heeft toegang tot de volgende onderdelen gevraagd';
$lang['oauth2']['profile'] = 'Profiel';
@@ -647,3 +812,20 @@ $lang['oauth2']['permit'] = 'Authoriseer applicatie';
$lang['oauth2']['authorize_app'] = 'Authoriseer applicatie';
$lang['oauth2']['deny'] = 'Weiger';
$lang['oauth2']['access_denied'] = 'Log in als een postvakeigenaar om OAuth-toegang te verlenen';
+
+$lang['admin']['sys_mails'] = 'Systeemmails';
+$lang['admin']['subject'] = 'Onderwerp';
+$lang['admin']['from'] = 'Afzender';
+$lang['admin']['include_exclude'] = 'Ontvangers';
+$lang['admin']['include_exclude_info'] = 'Zonder selectie worden alle postvakken benaderd!';
+$lang['admin']['excludes'] = 'Exclusief';
+$lang['admin']['includes'] = 'Inclusief';
+$lang['admin']['text'] = 'Tekst';
+$lang['admin']['activate_send'] = 'Bevestig bovenstaande gegevens';
+$lang['admin']['send'] = 'Verstuur';
+
+$lang['warning']['ip_invalid'] = 'Ongeldig IP overgeslagen: %s';
+$lang['danger']['text_empty'] = 'De tekst dient ingevuld te worden';
+$lang['danger']['subject_empty'] = 'Het onderwerp dient ingevuld te worden';
+$lang['danger']['from_invalid'] = 'De afzender dient ingevuld te worden';
+$lang['danger']['network_host_invalid'] = 'Ongeldig netwerk of host: %s';
diff --git a/data/web/lang/lang.pl.php b/data/web/lang/lang.pl.php
index adc4edab..140b0c32 100644
--- a/data/web/lang/lang.pl.php
+++ b/data/web/lang/lang.pl.php
@@ -193,8 +193,6 @@ $lang['mailbox']['target_address'] = 'Adres Idลบ do';
$lang['mailbox']['username'] = 'Nazwa uลผytkownika';
$lang['mailbox']['fname'] = 'Peลna nazwa';
$lang['mailbox']['filter_table'] = 'Tabela filtru';
-$lang['mailbox']['yes'] = '✔';
-$lang['mailbox']['no'] = '✘';
$lang['mailbox']['in_use'] = 'W uลผyciu (%)';
$lang['mailbox']['msg_num'] = 'Wiadomoลฤ #';
$lang['mailbox']['remove'] = 'Usuล';
@@ -360,8 +358,6 @@ $lang['admin']['save'] = 'Zapisz zmiany';
$lang['admin']['admin'] = 'Administrator';
$lang['admin']['admin_details'] = 'Edytuj szczegรณลy administratora';
$lang['admin']['unchanged_if_empty'] = 'W przypadku braku zmian, nie wypeลniaj';
-$lang['admin']['yes'] = '✔';
-$lang['admin']['no'] = '✘';
$lang['admin']['access'] = 'Dostฤp';
$lang['admin']['no_record'] = 'Brak rekordu';
$lang['admin']['filter_table'] = 'Tabela filtru';
diff --git a/data/web/lang/lang.pt.php b/data/web/lang/lang.pt.php
index 13a86300..d6fc8649 100644
--- a/data/web/lang/lang.pt.php
+++ b/data/web/lang/lang.pt.php
@@ -140,8 +140,6 @@ $lang['mailbox']['target_address'] = 'Encaminhar para';
$lang['mailbox']['username'] = 'Usuรกrio';
$lang['mailbox']['fname'] = 'Nome';
$lang['mailbox']['filter_table'] = 'Procurar';
-$lang['mailbox']['yes'] = '✔';
-$lang['mailbox']['no'] = '✘';
$lang['mailbox']['in_use'] = 'Em uso (%)';
$lang['mailbox']['msg_num'] = 'Mensagens';
$lang['mailbox']['remove'] = 'Remover';
@@ -239,7 +237,5 @@ $lang['admin']['save'] = 'Salvar';
$lang['admin']['admin'] = 'Administrador';
$lang['admin']['admin_details'] = 'Editar informaรงรตes do administrator';
$lang['admin']['unchanged_if_empty'] = 'Deixar em branco para nรฃo alterar';
-$lang['admin']['yes'] = '✔';
-$lang['admin']['no'] = '✘';
$lang['admin']['access'] = 'Acessos';
$lang['admin']['no_record'] = 'Nenhum registro';
diff --git a/data/web/lang/lang.ru.php b/data/web/lang/lang.ru.php
index fa2074f6..10a2b30c 100644
--- a/data/web/lang/lang.ru.php
+++ b/data/web/lang/lang.ru.php
@@ -189,8 +189,6 @@ $lang['mailbox']['target_address'] = 'ะัะฝะพะฒะฝะพะน ะฐะดัะตั';
$lang['mailbox']['username'] = 'ะะผั ะฟะพะปัะทะพะฒะฐัะตะปั';
$lang['mailbox']['fname'] = 'ะะพะปะฝะพะต ะธะผั';
$lang['mailbox']['filter_table'] = 'ะะพะธัะบ';
-$lang['mailbox']['yes'] = '✔';
-$lang['mailbox']['no'] = '✘';
$lang['mailbox']['in_use'] = 'ะัะฟะพะปัะทะพะฒะฐะฝะพ (%)';
$lang['mailbox']['msg_num'] = 'ะะธััะผะฐ #';
$lang['mailbox']['remove'] = 'ะฃะดะฐะปะธัั';
@@ -359,8 +357,6 @@ $lang['admin']['save'] = 'ะกะพั ัะฐะฝะธัั ะธะทะผะตะฝะตะฝะธั';
$lang['admin']['admin'] = 'ะะดะผะธะฝะธัััะฐัะพั';
$lang['admin']['admin_details'] = 'ะะทะผะตะฝะธัั ะดะฐะฝะฝัะต ะฐะดะผะธะฝะธัััะฐัะพัะฐ';
$lang['admin']['unchanged_if_empty'] = 'ะัะปะธ ะฑะตะท ะธะทะผะตะฝะตะฝะธะน ะพััะฐะฒััะต ะฟััััะผ';
-$lang['admin']['yes'] = '✔';
-$lang['admin']['no'] = '✘';
$lang['admin']['access'] = 'ะะพัััะฟ ะบ';
$lang['admin']['no_record'] = 'ะะตั ะทะฐะฟะธัะตะน';
$lang['admin']['filter_table'] = 'ะะพะธัะบ';
diff --git a/data/web/mailbox.php b/data/web/mailbox.php
index e236a8af..392e9adf 100644
--- a/data/web/mailbox.php
+++ b/data/web/mailbox.php
@@ -1,8 +1,8 @@