From 9f10324729ab14702867576d61c7aa23bd02f0bb Mon Sep 17 00:00:00 2001 From: ludeeus Date: Tue, 4 Sep 2018 22:12:01 +0200 Subject: [PATCH] initial commit --- .editorconfig | 19 + .github/CODEOWNERS | 4 + .github/ISSUE_TEMPLATE.md | 20 + .github/PULL_REQUEST_TEMPLATE.md | 9 + .github/autolabeler.yml | 2 + .github/config.yml | 50 + .github/invite-contributors.yml | 10 + .github/lock.yml | 20 + .github/move.yml | 20 + .github/no-response.yml | 13 + .github/potential-duplicates.yml | 14 + .github/settings.yml | 150 + .github/stale.yml | 61 + .github/support.yml | 22 + .gitignore | 0 .gitlab-ci.yml | 428 ++ .mdlrc | 1 + .yamllint | 66 + CODE_OF_CONDUCT.md | 74 + CONTRIBUTING.md | 29 + LICENSE.md | 21 + README.md | 345 + images/image.png | Bin 0 -> 45382 bytes mqtt/.README.j2 | 70 + mqtt/Dockerfile | 45 + mqtt/build.json | 9 + mqtt/config.json | 73 + mqtt/icon.png | Bin 0 -> 5999 bytes mqtt/logo.png | Bin 0 -> 13169 bytes mqtt/rootfs/app/assets/arrow_down.png | Bin 0 -> 268 bytes mqtt/rootfs/app/assets/arrow_up.png | Bin 0 -> 271 bytes mqtt/rootfs/app/assets/jquery.minicolors.png | Bin 0 -> 77459 bytes mqtt/rootfs/app/assets/logo.png | Bin 0 -> 5386 bytes mqtt/rootfs/app/css/foundation.css | 6442 +++++++++++++++++ mqtt/rootfs/app/css/foundation.min.css | 5853 +++++++++++++++ mqtt/rootfs/app/css/jquery.minicolors.css | 245 + mqtt/rootfs/app/css/normalize.css | 402 + mqtt/rootfs/app/css/style.css | 325 + mqtt/rootfs/app/fancybox/blank.gif | Bin 0 -> 43 bytes mqtt/rootfs/app/fancybox/fancy_close.png | Bin 0 -> 1517 bytes mqtt/rootfs/app/fancybox/fancy_loading.png | Bin 0 -> 10195 bytes mqtt/rootfs/app/fancybox/fancy_nav_left.png | Bin 0 -> 1446 bytes mqtt/rootfs/app/fancybox/fancy_nav_right.png | Bin 0 -> 1454 bytes mqtt/rootfs/app/fancybox/fancy_shadow_e.png | Bin 0 -> 107 bytes mqtt/rootfs/app/fancybox/fancy_shadow_n.png | Bin 0 -> 106 bytes mqtt/rootfs/app/fancybox/fancy_shadow_ne.png | Bin 0 -> 347 bytes mqtt/rootfs/app/fancybox/fancy_shadow_nw.png | Bin 0 -> 324 bytes mqtt/rootfs/app/fancybox/fancy_shadow_s.png | Bin 0 -> 111 bytes mqtt/rootfs/app/fancybox/fancy_shadow_se.png | Bin 0 -> 352 bytes mqtt/rootfs/app/fancybox/fancy_shadow_sw.png | Bin 0 -> 340 bytes mqtt/rootfs/app/fancybox/fancy_shadow_w.png | Bin 0 -> 103 bytes mqtt/rootfs/app/fancybox/fancy_title_left.png | Bin 0 -> 503 bytes mqtt/rootfs/app/fancybox/fancy_title_main.png | Bin 0 -> 96 bytes mqtt/rootfs/app/fancybox/fancy_title_over.png | Bin 0 -> 70 bytes .../rootfs/app/fancybox/fancy_title_right.png | Bin 0 -> 506 bytes mqtt/rootfs/app/fancybox/fancybox-x.png | Bin 0 -> 203 bytes mqtt/rootfs/app/fancybox/fancybox-y.png | Bin 0 -> 176 bytes mqtt/rootfs/app/fancybox/fancybox.png | Bin 0 -> 15287 bytes mqtt/rootfs/app/index.html | 334 + mqtt/rootfs/app/js/app.js | 342 + mqtt/rootfs/app/js/arrow.gif | Bin 0 -> 66 bytes mqtt/rootfs/app/js/cross.gif | Bin 0 -> 83 bytes mqtt/rootfs/app/js/encoder.js | 243 + mqtt/rootfs/app/js/hs.png | Bin 0 -> 2684 bytes mqtt/rootfs/app/js/hv.png | Bin 0 -> 2865 bytes mqtt/rootfs/app/js/jquery.minicolors.min.js | 8 + mqtt/rootfs/app/js/mqttws31.js | 1958 +++++ mqtt/rootfs/etc/apk/repositories | 4 + .../rootfs/etc/cont-init.d/10-requirements.sh | 82 + mqtt/rootfs/etc/cont-init.d/20-mqtt_broker.sh | 73 + mqtt/rootfs/etc/cont-init.d/20-mqtt_web.sh | 28 + mqtt/rootfs/etc/cont-init.d/40-nginx.sh | 32 + mqtt/rootfs/etc/nginx/.htpasswd | 0 mqtt/rootfs/etc/nginx/nginx-ssl.conf | 32 + mqtt/rootfs/etc/nginx/nginx.conf | 21 + mqtt/rootfs/etc/services.d/mosquitto/finish | 9 + mqtt/rootfs/etc/services.d/mosquitto/run | 10 + mqtt/rootfs/etc/services.d/nginx/finish | 9 + mqtt/rootfs/etc/services.d/nginx/run | 10 + 79 files changed, 18037 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/autolabeler.yml create mode 100644 .github/config.yml create mode 100644 .github/invite-contributors.yml create mode 100644 .github/lock.yml create mode 100644 .github/move.yml create mode 100644 .github/no-response.yml create mode 100644 .github/potential-duplicates.yml create mode 100644 .github/settings.yml create mode 100644 .github/stale.yml create mode 100644 .github/support.yml create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .mdlrc create mode 100644 .yamllint create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 images/image.png create mode 100644 mqtt/.README.j2 create mode 100644 mqtt/Dockerfile create mode 100644 mqtt/build.json create mode 100644 mqtt/config.json create mode 100644 mqtt/icon.png create mode 100644 mqtt/logo.png create mode 100644 mqtt/rootfs/app/assets/arrow_down.png create mode 100644 mqtt/rootfs/app/assets/arrow_up.png create mode 100644 mqtt/rootfs/app/assets/jquery.minicolors.png create mode 100644 mqtt/rootfs/app/assets/logo.png create mode 100644 mqtt/rootfs/app/css/foundation.css create mode 100644 mqtt/rootfs/app/css/foundation.min.css create mode 100644 mqtt/rootfs/app/css/jquery.minicolors.css create mode 100644 mqtt/rootfs/app/css/normalize.css create mode 100644 mqtt/rootfs/app/css/style.css create mode 100644 mqtt/rootfs/app/fancybox/blank.gif create mode 100644 mqtt/rootfs/app/fancybox/fancy_close.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_loading.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_nav_left.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_nav_right.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_e.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_n.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_ne.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_nw.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_s.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_se.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_sw.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_shadow_w.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_title_left.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_title_main.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_title_over.png create mode 100644 mqtt/rootfs/app/fancybox/fancy_title_right.png create mode 100644 mqtt/rootfs/app/fancybox/fancybox-x.png create mode 100644 mqtt/rootfs/app/fancybox/fancybox-y.png create mode 100644 mqtt/rootfs/app/fancybox/fancybox.png create mode 100644 mqtt/rootfs/app/index.html create mode 100644 mqtt/rootfs/app/js/app.js create mode 100644 mqtt/rootfs/app/js/arrow.gif create mode 100644 mqtt/rootfs/app/js/cross.gif create mode 100644 mqtt/rootfs/app/js/encoder.js create mode 100644 mqtt/rootfs/app/js/hs.png create mode 100644 mqtt/rootfs/app/js/hv.png create mode 100644 mqtt/rootfs/app/js/jquery.minicolors.min.js create mode 100644 mqtt/rootfs/app/js/mqttws31.js create mode 100644 mqtt/rootfs/etc/apk/repositories create mode 100644 mqtt/rootfs/etc/cont-init.d/10-requirements.sh create mode 100644 mqtt/rootfs/etc/cont-init.d/20-mqtt_broker.sh create mode 100644 mqtt/rootfs/etc/cont-init.d/20-mqtt_web.sh create mode 100644 mqtt/rootfs/etc/cont-init.d/40-nginx.sh create mode 100644 mqtt/rootfs/etc/nginx/.htpasswd create mode 100644 mqtt/rootfs/etc/nginx/nginx-ssl.conf create mode 100644 mqtt/rootfs/etc/nginx/nginx.conf create mode 100644 mqtt/rootfs/etc/services.d/mosquitto/finish create mode 100644 mqtt/rootfs/etc/services.d/mosquitto/run create mode 100644 mqtt/rootfs/etc/services.d/nginx/finish create mode 100644 mqtt/rootfs/etc/services.d/nginx/run diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7a12570 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +ident_size = 4 + +[*.md] +ident_size = 2 +trim_trailing_whitespace = false + +[*.json] +ident_size = 2 + +[{.gitignore,.gitkeep,.editorconfig}] +ident_size = 2 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..3fbad49 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,4 @@ +# Require maintainer's :+1: for changes to the .github/ repo-config files +# mainly due to https://github.com/probot/settings privilege escalation +.github/* @frenck +.gitlab-ci.yml @frenck diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..544da8f --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ +# Problem/Motivation + +> (Why the issue was filed) + +## Expected behavior + +> (What you expected to happen) + +## Actual behavior + +> (What actually happened) + +## Steps to reproduce + +> (How can someone else make/see it happen) + +## Proposed changes + +> (If you have a proposed change, workaround or fix, +> describe the rationale behind it) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..cbd529a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +# Proposed Changes + +> (Describe the changes and rationale behind them) + +## Related Issues + +> ([Github link][autolink-references] to related issues or pull requests) + +[autolink-references]: https://help.github.com/articles/autolinked-references-and-urls/ \ No newline at end of file diff --git a/.github/autolabeler.yml b/.github/autolabeler.yml new file mode 100644 index 0000000..3ce5703 --- /dev/null +++ b/.github/autolabeler.yml @@ -0,0 +1,2 @@ +--- +"Type: Documentation": ["*.md", "*.j2"] diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 0000000..71d2f6d --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,50 @@ +--- +# Configuration for request-info - https://github.com/behaviorbot/request-info + +# *OPTIONAL* Comment to reply with +# Can be either a string : +requestInfoReplyComment: + - "We would appreciate it if you could provide us with more info about this issue/pr!" + - "Hmmm... That issue/PR is kinda low on text. Could you please provide some more content?" + +# *OPTIONAL* default titles to check against for lack of descriptiveness +# MUST BE ALL LOWERCASE +requestInfoDefaultTitles: [] + +# *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given +requestInfoLabelToAdd: "Incomplete" + +# *OPTIONAL* Require Pull Requests to contain more information than what is provided in the PR template +# Will fail if the pull request's body is equal to the provided template +checkPullRequestTemplate: true + +# *OPTIONAL* Only warn about insufficient information on these events type +# Keys must be lowercase. Valid values are 'issue' and 'pullRequest' +requestInfoOn: + pullRequest: true + issue: true + +# *OPTIONAL* Add a list of people whose Issues/PRs will not be commented on +# keys must be GitHub usernames +requestInfoUserstoExclude: [] + +# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome + +# Comment to be posted to on first time issues +newIssueWelcomeComment: > + :wave: Thanks for opening your first issue here! + If you're reporting a :bug: bug, please make sure you include steps to reproduce it. + Also, logs, error messages and information about your hardware might be usefull. + +# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome + +# Comment to be posted to on PRs from first time contributors in your repository +newPRWelcomeComment: > + :sparkling_heart: Thanks for opening this pull request! :sparkling_heart: + If your PR gets accepted and merged in, we will invite you to the project :tada: + +# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge + +# Comment to be posted to on pull requests merged by a first time user +firstPRMergeComment: > + Congrats on merging your first pull request! :tada::tada::tada: diff --git a/.github/invite-contributors.yml b/.github/invite-contributors.yml new file mode 100644 index 0000000..25eb31a --- /dev/null +++ b/.github/invite-contributors.yml @@ -0,0 +1,10 @@ +--- +# If true, this will add new contributors as outside collaborators +# to the repo their PR was merged in. Team name is ignored if this +# flag is set to true. +isOutside: false + +# Specify team name to add new contributors to a specific team +# within your organization. +# Use team name or team-name-slug +team: Contributors diff --git a/.github/lock.yml b/.github/lock.yml new file mode 100644 index 0000000..4b1e816 --- /dev/null +++ b/.github/lock.yml @@ -0,0 +1,20 @@ +--- +# Configuration for lock-threads - https://github.com/dessant/lock-threads +# Number of days of inactivity before a closed issue or pull request is locked +daysUntilLock: 30 + +# Comment to post before locking. Set to `false` to disable +lockComment: > + This thread has been automatically locked because it has not had recent + activity. Please open a new issue for related bugs and link to relevant + comments in this thread. + +# Issues or pull requests with these labels will not be locked +# exemptLabels: +# - no-locking + +# Limit to only `issues` or `pulls` +# only: issues + +# Add a label when locking. Set to `false` to disable +lockLabel: false diff --git a/.github/move.yml b/.github/move.yml new file mode 100644 index 0000000..0c2276a --- /dev/null +++ b/.github/move.yml @@ -0,0 +1,20 @@ +--- +# Delete the command comment when it contains no other content +deleteCommand: true + +# Close the source issue after moving +closeSourceIssue: true + +# Lock the source issue after moving +lockSourceIssue: true + +# Mention issue and comment authors +mentionAuthors: true + +# Preserve mentions in the issue content +keepContentMentions: false + +# Set custom aliases for targets +# aliases: +# r: repo +# or: owner/repo diff --git a/.github/no-response.yml b/.github/no-response.yml new file mode 100644 index 0000000..bb9f0f2 --- /dev/null +++ b/.github/no-response.yml @@ -0,0 +1,13 @@ +--- +# Configuration for probot-no-response - https://github.com/probot/no-response +# Number of days of inactivity before an Issue is closed for lack of response +daysUntilClose: 14 +# Label requiring a response +responseRequiredLabel: "Status: Awaiting response" +# Comment to post when closing an Issue for lack of response. Set to `false` to disable +closeComment: > + This issue has been automatically closed because there has been no response + to our request for more information from the original author. With only the + information that is currently in the issue, we don't have enough information + to take action. Please reach out if you have or find the answers we need so + that we can investigate further. diff --git a/.github/potential-duplicates.yml b/.github/potential-duplicates.yml new file mode 100644 index 0000000..00c7c0f --- /dev/null +++ b/.github/potential-duplicates.yml @@ -0,0 +1,14 @@ +--- +# Label name and color to set, when potential duplicates are detected +issueLabel: "Potential duplicate" +labelColor: e6e6e6 + +# If similarity is higher than this threshold, issue will be marked as duplicate +threshold: 0.70 + +# Comment to post when potential duplicates are detected +referenceComment: > + Potential duplicates found: + {{#issues}} + - [#{{ number }}] {{ title }} ({{ accuracy }}%) + {{/issues}} diff --git a/.github/settings.yml b/.github/settings.yml new file mode 100644 index 0000000..df5bf72 --- /dev/null +++ b/.github/settings.yml @@ -0,0 +1,150 @@ +--- +repository: + description: "MQTT Broker & Web client - Community Hass.io Add-on for Home Assistant" + homepage: https://addons.community + topics: mosquitto, mqtt, hivemq, web, hassio-addons, hassio, hass, home-assistant, homeassistant + private: false + has_issues: true + has_projects: false + has_wiki: false + has_downloads: false + default_branch: master + allow_squash_merge: true + allow_merge_commit: false + allow_rebase_merge: true +labels: + # Priority labels + - name: "Priority: Critical" + color: ee0701 + description: "This should be dealt with ASAP. Not fixing this issue would be a serious error." + - name: "Priority: High" + color: b60205 + description: "After critical issues are fixed, these should be dealt with before any further issues." + - name: "Priority: Medium" + color: 0e8a16 + description: "This issue may be useful, and needs some attention." + - name: "Priority: Low" + color: e4ea8a + description: "Nice addition, maybe... someday..." + + # Type labels + - name: "Type: Bug" + color: ee0701 + description: "Inconsistencies or issues which will cause a problem for users or implementors." + - name: "Type: Documentation" + color: 0052cc + description: "Solely about the documentation of the project." + - name: "Type: Enhancement" + color: 1d76db + description: "Enhancement of the code, not introducing new features." + - name: "Type: Feature" + color: 0e8a16 + description: "New features or options." + - name: "Type: Support" + color: 5319e7 + description: "Marks an issue as an support ticket." + - name: "Type: Discussion" + color: d4c5f9 + description: "Marks an issue as an generic discussion ticket." + - name: "Type: Maintaince" + color: 2af79e + description: "Generic maintaince tasks, e.g., package updates." + + # Additional markers + - name: "Security" + color: ee0701 + description: "Marks an security issues that needs to be resolved asap." + - name: "Idea" + color: fef2c0 + description: "Marks an idea, which might be excepted and implemented." + - name: "Incomplete" + color: fef2c0 + description: "Marks an PR or issue that is missing information." + - name: "Pull request" + color: fbca04 + description: "There is an PR opened for this issue." + - name: "Accepted" + color: c2e0c6 + description: "This issue or PR has been accepted." + - name: "Declined" + color: f9d0c4 + description: "This issue or PR has been declined." + - name: "Potential duplicate" + color: e6e6e6 + description: "This issue has been automatically marked as a potential duplicate." + + # Ongoing Status labels + - name: "Status: Triage" + color: fbca04 + description: "This issue needs to be triaged." + - name: "Status: On hold" + color: cccccc + description: "Issue or PR that has been placed on hold for now." + - name: "Status: In progress" + color: fbca04 + description: "Issue is currently being resolved by a developer." + - name: "Status: Stale" + color: fef2c0 + description: "There has not been activity on this issue or PR for quite some time." + - name: "Status: Awaiting response" + color: fef2c0 + description: "Issue or PR awaits response from the creator." + - name: "Status: Blocked" + color: fef2c0 + description: "Progress on this issue is currently not possible." + + # Closing status labels + - name: "Closed: Known limitation" + color: e6e6e6 + description: "Issue is closed, it is a known limitation." + - name: "Closed: Expected behavior" + color: e6e6e6 + description: "Issues is closed, it is expected behavior." + - name: "Closed: Duplicate" + color: e6e6e6 + description: "Issue is closed, duplicate of an existing issue." + - name: "Closed: Invalid" + color: e6e6e6 + description: "Issue is closed, marked as not a valid issue (e.g., an user error)." + - name: "Closed: Wrong repository" + color: e6e6e6 + description: "Issue is closed, was created in the wrong repository." + - name: "Closed: Won't Fix" + color: e6e6e6 + description: "Issue is closed, it won't be fixed." + - name: "Closed: Done" + color: c2e0c6 + description: "Issue closed, work on this issue has been marked complete." + + # Others + - name: "Beginner Friendly" + color: 0e8a16 + description: "Good first issue for people wanting to contribute to the project." + - name: "Help wanted" + color: 0e8a16 + description: "We need some extra helping hands or expertise in order to resolve this." + - name: "Hacktoberfest" + description: "Issues/PRs are participating in the Hacktoberfest" + color: fbca04 + +branches: + - name: master + protection: + required_pull_request_reviews: + # required_approving_review_count: 1 + dismiss_stale_reviews: true + require_code_owner_reviews: true + dismissal_restrictions: + users: [] + teams: + - Admins + - Masters + required_status_checks: + strict: false + contexts: [] + enforce_admins: false + restrictions: + users: [] + teams: + - Admins + - Masters diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..36938bb --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,61 @@ +--- +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale Issue or Pull Request is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - "Status: On hold" + - "Status: In progress" + - "Status: Awaiting response" + - "Status: Blocked" + - "Idea" + - "Security" + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Label to use when marking as stale +staleLabel: "Status: Stale" + +# Comment to post when marking 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 removing the stale label. +# unmarkComment: > +# Your comment here. +unmarkComment: false + +# Comment to post when closing a stale Issue or Pull Request. +# closeComment: > +# Your comment here. +closeComment: false + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +only: issues + +# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': +# pulls: +# daysUntilStale: 30 +# markComment: > +# This pull request 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. + +# issues: +# exemptLabels: +# - confirmed diff --git a/.github/support.yml b/.github/support.yml new file mode 100644 index 0000000..4060944 --- /dev/null +++ b/.github/support.yml @@ -0,0 +1,22 @@ +--- +# Configuration for support-requests - https://github.com/dessant/support-requests + +# Label used to mark issues as support requests +supportLabel: "Type: Support" + +# Comment to post on issues marked as support requests. Add a link +# to a support page, or set to `false` to disable +supportComment: > + :wave: We use the issue tracker exclusively for bug reports and feature requests. + However, this issue appears to be a support request. Please use our + support channels to get help with the project. + + Head over to the + [Home Assistant community forum](https://community.home-assistant.io/?u=frenck) + or join our [Discord](https://discord.gg/c5DvZ4e) chat. + +# Close issues marked as support requests +close: true + +# Lock issues marked as support requests +lock: false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..6b1ebee --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,428 @@ +--- +image: docker:latest + +variables: + ADDON_GITHUB_REPO: hassio-addons/addon-hastebin + ADDON_SLUG: hastebin + ADDON_TARGET: hastebin + DOCKER_DRIVER: overlay2 + DOCKER_HUB_ORG: hassioaddons + +stages: + - preflight + - build + - scan + - deploy + - manifest + - publish + +# Generic DIND template +.dind: &dind + before_script: + - docker info + services: + - name: docker:dind + command: ["--experimental"] + +# Generic preflight template +.preflight: &preflight + stage: preflight + tags: + - preflight + +# Generic build template +.build: &build + <<: *dind + stage: build + before_script: + - docker info + - | + if [ "$(apk --print-arch)" = "amd64" ]; then + docker run --rm --privileged hassioaddons/qemu-user-static:latest + fi + - | + echo "${CI_JOB_TOKEN}" | docker login \ + --username gitlab-ci-token \ + --password-stdin \ + registry.gitlab.com + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" || true + script: + - | + docker build \ + --build-arg "BUILD_FROM=${FROM}" \ + --build-arg "BUILD_DATE=$(date +"%Y-%m-%dT%H:%M:%SZ")" \ + --build-arg "BUILD_ARCH=${ADDON_ARCH}" \ + --build-arg "BUILD_REF=${CI_COMMIT_SHA}" \ + --build-arg "BUILD_VERSION=${CI_COMMIT_TAG:-${CI_COMMIT_SHA:0:7}}" \ + --cache-from "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" \ + --tag \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" \ + "${ADDON_TARGET}" + - | + docker push \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" +# Generic scan template +.scan: &scan + <<: *dind + stage: scan + allow_failure: true + before_script: + - docker info + - docker run -d --name db arminc/clair-db:latest + - docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:v2.0.1 + - apk add -U curl ca-certificates + - | + curl \ + --silent \ + --show-error \ + --location \ + --fail \ + --retry 3 \ + --output /usr/bin/clair-scanner \ + https://github.com/arminc/clair-scanner/releases/download/v8/clair-scanner_linux_amd64 + - chmod +x /usr/bin/clair-scanner + - touch clair-whitelist.yml + - echo "Waiting for Clair to start" + - | + while ! nc -z docker 6060; do + sleep 1 + WAIT=$((${WAIT} + 1)) + if [ "${WAIT}" -gt 30 ]; then + echo "Error > Timeout waiting for Clair to start" + exit 1 + fi + done + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + script: + - | + clair-scanner \ + -c http://docker:6060 \ + --ip $(hostname -i) \ + -w clair-whitelist.yml \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + tags: + - scan + +# Generic deploy template +.deploy: &deploy + <<: *dind + stage: deploy + before_script: + - docker info + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + - | + echo "${CI_JOB_TOKEN}" | docker login \ + --username gitlab-ci-token \ + --password-stdin \ + registry.gitlab.com + - | + echo "${DOCKER_PASSWORD}" | docker login \ + --username "${DOCKER_LOGIN}" \ + --password-stdin + script: + - | + docker tag \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" + - docker push "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:cache" + - TAG="${CI_COMMIT_TAG#v}" + - TAG="${TAG:-${CI_COMMIT_SHA:0:7}}" + - | + docker tag \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${ADDON_ARCH}-${TAG}" + - | + docker push \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${ADDON_ARCH}-${TAG}" + tags: + - deploy + only: + - master + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + except: + - /^(?!master).+@/ + +# Generic manifest template +.manifest: &manifest + <<: *dind + stage: manifest + before_script: + - mkdir -p ~/.docker + - echo '{"experimental":"enabled"}' > ~/.docker/config.json + - docker info + - | + echo "${DOCKER_PASSWORD}" | docker login \ + --username "${DOCKER_LOGIN}" \ + --password-stdin + script: + - TAG="${TAG#v}" + - TAG="${TAG:-${CI_COMMIT_SHA:0:7}}" + - REF="${CI_COMMIT_TAG#v}" + - REF="${REF:-${CI_COMMIT_SHA:0:7}}" + - | + docker manifest create \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:aarch64-${REF}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:amd64-${REF}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:armhf-${REF}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:i386-${REF}" + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:aarch64-${REF}" \ + --os=linux \ + --arch=arm64 \ + --variant=v8 + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:amd64-${REF}" \ + --os=linux \ + --arch=amd64 + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:armhf-${REF}" \ + --os=linux \ + --arch=arm \ + --variant=v6 + - | + docker manifest annotate \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:i386-${REF}" \ + --os=linux \ + --arch=386 + - | + docker manifest push \ + "${DOCKER_HUB_ORG}/${ADDON_SLUG}:${TAG}" + tags: + - manifest + except: + - /^(?!master).+@/ + +# Generic publish template +.publish: &publish + stage: publish + image: + name: hassioaddons/repository-updater:latest + entrypoint: [""] + script: + - | + repository-updater \ + --token "${GITHUB_TOKEN}" \ + --repository "${REPOSITORY}" \ + --addon "${ADDON_GITHUB_REPO}" + tags: + - publish + except: + - /^(?!master).+@/ + +# Preflight jobs +hadolint: + <<: *preflight + image: hadolint/hadolint:latest-debian + before_script: + - hadolint --version + script: + - hadolint "${ADDON_TARGET}/Dockerfile" + +shellcheck: + <<: *preflight + image: + name: koalaman/shellcheck-alpine:stable + entrypoint: [""] + before_script: + - shellcheck --version + - apk --no-cache add grep + - | + find . -type f -print0 | \ + xargs -0 sed -i 's:#!/usr/bin/with-contenv bash:#!/bin/bash:g' + script: + - | + for file in $(grep -IRl "#\!\(/usr/bin/env \|/bin/\)" --exclude-dir ".git" "${ADDON_TARGET}"); do + if ! shellcheck $file; then + export FAILED=1 + else + echo "$file OK" + fi + done + if [ "${FAILED}" = "1" ]; then + exit 1 + fi + +yamllint: + <<: *preflight + image: sdesbure/yamllint + before_script: + - yamllint --version + script: + - yamllint . + +jsonlint: + <<: *preflight + image: sahsu/docker-jsonlint + before_script: + - jsonlint --version || true + script: + - | + for file in $(find . -type f -name "*.json"); do + if ! jsonlint -q $file; then + export FAILED=1 + else + echo "$file OK" + fi + done + if [ "${FAILED}" = "1" ]; then + exit 1 + fi +markdownlint: + <<: *preflight + image: + name: ruby:alpine + entrypoint: [""] + before_script: + - gem install mdl + - mdl --version + script: + - mdl --style all --warnings . + +# Build Jobs +build:armhf: + <<: *build + variables: + ADDON_ARCH: armhf + FROM: hassioaddons/base-armhf:2.1.2 + tags: + - build + - armhf + +build:aarch64: + <<: *build + variables: + ADDON_ARCH: aarch64 + FROM: hassioaddons/base-aarch64:2.1.2 + tags: + - build + - aarch64 + +build:i386: + <<: *build + variables: + ADDON_ARCH: i386 + FROM: hassioaddons/base-i386:2.1.2 + tags: + - build + - i386 + +build:amd64: + <<: *build + variables: + ADDON_ARCH: amd64 + FROM: hassioaddons/base-amd64:2.1.2 + tags: + - build + - amd64 + +# Scan jobs +clair:armhf: + <<: *scan + variables: + ADDON_ARCH: armhf + +clair:aarch64: + <<: *scan + variables: + ADDON_ARCH: aarch64 + +clair:i386: + <<: *scan + variables: + ADDON_ARCH: i386 + +clair:amd64: + <<: *scan + variables: + ADDON_ARCH: amd64 + +# Deploy jobs +deploy:armhf: + <<: *deploy + variables: + ADDON_ARCH: armhf + +deploy:aarch64: + <<: *deploy + variables: + ADDON_ARCH: aarch64 + +deploy:i386: + <<: *deploy + variables: + ADDON_ARCH: i386 + +deploy:amd64: + <<: *deploy + variables: + ADDON_ARCH: amd64 + +# Manifest jobs +manifest:sha: + <<: *manifest + only: + - master + +manifest:version: + <<: *manifest + variables: + TAG: "${CI_COMMIT_TAG}" + only: + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + +manifest:stable: + <<: *manifest + variables: + TAG: latest + only: + - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ + +manifest:beta: + <<: *manifest + variables: + TAG: beta + only: + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + +manifest:edge: + <<: *manifest + variables: + TAG: edge + only: + - master + +# Publish jobs +publish:stable: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository + only: + - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ + environment: + name: stable + +publish:beta: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository-beta + only: + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + environment: + name: beta + +publish:edge: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository-edge + only: + - master + environment: + name: edge diff --git a/.mdlrc b/.mdlrc new file mode 100644 index 0000000..2b0128d --- /dev/null +++ b/.mdlrc @@ -0,0 +1 @@ +rules "~MD024" \ No newline at end of file diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..f4bc5a4 --- /dev/null +++ b/.yamllint @@ -0,0 +1,66 @@ +--- +rules: + braces: + level: error + min-spaces-inside: 0 + max-spaces-inside: 1 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + brackets: + level: error + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + colons: + level: error + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: error + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: + level: error + require-starting-space: true + min-spaces-from-content: 2 + comments-indentation: + level: error + document-end: + level: error + present: false + document-start: + level: error + present: true + empty-lines: + level: error + max: 1 + max-start: 0 + max-end: 1 + hyphens: + level: error + max-spaces-after: 1 + indentation: + level: error + spaces: 2 + indent-sequences: true + check-multi-line-strings: false + key-duplicates: + level: error + line-length: + ignore: | + .github/support.yml + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: + level: error + new-lines: + level: error + type: unix + trailing-spaces: + level: error + truthy: + level: error diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..0ac232b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Code of conduct + +## Our pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention + or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or + electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate + in a professional setting + +## Our responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project lead at frenck@addons.community. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project lead is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..b9ae2b2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing + +When contributing to this repository, please first discuss the change you wish +to make via issue, email, or any other method with the owners of this repository +before making a change. + +Please note we have a code of conduct, please follow it in all your interactions +with the project. + +## Issues and feature requests + +You've found a bug in the source code, a mistake in the documentation or maybe +you'd like a new feature? You can help us by submitting an issue to our +[GitHub Repository][github]. Before you create an issue, make sure you search +the archive, maybe your question was already answered. + +Even better: You could submit a pull request with a fix / new feature! + +## Pull request process + +1. Search our repository for open or closed [pull requests][prs] that relates + to your submission. You don't want to duplicate effort. + +1. You may merge the pull request in once you have the sign-off of two other + developers, or if you do not have permission to do that, you may request + the second reviewer to merge it for you. + +[github]: https://github.com/hassio-addons/addon-hastebin/issues +[prs]: https://github.com/hassio-addons/addon-hastebin/pulls diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..f6c5214 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2018 Joakim Sørensen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4ef3026 --- /dev/null +++ b/README.md @@ -0,0 +1,345 @@ +# Community Hass.io Add-ons: MQTT Broker & Web client + +[![GitHub Release][releases-shield]][releases] +![Project Stage][project-stage-shield] +[![License][license-shield]](LICENSE.md) + +[![GitLab CI][gitlabci-shield]][gitlabci] +![Project Maintenance][maintenance-shield] +[![GitHub Activity][commits-shield]][commits] + +[![Bountysource][bountysource-shield]][bountysource] +[![Discord][discord-shield]][discord] +[![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +Mosquitto MQTT Broker bundled with Hivemq's web client. + +## About + +This add-on combines the power of [Hivemq](https://www.hivemq.com/)'s web based MQTT client, and the powerfull [Mosquitto](https://mosquitto.org/) broker. +With this you can host your broker, and inspect/publish messages in the Web client! + +![sample](/images/image.png) + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Hass.io add-on. + +1. [Add our Hass.io add-ons repository][repository] to your Hass.io instance. +1. Install the "MQTT Broker & Web client" add-on. +1. Start the "MQTT Broker & Web client" add-on +1. Configure the "MQTT Broker & Web client" add-on +1. Check the logs of the "MQTT Broker & Web client" add-on to see if everything went well. +1. Click "OPEN WEB UI" to open the MQTT Broker & Web client website. + +**NOTE**: Starting the add-on might take a couple of minutes (especially the +first time starting the add-on). + +**NOTE**: Do not add this repository to Hass.io, please use: +`https://github.com/hassio-addons/repository`. + +## Docker status + +![Supports armhf Architecture][armhf-shield] +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports i386 Architecture][i386-shield] + +[![Docker Layers][layers-shield]][microbadger] +[![Docker Pulls][pulls-shield]][dockerhub] + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```json +{ + "log_level": "info", + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "web": { + "enabled": true, + "username": "MarryPoppins", + "password": "Supercalifragilisticexpialidocious", + "ssl": true + }, + "broker": { + "enabled": true, + "enable_ws": true, + "enable_mqtt": true, + "username": "MarryPoppins", + "password": "Supercalifragilisticexpialidocious", + "ssl": true, + "allow_anonymous": false + } +} +``` + +**Note**: _This is just an example, don't copy and past it! Create your own!_ + +### Option: `log_level` + +The `log_level` option controls the level of log output by the addon and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `certfile` + +The certificate file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option: `keyfile` + +The private key file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option group `web` + +--- +The following options are for the option group: `web`. These settings +only apply to the Hivemq MQTT web client. + +#### Option `web`: `enable` + +Flag to control if this service should be started. + +#### Option `web`: `username` + +Username for authenticating with the web client of this add-on. Leaving the username +field empty, will disable the authentication mechanism entirely. + +Setting a username/password can be added as an extra line of defense, +to prevent users of using your installation for themselves. + +This option is HIGHLY recommended in case you expose this add-on to the outside +world. + +**Note**: _This option support secrets, e.g., `!secret mqtt_web_username`._ + +#### Option `web`: `password` + +Password for authenticating with the web client of this add-on. + +**Note**: _This option support secrets, e.g., `!secret mqtt_web_password`._ + +#### Option `web`: `ssl` + +Enables/Disables SSL (HTTPS) on the web client of this add-on. Set it `true` +to enable it, `false` otherwise. + +### Option group `broker` + +--- +The following options are for the option group: `web`. These settings +only apply to the Hivemq MQTT web client. + +#### Option `broker`: `enable` + +Flag to control if this service should be started. + +#### Option `broker`: `enable_ws` + +Enables the websocket protocol on the broker. +**This is needed if you have enabled the web client of this addon** +The default websocket port is `1884`. + +#### Option `broker`: `enable_mqtt` + +Enables the websocket protocol on the broker. +The default websocket port is `1883`. + +#### Option `broker`: `username` + +Username for authenticating with the mqtt broker of this add-on. Leaving the username +field empty, will disable the authentication mechanism entirely. + +Setting a username/password can be added as an extra line of defense, +to prevent users of using your installation for themselves. + +This option is HIGHLY recommended in case you expose this add-on to the outside +world. + +**Note**: _This option support secrets, e.g., `!secret mqtt_broker_username`._ + +#### Option `broker`: `password` + +Password for authenticating with the mqtt broker of this add-on. + +**Note**: _This option support secrets, e.g., `!secret mqtt_broker_password`._ + +#### Option `broker`: `ssl` + +Enables/Disables SSL (HTTPS) on the mqtt broker of this add-on. Set it `true` +to enable it, `false` otherwise. + +#### Option `broker`: `allow_anonymous` + +Set this to `true` if you need to enable anonymous authentication. +**NB!: It is NOT a good idea having this enabled** + +### Option: `i_like_to_be_pwned` + +Adding this option to the add-on configuration allows to you bypass the +HaveIBeenPwned password requirement by setting it to `true`. + +**Note**: _We STRONGLY suggest picking a stronger/safer password instead of +using this option! USE AT YOUR OWN RISK!_ + +### Option: `leave_front_door_open` + +Adding this option to the add-on configuration allows you to disable +authentication on the Web Terminal by setting it to `true` and leaving the +username and password empty. + +**Note**: _We STRONGLY suggest, not to use this, even if this add-on is +only exposed to your internal network. USE AT YOUR OWN RISK!_ + +## Embedding into Home Assistant + +It is possible to embed the web client of this add-on directly into Home Assistant, allowing you to +access your the web client of this add-on through the Home Assistant frontend. + +Home Assistant provides the `panel_iframe` component, for these purposes. + +Example configuration: + +```yaml +panel_iframe: + mqtt: + title: MQTT + icon: mdi:code-brackets + url: https://addres.to.your.hass.io:5713 +``` + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. The format of the log is based on +[Keep a Changelog][keepchangelog]. + +Releases are based on [Semantic Versioning][semver], and use the format +of ``MAJOR.MINOR.PATCH``. In a nutshell, the version will be incremented +based on the following: + +- ``MAJOR``: Incompatible or major changes. +- ``MINOR``: Backwards-compatible new features and enhancements. +- ``PATCH``: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Community Hass.io Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Contributing + +This is an active open-source project. We are always open to people who want to +use the code or contribute to it. + +We have set up a separate document containing our +[contribution guidelines](CONTRIBUTING.md). + +Thank you for being involved! :heart_eyes: + +## Authors & contributors + +The original setup of this repository is by [Joakim Sørensen][ludeeus]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## We have got some Hass.io add-ons for you + +Want some more functionality to your Hass.io Home Assistant instance? + +We have created multiple add-ons for Hass.io. For a full list, check out +our [GitHub Repository][repository]. + +## License + +MIT License + +Copyright (c) 2018 Joakim Sørensen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[anchore-shield]: https://anchore.io/service/badges/image/67d1185473090e99d5ac5e1bb4d1aa2295117a9bd3d7abbf8cd8a71e331c8388 +[anchore]: https://anchore.io/image/dockerhub/hassioaddons%2Funifi%3Alatest +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[bountysource-shield]: https://img.shields.io/bountysource/team/hassio-addons/activity.svg +[bountysource]: https://www.bountysource.com/teams/hassio-addons/issues +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/ludeeus +[commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/addon-mqtt.svg +[commits]: https://github.com/hassio-addons/addon-mqtt/commits/master +[contributors]: https://github.com/hassio-addons/addon-mqtt/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[dockerhub]: https://hub.docker.com/r/hassioaddons/mqtt +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/ +[ludeeus]: https://github.com/ludeeus +[gitlabci-shield]: https://gitlab.com/hassio-addons/addon-mqtt/badges/master/pipeline.svg +[gitlabci]: https://gitlab.com/hassio-addons/addon-mqtt/pipelines +[home-assistant]: https://home-assistant.io +[i386-shield]: https://img.shields.io/badge/i386-yes-green.svg +[issue]: https://github.com/hassio-addons/addon-mqtt/issues +[keepchangelog]: http://keepachangelog.com/en/1.0.0/ +[layers-shield]: https://images.microbadger.com/badges/image/hassioaddons/mqtt.svg +[license-shield]: https://img.shields.io/github/license/hassio-addons/addon-mqtt.svg +[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg +[microbadger]: https://microbadger.com/images/hassioaddons/mqtt +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[pulls-shield]: https://img.shields.io/docker/pulls/hassioaddons/mqtt.svg +[reddit]: https://reddit.com/r/homeassistant +[releases-shield]: https://img.shields.io/github/release/hassio-addons/addon-mqtt.svg +[releases]: https://github.com/hassio-addons/addon-mqtt/releases +[repository]: https://github.com/hassio-addons/repository +[semver]: http://semver.org/spec/v2.0.0.htm diff --git a/images/image.png b/images/image.png new file mode 100644 index 0000000000000000000000000000000000000000..56bcfdea0190e9dcd97e0544e61250c65ee45c08 GIT binary patch literal 45382 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

HUh??3$P%cWWAx=$d=2r#R0f|4sGc#yoR- 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 Vgr@F{mOG$~;OXk;vd$@?2>`1A6O{k} literal 0 HcmV?d00001 diff --git a/mqtt/.README.j2 b/mqtt/.README.j2 new file mode 100644 index 0000000..85695ba --- /dev/null +++ b/mqtt/.README.j2 @@ -0,0 +1,70 @@ +# Community Hass.io Add-ons: SQLite-web + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +Mosquitto MQTT Broker bundled with Hivemq's web client. + +## About + +This add-on combines the power of [Hivemq](https://www.hivemq.com/)'s web based MQTT client, and the powerfull [Mosquitto](https://mosquitto.org/) broker. +With this you can host your broker, and inspect/publish messages in the Web client! + +[Click here for the full documentation][docs] + +![Home Assistant Control Panel screenshot][screenshot] + +{% if channel == "edge" %} +## WARNING! THIS IS AN EDGE VERSION! + +This Hass.io Add-ons repository contains edge builds of add-ons. Edge builds +add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +{% if channel == "beta" %} +## WARNING! THIS IS A BETA VERSION! + +This Hass.io Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/ludeeus +[discord-shield]: https://img.shields.io/discord/330944238910963714.svg +[discord]: https://discord.gg/c5DvZ4e +[docs]: {{ repo }}/blob/{{ version }}/README.md +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io +[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} +[screenshot]: https://github.com/hassio-addons/addon-sqlite-web/raw/master/images/screenshot.png diff --git a/mqtt/Dockerfile b/mqtt/Dockerfile new file mode 100644 index 0000000..62fa9d0 --- /dev/null +++ b/mqtt/Dockerfile @@ -0,0 +1,45 @@ +ARG BUILD_FROM=hassioaddons/base:2.1.2 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Sets working directory +WORKDIR /app + +# Copy root filesystem +COPY rootfs / + +# Setup base +RUN \ + apk add --no-cache \ + apache2-utils=2.4.34-r0 \ + nginx=1.14.0-r0 \ + libwebsockets=2.4.0-r1 \ + mosquitto=1.4.15-r0 \ + && mkdir /opt + +# Build arugments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="MQTT Broker & Web client" \ + io.hass.description="Mosquitto MQTT Broker bundled with Hivemq's web client." \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Joakim Sørensen @ludeeus " \ + org.label-schema.description="Mosquitto MQTT Broker bundled with Hivemq's web client." \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="MQTT Broker & Web client" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://community.home-assistant.io/t/community-hass-io-add-on-mqtt/XXXX" \ + org.label-schema.usage="https://github.com/hassio-addons/addon-mqtt/tree/master/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/hassio-addons/addon-mqtt" \ + org.label-schema.vendor="Community Hass.io Add-ons" diff --git a/mqtt/build.json b/mqtt/build.json new file mode 100644 index 0000000..d4ed113 --- /dev/null +++ b/mqtt/build.json @@ -0,0 +1,9 @@ +{ + "build_from": { + "aarch64": "hassioaddons/base-aarch64:2.1.2", + "amd64": "hassioaddons/base-amd64:2.1.2", + "armhf": "hassioaddons/base-armhf:2.1.2", + "i386": "hassioaddons/base-i386:2.1.2" + }, + "args": {} +} diff --git a/mqtt/config.json b/mqtt/config.json new file mode 100644 index 0000000..8f3f284 --- /dev/null +++ b/mqtt/config.json @@ -0,0 +1,73 @@ +{ + "name": "MQTT Broker & Web client", + "version": "dev", + "slug": "mqtt", + "description": "Mosquitto MQTT Broker bundled with Hivemq's web client", + "url": "https://github.com/hassio-addons/addon-mqtt/tree/master/README.md", + "webui": "https://[HOST]:[PORT:5713]", + "startup": "services", + "arch": [ + "aarch64", + "amd64", + "armhf", + "i386" + ], + "boot": "auto", + "hassio_api": true, + "homeassistant_api": false, + "host_network": false, + "ports": { + "5713/tcp": 5713, + "1884/tcp": 1884, + "1883/tcp": 1883 + }, + "map": [ + "ssl", + "config" + ], + "options": { + "log_level": "info", + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "web": { + "enabled": true, + "username": "", + "password": "", + "ssl": true + }, + "broker": { + "enabled": true, + "enable_ws": true, + "enable_mqtt": true, + "username": "", + "password": "", + "ssl": true, + "allow_anonymous": false + } + }, + "schema": { + "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)", + "certfile": "str", + "keyfile": "str", + "web": { + "enabled": "bool", + "username": "str", + "password": "str", + "ssl": "bool" + }, + "broker": { + "enabled": "bool", + "enable_ws": "bool", + "enable_mqtt": "bool", + "username": "str", + "password": "str", + "ssl": "bool", + "allow_anonymous": "bool" + }, + "i_like_to_be_pwned": "bool?", + "leave_front_door_open": "bool?" + }, + "environment": { + "LOG_FORMAT": "{LEVEL}: {MESSAGE}" + } +} diff --git a/mqtt/icon.png b/mqtt/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..46bed802b9e9b37313b16cc0246db71432a7d63e GIT binary patch literal 5999 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 literal 0 HcmV?d00001 diff --git a/mqtt/logo.png b/mqtt/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc8d542e608060a81e390fd12f0e92536a06f60 GIT binary patch literal 13169 zcmYkjWmH>Hw>6BrYq1dAp=c=%h2mC9aVUl0u7Tn%#jUs#+}&LZ#frN-1lRJW&%NJ$ zz8^WsIb)nLGWTA4?KS6`J6ugg78`>c0}c)jTV7836C50T4D7cI8Vc-Mn`Pw>`+|4= zBr641IYD^{yFoISRF;H;tBJvUHb#csqdUmyIK#o=^!@w557`%+!XA>j$Y{H0*qgby z8#{sE9E>gPTsZAOELLyT7o3`bVc-bzOG-L z{W7~uXc`{xXM z#uSwAO+~-5h{fDbbN+saM}LiZah7RyIZ0F5|AGvmd+I9pAP~I_vjyS|Mb&re4G2 zgg$(zM*riMqc(9&0VccUt4DJ4IVEY_IE8BUMsC8-rly$L!xUtWK%v^yIO~O@q!OFI z8PWovX)^&DQ^a&p>vxJP>3tJfEoS2#UfUB%`e?Fi?=slvY2V|;)deS9)ncA&a2m{; z;>Lu_g9iC#GO)Jd5JRoTM_SFsN83kLAiH(-vm(i!(~N+jXyB!wOE{H~LmZV-XLmfl zcPv;b18>~R%c~HlQv?m;sC%#9#<&I(x28lxpl%XMp?!aSYV$NVGv{pH72-z}F1tqT z)%D|dMz3D;+~8>8aoWiyH+RV|SV#sMh<-oC-BIJpY_TJa`Sk^9`ops5{ldVn zD#AC;?HI?ltm+1VFXr z#X)Q)M=E;YyV**DqXXfrLT~&P_oh_mtjdUE!-ul(&hPt?=1mvHdKvSG z@{>KkQ-S$(Rn5v+@SGy4oi@uOaKdyMY3IJinVnhANYKJ7fYK{(Ya_g)?e`Ie90HQ5 zXkILT*(aTqybmG@IcPzYqOR|~TQ1Qq&97>353#s7)fz8ZrsEpI52h{QA|t9@jadQ@ z*qPe=Xz@4!VU2doO%hhMp+o)sgd0TJa8*fusHVG~3aeJh5WjM-yU#biWS=2U5!QHN zvTB2Dexv2s#>Jtx_1$;Tg7ehbbUkk`EIUe*=j8T7&(8yNH_qjr=35Q@@7M-f__B{A zeLn*BkKaNQ#aWs@uMfv%HG~gkj-}YG(7@+%vPVd$WKELdLaV~re2g zc%ojZeJOa-?=oqHf*v>*i5GJ{dsPk^oBIS&;?3`h@8Tn0 zVi!p5k2lhr_&a6TwB5cZyNM{8FBN`4g;ZdC{9oBgR;MV?`vsa9c}K^#4F5=3Gf((7 z7wBVVBx&Wk^B%A%cq%-b_I^88qISWGAQsa@w{443Xg z7N+m>ZO%@l#poiXgYr<01{Ick2N{714@+p$Y(OIHktIqVJABOS&cKxS-{%1TrUqHW zkAXNwdxL>(nc21M(H#+4s%4Oy8Gsih+cWeP8#r}OtW7n_$|3-54m@vylVQ~87VZXw z|J+iydP5lV;c24!Pg%6~e5IJxYV}z&KllKtgphGFhoznD@F7fT$6A6JL0&#y7HtcQ zT?a`j@DOvqZ~=A3TxoeUxgV1A!=_E5WS7*{cna9j={I?Fr^DM+d#KTL$-`C$Uh%#= z?~owH!@b3vE zBxzy4PFuyIJ|aT`ytKhG;@JCv(1*n35yE#h)$-|6gQj7sDAcdjQT{~eVM0;!f8Gpt z!xP>UZH_Vn1OW^Mya6mg1~}ZW;RE@0{9{%QP32zhvsbm+YADz~3S$C6(clez?6;Wu zb&v|Mz@IXbx6)24{mwtaWxwdcQ~pJkrZWBn5%xV3BcW&A(7(lL0;#8`l!cbYME+BvL!wPYp?mZAQKwj1*9d zOTTPpT(VncVETDz^2}b)0M*rq<7ZRZbU13XC|v=!LV$L1xZ?#}atQbt;VdrcJfigv zLMhPb?I^QP3NZ~n?m4-?Z*NOscYf^@z+}Ub%Sps1qDeCX8_Bez zHNXu9+H5Itew3RCQiyB)d9Xt9PAkmw(+)x&=jX&I-|GXhYMzMDs@TD|-*gxUVUhn0 z3io9_RM(?@4RH(lmU7ce-Xn{KG=|F|8l_^_!$qxsoBTkp>!TV!Wt$Od+EyFF6Fis%fBpeR*Aph5KQxnlE>wqwdI~HfR$gqgQBAVDLOzE9Ouu zLR!bJ{O4HYxqQ(EAZ3g{YT}TRmE6;JiPdka2x-Y}m>wdjw~B#>PdzgVaUocz))>VV zwLCKINjAGy*wmIEFquH7_$`H|EW&h9IdRW5)<~gyfJTJL7jqS;q$L_!l#b0(?1T)x z*zMcMXjWYomAbUO@x_=chz)HXmV@}+J+&#$C=NP0X{@UNyv`GdbyR%d3y1i~kc0(? zoYJ)+Cy?kyjVQ5sULZsg7=Mj zGD^wR=y{+9?H+F$i27xCnQxTpg_}7|rJ*mj(DH5huiFO_NlfTut&x#e`%;TwoP7dt z^@WHKg^S=o(S{)ELn>;sJTv=;6Cq9SA2`Bf^M{sR+{0y0o_D`Y^?aIjysp05Xd?HY z%(;%XZPd{q;wabm$r#`i={AFAIyYTF!;8bHP9mF$8okFXQ%&MO)h%^Qqe&CTHV=d@ zmZ!G0_)Y#Q0V(3-8Z@Fw+mj@NZKZFak^d>{?j`bUyKdl})3T1k{U&D(xO8BF+KqT3 zcA4Xfsrh0lnfcs~{hW0E8eNV!ak8n?rEcJ$|ggMfb6`#Y8y^A9}$yY>Mxm-N^|v>g72KaT6`hu2Vys8yJ7GS^nFNw z=Ny+{Qb_jYSrkAIOhfjgr*wF0N8?B{l~dA4&-z>ZRphTKuiMq0vZbe#(g)WmEOr8{ z{J61+Q!=lNkVa>SjXpa>3%H3Eh#hL`U_20vON%Rb76@eJqCpS4B;UJ z0zUp-ViKCat9|om-6a_E{pQV)HmhaXkL9lg@qY^Az(Ct%#ws>e6_K4&e3tLfgSnQr z1dYNwFy6Cr03MzzCP6Bp@71`FNFEv*+E;7}fp7fQVh0Xcm&LuY>FLJ~Dv@n`pE;AN z=45UnEZIB%XixvGyKP{!A|*i&n>cGTNL=19wTR#>K7L0B5Y(aw!w)eIsx_Tba0C|x zftIc);13T0lO4)%p093JpXCk}K#?TpNB&ST{=lCUXM7&TH{NUf2rmb14k}|+a&-z{ zVo0*dB~=6U<$XAiZ^|Cm163m(R?ufX8esfJCDDWMt@}pWJn+SN)Z{bcmnPkf)tfTZ zdf8>4#0DKHqG>J7+GE|oP~GV+$;Mc%7!3TFK|I`bR6QQV#13#6P7=!KAFU~~49=y# zqx+gM99)X`SM~LL&%Uk#LShz^Ur}jjAm^3K5v}ENz}a^L>(QexgRV1pElkRcVPIR0=+vY>m|h8;4fy2xur#mnos+}cWqK#b zE(=&+r_3#4Q`-$(TU?V06Vm}=nyP{Y@_d>SE5O|zj~Ek)ufZzkmq7SjWju6Ei36_h zH=DY(rs#iPTLg{*Xz|srzz9*kZ@6tAX8*`6SJ|(p^`Jh=z~fgD7qB+L4gSD+_f-~zMzDhAX zP)f9kYv=li`XHSqmbdQRfuGFq zVr{ywEgpYnVi4jgQ|M1t{u(gJ*-+9EpvCdTu6SgWv_+Ci2bSUzz5KE7my_tPWOrA) zHlCF;o%Pay*zEFFTjbK7w(VBy&>;m0xD!=rwGgX>36oC_e@ZjT8LM-y7=Z_Hx z=wkBl1k3NuRO`*{Hnt=Wp`v)&{QHy_-}7F$d}5mPSm*Mm@23Rr_&v%`iFFJ)U<>pt z|9`O%KhsktAV3;0w{Fue(UMwnC*U_48?iYLN=;`P_Eg=iZhI1_>fm`Lg2QAJn1p8I z>t#NsM#_dAD9tOcO$f-InYEEne?@&)P`fR^ue}5vJGn0L`U}84BF_sAAEf$0?rK6t zjCWKzeOwezRtWJTa-D3GuppF4qiweuFct$>660k$#w?AVI=m&Sz&v7OL)Fx0?Er7Q zK}U_!8=g*K41sXJ^Qbp?MpfOEbc-?&*=QF-d1aE%|AuVD?^8|e{+D(<>*OLa{$p|q zBD@f!XvjViY>0H4dubOr1j_mQaMQuA!eznA_Q6|J?cDvFu!{p5fLeULVKMZ#%jh8g zjH|G}vo5QWNRZos`rcL?Q1BDUo@k)5J>@{&%YMy*o#J8yK81Ggk4&4pX}XgQt<;nL zO~qS(XF3BdQ$A&_C%E`N$Qfe6Nn`X^oel~dp&5W{DrLx1(yue83@Qv zFZ4X{Qj5*Bv}lt;McNfHze8eNU0QlqFF(0=sTv-n-9Rx7QsH4h>1}JSMle?e?+y31YK$BTY)-6m zZGN%Q*vu-LEEbav)lPB6m=LaI^_n67G9L?=ud8rQSoju5*F_Dyvr8+CVn}|wMPK>W2s;NFh`@}?&mMzPwoXX(x8UC#J9HK(X#ujGxMxX`F8OYb1B$;nz>2PQh-s4U#+YdO zW7n)G=36c8ze|C|cue4=2pzmcgzG*QoChMGh%Yb(hltLaZyTK+}r^d)DfgCP7qzhvd%)Zc{ z7jr};kAw6AXAS6X@MI6qZ`%B@Jm`O7qtInhkHdm|Ny{q%7>19WDsbcw+W4d(P$adg zQ`$YbCF#iKeq#U}>lB=LXI^kt=HYyMSre1MROtZAsHD$Tk*FO=5ledIc2v3Sr>x&C zJxM2xZmkU4whPZkx#>KpgTVVuqIc3(3X z>#yQlipPbw0%tejw;XcA57y?!QxYu~-5x=6#pw~F5DO-&4Ws+-64z_ea^Jsl{7ko5 z_kL&mA`c@>s}bOi4PRZ6&#@sS^COq7((JOx`w>@WQmcoRg8Q5ZjtjU-3BME07^U1H zUo)=wFq~SnYhEZ`wwF5BQd;tqD}Gb<2X;frx=WRrE)(J4Hj8E2y;6047VkAOD`KL+zMTCA}ds?8q8U3wnPj0*Jl-ZhB+@{cokr7=I zxJ%D>l+(g4r9P(qdrFDxDdfj;Z6c{WXyLZ!6O#04uWsj#U?kS7Lb%v1l*-+*0tUOA z2$wW$w|GO}vC$)?k#Hy~k>S`XFKN5BzH+id%SA=*INHC~>9f!*8Q%O^l+Q10m9440 zn@$?RzX`D_k;KwKD(bF->xmr5#gp*32b1}9uF5OIMRg;9vMKD4Ud!$cEG#0k+JVeTBcaX^-T<)0)7!t>J zMQDga5_r6xuI8n zHUG=X?fQ>2P!~S;tV{+I=i)AM67F#?s>G{|80snMG0~XEN#dmDNz}CBL<(aeCF9dx zLi%$op(HmW(`5%TRI|Gbisu-ojPbNtl^km}2t)1_{`b~GC&+2-((R%$Z1a|rDdP}tic+1d=-`32q zT7u%}7~5xd_8g;0!_`qWeao}XLELfGuH-HB;PMP;=Ep;d3n^*U@TNOKkg6+}TF*d& zPwgIj<_MAnmii%y^9RTRXM_1KdU|eG-Q?fS!q`8S=P>iMT2yPTg+m4{4zWU2W>y&n zT4uf@(IY)Rjd328)1M}!X+7*FHoabrYZ^D>sV8yTKKF|Qlc|80lLh=ko3cxy7$+n8 z;s8Dn4PYQ#ECVIY@mJlA%?>PF=bE;io`f z6emx!5Z1>g!d*Pv9SHijId<_`oj+s- z`i&ibX-0IptI?=N@BVNCx2=@b zTB~jF(Z+kX5CYJoqXgvW>jU>n!D@FzGQ>yrqQy@U(n0+JJ~I$27yWTn^{_xcn~`sN zK;Raf5KO|#u%~$XNzxdMefl?~uYpz0eNHB+H3z#0%nXcz_`V2Z@ohJ?J-6bJ@3ZQP z=yw)1eP7*Z2HXUsQk-3TaV39PEmEeailrZ@vBG0nJFxx(VI&?@~Of z4zpzN3T@Y-AIkKT@LoQp{;(=!nR;U@@(9>1qj@TyItcyliJMMm9g4PegDAGls^f}% zS4TDtvc6I%`CWnsJ^1pjx$#q%^$~JP3)lspk_FRVXoe9eh8No!jlh$IBuys0k3U?O ze~KGVZfl|JdV41QL7KuNtVm_1ka-A%1mi|B)VxJ@+ZyhcGqO<6B)v`3Vg=G!`-o7K zf~)$rAs_0CRRhCSWDh~DjHkkh1y*9y(@*|0QBSkxNX~tk(2D#s;;Y^`@8^==7mD%M zZl3Snq%J`=i?OpGqwkwe+A*dFyyhHc1HVxTn&ZzX+>=ut@A9r-{EUbl#F;>L_co6m z!bGM4*wQrO=486(Qa0HGPG%fT`_?+?^w+3~>sd-t?y7|pz8D1Jy&LHG6`!=}#|4q< zH&IF_b4`4t>h9t`&WGjMu2w;Y!!+k#l@A~+Zhod#>RKw6+%a& z#UsFj71pa-k$cn|23lJU0WYH!4m_XpF^?FBHfIeHpQ|E5AycT-Y~7GHffh=QZV%OY zGrYpu)mD758vp>}o#PrCftqpHA?Pk4$L55&1tkI9--Q&O^a@Uhf-z><0q|BoF5 zZH-yZa`&QYJP?+&0Z?vu&OLTY7km7}7##)y(oruhGqv}pCK6YVaNf%6{=n%n%M7!x zwl%OW+q$$IZSYTn+|SkZO2 zk*{O+JBr^cIa~ncA-91C``~K;{7^fk3e-~PLC_w5rVQ&DC|&qI1tU$4}}6EiFHn}k`VMFyorGM1+G6&52yPx$NWpURab%xcJ#6S?uC z{3hRo30&rcN$njRzR6^Q0_h-J$D?`Ae94lB@}{%fwP7KnY6HPJJ)UC0T10pt3@&uE z@os`Db;&#Am*P?Q*&99Ln5~cUI2L2Gh=&S=oX8(=C=Vm9&S^O)hAeM?e)(}AY>*%{ zkk+~{M~`j$Bdp7F8^!z0=t>S7;J)n1C!>qK;4U#YP*17AR|0bBI6+&mi)F{%gOlMV zSq*Y}hc=|=P{~qzO<+fNY9n}#nlvPDg%{(FC!ZnfSr%(FW~&zFW&?PH7KD7zRXT}S zU$>rU+Y)!kOZYxZVP=7a;>y>@Z*E<+jtpb|wtdI{s=AYbZBwTrnBY^%wxs#4bijsW z3JakZb&5{srz%*TG#Lm)3ioq^&tU}wEie>@rbUafh=(I5G3m+4^~M#n=j#gu&o_om z3jC!pG|A4&ekuQt#7KSw6UMORw8|^F(L>sjW0Pr-RUw!fr0IQD?vL0at4IBXVOWn2 zQZ^S%38@q=1A*NSN?-pJ+y$lQB$VqT?6bqVNe)o8=@{g7c$3oy@O13g*AZU|Vm@Ud zI2?0PrN82uX;pf^UYo4qWuCu_J)mwofkIK-uaMPYgell`sBA(XN)1(l^=p%JHj3ujq znKP~w-ik2p3dm42+RxFIjZY#WI=un1NI@^GBm2p5{u)g&7-@e?VK6P(zX9Sl;f>v( zejhyTnn4Pq4vIgC-;!CB{S+tLnzGbScPR10y2G^=>E+?auq5?2s`pSF#-3Cx8H|mx zdfzcJ+-<4TZ0~ZuqRzcF#hDjfz`-*rE0Q<(%gw2h$h#j&Nz7#c;C zWZ7{FhBJ~%nO3xbgcfi=mtwuq*Q`Z z?BgQ>e>S{bpuO71orO7G_R(z+EanY1vf?CXN_#hN;IC)|UhzjS60_9?`NBeF^$KIb z8=iGR$MgBU{U4@D$ad)fs9Kq(QAh8boNAr*xN6bErh{ebswrXIT0%~O@4In0f)oW= zDQ=dHC|YW(Phd{5gXdF-3hrgolpBYrokb-FObY}6zKt(J7Kpw{o zm7I~j?3v?iF0#ki2Z`dSkU^2brkJqcD>FL>768(;7uSv>X2#9k*Wz*!;)1&3!=Z+# zSe{OU{y*WFd2Je=wa`<#vYeHP;VUlwDoGz1kHzifkL-PSV8I@-+|ztRSg-zB{@Djj z1U>W)McP!X^A*b!^rk1m6X%B|@3#EfS6r-zX9*I6rvDKc;?%{q9QkN6qb&HBMn*ne zb3^_}{iS8D@GG7H_qF#eCbrJB_yu+HFM7ONBOP>r=B$ECtQEcCEHSEt7-@0xG*XDL zJrmsls&}N*!4{~K1JwMY*QV|dC#HfApE>0agu6-pE{d_DPt>TzXVF<_qb)rlS`_g8 zp~E~CtRuTLLu4JIg3+^PTvvMA|6sP6v1~N$PAPYM8C02Qbbor+;@6MFif|bR1dak9 zckYTtnw&#nS`bUAUemE8{%EIYbY0P`<~HA|n_0g~;W2BtEY%Ta)-_U4ziNAykM|Hy ztC@y~$OpY5{MezHCm9o*foP%n97=+!=^s*ZXrd&I;hFg+OfC^-c5i6`{7kM{13!3b zuGrbMks(#fAQ@nV%rCY8o{auLtck-I2UC*zSBz?_O2~>to2l(zkiz_%*YHe}tb-~Y z>TmswuBp4B&x=wXp8sLhTS_TEFY#lx(|HzZ{jC@7aS}2zIJm1$zX?DX(1#I7Y*Y8& zMx|6C=5m%lKDI%f;62tFQ@3J=LZHmjRB{l1M*`v_x4cx1r_K9@8M{B4+w~@AdB`LB zB6<04wSg@Ai!8gys(F6&k`h8lvyQDeT}9N@yNb9lUjtS>h#cNSWR-8~H2pyY85AEj z`PI|$9A1Vzu}eEopm6zQfn{~??Ym}TT!ceA^aq#J71vu1!I;Hbr~3avTwAb}tE+vt z$h9TZg&eZ1HJ39!C!c9j8z7!~y;pB|1wcC&UElR2{8Mz7HqTf7l)>JOrDnXv-7utY z=I2BZGfrkR5bJ8Qn8W{TTCjWMkidCa0_LM|{28pt7p0XMyjx9C#Spuw#$6$xEo~x!>f^1-8w= z!?yDjN#~(UMB&R zuQ2AnBaId|eOi#|rnpUgJeTop24c6}w!>I1-t$S-0M=)>N1w&XiL_;EbvYa#%d33* z&;Jr=*|9e`anRv+2p{_K4MEI>7^b1-GzAT^uZM8^wm!Hf@ul|=gMF3#>h?GT@F-Qv|@UK-XG6BS`iQN4vO%-NzDF% z#E*%^QFnEq`USVkw^zduSOMq=#~dErxM8oKAu2&+gioCpXtW?njj`xuP)96{yC10{MFfcy(GlO$m!p4jF3hsWy-KKctQueZ-ac9nxGrzCv}~Xp(|Di%WTb zhaFkmFlQD(>G-{i4>8)%YV%pEgP}<`QKF+JdtI|M48Ia6;P5MiJqojYgK_EBP5bW6 zVH%;nHE%5TLF=lz@fHnCAcBRi=zE*fdk%exPRf=zOgXMsu}`wUkP9+_z*@`p0KZ9< z_NCL6KbGy0-`QpQ9l|pOvyKH2U~0&MOrvAW&jSOz$T4=hj&4q1?d{|JeXS;&n{Z-b z*bx6NiJY?6q>_>d@PS6xds%iZ>boB5kU5PloJ*Ath^vY2rU_r80+ zwb*wSYB^Q+ACZ*Y1r{%eP$%LhK#Ku%6o z&k-J!l>XQ+^s9TRNe@3Jqu2SLxAHzG_2*|dg>T!-GM^<)KM{Ysz{mi1{FF5E;`@FP zFG1#TO)V*M^zp{%nf6j7hiKE3xeR6cF|XWpV{avQ>eX6$FLBzt5M%hUfoX9kJpDe$ zW2=*QT1S(0ig!Ds=z{S~+?)YAEbg3N;)Gei_#LdI#LD|xfwBn}EcLZH_2?PnidXwZ z-I!4l8@q8u5>%l2d0ht3Q8CH)E;+?ufwDT#TBQbCLr$WxhJRaNc~GL+uiVeii`jJo z>Aij0pl~G06b%q(223GcTY?umGAbq2i4)X?TVO%Xg+4M!*0yk1@AY(2Vv;uCyG69d zL7`d)^Ls58pr;oc3x59gtuwX~eniamPsDMDhQr>mIP3p#`LHC~O*b_6j02#wxiS`A(- zw*Y*uWqYQcOOlW!@sUs(@!Q{>1evPawv-@3ylk{i0t104_h0K$3!}yq;GMWQJHpt6 zFp1Cbx$xJBX)u4L-l%5%=JD~^-h|FpHHtJ#!xod9?b0iiov&KV4NE zLM|6AB@8t2VoXvYm-?O5I{)?i8wj^Q^yfQN2RqciqKIdUrCEzMLiyHRwZ^jUi3E!G z-t?O-OmG^ymVN_ANoX!#Ssaw5nEyIn9ik z41XaoZ`(}Fx0l1tJ=kpv{pAveTri3msEiZ;pPOHK9td!k6tU`^nnSqa0vW!Fz1tQ_ zaD2FSZFD`gn`_AT60-MrYvM#S_TF(MEk#2v4jDUWSat!-Ps^SI|HIaRHA>nkC50;q12`vxAQ7ZJ`|N0YZD?(dd62=c5A~JJx}C z)zm9UJdzH`=xQRs9`Hw&#ucUi@0>z~)DI-Md)99fd9;BOPpmqu|9u&Dh=FhBzn9S^ epS!kK)InG2nKVKyaoC9%IC&Wr=}M`u0sjwLPHYPR literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/assets/arrow_down.png b/mqtt/rootfs/app/assets/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..1a336d147631a343b349adfc6b5d7ba6f252da5f GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G>pWc?Ln>~)nVidcKtaT{H=)JV;FOX?qF_z}i?YN~j_!mO zU&q9b;6L{s#8&KoQrUOHm4m7AkHQ(Ab$3+LD!5~2>^!rAi}1B}lL?P7n#;lVQ8`>8HaV`3_+q<3IDm4knfE z@5&or3dwRt)bMimes{=m&_DhA;*)QeZwa25cK*1MKEsjcnNK?yY^GUXxFyIIaCk#x zpRV*GYp2GjY46n)rIoB7*-Y^ldvQFGV_i;0!?TXx0UsH>KJQ_edGkU;&}q+;oX^`! z%}Nv!em0~!C&?%}=$<}5c|rfPn-e13_bhicQ!!;>mT)_$A;H=#$-pAP;3A&hy>r?B RSwP1#c)I$ztaD0e0s!-)XP^K8 literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/assets/jquery.minicolors.png b/mqtt/rootfs/app/assets/jquery.minicolors.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa1e9d9062696b96641450a0b0dcc8669835782 GIT binary patch literal 77459 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

-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 JPDHLkV1o8UQl|g_ literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/assets/logo.png b/mqtt/rootfs/app/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a4dc0bea9756f3414d3acb9c8c200ef2c0be86 GIT binary patch literal 5386 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 literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/css/foundation.css b/mqtt/rootfs/app/css/foundation.css new file mode 100644 index 0000000..e434469 --- /dev/null +++ b/mqtt/rootfs/app/css/foundation.css @@ -0,0 +1,6442 @@ +*, +*:before, +*:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +html, +body { + font-size: 100%; +} + +body { + background: white; + color: #222222; + padding: 0; + margin: 0; + font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; + font-weight: normal; + font-style: normal; + line-height: 1; + position: relative; + cursor: default; +} + +a:hover { + cursor: pointer; +} + +a:focus { + outline: none; +} + +img, +object, +embed { + max-width: 100%; + height: auto; +} + +object, +embed { + height: 100%; +} + +img { + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +#map_canvas embed, +#map_canvas object, +.map_canvas img, +.map_canvas embed, +.map_canvas object { + max-width: none !important; +} + +.left { + float: left !important; +} + +.right { + float: right !important; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-justify { + text-align: justify !important; +} + +.hide { + display: none; +} + +.antialiased { + -webkit-font-smoothing: antialiased; +} + +img { + display: inline-block; + vertical-align: middle; +} + +textarea { + height: auto; + min-height: 50px; +} + +select { + width: 100%; +} + +/* Grid HTML Classes */ +.row { + width: 100%; + margin-left: auto; + margin-right: auto; + margin-top: 0; + margin-bottom: 0; + max-width: 62.5em; + *zoom: 1; +} + +.row:before, .row:after { + content: " "; + display: table; +} + +.row:after { + clear: both; +} + +.row.collapse .column, +.row.collapse .columns { + position: relative; + padding-left: 0; + padding-right: 0; + float: left; +} + +.row .row { + width: auto; + margin-left: -0.9375em; + margin-right: -0.9375em; + margin-top: 0; + margin-bottom: 0; + max-width: none; + *zoom: 1; +} + +.row .row:before, .row .row:after { + content: " "; + display: table; +} + +.row .row:after { + clear: both; +} + +.row .row.collapse { + width: auto; + margin: 0; + max-width: none; + *zoom: 1; +} + +.row .row.collapse:before, .row .row.collapse:after { + content: " "; + display: table; +} + +.row .row.collapse:after { + clear: both; +} + +.column, +.columns { + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; + width: 100%; + float: left; +} + +@media only screen { + .column, + .columns { + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; + float: left; + } + + .small-1 { + position: relative; + width: 8.33333%; + } + + .small-2 { + position: relative; + width: 16.66667%; + } + + .small-3 { + position: relative; + width: 25%; + } + + .small-4 { + position: relative; + width: 33.33333%; + } + + .small-5 { + position: relative; + width: 41.66667%; + } + + .small-6 { + position: relative; + width: 50%; + } + + .small-7 { + position: relative; + width: 58.33333%; + } + + .small-8 { + position: relative; + width: 66.66667%; + } + + .small-9 { + position: relative; + width: 75%; + } + + .small-10 { + position: relative; + width: 83.33333%; + } + + .small-11 { + position: relative; + width: 91.66667%; + } + + .small-12 { + position: relative; + width: 100%; + } + + .small-offset-0 { + position: relative; + margin-left: 0%; + } + + .small-offset-1 { + position: relative; + margin-left: 8.33333%; + } + + .small-offset-2 { + position: relative; + margin-left: 16.66667%; + } + + .small-offset-3 { + position: relative; + margin-left: 25%; + } + + .small-offset-4 { + position: relative; + margin-left: 33.33333%; + } + + .small-offset-5 { + position: relative; + margin-left: 41.66667%; + } + + .small-offset-6 { + position: relative; + margin-left: 50%; + } + + .small-offset-7 { + position: relative; + margin-left: 58.33333%; + } + + .small-offset-8 { + position: relative; + margin-left: 66.66667%; + } + + .small-offset-9 { + position: relative; + margin-left: 75%; + } + + .small-offset-10 { + position: relative; + margin-left: 83.33333%; + } + + [class*="column"] + [class*="column"]:last-child { + float: right; + } + + [class*="column"] + [class*="column"].end { + float: left; + } + + .column.small-centered, + .columns.small-centered { + position: relative; + margin-left: auto; + margin-right: auto; + float: none !important; + } +} + +/* Styles for screens that are atleast 768px; */ +@media only screen and (min-width: 768px) { + .large-1 { + position: relative; + width: 8.33333%; + } + + .large-2 { + position: relative; + width: 16.66667%; + } + + .large-3 { + position: relative; + width: 25%; + } + + .large-4 { + position: relative; + width: 33.33333%; + } + + .large-5 { + position: relative; + width: 41.66667%; + } + + .large-6 { + position: relative; + width: 50%; + } + + .large-7 { + position: relative; + width: 58.33333%; + } + + .large-8 { + position: relative; + width: 66.66667%; + } + + .large-9 { + position: relative; + width: 75%; + } + + .large-10 { + position: relative; + width: 83.33333%; + } + + .large-11 { + position: relative; + width: 91.66667%; + } + + .large-12 { + position: relative; + width: 100%; + } + + .row .large-offset-0 { + position: relative; + margin-left: 0%; + } + + .row .large-offset-1 { + position: relative; + margin-left: 8.33333%; + } + + .row .large-offset-2 { + position: relative; + margin-left: 16.66667%; + } + + .row .large-offset-3 { + position: relative; + margin-left: 25%; + } + + .row .large-offset-4 { + position: relative; + margin-left: 33.33333%; + } + + .row .large-offset-5 { + position: relative; + margin-left: 41.66667%; + } + + .row .large-offset-6 { + position: relative; + margin-left: 50%; + } + + .row .large-offset-7 { + position: relative; + margin-left: 58.33333%; + } + + .row .large-offset-8 { + position: relative; + margin-left: 66.66667%; + } + + .row .large-offset-9 { + position: relative; + margin-left: 75%; + } + + .row .large-offset-10 { + position: relative; + margin-left: 83.33333%; + } + + .row .large-offset-11 { + position: relative; + margin-left: 91.66667%; + } + + .push-1 { + position: relative; + left: 8.33333%; + right: auto; + } + + .pull-1 { + position: relative; + right: 8.33333%; + left: auto; + } + + .push-2 { + position: relative; + left: 16.66667%; + right: auto; + } + + .pull-2 { + position: relative; + right: 16.66667%; + left: auto; + } + + .push-3 { + position: relative; + left: 25%; + right: auto; + } + + .pull-3 { + position: relative; + right: 25%; + left: auto; + } + + .push-4 { + position: relative; + left: 33.33333%; + right: auto; + } + + .pull-4 { + position: relative; + right: 33.33333%; + left: auto; + } + + .push-5 { + position: relative; + left: 41.66667%; + right: auto; + } + + .pull-5 { + position: relative; + right: 41.66667%; + left: auto; + } + + .push-6 { + position: relative; + left: 50%; + right: auto; + } + + .pull-6 { + position: relative; + right: 50%; + left: auto; + } + + .push-7 { + position: relative; + left: 58.33333%; + right: auto; + } + + .pull-7 { + position: relative; + right: 58.33333%; + left: auto; + } + + .push-8 { + position: relative; + left: 66.66667%; + right: auto; + } + + .pull-8 { + position: relative; + right: 66.66667%; + left: auto; + } + + .push-9 { + position: relative; + left: 75%; + right: auto; + } + + .pull-9 { + position: relative; + right: 75%; + left: auto; + } + + .push-10 { + position: relative; + left: 83.33333%; + right: auto; + } + + .pull-10 { + position: relative; + right: 83.33333%; + left: auto; + } + + .push-11 { + position: relative; + left: 91.66667%; + right: auto; + } + + .pull-11 { + position: relative; + right: 91.66667%; + left: auto; + } + + .column.large-centered, + .columns.large-centered { + position: relative; + margin-left: auto; + margin-right: auto; + float: none !important; + } + + .column.large-uncentered, + .columns.large-uncentered { + margin-left: 0; + margin-right: 0; + float: left !important; + } + + .column.large-uncentered.opposite, + .columns.large-uncentered.opposite { + float: right !important; + } +} + +/* Foundation Visibility HTML Classes */ +.show-for-small, +.show-for-medium-down, +.show-for-large-down { + display: inherit !important; +} + +.show-for-medium, +.show-for-medium-up, +.show-for-large, +.show-for-large-up, +.show-for-xlarge { + display: none !important; +} + +.hide-for-medium, +.hide-for-medium-up, +.hide-for-large, +.hide-for-large-up, +.hide-for-xlarge { + display: inherit !important; +} + +.hide-for-small, +.hide-for-medium-down, +.hide-for-large-down { + display: none !important; +} + +/* Specific visilbity for tables */ +table.show-for-small, table.show-for-medium-down, table.show-for-large-down, table.hide-for-medium, table.hide-for-medium-up, table.hide-for-large, table.hide-for-large-up, table.hide-for-xlarge { + display: table; +} + +thead.show-for-small, thead.show-for-medium-down, thead.show-for-large-down, thead.hide-for-medium, thead.hide-for-medium-up, thead.hide-for-large, thead.hide-for-large-up, thead.hide-for-xlarge { + display: table-header-group !important; +} + +tbody.show-for-small, tbody.show-for-medium-down, tbody.show-for-large-down, tbody.hide-for-medium, tbody.hide-for-medium-up, tbody.hide-for-large, tbody.hide-for-large-up, tbody.hide-for-xlarge { + display: table-row-group !important; +} + +tr.show-for-small, tr.show-for-medium-down, tr.show-for-large-down, tr.hide-for-medium, tr.hide-for-medium-up, tr.hide-for-large, tr.hide-for-large-up, tr.hide-for-xlarge { + display: table-row !important; +} + +td.show-for-small, td.show-for-medium-down, td.show-for-large-down, td.hide-for-medium, td.hide-for-medium-up, td.hide-for-large, td.hide-for-large-up, td.hide-for-xlarge, +th.show-for-small, +th.show-for-medium-down, +th.show-for-large-down, +th.hide-for-medium, +th.hide-for-medium-up, +th.hide-for-large, +th.hide-for-large-up, +th.hide-for-xlarge { + display: table-cell !important; +} + +/* Medium Displays: 768px - 1279px */ +@media only screen and (min-width: 768px) { + .show-for-medium, + .show-for-medium-up { + display: inherit !important; + } + + .show-for-small { + display: none !important; + } + + .hide-for-small { + display: inherit !important; + } + + .hide-for-medium, + .hide-for-medium-up { + display: none !important; + } + + /* Specific visilbity for tables */ + table.show-for-medium, table.show-for-medium-up, table.hide-for-small { + display: table; + } + + thead.show-for-medium, thead.show-for-medium-up, thead.hide-for-small { + display: table-header-group !important; + } + + tbody.show-for-medium, tbody.show-for-medium-up, tbody.hide-for-small { + display: table-row-group !important; + } + + tr.show-for-medium, tr.show-for-medium-up, tr.hide-for-small { + display: table-row !important; + } + + td.show-for-medium, td.show-for-medium-up, td.hide-for-small, + th.show-for-medium, + th.show-for-medium-up, + th.hide-for-small { + display: table-cell !important; + } +} + +/* Large Displays: 1280px - 1440px */ +@media only screen and (min-width: 1280px) { + .show-for-large, + .show-for-large-up { + display: inherit !important; + } + + .show-for-medium, + .show-for-medium-down { + display: none !important; + } + + .hide-for-medium, + .hide-for-medium-down { + display: inherit !important; + } + + .hide-for-large, + .hide-for-large-up { + display: none !important; + } + + /* Specific visilbity for tables */ + table.show-for-large, table.show-for-large-up, table.hide-for-medium, table.hide-for-medium-down { + display: table; + } + + thead.show-for-large, thead.show-for-large-up, thead.hide-for-medium, thead.hide-for-medium-down { + display: table-header-group !important; + } + + tbody.show-for-large, tbody.show-for-large-up, tbody.hide-for-medium, tbody.hide-for-medium-down { + display: table-row-group !important; + } + + tr.show-for-large, tr.show-for-large-up, tr.hide-for-medium, tr.hide-for-medium-down { + display: table-row !important; + } + + td.show-for-large, td.show-for-large-up, td.hide-for-medium, td.hide-for-medium-down, + th.show-for-large, + th.show-for-large-up, + th.hide-for-medium, + th.hide-for-medium-down { + display: table-cell !important; + } +} + +/* X-Large Displays: 1400px and up */ +@media only screen and (min-width: 1440px) { + .show-for-xlarge { + display: inherit !important; + } + + .show-for-large, + .show-for-large-down { + display: none !important; + } + + .hide-for-large, + .hide-for-large-down { + display: inherit !important; + } + + .hide-for-xlarge { + display: none !important; + } + + /* Specific visilbity for tables */ + table.show-for-xlarge, table.hide-for-large, table.hide-for-large-down { + display: table; + } + + thead.show-for-xlarge, thead.hide-for-large, thead.hide-for-large-down { + display: table-header-group !important; + } + + tbody.show-for-xlarge, tbody.hide-for-large, tbody.hide-for-large-down { + display: table-row-group !important; + } + + tr.show-for-xlarge, tr.hide-for-large, tr.hide-for-large-down { + display: table-row !important; + } + + td.show-for-xlarge, td.hide-for-large, td.hide-for-large-down, + th.show-for-xlarge, + th.hide-for-large, + th.hide-for-large-down { + display: table-cell !important; + } +} + +/* Orientation targeting */ +.show-for-landscape, +.hide-for-portrait { + display: inherit !important; +} + +.hide-for-landscape, +.show-for-portrait { + display: none !important; +} + +/* Specific visilbity for tables */ +table.hide-for-landscape, table.show-for-portrait { + display: table; +} + +thead.hide-for-landscape, thead.show-for-portrait { + display: table-header-group !important; +} + +tbody.hide-for-landscape, tbody.show-for-portrait { + display: table-row-group !important; +} + +tr.hide-for-landscape, tr.show-for-portrait { + display: table-row !important; +} + +td.hide-for-landscape, td.show-for-portrait, +th.hide-for-landscape, +th.show-for-portrait { + display: table-cell !important; +} + +@media only screen and (orientation: landscape) { + .show-for-landscape, + .hide-for-portrait { + display: inherit !important; + } + + .hide-for-landscape, + .show-for-portrait { + display: none !important; + } + + /* Specific visilbity for tables */ + table.show-for-landscape, table.hide-for-portrait { + display: table; + } + + thead.show-for-landscape, thead.hide-for-portrait { + display: table-header-group !important; + } + + tbody.show-for-landscape, tbody.hide-for-portrait { + display: table-row-group !important; + } + + tr.show-for-landscape, tr.hide-for-portrait { + display: table-row !important; + } + + td.show-for-landscape, td.hide-for-portrait, + th.show-for-landscape, + th.hide-for-portrait { + display: table-cell !important; + } +} + +@media only screen and (orientation: portrait) { + .show-for-portrait, + .hide-for-landscape { + display: inherit !important; + } + + .hide-for-portrait, + .show-for-landscape { + display: none !important; + } + + /* Specific visilbity for tables */ + table.show-for-portrait, table.hide-for-landscape { + display: table; + } + + thead.show-for-portrait, thead.hide-for-landscape { + display: table-header-group !important; + } + + tbody.show-for-portrait, tbody.hide-for-landscape { + display: table-row-group !important; + } + + tr.show-for-portrait, tr.hide-for-landscape { + display: table-row !important; + } + + td.show-for-portrait, td.hide-for-landscape, + th.show-for-portrait, + th.hide-for-landscape { + display: table-cell !important; + } +} + +/* Touch-enabled device targeting */ +.show-for-touch { + display: none !important; +} + +.hide-for-touch { + display: inherit !important; +} + +.touch .show-for-touch { + display: inherit !important; +} + +.touch .hide-for-touch { + display: none !important; +} + +/* Specific visilbity for tables */ +table.hide-for-touch { + display: table; +} + +.touch table.show-for-touch { + display: table; +} + +thead.hide-for-touch { + display: table-header-group !important; +} + +.touch thead.show-for-touch { + display: table-header-group !important; +} + +tbody.hide-for-touch { + display: table-row-group !important; +} + +.touch tbody.show-for-touch { + display: table-row-group !important; +} + +tr.hide-for-touch { + display: table-row !important; +} + +.touch tr.show-for-touch { + display: table-row !important; +} + +td.hide-for-touch { + display: table-cell !important; +} + +.touch td.show-for-touch { + display: table-cell !important; +} + +th.hide-for-touch { + display: table-cell !important; +} + +.touch th.show-for-touch { + display: table-cell !important; +} + +/* Foundation Block Grids for below small breakpoint */ +@media only screen { + [class*="block-grid-"] { + display: block; + padding: 0; + margin: 0 -0.625em; + *zoom: 1; + } + + [class*="block-grid-"]:before, [class*="block-grid-"]:after { + content: " "; + display: table; + } + + [class*="block-grid-"]:after { + clear: both; + } + + [class*="block-grid-"] > li { + display: inline; + height: auto; + float: left; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-1 > li { + width: 100%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-1 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-1 > li:nth-of-type(1n+1) { + clear: both; + } + + .small-block-grid-2 > li { + width: 50%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-2 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-2 > li:nth-of-type(2n+1) { + clear: both; + } + + .small-block-grid-3 > li { + width: 33.33333%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-3 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-3 > li:nth-of-type(3n+1) { + clear: both; + } + + .small-block-grid-4 > li { + width: 25%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-4 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-4 > li:nth-of-type(4n+1) { + clear: both; + } + + .small-block-grid-5 > li { + width: 20%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-5 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-5 > li:nth-of-type(5n+1) { + clear: both; + } + + .small-block-grid-6 > li { + width: 16.66667%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-6 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-6 > li:nth-of-type(6n+1) { + clear: both; + } + + .small-block-grid-7 > li { + width: 14.28571%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-7 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-7 > li:nth-of-type(7n+1) { + clear: both; + } + + .small-block-grid-8 > li { + width: 12.5%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-8 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-8 > li:nth-of-type(8n+1) { + clear: both; + } + + .small-block-grid-9 > li { + width: 11.11111%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-9 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-9 > li:nth-of-type(9n+1) { + clear: both; + } + + .small-block-grid-10 > li { + width: 10%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-10 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-10 > li:nth-of-type(10n+1) { + clear: both; + } + + .small-block-grid-11 > li { + width: 9.09091%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-11 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-11 > li:nth-of-type(11n+1) { + clear: both; + } + + .small-block-grid-12 > li { + width: 8.33333%; + padding: 0 0.625em 1.25em; + } + + .small-block-grid-12 > li:nth-of-type(n) { + clear: none; + } + + .small-block-grid-12 > li:nth-of-type(12n+1) { + clear: both; + } +} + +/* Foundation Block Grids for above small breakpoint */ +@media only screen and (min-width: 768px) { + /* Remove small grid clearing */ + .small-block-grid-1 > li:nth-of-type(1n+1) { + clear: none; + } + + .small-block-grid-2 > li:nth-of-type(2n+1) { + clear: none; + } + + .small-block-grid-3 > li:nth-of-type(3n+1) { + clear: none; + } + + .small-block-grid-4 > li:nth-of-type(4n+1) { + clear: none; + } + + .small-block-grid-5 > li:nth-of-type(5n+1) { + clear: none; + } + + .small-block-grid-6 > li:nth-of-type(6n+1) { + clear: none; + } + + .small-block-grid-7 > li:nth-of-type(7n+1) { + clear: none; + } + + .small-block-grid-8 > li:nth-of-type(8n+1) { + clear: none; + } + + .small-block-grid-9 > li:nth-of-type(9n+1) { + clear: none; + } + + .small-block-grid-10 > li:nth-of-type(10n+1) { + clear: none; + } + + .small-block-grid-11 > li:nth-of-type(11n+1) { + clear: none; + } + + .small-block-grid-12 > li:nth-of-type(12n+1) { + clear: none; + } + + .large-block-grid-1 > li { + width: 100%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-1 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-1 > li:nth-of-type(1n+1) { + clear: both; + } + + .large-block-grid-2 > li { + width: 50%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-2 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-2 > li:nth-of-type(2n+1) { + clear: both; + } + + .large-block-grid-3 > li { + width: 33.33333%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-3 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-3 > li:nth-of-type(3n+1) { + clear: both; + } + + .large-block-grid-4 > li { + width: 25%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-4 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-4 > li:nth-of-type(4n+1) { + clear: both; + } + + .large-block-grid-5 > li { + width: 20%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-5 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-5 > li:nth-of-type(5n+1) { + clear: both; + } + + .large-block-grid-6 > li { + width: 16.66667%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-6 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-6 > li:nth-of-type(6n+1) { + clear: both; + } + + .large-block-grid-7 > li { + width: 14.28571%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-7 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-7 > li:nth-of-type(7n+1) { + clear: both; + } + + .large-block-grid-8 > li { + width: 12.5%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-8 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-8 > li:nth-of-type(8n+1) { + clear: both; + } + + .large-block-grid-9 > li { + width: 11.11111%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-9 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-9 > li:nth-of-type(9n+1) { + clear: both; + } + + .large-block-grid-10 > li { + width: 10%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-10 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-10 > li:nth-of-type(10n+1) { + clear: both; + } + + .large-block-grid-11 > li { + width: 9.09091%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-11 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-11 > li:nth-of-type(11n+1) { + clear: both; + } + + .large-block-grid-12 > li { + width: 8.33333%; + padding: 0 0.625em 1.25em; + } + + .large-block-grid-12 > li:nth-of-type(n) { + clear: none; + } + + .large-block-grid-12 > li:nth-of-type(12n+1) { + clear: both; + } +} + +p.lead { + font-size: 1.21875em; + line-height: 1.6; +} + +.subheader { + line-height: 1.4; + color: #6f6f6f; + font-weight: 300; + margin-top: 0.2em; + margin-bottom: 0.5em; +} + +/* Typography resets */ +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +form, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; + direction: ltr; +} + +/* Default Link Styles */ +a { + color: #2ba6cb; + text-decoration: none; + line-height: inherit; +} + +a:hover, a:focus { + color: #2795b6; +} + +a img { + border: none; +} + +/* Default paragraph styles */ +p { + font-family: inherit; + font-weight: normal; + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + text-rendering: optimizeLegibility; +} + +p aside { + font-size: 0.875em; + line-height: 1.35; + font-style: italic; +} + +/* Default header styles */ +h1, h2, h3, h4, h5, h6 { + font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; + font-weight: bold; + font-style: normal; + color: #222222; + text-rendering: optimizeLegibility; + margin-top: 0.2em; + margin-bottom: 0.5em; + line-height: 1.2125em; +} + +h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { + font-size: 60%; + color: #6f6f6f; + line-height: 0; +} + +h1 { + font-size: 2.125em; +} + +h2 { + font-size: 1.6875em; +} + +h3 { + font-size: 1.375em; +} + +h4 { + font-size: 1.125em; +} + +h5 { + font-size: 1.125em; +} + +h6 { + font-size: 1em; +} + +hr { + border: solid #dddddd; + border-width: 1px 0 0; + clear: both; + margin: 1.25em 0 1.1875em; + height: 0; +} + +/* Helpful Typography Defaults */ +em, +i { + font-style: italic; + line-height: inherit; +} + +strong, +b { + font-weight: bold; + line-height: inherit; +} + +small { + font-size: 60%; + line-height: inherit; +} + +code { + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: bold; + color: #7f0a0c; +} + +/* Lists */ +ul, +ol, +dl { + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + list-style-position: outside; + font-family: inherit; +} + +ul, ol { + margin-left: 0; +} + +/* Unordered Lists */ +ul li ul, +ul li ol { + margin-left: 1.25em; + margin-bottom: 0; + font-size: 1em; + /* Override nested font-size change */ +} + +ul.square li ul, ul.circle li ul, ul.disc li ul { + list-style: inherit; +} + +ul.square { + list-style-type: square; +} + +ul.circle { + list-style-type: circle; +} + +ul.disc { + list-style-type: disc; +} + +ul.no-bullet { + list-style: none; +} + +/* Ordered Lists */ +ol li ul, +ol li ol { + margin-left: 1.25em; + margin-bottom: 0; +} + +/* Definition Lists */ +dl dt { + margin-bottom: 0.3em; + font-weight: bold; +} + +dl dd { + margin-bottom: 0.75em; +} + +/* Abbreviations */ +abbr, +acronym { + text-transform: uppercase; + font-size: 90%; + color: #222222; + border-bottom: 1px dotted #dddddd; + cursor: help; +} + +abbr { + text-transform: none; +} + +/* Blockquotes */ +blockquote { + margin: 0 0 1.25em; + padding: 0.5625em 1.25em 0 1.1875em; + border-left: 1px solid #dddddd; +} + +blockquote cite { + display: block; + font-size: 0.8125em; + color: #555555; +} + +blockquote cite:before { + content: "\2014 \0020"; +} + +blockquote cite a, +blockquote cite a:visited { + color: #555555; +} + +blockquote, +blockquote p { + line-height: 1.6; + color: #6f6f6f; +} + +/* Microformats */ +.vcard { + display: inline-block; + margin: 0 0 1.25em 0; + border: 1px solid #dddddd; + padding: 0.625em 0.75em; +} + +.vcard li { + margin: 0; + display: block; +} + +.vcard .fn { + font-weight: bold; + font-size: 0.9375em; +} + +.vevent .summary { + font-weight: bold; +} + +.vevent abbr { + cursor: default; + text-decoration: none; + font-weight: bold; + border: none; + padding: 0 0.0625em; +} + +@media only screen and (min-width: 768px) { + h1, h2, h3, h4, h5, h6 { + line-height: 1.4; + } + + h1 { + font-size: 2.75em; + } + + h2 { + font-size: 2.3125em; + } + + h3 { + font-size: 1.6875em; + } + + h4 { + font-size: 1.4375em; + } +} + +/* + * Print styles. + * + * Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/ + * Credit to Paul Irish and HTML5 Boilerplate (html5boilerplate.com) +*/ +.print-only { + display: none !important; +} + +@media print { + * { + background: transparent !important; + color: black !important; + /* Black prints faster: h5bp.com/s */ + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + /* h5bp.com/t */ + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + .hide-on-print { + display: none !important; + } + + .print-only { + display: block !important; + } + + .hide-for-print { + display: none !important; + } + + .show-for-print { + display: inherit !important; + } +} + +button, .button { + border-style: solid; + border-width: 1px; + cursor: pointer; + font-family: inherit; + font-weight: bold; + line-height: 1; + margin: 0 0 1.25em; + position: relative; + text-decoration: none; + text-align: center; + display: inline-block; + padding-top: 0.75em; + padding-right: 1.5em; + padding-bottom: 0.8125em; + padding-left: 1.5em; + font-size: 1em; + background-color: #2ba6cb; + border-color: #2284a1; + color: white; +} + +button:hover, button:focus, .button:hover, .button:focus { + background-color: #2284a1; +} + +button:hover, button:focus, .button:hover, .button:focus { + color: white; +} + +button.secondary, .button.secondary { + background-color: #e9e9e9; + border-color: #d0d0d0; + color: #333333; +} + +button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus { + background-color: #d0d0d0; +} + +button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus { + color: #333333; +} + +button.success, .button.success { + background-color: #5da423; + border-color: #457a1a; + color: white; +} + +button.success:hover, button.success:focus, .button.success:hover, .button.success:focus { + background-color: #457a1a; +} + +button.success:hover, button.success:focus, .button.success:hover, .button.success:focus { + color: white; +} + +button.alert, .button.alert { + background-color: #c60f13; + border-color: #970b0e; + color: white; +} + +button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus { + background-color: #970b0e; +} + +button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus { + color: white; +} + +button.large, .button.large { + padding-top: 1em; + padding-right: 2em; + padding-bottom: 1.0625em; + padding-left: 2em; + font-size: 1.25em; +} + +button.small, .button.small { + padding-top: 0.5625em; + padding-right: 1.125em; + padding-bottom: 0.625em; + padding-left: 1.125em; + font-size: 0.8125em; +} + +button.tiny, .button.tiny { + padding-top: 0.4375em; + padding-right: 0.875em; + padding-bottom: 0.5em; + padding-left: 0.875em; + font-size: 0.6875em; +} + +button.expand, .button.expand { + padding-right: 0px; + padding-left: 0px; + width: 100%; +} + +button.left-align, .button.left-align { + text-align: left; + text-indent: 0.75em; +} + +button.right-align, .button.right-align { + text-align: right; + padding-right: 0.75em; +} + +button.disabled, button[disabled], .button.disabled, .button[disabled] { + background-color: #2ba6cb; + border-color: #2284a1; + color: white; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none; +} + +button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { + background-color: #2284a1; +} + +button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { + color: white; +} + +button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { + background-color: #2ba6cb; +} + +button.disabled.secondary, button[disabled].secondary, .button.disabled.secondary, .button[disabled].secondary { + background-color: #e9e9e9; + border-color: #d0d0d0; + color: #333333; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none; +} + +button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + background-color: #d0d0d0; +} + +button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + color: #333333; +} + +button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + background-color: #e9e9e9; +} + +button.disabled.success, button[disabled].success, .button.disabled.success, .button[disabled].success { + background-color: #5da423; + border-color: #457a1a; + color: white; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none; +} + +button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { + background-color: #457a1a; +} + +button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { + color: white; +} + +button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { + background-color: #5da423; +} + +button.disabled.alert, button[disabled].alert, .button.disabled.alert, .button[disabled].alert { + background-color: #c60f13; + border-color: #970b0e; + color: white; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none; +} + +button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { + background-color: #970b0e; +} + +button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { + color: white; +} + +button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { + background-color: #c60f13; +} + +button, .button { + padding-top: 0.8125em; + padding-bottom: 0.75em; + -webkit-appearance: none; +} + +button.tiny, .button.tiny { + padding-top: 0.5em; + padding-bottom: 0.4375em; + -webkit-appearance: none; +} + +button.small, .button.small { + padding-top: 0.625em; + padding-bottom: 0.5625em; + -webkit-appearance: none; +} + +button.large, .button.large { + padding-top: 1.03125em; + padding-bottom: 1.03125em; + -webkit-appearance: none; +} + +@media only screen { + button, .button { + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset; + -webkit-transition: background-color 300ms ease-out; + -moz-transition: background-color 300ms ease-out; + transition: background-color 300ms ease-out; + } + + button:active, .button:active { + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2) inset; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2) inset; + } + + button.radius, .button.radius { + -webkit-border-radius: 3px; + border-radius: 3px; + } + + button.round, .button.round { + -webkit-border-radius: 1000px; + border-radius: 1000px; + } +} + +@media only screen and (min-width: 768px) { + button, .button { + display: inline-block; + } +} + +/* Standard Forms */ +form { + margin: 0 0 1em; +} + +/* Using forms within rows, we need to set some defaults */ +form .row .row { + margin: 0 -0.5em; +} + +form .row .row .column, +form .row .row .columns { + padding: 0 0.5em; +} + +form .row .row.collapse { + margin: 0; +} + +form .row .row.collapse .column, +form .row .row.collapse .columns { + padding: 0; +} + +form .row input.column, +form .row input.columns, +form .row textarea.column, +form .row textarea.columns { + padding-left: 0.5em; +} + +/* Label Styles */ +label { + font-size: 0.875em; + color: #4d4d4d; + cursor: pointer; + display: block; + font-weight: 500; + margin-bottom: 0.1875em; + /* Styles for required inputs */ +} + +label.right { + float: none; + text-align: right; +} + +label.inline { + margin: 0 0 1em 0; + padding: 0.625em 0; +} + +label small { + text-transform: capitalize; + color: #666666; +} + +/* Attach elements to the beginning or end of an input */ +.prefix, +.postfix { + display: block; + position: relative; + z-index: 2; + text-align: center; + width: 100%; + padding-top: 0; + padding-bottom: 0; + border-style: solid; + border-width: 1px; + overflow: hidden; + font-size: 0.875em; + height: 2.3125em; + line-height: 2.3125em; +} + +/* Adjust padding, alignment and radius if pre/post element is a button */ +.postfix.button { + padding-left: 0; + padding-right: 0; + padding-top: 0; + padding-bottom: 0; + text-align: center; + line-height: 2.125em; +} + +.prefix.button { + padding-left: 0; + padding-right: 0; + padding-top: 0; + padding-bottom: 0; + text-align: center; + line-height: 2.125em; +} + +.prefix.button.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.postfix.button.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.prefix.button.round { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-bottomleft: 1000px; + -moz-border-radius-topleft: 1000px; + -webkit-border-bottom-left-radius: 1000px; + -webkit-border-top-left-radius: 1000px; + border-bottom-left-radius: 1000px; + border-top-left-radius: 1000px; +} + +.postfix.button.round { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px; +} + +/* Separate prefix and postfix styles when on span or label so buttons keep their own */ +span.prefix, label.prefix { + background: #f2f2f2; + border-color: #d9d9d9; + border-right: none; + color: #333333; +} + +span.prefix.radius, label.prefix.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +span.postfix, label.postfix { + background: #f2f2f2; + border-color: #cccccc; + border-left: none; + color: #333333; +} + +span.postfix.radius, label.postfix.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +/* Input groups will automatically style first and last elements of the group */ +.input-group.radius > *:first-child, .input-group.radius > *:first-child * { + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.input-group.radius > *:last-child, .input-group.radius > *:last-child * { + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.input-group.round > *:first-child, .input-group.round > *:first-child * { + -moz-border-radius-bottomleft: 1000px; + -moz-border-radius-topleft: 1000px; + -webkit-border-bottom-left-radius: 1000px; + -webkit-border-top-left-radius: 1000px; + border-bottom-left-radius: 1000px; + border-top-left-radius: 1000px; +} + +.input-group.round > *:last-child, .input-group.round > *:last-child * { + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px; +} + +/* We use this to get basic styling on all basic form elements */ +input[type="text"], +input[type="password"], +input[type="date"], +input[type="datetime"], +input[type="datetime-local"], +input[type="month"], +input[type="week"], +input[type="email"], +input[type="number"], +input[type="search"], +input[type="tel"], +input[type="time"], +input[type="url"], +textarea { + background-color: white; + font-family: inherit; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + color: rgba(0, 0, 0, 0.75); + display: block; + font-size: 0.875em; + margin: 0 0 1em 0; + padding: 0.5em; + height: 2.3125em; + width: 100%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: -webkit-box-shadow 0.45s, border-color 0.45s ease-in-out; + -moz-transition: -moz-box-shadow 0.45s, border-color 0.45s ease-in-out; + transition: box-shadow 0.45s, border-color 0.45s ease-in-out; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="month"]:focus, +input[type="week"]:focus, +input[type="email"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="time"]:focus, +input[type="url"]:focus, +textarea:focus { + -webkit-box-shadow: 0 0 5px #999999; + -moz-box-shadow: 0 0 5px #999999; + box-shadow: 0 0 5px #999999; + border-color: #999999; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="month"]:focus, +input[type="week"]:focus, +input[type="email"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="time"]:focus, +input[type="url"]:focus, +textarea:focus { + background: #fafafa; + border-color: #999999; + outline: none; +} + +input[type="text"][disabled], +input[type="password"][disabled], +input[type="date"][disabled], +input[type="datetime"][disabled], +input[type="datetime-local"][disabled], +input[type="month"][disabled], +input[type="week"][disabled], +input[type="email"][disabled], +input[type="number"][disabled], +input[type="search"][disabled], +input[type="tel"][disabled], +input[type="time"][disabled], +input[type="url"][disabled], +textarea[disabled] { + background-color: #dddddd; +} + +/* Adjust margin for form elements below */ +input[type="file"], +input[type="checkbox"], +input[type="radio"], +select { + margin: 8px 40px 1em; +} + +/* Normalize file input width */ +input[type="file"] { + width: 100%; +} + +/* We add basic fieldset styling */ +fieldset { + border: solid 1px #dddddd; + padding: 1.25em; + margin: 1.125em 0; +} + +fieldset legend { + font-weight: bold; + background: white; + padding: 0 0.1875em; + margin: 0; + margin-left: -0.1875em; +} + +/* Error Handling */ +[data-abide] .error small.error, [data-abide] span.error, [data-abide] small.error { + display: block; + padding: 0.375em 0.25em; + margin-top: -1.3125em; + margin-bottom: 1em; + font-size: 0.75em; + font-weight: bold; + background: #c60f13; + color: white; + margin-top: 0; +} + +[data-abide] span.error, [data-abide] small.error { + display: none; +} + +span.error, small.error { + display: block; + padding: 0.375em 0.25em; + margin-top: -1.3125em; + margin-bottom: 1em; + font-size: 0.75em; + font-weight: bold; + background: #c60f13; + color: white; +} + +.error input, +.error textarea, +.error select { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1); + margin-bottom: 0; +} + +.error input:focus, +.error textarea:focus, +.error select:focus { + background: #fafafa; + border-color: #999999; +} + +.error label, +.error label.error { + color: #c60f13; +} + +.error small.error { + display: block; + padding: 0.375em 0.25em; + margin-top: -1.3125em; + margin-bottom: 1em; + font-size: 0.75em; + font-weight: bold; + background: #c60f13; + color: white; +} + +.error span.error-message { + display: block; +} + +input.error, +textarea.error { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1); +} + +input.error:focus, +textarea.error:focus { + background: #fafafa; + border-color: #999999; +} + +.error select { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1); +} + +.error select:focus { + background: #fafafa; + border-color: #999999; +} + +label.error { + color: #c60f13; +} + +/* Button Groups */ +.button-group { + list-style: none; + margin: 0; + *zoom: 1; +} + +.button-group:before, .button-group:after { + content: " "; + display: table; +} + +.button-group:after { + clear: both; +} + +.button-group > * { + margin: 0 0 0 -1px; + float: left; +} + +.button-group > *:first-child { + margin-left: 0; +} + +.button-group.radius > *:first-child, .button-group.radius > *:first-child > a, .button-group.radius > *:first-child > button, .button-group.radius > *:first-child > .button { + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.button-group.radius > *:last-child, .button-group.radius > *:last-child > a, .button-group.radius > *:last-child > button, .button-group.radius > *:last-child > .button { + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.button-group.round > *:first-child, .button-group.round > *:first-child > a, .button-group.round > *:first-child > button, .button-group.round > *:first-child > .button { + -moz-border-radius-bottomleft: 1000px; + -moz-border-radius-topleft: 1000px; + -webkit-border-bottom-left-radius: 1000px; + -webkit-border-top-left-radius: 1000px; + border-bottom-left-radius: 1000px; + border-top-left-radius: 1000px; +} + +.button-group.round > *:last-child, .button-group.round > *:last-child > a, .button-group.round > *:last-child > button, .button-group.round > *:last-child > .button { + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px; +} + +.button-group.even-2 li { + width: 50%; +} + +.button-group.even-2 li button, .button-group.even-2 li .button { + width: 100%; +} + +.button-group.even-3 li { + width: 33.33333%; +} + +.button-group.even-3 li button, .button-group.even-3 li .button { + width: 100%; +} + +.button-group.even-4 li { + width: 25%; +} + +.button-group.even-4 li button, .button-group.even-4 li .button { + width: 100%; +} + +.button-group.even-5 li { + width: 20%; +} + +.button-group.even-5 li button, .button-group.even-5 li .button { + width: 100%; +} + +.button-group.even-6 li { + width: 16.66667%; +} + +.button-group.even-6 li button, .button-group.even-6 li .button { + width: 100%; +} + +.button-group.even-7 li { + width: 14.28571%; +} + +.button-group.even-7 li button, .button-group.even-7 li .button { + width: 100%; +} + +.button-group.even-8 li { + width: 12.5%; +} + +.button-group.even-8 li button, .button-group.even-8 li .button { + width: 100%; +} + +.button-bar { + *zoom: 1; +} + +.button-bar:before, .button-bar:after { + content: " "; + display: table; +} + +.button-bar:after { + clear: both; +} + +.button-bar .button-group { + float: left; + margin-right: 0.625em; +} + +.button-bar .button-group div { + overflow: hidden; +} + +/* Dropdown Button */ +.dropdown.button { + position: relative; + padding-right: 3.1875em; +} + +.dropdown.button:before { + position: absolute; + content: ""; + width: 0; + height: 0; + display: block; + border-style: solid; + border-color: white transparent transparent transparent; + top: 50%; +} + +.dropdown.button:before { + border-width: 0.5625em; + right: 1.5em; + margin-top: -0.25em; +} + +.dropdown.button:before { + border-color: white transparent transparent transparent; +} + +.dropdown.button.tiny { + padding-right: 2.1875em; +} + +.dropdown.button.tiny:before { + border-width: 0.4375em; + right: 0.875em; + margin-top: -0.15625em; +} + +.dropdown.button.tiny:before { + border-color: white transparent transparent transparent; +} + +.dropdown.button.small { + padding-right: 2.8125em; +} + +.dropdown.button.small:before { + border-width: 0.5625em; + right: 1.125em; + margin-top: -0.21875em; +} + +.dropdown.button.small:before { + border-color: white transparent transparent transparent; +} + +.dropdown.button.large { + padding-right: 4em; +} + +.dropdown.button.large:before { + border-width: 0.625em; + right: 1.75em; + margin-top: -0.3125em; +} + +.dropdown.button.large:before { + border-color: white transparent transparent transparent; +} + +.dropdown.button.secondary:before { + border-color: #333333 transparent transparent transparent; +} + +/* Split Buttons */ +.split.button { + position: relative; + padding-right: 4.8em; +} + +.split.button span { + display: block; + height: 100%; + position: absolute; + right: 0; + top: 0; + border-left: solid 1px; +} + +.split.button span:before { + position: absolute; + content: ""; + width: 0; + height: 0; + display: block; + border-style: inset; + left: 50%; +} + +.split.button span:active { + background-color: rgba(0, 0, 0, 0.1); +} + +.split.button span { + border-left-color: #1e728c; +} + +.split.button span { + width: 3em; +} + +.split.button span:before { + border-top-style: solid; + border-width: 0.5625em; + top: 1.125em; + margin-left: -0.5625em; +} + +.split.button span:before { + border-color: white transparent transparent transparent; +} + +.split.button.secondary span { + border-left-color: #c3c3c3; +} + +.split.button.secondary span:before { + border-color: white transparent transparent transparent; +} + +.split.button.alert span { + border-left-color: #7f0a0c; +} + +.split.button.success span { + border-left-color: #396516; +} + +.split.button.tiny { + padding-right: 3.9375em; +} + +.split.button.tiny span { + width: 2.84375em; +} + +.split.button.tiny span:before { + border-top-style: solid; + border-width: 0.4375em; + top: 0.875em; + margin-left: -0.3125em; +} + +.split.button.small { + padding-right: 3.9375em; +} + +.split.button.small span { + width: 2.8125em; +} + +.split.button.small span:before { + border-top-style: solid; + border-width: 0.5625em; + top: 0.84375em; + margin-left: -0.5625em; +} + +.split.button.large { + padding-right: 6em; +} + +.split.button.large span { + width: 3.75em; +} + +.split.button.large span:before { + border-top-style: solid; + border-width: 0.625em; + top: 1.3125em; + margin-left: -0.5625em; +} + +.split.button.expand { + padding-left: 2em; +} + +.split.button.secondary span:before { + border-color: #333333 transparent transparent transparent; +} + +.split.button.radius span { + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.split.button.round span { + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px; +} + +/* Flex Video */ +.flex-video { + position: relative; + padding-top: 1.5625em; + padding-bottom: 67.5%; + height: 0; + margin-bottom: 1em; + overflow: hidden; +} + +.flex-video.widescreen { + padding-bottom: 57.25%; +} + +.flex-video.vimeo { + padding-top: 0; +} + +.flex-video iframe, +.flex-video object, +.flex-video embed, +.flex-video video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +/* Sections */ +[data-section=''], [data-section='auto'], .section-container.auto, +[data-section='vertical-tabs'], .section-container.vertical-tabs, +[data-section='vertical-nav'], .section-container.vertical-nav, +[data-section='horizontal-nav'], .section-container.horizontal-nav, +[data-section='accordion'], .section-container.accordion { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em; +} + +[data-section=''][data-section-small-style], [data-section='auto'][data-section-small-style], .section-container.auto[data-section-small-style], +[data-section='vertical-tabs'][data-section-small-style], .section-container.vertical-tabs[data-section-small-style], +[data-section='vertical-nav'][data-section-small-style], .section-container.vertical-nav[data-section-small-style], +[data-section='horizontal-nav'][data-section-small-style], .section-container.horizontal-nav[data-section-small-style], +[data-section='accordion'][data-section-small-style], .section-container.accordion[data-section-small-style] { + width: 100% !important; +} + +[data-section=''][data-section-small-style] > [data-section-region], [data-section=''][data-section-small-style] > section, [data-section=''][data-section-small-style] > .section, [data-section='auto'][data-section-small-style] > [data-section-region], [data-section='auto'][data-section-small-style] > section, [data-section='auto'][data-section-small-style] > .section, .section-container.auto[data-section-small-style] > [data-section-region], .section-container.auto[data-section-small-style] > section, .section-container.auto[data-section-small-style] > .section, +[data-section='vertical-tabs'][data-section-small-style] > [data-section-region], +[data-section='vertical-tabs'][data-section-small-style] > section, +[data-section='vertical-tabs'][data-section-small-style] > .section, .section-container.vertical-tabs[data-section-small-style] > [data-section-region], .section-container.vertical-tabs[data-section-small-style] > section, .section-container.vertical-tabs[data-section-small-style] > .section, +[data-section='vertical-nav'][data-section-small-style] > [data-section-region], +[data-section='vertical-nav'][data-section-small-style] > section, +[data-section='vertical-nav'][data-section-small-style] > .section, .section-container.vertical-nav[data-section-small-style] > [data-section-region], .section-container.vertical-nav[data-section-small-style] > section, .section-container.vertical-nav[data-section-small-style] > .section, +[data-section='horizontal-nav'][data-section-small-style] > [data-section-region], +[data-section='horizontal-nav'][data-section-small-style] > section, +[data-section='horizontal-nav'][data-section-small-style] > .section, .section-container.horizontal-nav[data-section-small-style] > [data-section-region], .section-container.horizontal-nav[data-section-small-style] > section, .section-container.horizontal-nav[data-section-small-style] > .section, +[data-section='accordion'][data-section-small-style] > [data-section-region], +[data-section='accordion'][data-section-small-style] > section, +[data-section='accordion'][data-section-small-style] > .section, .section-container.accordion[data-section-small-style] > [data-section-region], .section-container.accordion[data-section-small-style] > section, .section-container.accordion[data-section-small-style] > .section { + padding: 0 !important; + margin: 0 !important; +} + +[data-section=''][data-section-small-style] > [data-section-region] > [data-section-title], [data-section=''][data-section-small-style] > [data-section-region] > .title, [data-section=''][data-section-small-style] > section > [data-section-title], [data-section=''][data-section-small-style] > section > .title, [data-section=''][data-section-small-style] > .section > [data-section-title], [data-section=''][data-section-small-style] > .section > .title, [data-section='auto'][data-section-small-style] > [data-section-region] > [data-section-title], [data-section='auto'][data-section-small-style] > [data-section-region] > .title, [data-section='auto'][data-section-small-style] > section > [data-section-title], [data-section='auto'][data-section-small-style] > section > .title, [data-section='auto'][data-section-small-style] > .section > [data-section-title], [data-section='auto'][data-section-small-style] > .section > .title, .section-container.auto[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.auto[data-section-small-style] > [data-section-region] > .title, .section-container.auto[data-section-small-style] > section > [data-section-title], .section-container.auto[data-section-small-style] > section > .title, .section-container.auto[data-section-small-style] > .section > [data-section-title], .section-container.auto[data-section-small-style] > .section > .title, +[data-section='vertical-tabs'][data-section-small-style] > [data-section-region] > [data-section-title], +[data-section='vertical-tabs'][data-section-small-style] > [data-section-region] > .title, +[data-section='vertical-tabs'][data-section-small-style] > section > [data-section-title], +[data-section='vertical-tabs'][data-section-small-style] > section > .title, +[data-section='vertical-tabs'][data-section-small-style] > .section > [data-section-title], +[data-section='vertical-tabs'][data-section-small-style] > .section > .title, .section-container.vertical-tabs[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.vertical-tabs[data-section-small-style] > [data-section-region] > .title, .section-container.vertical-tabs[data-section-small-style] > section > [data-section-title], .section-container.vertical-tabs[data-section-small-style] > section > .title, .section-container.vertical-tabs[data-section-small-style] > .section > [data-section-title], .section-container.vertical-tabs[data-section-small-style] > .section > .title, +[data-section='vertical-nav'][data-section-small-style] > [data-section-region] > [data-section-title], +[data-section='vertical-nav'][data-section-small-style] > [data-section-region] > .title, +[data-section='vertical-nav'][data-section-small-style] > section > [data-section-title], +[data-section='vertical-nav'][data-section-small-style] > section > .title, +[data-section='vertical-nav'][data-section-small-style] > .section > [data-section-title], +[data-section='vertical-nav'][data-section-small-style] > .section > .title, .section-container.vertical-nav[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.vertical-nav[data-section-small-style] > [data-section-region] > .title, .section-container.vertical-nav[data-section-small-style] > section > [data-section-title], .section-container.vertical-nav[data-section-small-style] > section > .title, .section-container.vertical-nav[data-section-small-style] > .section > [data-section-title], .section-container.vertical-nav[data-section-small-style] > .section > .title, +[data-section='horizontal-nav'][data-section-small-style] > [data-section-region] > [data-section-title], +[data-section='horizontal-nav'][data-section-small-style] > [data-section-region] > .title, +[data-section='horizontal-nav'][data-section-small-style] > section > [data-section-title], +[data-section='horizontal-nav'][data-section-small-style] > section > .title, +[data-section='horizontal-nav'][data-section-small-style] > .section > [data-section-title], +[data-section='horizontal-nav'][data-section-small-style] > .section > .title, .section-container.horizontal-nav[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.horizontal-nav[data-section-small-style] > [data-section-region] > .title, .section-container.horizontal-nav[data-section-small-style] > section > [data-section-title], .section-container.horizontal-nav[data-section-small-style] > section > .title, .section-container.horizontal-nav[data-section-small-style] > .section > [data-section-title], .section-container.horizontal-nav[data-section-small-style] > .section > .title, +[data-section='accordion'][data-section-small-style] > [data-section-region] > [data-section-title], +[data-section='accordion'][data-section-small-style] > [data-section-region] > .title, +[data-section='accordion'][data-section-small-style] > section > [data-section-title], +[data-section='accordion'][data-section-small-style] > section > .title, +[data-section='accordion'][data-section-small-style] > .section > [data-section-title], +[data-section='accordion'][data-section-small-style] > .section > .title, .section-container.accordion[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.accordion[data-section-small-style] > [data-section-region] > .title, .section-container.accordion[data-section-small-style] > section > [data-section-title], .section-container.accordion[data-section-small-style] > section > .title, .section-container.accordion[data-section-small-style] > .section > [data-section-title], .section-container.accordion[data-section-small-style] > .section > .title { + width: 100% !important; +} + +[data-section=''] > section, [data-section=''] > .section, [data-section=''] > [data-section-region], [data-section='auto'] > section, [data-section='auto'] > .section, [data-section='auto'] > [data-section-region], .section-container.auto > section, .section-container.auto > .section, .section-container.auto > [data-section-region], +[data-section='vertical-tabs'] > section, +[data-section='vertical-tabs'] > .section, +[data-section='vertical-tabs'] > [data-section-region], .section-container.vertical-tabs > section, .section-container.vertical-tabs > .section, .section-container.vertical-tabs > [data-section-region], +[data-section='vertical-nav'] > section, +[data-section='vertical-nav'] > .section, +[data-section='vertical-nav'] > [data-section-region], .section-container.vertical-nav > section, .section-container.vertical-nav > .section, .section-container.vertical-nav > [data-section-region], +[data-section='horizontal-nav'] > section, +[data-section='horizontal-nav'] > .section, +[data-section='horizontal-nav'] > [data-section-region], .section-container.horizontal-nav > section, .section-container.horizontal-nav > .section, .section-container.horizontal-nav > [data-section-region], +[data-section='accordion'] > section, +[data-section='accordion'] > .section, +[data-section='accordion'] > [data-section-region], .section-container.accordion > section, .section-container.accordion > .section, .section-container.accordion > [data-section-region] { + margin: 0; +} + +[data-section=''] > section > [data-section-title], [data-section=''] > section > .title, [data-section=''] > .section > [data-section-title], [data-section=''] > .section > .title, [data-section=''] > [data-section-region] > [data-section-title], [data-section=''] > [data-section-region] > .title, [data-section='auto'] > section > [data-section-title], [data-section='auto'] > section > .title, [data-section='auto'] > .section > [data-section-title], [data-section='auto'] > .section > .title, [data-section='auto'] > [data-section-region] > [data-section-title], [data-section='auto'] > [data-section-region] > .title, .section-container.auto > section > [data-section-title], .section-container.auto > section > .title, .section-container.auto > .section > [data-section-title], .section-container.auto > .section > .title, .section-container.auto > [data-section-region] > [data-section-title], .section-container.auto > [data-section-region] > .title, +[data-section='vertical-tabs'] > section > [data-section-title], +[data-section='vertical-tabs'] > section > .title, +[data-section='vertical-tabs'] > .section > [data-section-title], +[data-section='vertical-tabs'] > .section > .title, +[data-section='vertical-tabs'] > [data-section-region] > [data-section-title], +[data-section='vertical-tabs'] > [data-section-region] > .title, .section-container.vertical-tabs > section > [data-section-title], .section-container.vertical-tabs > section > .title, .section-container.vertical-tabs > .section > [data-section-title], .section-container.vertical-tabs > .section > .title, .section-container.vertical-tabs > [data-section-region] > [data-section-title], .section-container.vertical-tabs > [data-section-region] > .title, +[data-section='vertical-nav'] > section > [data-section-title], +[data-section='vertical-nav'] > section > .title, +[data-section='vertical-nav'] > .section > [data-section-title], +[data-section='vertical-nav'] > .section > .title, +[data-section='vertical-nav'] > [data-section-region] > [data-section-title], +[data-section='vertical-nav'] > [data-section-region] > .title, .section-container.vertical-nav > section > [data-section-title], .section-container.vertical-nav > section > .title, .section-container.vertical-nav > .section > [data-section-title], .section-container.vertical-nav > .section > .title, .section-container.vertical-nav > [data-section-region] > [data-section-title], .section-container.vertical-nav > [data-section-region] > .title, +[data-section='horizontal-nav'] > section > [data-section-title], +[data-section='horizontal-nav'] > section > .title, +[data-section='horizontal-nav'] > .section > [data-section-title], +[data-section='horizontal-nav'] > .section > .title, +[data-section='horizontal-nav'] > [data-section-region] > [data-section-title], +[data-section='horizontal-nav'] > [data-section-region] > .title, .section-container.horizontal-nav > section > [data-section-title], .section-container.horizontal-nav > section > .title, .section-container.horizontal-nav > .section > [data-section-title], .section-container.horizontal-nav > .section > .title, .section-container.horizontal-nav > [data-section-region] > [data-section-title], .section-container.horizontal-nav > [data-section-region] > .title, +[data-section='accordion'] > section > [data-section-title], +[data-section='accordion'] > section > .title, +[data-section='accordion'] > .section > [data-section-title], +[data-section='accordion'] > .section > .title, +[data-section='accordion'] > [data-section-region] > [data-section-title], +[data-section='accordion'] > [data-section-region] > .title, .section-container.accordion > section > [data-section-title], .section-container.accordion > section > .title, .section-container.accordion > .section > [data-section-title], .section-container.accordion > .section > .title, .section-container.accordion > [data-section-region] > [data-section-title], .section-container.accordion > [data-section-region] > .title { + margin-bottom: 0; +} + +[data-section=''] > section > [data-section-title] a, [data-section=''] > section > .title a, [data-section=''] > .section > [data-section-title] a, [data-section=''] > .section > .title a, [data-section=''] > [data-section-region] > [data-section-title] a, [data-section=''] > [data-section-region] > .title a, [data-section='auto'] > section > [data-section-title] a, [data-section='auto'] > section > .title a, [data-section='auto'] > .section > [data-section-title] a, [data-section='auto'] > .section > .title a, [data-section='auto'] > [data-section-region] > [data-section-title] a, [data-section='auto'] > [data-section-region] > .title a, .section-container.auto > section > [data-section-title] a, .section-container.auto > section > .title a, .section-container.auto > .section > [data-section-title] a, .section-container.auto > .section > .title a, .section-container.auto > [data-section-region] > [data-section-title] a, .section-container.auto > [data-section-region] > .title a, +[data-section='vertical-tabs'] > section > [data-section-title] a, +[data-section='vertical-tabs'] > section > .title a, +[data-section='vertical-tabs'] > .section > [data-section-title] a, +[data-section='vertical-tabs'] > .section > .title a, +[data-section='vertical-tabs'] > [data-section-region] > [data-section-title] a, +[data-section='vertical-tabs'] > [data-section-region] > .title a, .section-container.vertical-tabs > section > [data-section-title] a, .section-container.vertical-tabs > section > .title a, .section-container.vertical-tabs > .section > [data-section-title] a, .section-container.vertical-tabs > .section > .title a, .section-container.vertical-tabs > [data-section-region] > [data-section-title] a, .section-container.vertical-tabs > [data-section-region] > .title a, +[data-section='vertical-nav'] > section > [data-section-title] a, +[data-section='vertical-nav'] > section > .title a, +[data-section='vertical-nav'] > .section > [data-section-title] a, +[data-section='vertical-nav'] > .section > .title a, +[data-section='vertical-nav'] > [data-section-region] > [data-section-title] a, +[data-section='vertical-nav'] > [data-section-region] > .title a, .section-container.vertical-nav > section > [data-section-title] a, .section-container.vertical-nav > section > .title a, .section-container.vertical-nav > .section > [data-section-title] a, .section-container.vertical-nav > .section > .title a, .section-container.vertical-nav > [data-section-region] > [data-section-title] a, .section-container.vertical-nav > [data-section-region] > .title a, +[data-section='horizontal-nav'] > section > [data-section-title] a, +[data-section='horizontal-nav'] > section > .title a, +[data-section='horizontal-nav'] > .section > [data-section-title] a, +[data-section='horizontal-nav'] > .section > .title a, +[data-section='horizontal-nav'] > [data-section-region] > [data-section-title] a, +[data-section='horizontal-nav'] > [data-section-region] > .title a, .section-container.horizontal-nav > section > [data-section-title] a, .section-container.horizontal-nav > section > .title a, .section-container.horizontal-nav > .section > [data-section-title] a, .section-container.horizontal-nav > .section > .title a, .section-container.horizontal-nav > [data-section-region] > [data-section-title] a, .section-container.horizontal-nav > [data-section-region] > .title a, +[data-section='accordion'] > section > [data-section-title] a, +[data-section='accordion'] > section > .title a, +[data-section='accordion'] > .section > [data-section-title] a, +[data-section='accordion'] > .section > .title a, +[data-section='accordion'] > [data-section-region] > [data-section-title] a, +[data-section='accordion'] > [data-section-region] > .title a, .section-container.accordion > section > [data-section-title] a, .section-container.accordion > section > .title a, .section-container.accordion > .section > [data-section-title] a, .section-container.accordion > .section > .title a, .section-container.accordion > [data-section-region] > [data-section-title] a, .section-container.accordion > [data-section-region] > .title a { + width: 100%; + display: inline-block; + white-space: nowrap; +} + +[data-section=''] > section > [data-section-content], [data-section=''] > section > .content, [data-section=''] > .section > [data-section-content], [data-section=''] > .section > .content, [data-section=''] > [data-section-region] > [data-section-content], [data-section=''] > [data-section-region] > .content, [data-section='auto'] > section > [data-section-content], [data-section='auto'] > section > .content, [data-section='auto'] > .section > [data-section-content], [data-section='auto'] > .section > .content, [data-section='auto'] > [data-section-region] > [data-section-content], [data-section='auto'] > [data-section-region] > .content, .section-container.auto > section > [data-section-content], .section-container.auto > section > .content, .section-container.auto > .section > [data-section-content], .section-container.auto > .section > .content, .section-container.auto > [data-section-region] > [data-section-content], .section-container.auto > [data-section-region] > .content, +[data-section='vertical-tabs'] > section > [data-section-content], +[data-section='vertical-tabs'] > section > .content, +[data-section='vertical-tabs'] > .section > [data-section-content], +[data-section='vertical-tabs'] > .section > .content, +[data-section='vertical-tabs'] > [data-section-region] > [data-section-content], +[data-section='vertical-tabs'] > [data-section-region] > .content, .section-container.vertical-tabs > section > [data-section-content], .section-container.vertical-tabs > section > .content, .section-container.vertical-tabs > .section > [data-section-content], .section-container.vertical-tabs > .section > .content, .section-container.vertical-tabs > [data-section-region] > [data-section-content], .section-container.vertical-tabs > [data-section-region] > .content, +[data-section='vertical-nav'] > section > [data-section-content], +[data-section='vertical-nav'] > section > .content, +[data-section='vertical-nav'] > .section > [data-section-content], +[data-section='vertical-nav'] > .section > .content, +[data-section='vertical-nav'] > [data-section-region] > [data-section-content], +[data-section='vertical-nav'] > [data-section-region] > .content, .section-container.vertical-nav > section > [data-section-content], .section-container.vertical-nav > section > .content, .section-container.vertical-nav > .section > [data-section-content], .section-container.vertical-nav > .section > .content, .section-container.vertical-nav > [data-section-region] > [data-section-content], .section-container.vertical-nav > [data-section-region] > .content, +[data-section='horizontal-nav'] > section > [data-section-content], +[data-section='horizontal-nav'] > section > .content, +[data-section='horizontal-nav'] > .section > [data-section-content], +[data-section='horizontal-nav'] > .section > .content, +[data-section='horizontal-nav'] > [data-section-region] > [data-section-content], +[data-section='horizontal-nav'] > [data-section-region] > .content, .section-container.horizontal-nav > section > [data-section-content], .section-container.horizontal-nav > section > .content, .section-container.horizontal-nav > .section > [data-section-content], .section-container.horizontal-nav > .section > .content, .section-container.horizontal-nav > [data-section-region] > [data-section-content], .section-container.horizontal-nav > [data-section-region] > .content, +[data-section='accordion'] > section > [data-section-content], +[data-section='accordion'] > section > .content, +[data-section='accordion'] > .section > [data-section-content], +[data-section='accordion'] > .section > .content, +[data-section='accordion'] > [data-section-region] > [data-section-content], +[data-section='accordion'] > [data-section-region] > .content, .section-container.accordion > section > [data-section-content], .section-container.accordion > section > .content, .section-container.accordion > .section > [data-section-content], .section-container.accordion > .section > .content, .section-container.accordion > [data-section-region] > [data-section-content], .section-container.accordion > [data-section-region] > .content { + display: none; +} + +[data-section=''] > section.active > [data-section-content], [data-section=''] > section.active > .content, [data-section=''] > .section.active > [data-section-content], [data-section=''] > .section.active > .content, [data-section=''] > [data-section-region].active > [data-section-content], [data-section=''] > [data-section-region].active > .content, [data-section='auto'] > section.active > [data-section-content], [data-section='auto'] > section.active > .content, [data-section='auto'] > .section.active > [data-section-content], [data-section='auto'] > .section.active > .content, [data-section='auto'] > [data-section-region].active > [data-section-content], [data-section='auto'] > [data-section-region].active > .content, .section-container.auto > section.active > [data-section-content], .section-container.auto > section.active > .content, .section-container.auto > .section.active > [data-section-content], .section-container.auto > .section.active > .content, .section-container.auto > [data-section-region].active > [data-section-content], .section-container.auto > [data-section-region].active > .content, +[data-section='vertical-tabs'] > section.active > [data-section-content], +[data-section='vertical-tabs'] > section.active > .content, +[data-section='vertical-tabs'] > .section.active > [data-section-content], +[data-section='vertical-tabs'] > .section.active > .content, +[data-section='vertical-tabs'] > [data-section-region].active > [data-section-content], +[data-section='vertical-tabs'] > [data-section-region].active > .content, .section-container.vertical-tabs > section.active > [data-section-content], .section-container.vertical-tabs > section.active > .content, .section-container.vertical-tabs > .section.active > [data-section-content], .section-container.vertical-tabs > .section.active > .content, .section-container.vertical-tabs > [data-section-region].active > [data-section-content], .section-container.vertical-tabs > [data-section-region].active > .content, +[data-section='vertical-nav'] > section.active > [data-section-content], +[data-section='vertical-nav'] > section.active > .content, +[data-section='vertical-nav'] > .section.active > [data-section-content], +[data-section='vertical-nav'] > .section.active > .content, +[data-section='vertical-nav'] > [data-section-region].active > [data-section-content], +[data-section='vertical-nav'] > [data-section-region].active > .content, .section-container.vertical-nav > section.active > [data-section-content], .section-container.vertical-nav > section.active > .content, .section-container.vertical-nav > .section.active > [data-section-content], .section-container.vertical-nav > .section.active > .content, .section-container.vertical-nav > [data-section-region].active > [data-section-content], .section-container.vertical-nav > [data-section-region].active > .content, +[data-section='horizontal-nav'] > section.active > [data-section-content], +[data-section='horizontal-nav'] > section.active > .content, +[data-section='horizontal-nav'] > .section.active > [data-section-content], +[data-section='horizontal-nav'] > .section.active > .content, +[data-section='horizontal-nav'] > [data-section-region].active > [data-section-content], +[data-section='horizontal-nav'] > [data-section-region].active > .content, .section-container.horizontal-nav > section.active > [data-section-content], .section-container.horizontal-nav > section.active > .content, .section-container.horizontal-nav > .section.active > [data-section-content], .section-container.horizontal-nav > .section.active > .content, .section-container.horizontal-nav > [data-section-region].active > [data-section-content], .section-container.horizontal-nav > [data-section-region].active > .content, +[data-section='accordion'] > section.active > [data-section-content], +[data-section='accordion'] > section.active > .content, +[data-section='accordion'] > .section.active > [data-section-content], +[data-section='accordion'] > .section.active > .content, +[data-section='accordion'] > [data-section-region].active > [data-section-content], +[data-section='accordion'] > [data-section-region].active > .content, .section-container.accordion > section.active > [data-section-content], .section-container.accordion > section.active > .content, .section-container.accordion > .section.active > [data-section-content], .section-container.accordion > .section.active > .content, .section-container.accordion > [data-section-region].active > [data-section-content], .section-container.accordion > [data-section-region].active > .content { + display: block; +} + +[data-section=''] > section:not(.active), [data-section=''] > .section:not(.active), [data-section=''] > [data-section-region]:not(.active), [data-section='auto'] > section:not(.active), [data-section='auto'] > .section:not(.active), [data-section='auto'] > [data-section-region]:not(.active), .section-container.auto > section:not(.active), .section-container.auto > .section:not(.active), .section-container.auto > [data-section-region]:not(.active), +[data-section='vertical-tabs'] > section:not(.active), +[data-section='vertical-tabs'] > .section:not(.active), +[data-section='vertical-tabs'] > [data-section-region]:not(.active), .section-container.vertical-tabs > section:not(.active), .section-container.vertical-tabs > .section:not(.active), .section-container.vertical-tabs > [data-section-region]:not(.active), +[data-section='vertical-nav'] > section:not(.active), +[data-section='vertical-nav'] > .section:not(.active), +[data-section='vertical-nav'] > [data-section-region]:not(.active), .section-container.vertical-nav > section:not(.active), .section-container.vertical-nav > .section:not(.active), .section-container.vertical-nav > [data-section-region]:not(.active), +[data-section='horizontal-nav'] > section:not(.active), +[data-section='horizontal-nav'] > .section:not(.active), +[data-section='horizontal-nav'] > [data-section-region]:not(.active), .section-container.horizontal-nav > section:not(.active), .section-container.horizontal-nav > .section:not(.active), .section-container.horizontal-nav > [data-section-region]:not(.active), +[data-section='accordion'] > section:not(.active), +[data-section='accordion'] > .section:not(.active), +[data-section='accordion'] > [data-section-region]:not(.active), .section-container.accordion > section:not(.active), .section-container.accordion > .section:not(.active), .section-container.accordion > [data-section-region]:not(.active) { + padding: 0 !important; +} + +[data-section=''] > section > [data-section-title], [data-section=''] > section > .title, [data-section=''] > .section > [data-section-title], [data-section=''] > .section > .title, [data-section=''] > [data-section-region] > [data-section-title], [data-section=''] > [data-section-region] > .title, [data-section='auto'] > section > [data-section-title], [data-section='auto'] > section > .title, [data-section='auto'] > .section > [data-section-title], [data-section='auto'] > .section > .title, [data-section='auto'] > [data-section-region] > [data-section-title], [data-section='auto'] > [data-section-region] > .title, .section-container.auto > section > [data-section-title], .section-container.auto > section > .title, .section-container.auto > .section > [data-section-title], .section-container.auto > .section > .title, .section-container.auto > [data-section-region] > [data-section-title], .section-container.auto > [data-section-region] > .title, +[data-section='vertical-tabs'] > section > [data-section-title], +[data-section='vertical-tabs'] > section > .title, +[data-section='vertical-tabs'] > .section > [data-section-title], +[data-section='vertical-tabs'] > .section > .title, +[data-section='vertical-tabs'] > [data-section-region] > [data-section-title], +[data-section='vertical-tabs'] > [data-section-region] > .title, .section-container.vertical-tabs > section > [data-section-title], .section-container.vertical-tabs > section > .title, .section-container.vertical-tabs > .section > [data-section-title], .section-container.vertical-tabs > .section > .title, .section-container.vertical-tabs > [data-section-region] > [data-section-title], .section-container.vertical-tabs > [data-section-region] > .title, +[data-section='vertical-nav'] > section > [data-section-title], +[data-section='vertical-nav'] > section > .title, +[data-section='vertical-nav'] > .section > [data-section-title], +[data-section='vertical-nav'] > .section > .title, +[data-section='vertical-nav'] > [data-section-region] > [data-section-title], +[data-section='vertical-nav'] > [data-section-region] > .title, .section-container.vertical-nav > section > [data-section-title], .section-container.vertical-nav > section > .title, .section-container.vertical-nav > .section > [data-section-title], .section-container.vertical-nav > .section > .title, .section-container.vertical-nav > [data-section-region] > [data-section-title], .section-container.vertical-nav > [data-section-region] > .title, +[data-section='horizontal-nav'] > section > [data-section-title], +[data-section='horizontal-nav'] > section > .title, +[data-section='horizontal-nav'] > .section > [data-section-title], +[data-section='horizontal-nav'] > .section > .title, +[data-section='horizontal-nav'] > [data-section-region] > [data-section-title], +[data-section='horizontal-nav'] > [data-section-region] > .title, .section-container.horizontal-nav > section > [data-section-title], .section-container.horizontal-nav > section > .title, .section-container.horizontal-nav > .section > [data-section-title], .section-container.horizontal-nav > .section > .title, .section-container.horizontal-nav > [data-section-region] > [data-section-title], .section-container.horizontal-nav > [data-section-region] > .title, +[data-section='accordion'] > section > [data-section-title], +[data-section='accordion'] > section > .title, +[data-section='accordion'] > .section > [data-section-title], +[data-section='accordion'] > .section > .title, +[data-section='accordion'] > [data-section-region] > [data-section-title], +[data-section='accordion'] > [data-section-region] > .title, .section-container.accordion > section > [data-section-title], .section-container.accordion > section > .title, .section-container.accordion > .section > [data-section-title], .section-container.accordion > .section > .title, .section-container.accordion > [data-section-region] > [data-section-title], .section-container.accordion > [data-section-region] > .title { + width: 100%; +} + +.section-container.auto, +.section-container.vertical-tabs, +.section-container.vertical-nav, +.section-container.horizontal-nav, +.section-container.accordion { + border-top: 1px solid #cccccc; +} + +.section-container.auto > section > .title, .section-container.auto > .section > .title, +.section-container.vertical-tabs > section > .title, +.section-container.vertical-tabs > .section > .title, +.section-container.vertical-nav > section > .title, +.section-container.vertical-nav > .section > .title, +.section-container.horizontal-nav > section > .title, +.section-container.horizontal-nav > .section > .title, +.section-container.accordion > section > .title, +.section-container.accordion > .section > .title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #cccccc; +} + +.section-container.auto > section > .title a, .section-container.auto > .section > .title a, +.section-container.vertical-tabs > section > .title a, +.section-container.vertical-tabs > .section > .title a, +.section-container.vertical-nav > section > .title a, +.section-container.vertical-nav > .section > .title a, +.section-container.horizontal-nav > section > .title a, +.section-container.horizontal-nav > .section > .title a, +.section-container.accordion > section > .title a, +.section-container.accordion > .section > .title a { + padding: 0.9375em; + color: #333333; + font-size: 0.875em; + background: none; +} + +.section-container.auto > section > .title:hover, .section-container.auto > .section > .title:hover, +.section-container.vertical-tabs > section > .title:hover, +.section-container.vertical-tabs > .section > .title:hover, +.section-container.vertical-nav > section > .title:hover, +.section-container.vertical-nav > .section > .title:hover, +.section-container.horizontal-nav > section > .title:hover, +.section-container.horizontal-nav > .section > .title:hover, +.section-container.accordion > section > .title:hover, +.section-container.accordion > .section > .title:hover { + background-color: #e2e2e2; +} + +.section-container.auto > section > .content, .section-container.auto > .section > .content, +.section-container.vertical-tabs > section > .content, +.section-container.vertical-tabs > .section > .content, +.section-container.vertical-nav > section > .content, +.section-container.vertical-nav > .section > .content, +.section-container.horizontal-nav > section > .content, +.section-container.horizontal-nav > .section > .content, +.section-container.accordion > section > .content, +.section-container.accordion > .section > .content { + padding: 0.9375em; + background-color: white; + border: solid 1px #cccccc; +} + +.section-container.auto > section > .content > *:last-child, .section-container.auto > .section > .content > *:last-child, +.section-container.vertical-tabs > section > .content > *:last-child, +.section-container.vertical-tabs > .section > .content > *:last-child, +.section-container.vertical-nav > section > .content > *:last-child, +.section-container.vertical-nav > .section > .content > *:last-child, +.section-container.horizontal-nav > section > .content > *:last-child, +.section-container.horizontal-nav > .section > .content > *:last-child, +.section-container.accordion > section > .content > *:last-child, +.section-container.accordion > .section > .content > *:last-child { + margin-bottom: 0; +} + +.section-container.auto > section > .content > *:first-child, .section-container.auto > .section > .content > *:first-child, +.section-container.vertical-tabs > section > .content > *:first-child, +.section-container.vertical-tabs > .section > .content > *:first-child, +.section-container.vertical-nav > section > .content > *:first-child, +.section-container.vertical-nav > .section > .content > *:first-child, +.section-container.horizontal-nav > section > .content > *:first-child, +.section-container.horizontal-nav > .section > .content > *:first-child, +.section-container.accordion > section > .content > *:first-child, +.section-container.accordion > .section > .content > *:first-child { + padding-top: 0; +} + +.section-container.auto > section > .content > *:last-child:not(.flex-video), .section-container.auto > .section > .content > *:last-child:not(.flex-video), +.section-container.vertical-tabs > section > .content > *:last-child:not(.flex-video), +.section-container.vertical-tabs > .section > .content > *:last-child:not(.flex-video), +.section-container.vertical-nav > section > .content > *:last-child:not(.flex-video), +.section-container.vertical-nav > .section > .content > *:last-child:not(.flex-video), +.section-container.horizontal-nav > section > .content > *:last-child:not(.flex-video), +.section-container.horizontal-nav > .section > .content > *:last-child:not(.flex-video), +.section-container.accordion > section > .content > *:last-child:not(.flex-video), +.section-container.accordion > .section > .content > *:last-child:not(.flex-video) { + padding-bottom: 0; +} + +.section-container.auto > section.active > .title, .section-container.auto > .section.active > .title, +.section-container.vertical-tabs > section.active > .title, +.section-container.vertical-tabs > .section.active > .title, +.section-container.vertical-nav > section.active > .title, +.section-container.vertical-nav > .section.active > .title, +.section-container.horizontal-nav > section.active > .title, +.section-container.horizontal-nav > .section.active > .title, +.section-container.accordion > section.active > .title, +.section-container.accordion > .section.active > .title { + background: #d5d5d5; +} + +.section-container.auto > section.active > .title a, .section-container.auto > .section.active > .title a, +.section-container.vertical-tabs > section.active > .title a, +.section-container.vertical-tabs > .section.active > .title a, +.section-container.vertical-nav > section.active > .title a, +.section-container.vertical-nav > .section.active > .title a, +.section-container.horizontal-nav > section.active > .title a, +.section-container.horizontal-nav > .section.active > .title a, +.section-container.accordion > section.active > .title a, +.section-container.accordion > .section.active > .title a { + color: #333333; +} + +.section-container.auto > section:not(.active), .section-container.auto > .section:not(.active), +.section-container.vertical-tabs > section:not(.active), +.section-container.vertical-tabs > .section:not(.active), +.section-container.vertical-nav > section:not(.active), +.section-container.vertical-nav > .section:not(.active), +.section-container.horizontal-nav > section:not(.active), +.section-container.horizontal-nav > .section:not(.active), +.section-container.accordion > section:not(.active), +.section-container.accordion > .section:not(.active) { + padding: 0 !important; +} + +.section-container.auto > section > .title, .section-container.auto > .section > .title, +.section-container.vertical-tabs > section > .title, +.section-container.vertical-tabs > .section > .title, +.section-container.vertical-nav > section > .title, +.section-container.vertical-nav > .section > .title, +.section-container.horizontal-nav > section > .title, +.section-container.horizontal-nav > .section > .title, +.section-container.accordion > section > .title, +.section-container.accordion > .section > .title { + border-top: none; +} + +[data-section='tabs'], .section-container.tabs { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em; +} + +[data-section='tabs']:not([data-section-resized]):not([data-section-small-style]), .section-container.tabs:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden; +} + +[data-section='tabs'] > section > [data-section-title], [data-section='tabs'] > section > .title, [data-section='tabs'] > .section > [data-section-title], [data-section='tabs'] > .section > .title, [data-section='tabs'] > [data-section-region] > [data-section-title], [data-section='tabs'] > [data-section-region] > .title, .section-container.tabs > section > [data-section-title], .section-container.tabs > section > .title, .section-container.tabs > .section > [data-section-title], .section-container.tabs > .section > .title, .section-container.tabs > [data-section-region] > [data-section-title], .section-container.tabs > [data-section-region] > .title { + margin-bottom: 0; +} + +[data-section='tabs'] > section > [data-section-title] a, [data-section='tabs'] > section > .title a, [data-section='tabs'] > .section > [data-section-title] a, [data-section='tabs'] > .section > .title a, [data-section='tabs'] > [data-section-region] > [data-section-title] a, [data-section='tabs'] > [data-section-region] > .title a, .section-container.tabs > section > [data-section-title] a, .section-container.tabs > section > .title a, .section-container.tabs > .section > [data-section-title] a, .section-container.tabs > .section > .title a, .section-container.tabs > [data-section-region] > [data-section-title] a, .section-container.tabs > [data-section-region] > .title a { + width: 100%; + display: inline-block; + white-space: nowrap; +} + +[data-section='tabs'] > section > [data-section-content], [data-section='tabs'] > section > .content, [data-section='tabs'] > .section > [data-section-content], [data-section='tabs'] > .section > .content, [data-section='tabs'] > [data-section-region] > [data-section-content], [data-section='tabs'] > [data-section-region] > .content, .section-container.tabs > section > [data-section-content], .section-container.tabs > section > .content, .section-container.tabs > .section > [data-section-content], .section-container.tabs > .section > .content, .section-container.tabs > [data-section-region] > [data-section-content], .section-container.tabs > [data-section-region] > .content { + display: none; +} + +[data-section='tabs'] > section.active > [data-section-content], [data-section='tabs'] > section.active > .content, [data-section='tabs'] > .section.active > [data-section-content], [data-section='tabs'] > .section.active > .content, [data-section='tabs'] > [data-section-region].active > [data-section-content], [data-section='tabs'] > [data-section-region].active > .content, .section-container.tabs > section.active > [data-section-content], .section-container.tabs > section.active > .content, .section-container.tabs > .section.active > [data-section-content], .section-container.tabs > .section.active > .content, .section-container.tabs > [data-section-region].active > [data-section-content], .section-container.tabs > [data-section-region].active > .content { + display: block; +} + +[data-section='tabs'] > section:not(.active), [data-section='tabs'] > .section:not(.active), [data-section='tabs'] > [data-section-region]:not(.active), .section-container.tabs > section:not(.active), .section-container.tabs > .section:not(.active), .section-container.tabs > [data-section-region]:not(.active) { + padding: 0 !important; +} + +[data-section='tabs'] > section > [data-section-title], [data-section='tabs'] > section > .title, [data-section='tabs'] > .section > [data-section-title], [data-section='tabs'] > .section > .title, [data-section='tabs'] > [data-section-region] > [data-section-title], [data-section='tabs'] > [data-section-region] > .title, .section-container.tabs > section > [data-section-title], .section-container.tabs > section > .title, .section-container.tabs > .section > [data-section-title], .section-container.tabs > .section > .title, .section-container.tabs > [data-section-region] > [data-section-title], .section-container.tabs > [data-section-region] > .title { + width: auto; + position: absolute; + top: 0; + left: 0; +} + +.section-container.tabs { + border: none; +} + +.section-container.tabs > section > .title, .section-container.tabs > .section > .title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #cccccc; +} + +.section-container.tabs > section > .title a, .section-container.tabs > .section > .title a { + padding: 0.9375em; + color: #333333; + font-size: 0.875em; + background: none; +} + +.section-container.tabs > section > .title:hover, .section-container.tabs > .section > .title:hover { + background-color: #e2e2e2; +} + +.section-container.tabs > section > .content, .section-container.tabs > .section > .content { + padding: 0.9375em; + background-color: white; + border: solid 1px #cccccc; +} + +.section-container.tabs > section > .content > *:last-child, .section-container.tabs > .section > .content > *:last-child { + margin-bottom: 0; +} + +.section-container.tabs > section > .content > *:first-child, .section-container.tabs > .section > .content > *:first-child { + padding-top: 0; +} + +.section-container.tabs > section > .content > *:last-child:not(.flex-video), .section-container.tabs > .section > .content > *:last-child:not(.flex-video) { + padding-bottom: 0; +} + +.section-container.tabs > section.active > .title, .section-container.tabs > .section.active > .title { + background: white; +} + +.section-container.tabs > section.active > .title a, .section-container.tabs > .section.active > .title a { + color: #333333; +} + +.section-container.tabs > section:not(.active), .section-container.tabs > .section:not(.active) { + padding: 0 !important; +} + +.section-container.tabs > section.active > .title, .section-container.tabs > .section.active > .title { + border-bottom: 0; +} + +@media only screen and (min-width: 768px) { + [data-section=''], [data-section='auto'], .section-container.auto { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em; + } + + [data-section='']:not([data-section-resized]):not([data-section-small-style]), [data-section='auto']:not([data-section-resized]):not([data-section-small-style]), .section-container.auto:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden; + } + + [data-section=''] > section > [data-section-title], [data-section=''] > section > .title, [data-section=''] > .section > [data-section-title], [data-section=''] > .section > .title, [data-section=''] > [data-section-region] > [data-section-title], [data-section=''] > [data-section-region] > .title, [data-section='auto'] > section > [data-section-title], [data-section='auto'] > section > .title, [data-section='auto'] > .section > [data-section-title], [data-section='auto'] > .section > .title, [data-section='auto'] > [data-section-region] > [data-section-title], [data-section='auto'] > [data-section-region] > .title, .section-container.auto > section > [data-section-title], .section-container.auto > section > .title, .section-container.auto > .section > [data-section-title], .section-container.auto > .section > .title, .section-container.auto > [data-section-region] > [data-section-title], .section-container.auto > [data-section-region] > .title { + margin-bottom: 0; + } + + [data-section=''] > section > [data-section-title] a, [data-section=''] > section > .title a, [data-section=''] > .section > [data-section-title] a, [data-section=''] > .section > .title a, [data-section=''] > [data-section-region] > [data-section-title] a, [data-section=''] > [data-section-region] > .title a, [data-section='auto'] > section > [data-section-title] a, [data-section='auto'] > section > .title a, [data-section='auto'] > .section > [data-section-title] a, [data-section='auto'] > .section > .title a, [data-section='auto'] > [data-section-region] > [data-section-title] a, [data-section='auto'] > [data-section-region] > .title a, .section-container.auto > section > [data-section-title] a, .section-container.auto > section > .title a, .section-container.auto > .section > [data-section-title] a, .section-container.auto > .section > .title a, .section-container.auto > [data-section-region] > [data-section-title] a, .section-container.auto > [data-section-region] > .title a { + width: 100%; + display: inline-block; + white-space: nowrap; + } + + [data-section=''] > section > [data-section-content], [data-section=''] > section > .content, [data-section=''] > .section > [data-section-content], [data-section=''] > .section > .content, [data-section=''] > [data-section-region] > [data-section-content], [data-section=''] > [data-section-region] > .content, [data-section='auto'] > section > [data-section-content], [data-section='auto'] > section > .content, [data-section='auto'] > .section > [data-section-content], [data-section='auto'] > .section > .content, [data-section='auto'] > [data-section-region] > [data-section-content], [data-section='auto'] > [data-section-region] > .content, .section-container.auto > section > [data-section-content], .section-container.auto > section > .content, .section-container.auto > .section > [data-section-content], .section-container.auto > .section > .content, .section-container.auto > [data-section-region] > [data-section-content], .section-container.auto > [data-section-region] > .content { + display: none; + } + + [data-section=''] > section.active > [data-section-content], [data-section=''] > section.active > .content, [data-section=''] > .section.active > [data-section-content], [data-section=''] > .section.active > .content, [data-section=''] > [data-section-region].active > [data-section-content], [data-section=''] > [data-section-region].active > .content, [data-section='auto'] > section.active > [data-section-content], [data-section='auto'] > section.active > .content, [data-section='auto'] > .section.active > [data-section-content], [data-section='auto'] > .section.active > .content, [data-section='auto'] > [data-section-region].active > [data-section-content], [data-section='auto'] > [data-section-region].active > .content, .section-container.auto > section.active > [data-section-content], .section-container.auto > section.active > .content, .section-container.auto > .section.active > [data-section-content], .section-container.auto > .section.active > .content, .section-container.auto > [data-section-region].active > [data-section-content], .section-container.auto > [data-section-region].active > .content { + display: block; + } + + [data-section=''] > section:not(.active), [data-section=''] > .section:not(.active), [data-section=''] > [data-section-region]:not(.active), [data-section='auto'] > section:not(.active), [data-section='auto'] > .section:not(.active), [data-section='auto'] > [data-section-region]:not(.active), .section-container.auto > section:not(.active), .section-container.auto > .section:not(.active), .section-container.auto > [data-section-region]:not(.active) { + padding: 0 !important; + } + + [data-section=''] > section > [data-section-title], [data-section=''] > section > .title, [data-section=''] > .section > [data-section-title], [data-section=''] > .section > .title, [data-section=''] > [data-section-region] > [data-section-title], [data-section=''] > [data-section-region] > .title, [data-section='auto'] > section > [data-section-title], [data-section='auto'] > section > .title, [data-section='auto'] > .section > [data-section-title], [data-section='auto'] > .section > .title, [data-section='auto'] > [data-section-region] > [data-section-title], [data-section='auto'] > [data-section-region] > .title, .section-container.auto > section > [data-section-title], .section-container.auto > section > .title, .section-container.auto > .section > [data-section-title], .section-container.auto > .section > .title, .section-container.auto > [data-section-region] > [data-section-title], .section-container.auto > [data-section-region] > .title { + width: auto; + position: absolute; + top: 0; + left: 0; + } + + .section-container.auto { + border: none; + } + + .section-container.auto > section > .title, .section-container.auto > .section > .title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #cccccc; + } + + .section-container.auto > section > .title a, .section-container.auto > .section > .title a { + padding: 0.9375em; + color: #333333; + font-size: 0.875em; + background: none; + } + + .section-container.auto > section > .title:hover, .section-container.auto > .section > .title:hover { + background-color: #e2e2e2; + } + + .section-container.auto > section > .content, .section-container.auto > .section > .content { + padding: 0.9375em; + background-color: white; + border: solid 1px #cccccc; + } + + .section-container.auto > section > .content > *:last-child, .section-container.auto > .section > .content > *:last-child { + margin-bottom: 0; + } + + .section-container.auto > section > .content > *:first-child, .section-container.auto > .section > .content > *:first-child { + padding-top: 0; + } + + .section-container.auto > section > .content > *:last-child:not(.flex-video), .section-container.auto > .section > .content > *:last-child:not(.flex-video) { + padding-bottom: 0; + } + + .section-container.auto > section.active > .title, .section-container.auto > .section.active > .title { + background: white; + } + + .section-container.auto > section.active > .title a, .section-container.auto > .section.active > .title a { + color: #333333; + } + + .section-container.auto > section:not(.active), .section-container.auto > .section:not(.active) { + padding: 0 !important; + } + + .section-container.auto > section.active > .title, .section-container.auto > .section.active > .title { + border-bottom: 0; + } + + [data-section='vertical-tabs'], .section-container.vertical-tabs { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em; + } + + [data-section='vertical-tabs']:not([data-section-resized]):not([data-section-small-style]), .section-container.vertical-tabs:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden; + } + + [data-section='vertical-tabs'][data-section-small-style], .section-container.vertical-tabs[data-section-small-style] { + width: 100% !important; + } + + [data-section='vertical-tabs'][data-section-small-style] > [data-section-region], [data-section='vertical-tabs'][data-section-small-style] > section, [data-section='vertical-tabs'][data-section-small-style] > .section, .section-container.vertical-tabs[data-section-small-style] > [data-section-region], .section-container.vertical-tabs[data-section-small-style] > section, .section-container.vertical-tabs[data-section-small-style] > .section { + padding: 0 !important; + margin: 0 !important; + } + + [data-section='vertical-tabs'][data-section-small-style] > [data-section-region] > [data-section-title], [data-section='vertical-tabs'][data-section-small-style] > [data-section-region] > .title, [data-section='vertical-tabs'][data-section-small-style] > section > [data-section-title], [data-section='vertical-tabs'][data-section-small-style] > section > .title, [data-section='vertical-tabs'][data-section-small-style] > .section > [data-section-title], [data-section='vertical-tabs'][data-section-small-style] > .section > .title, .section-container.vertical-tabs[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.vertical-tabs[data-section-small-style] > [data-section-region] > .title, .section-container.vertical-tabs[data-section-small-style] > section > [data-section-title], .section-container.vertical-tabs[data-section-small-style] > section > .title, .section-container.vertical-tabs[data-section-small-style] > .section > [data-section-title], .section-container.vertical-tabs[data-section-small-style] > .section > .title { + width: 100% !important; + } + + [data-section='vertical-tabs'] > section > [data-section-title], [data-section='vertical-tabs'] > section > .title, [data-section='vertical-tabs'] > .section > [data-section-title], [data-section='vertical-tabs'] > .section > .title, [data-section='vertical-tabs'] > [data-section-region] > [data-section-title], [data-section='vertical-tabs'] > [data-section-region] > .title, .section-container.vertical-tabs > section > [data-section-title], .section-container.vertical-tabs > section > .title, .section-container.vertical-tabs > .section > [data-section-title], .section-container.vertical-tabs > .section > .title, .section-container.vertical-tabs > [data-section-region] > [data-section-title], .section-container.vertical-tabs > [data-section-region] > .title { + margin-bottom: 0; + } + + [data-section='vertical-tabs'] > section > [data-section-title] a, [data-section='vertical-tabs'] > section > .title a, [data-section='vertical-tabs'] > .section > [data-section-title] a, [data-section='vertical-tabs'] > .section > .title a, [data-section='vertical-tabs'] > [data-section-region] > [data-section-title] a, [data-section='vertical-tabs'] > [data-section-region] > .title a, .section-container.vertical-tabs > section > [data-section-title] a, .section-container.vertical-tabs > section > .title a, .section-container.vertical-tabs > .section > [data-section-title] a, .section-container.vertical-tabs > .section > .title a, .section-container.vertical-tabs > [data-section-region] > [data-section-title] a, .section-container.vertical-tabs > [data-section-region] > .title a { + width: 100%; + display: inline-block; + white-space: nowrap; + } + + [data-section='vertical-tabs'] > section > [data-section-content], [data-section='vertical-tabs'] > section > .content, [data-section='vertical-tabs'] > .section > [data-section-content], [data-section='vertical-tabs'] > .section > .content, [data-section='vertical-tabs'] > [data-section-region] > [data-section-content], [data-section='vertical-tabs'] > [data-section-region] > .content, .section-container.vertical-tabs > section > [data-section-content], .section-container.vertical-tabs > section > .content, .section-container.vertical-tabs > .section > [data-section-content], .section-container.vertical-tabs > .section > .content, .section-container.vertical-tabs > [data-section-region] > [data-section-content], .section-container.vertical-tabs > [data-section-region] > .content { + display: none; + } + + [data-section='vertical-tabs'] > section.active > [data-section-content], [data-section='vertical-tabs'] > section.active > .content, [data-section='vertical-tabs'] > .section.active > [data-section-content], [data-section='vertical-tabs'] > .section.active > .content, [data-section='vertical-tabs'] > [data-section-region].active > [data-section-content], [data-section='vertical-tabs'] > [data-section-region].active > .content, .section-container.vertical-tabs > section.active > [data-section-content], .section-container.vertical-tabs > section.active > .content, .section-container.vertical-tabs > .section.active > [data-section-content], .section-container.vertical-tabs > .section.active > .content, .section-container.vertical-tabs > [data-section-region].active > [data-section-content], .section-container.vertical-tabs > [data-section-region].active > .content { + display: block; + } + + [data-section='vertical-tabs'] > section:not(.active), [data-section='vertical-tabs'] > .section:not(.active), [data-section='vertical-tabs'] > [data-section-region]:not(.active), .section-container.vertical-tabs > section:not(.active), .section-container.vertical-tabs > .section:not(.active), .section-container.vertical-tabs > [data-section-region]:not(.active) { + padding: 0 !important; + } + + [data-section='vertical-tabs'] > section > [data-section-title], [data-section='vertical-tabs'] > section > .title, [data-section='vertical-tabs'] > .section > [data-section-title], [data-section='vertical-tabs'] > .section > .title, [data-section='vertical-tabs'] > [data-section-region] > [data-section-title], [data-section='vertical-tabs'] > [data-section-region] > .title, .section-container.vertical-tabs > section > [data-section-title], .section-container.vertical-tabs > section > .title, .section-container.vertical-tabs > .section > [data-section-title], .section-container.vertical-tabs > .section > .title, .section-container.vertical-tabs > [data-section-region] > [data-section-title], .section-container.vertical-tabs > [data-section-region] > .title { + position: absolute; + top: 0; + left: 0; + width: 12.5em; + } + + [data-section='vertical-tabs'] > section.active, [data-section='vertical-tabs'] > .section.active, [data-section='vertical-tabs'] > [data-section-region].active, .section-container.vertical-tabs > section.active, .section-container.vertical-tabs > .section.active, .section-container.vertical-tabs > [data-section-region].active { + padding-left: 12.5em; + } + + [data-section='vertical-tabs'] > section.active > [data-section-title], [data-section='vertical-tabs'] > section.active > .title, [data-section='vertical-tabs'] > .section.active > [data-section-title], [data-section='vertical-tabs'] > .section.active > .title, [data-section='vertical-tabs'] > [data-section-region].active > [data-section-title], [data-section='vertical-tabs'] > [data-section-region].active > .title, .section-container.vertical-tabs > section.active > [data-section-title], .section-container.vertical-tabs > section.active > .title, .section-container.vertical-tabs > .section.active > [data-section-title], .section-container.vertical-tabs > .section.active > .title, .section-container.vertical-tabs > [data-section-region].active > [data-section-title], .section-container.vertical-tabs > [data-section-region].active > .title { + width: 12.5em; + } + + .section-container.vertical-tabs { + border: none; + } + + .section-container.vertical-tabs > section > .title, .section-container.vertical-tabs > .section > .title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #cccccc; + } + + .section-container.vertical-tabs > section > .title a, .section-container.vertical-tabs > .section > .title a { + padding: 0.9375em; + color: #333333; + font-size: 0.875em; + background: none; + } + + .section-container.vertical-tabs > section > .title:hover, .section-container.vertical-tabs > .section > .title:hover { + background-color: #e2e2e2; + } + + .section-container.vertical-tabs > section > .content, .section-container.vertical-tabs > .section > .content { + padding: 0.9375em; + background-color: white; + border: solid 1px #cccccc; + } + + .section-container.vertical-tabs > section > .content > *:last-child, .section-container.vertical-tabs > .section > .content > *:last-child { + margin-bottom: 0; + } + + .section-container.vertical-tabs > section > .content > *:first-child, .section-container.vertical-tabs > .section > .content > *:first-child { + padding-top: 0; + } + + .section-container.vertical-tabs > section > .content > *:last-child:not(.flex-video), .section-container.vertical-tabs > .section > .content > *:last-child:not(.flex-video) { + padding-bottom: 0; + } + + .section-container.vertical-tabs > section.active > .title, .section-container.vertical-tabs > .section.active > .title { + background: #d5d5d5; + } + + .section-container.vertical-tabs > section.active > .title a, .section-container.vertical-tabs > .section.active > .title a { + color: #333333; + } + + .section-container.vertical-tabs > section:not(.active), .section-container.vertical-tabs > .section:not(.active) { + padding: 0 !important; + } + + .section-container.vertical-tabs > section.active, .section-container.vertical-tabs > .section.active { + padding-left: 12.4375em; + } + + .section-container.vertical-tabs > section.active > .title, .section-container.vertical-tabs > .section.active > .title { + background-color: #d5d5d5; + } + + [data-section='vertical-nav'], .section-container.vertical-nav { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em; + } + + [data-section='vertical-nav']:not([data-section-resized]):not([data-section-small-style]), .section-container.vertical-nav:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden; + } + + [data-section='vertical-nav'][data-section-small-style], .section-container.vertical-nav[data-section-small-style] { + width: 100% !important; + } + + [data-section='vertical-nav'][data-section-small-style] > [data-section-region], [data-section='vertical-nav'][data-section-small-style] > section, [data-section='vertical-nav'][data-section-small-style] > .section, .section-container.vertical-nav[data-section-small-style] > [data-section-region], .section-container.vertical-nav[data-section-small-style] > section, .section-container.vertical-nav[data-section-small-style] > .section { + padding: 0 !important; + margin: 0 !important; + } + + [data-section='vertical-nav'][data-section-small-style] > [data-section-region] > [data-section-title], [data-section='vertical-nav'][data-section-small-style] > [data-section-region] > .title, [data-section='vertical-nav'][data-section-small-style] > section > [data-section-title], [data-section='vertical-nav'][data-section-small-style] > section > .title, [data-section='vertical-nav'][data-section-small-style] > .section > [data-section-title], [data-section='vertical-nav'][data-section-small-style] > .section > .title, .section-container.vertical-nav[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.vertical-nav[data-section-small-style] > [data-section-region] > .title, .section-container.vertical-nav[data-section-small-style] > section > [data-section-title], .section-container.vertical-nav[data-section-small-style] > section > .title, .section-container.vertical-nav[data-section-small-style] > .section > [data-section-title], .section-container.vertical-nav[data-section-small-style] > .section > .title { + width: 100% !important; + } + + [data-section='vertical-nav'] > section, [data-section='vertical-nav'] > .section, [data-section='vertical-nav'] > [data-section-region], .section-container.vertical-nav > section, .section-container.vertical-nav > .section, .section-container.vertical-nav > [data-section-region] { + position: relative; + display: inline-block; + } + + [data-section='vertical-nav'] > section > [data-section-title], [data-section='vertical-nav'] > section > .title, [data-section='vertical-nav'] > .section > [data-section-title], [data-section='vertical-nav'] > .section > .title, [data-section='vertical-nav'] > [data-section-region] > [data-section-title], [data-section='vertical-nav'] > [data-section-region] > .title, .section-container.vertical-nav > section > [data-section-title], .section-container.vertical-nav > section > .title, .section-container.vertical-nav > .section > [data-section-title], .section-container.vertical-nav > .section > .title, .section-container.vertical-nav > [data-section-region] > [data-section-title], .section-container.vertical-nav > [data-section-region] > .title { + margin-bottom: 0; + } + + [data-section='vertical-nav'] > section > [data-section-title] a, [data-section='vertical-nav'] > section > .title a, [data-section='vertical-nav'] > .section > [data-section-title] a, [data-section='vertical-nav'] > .section > .title a, [data-section='vertical-nav'] > [data-section-region] > [data-section-title] a, [data-section='vertical-nav'] > [data-section-region] > .title a, .section-container.vertical-nav > section > [data-section-title] a, .section-container.vertical-nav > section > .title a, .section-container.vertical-nav > .section > [data-section-title] a, .section-container.vertical-nav > .section > .title a, .section-container.vertical-nav > [data-section-region] > [data-section-title] a, .section-container.vertical-nav > [data-section-region] > .title a { + width: 100%; + display: inline-block; + white-space: nowrap; + } + + [data-section='vertical-nav'] > section > [data-section-content], [data-section='vertical-nav'] > section > .content, [data-section='vertical-nav'] > .section > [data-section-content], [data-section='vertical-nav'] > .section > .content, [data-section='vertical-nav'] > [data-section-region] > [data-section-content], [data-section='vertical-nav'] > [data-section-region] > .content, .section-container.vertical-nav > section > [data-section-content], .section-container.vertical-nav > section > .content, .section-container.vertical-nav > .section > [data-section-content], .section-container.vertical-nav > .section > .content, .section-container.vertical-nav > [data-section-region] > [data-section-content], .section-container.vertical-nav > [data-section-region] > .content { + display: none; + } + + [data-section='vertical-nav'] > section.active > [data-section-content], [data-section='vertical-nav'] > section.active > .content, [data-section='vertical-nav'] > .section.active > [data-section-content], [data-section='vertical-nav'] > .section.active > .content, [data-section='vertical-nav'] > [data-section-region].active > [data-section-content], [data-section='vertical-nav'] > [data-section-region].active > .content, .section-container.vertical-nav > section.active > [data-section-content], .section-container.vertical-nav > section.active > .content, .section-container.vertical-nav > .section.active > [data-section-content], .section-container.vertical-nav > .section.active > .content, .section-container.vertical-nav > [data-section-region].active > [data-section-content], .section-container.vertical-nav > [data-section-region].active > .content { + display: block; + } + + [data-section='vertical-nav'] > section:not(.active), [data-section='vertical-nav'] > .section:not(.active), [data-section='vertical-nav'] > [data-section-region]:not(.active), .section-container.vertical-nav > section:not(.active), .section-container.vertical-nav > .section:not(.active), .section-container.vertical-nav > [data-section-region]:not(.active) { + padding: 0 !important; + } + + [data-section='vertical-nav'] > section > [data-section-title], [data-section='vertical-nav'] > section > .title, [data-section='vertical-nav'] > .section > [data-section-title], [data-section='vertical-nav'] > .section > .title, [data-section='vertical-nav'] > [data-section-region] > [data-section-title], [data-section='vertical-nav'] > [data-section-region] > .title, .section-container.vertical-nav > section > [data-section-title], .section-container.vertical-nav > section > .title, .section-container.vertical-nav > .section > [data-section-title], .section-container.vertical-nav > .section > .title, .section-container.vertical-nav > [data-section-region] > [data-section-title], .section-container.vertical-nav > [data-section-region] > .title { + position: static; + width: auto; + } + + [data-section='vertical-nav'] > section > [data-section-title] a, [data-section='vertical-nav'] > section > .title a, [data-section='vertical-nav'] > .section > [data-section-title] a, [data-section='vertical-nav'] > .section > .title a, [data-section='vertical-nav'] > [data-section-region] > [data-section-title] a, [data-section='vertical-nav'] > [data-section-region] > .title a, .section-container.vertical-nav > section > [data-section-title] a, .section-container.vertical-nav > section > .title a, .section-container.vertical-nav > .section > [data-section-title] a, .section-container.vertical-nav > .section > .title a, .section-container.vertical-nav > [data-section-region] > [data-section-title] a, .section-container.vertical-nav > [data-section-region] > .title a { + display: block; + } + + [data-section='vertical-nav'] > section > [data-section-content], [data-section='vertical-nav'] > section > .content, [data-section='vertical-nav'] > .section > [data-section-content], [data-section='vertical-nav'] > .section > .content, [data-section='vertical-nav'] > [data-section-region] > [data-section-content], [data-section='vertical-nav'] > [data-section-region] > .content, .section-container.vertical-nav > section > [data-section-content], .section-container.vertical-nav > section > .content, .section-container.vertical-nav > .section > [data-section-content], .section-container.vertical-nav > .section > .content, .section-container.vertical-nav > [data-section-region] > [data-section-content], .section-container.vertical-nav > [data-section-region] > .content { + position: absolute; + top: 0; + left: 0; + z-index: 999; + min-width: 12.5em; + } + + .section-container.vertical-nav { + border: none; + } + + .section-container.vertical-nav > section > .title, .section-container.vertical-nav > .section > .title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #cccccc; + } + + .section-container.vertical-nav > section > .title a, .section-container.vertical-nav > .section > .title a { + padding: 0.9375em; + color: #333333; + font-size: 0.875em; + background: none; + } + + .section-container.vertical-nav > section > .title:hover, .section-container.vertical-nav > .section > .title:hover { + background-color: #e2e2e2; + } + + .section-container.vertical-nav > section > .content, .section-container.vertical-nav > .section > .content { + padding: 0.9375em; + background-color: white; + border: solid 1px #cccccc; + } + + .section-container.vertical-nav > section > .content > *:last-child, .section-container.vertical-nav > .section > .content > *:last-child { + margin-bottom: 0; + } + + .section-container.vertical-nav > section > .content > *:first-child, .section-container.vertical-nav > .section > .content > *:first-child { + padding-top: 0; + } + + .section-container.vertical-nav > section > .content > *:last-child:not(.flex-video), .section-container.vertical-nav > .section > .content > *:last-child:not(.flex-video) { + padding-bottom: 0; + } + + .section-container.vertical-nav > section.active > .title, .section-container.vertical-nav > .section.active > .title { + background: #d5d5d5; + } + + .section-container.vertical-nav > section.active > .title a, .section-container.vertical-nav > .section.active > .title a { + color: #333333; + } + + .section-container.vertical-nav > section:not(.active), .section-container.vertical-nav > .section:not(.active) { + padding: 0 !important; + } + + [data-section='horizontal-nav'], .section-container.horizontal-nav { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em; + } + + [data-section='horizontal-nav']:not([data-section-resized]):not([data-section-small-style]), .section-container.horizontal-nav:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden; + } + + [data-section='horizontal-nav'][data-section-small-style], .section-container.horizontal-nav[data-section-small-style] { + width: 100% !important; + } + + [data-section='horizontal-nav'][data-section-small-style] > [data-section-region], [data-section='horizontal-nav'][data-section-small-style] > section, [data-section='horizontal-nav'][data-section-small-style] > .section, .section-container.horizontal-nav[data-section-small-style] > [data-section-region], .section-container.horizontal-nav[data-section-small-style] > section, .section-container.horizontal-nav[data-section-small-style] > .section { + padding: 0 !important; + margin: 0 !important; + } + + [data-section='horizontal-nav'][data-section-small-style] > [data-section-region] > [data-section-title], [data-section='horizontal-nav'][data-section-small-style] > [data-section-region] > .title, [data-section='horizontal-nav'][data-section-small-style] > section > [data-section-title], [data-section='horizontal-nav'][data-section-small-style] > section > .title, [data-section='horizontal-nav'][data-section-small-style] > .section > [data-section-title], [data-section='horizontal-nav'][data-section-small-style] > .section > .title, .section-container.horizontal-nav[data-section-small-style] > [data-section-region] > [data-section-title], .section-container.horizontal-nav[data-section-small-style] > [data-section-region] > .title, .section-container.horizontal-nav[data-section-small-style] > section > [data-section-title], .section-container.horizontal-nav[data-section-small-style] > section > .title, .section-container.horizontal-nav[data-section-small-style] > .section > [data-section-title], .section-container.horizontal-nav[data-section-small-style] > .section > .title { + width: 100% !important; + } + + [data-section='horizontal-nav'] > section, [data-section='horizontal-nav'] > .section, [data-section='horizontal-nav'] > [data-section-region], .section-container.horizontal-nav > section, .section-container.horizontal-nav > .section, .section-container.horizontal-nav > [data-section-region] { + position: relative; + float: left; + } + + [data-section='horizontal-nav'] > section > [data-section-title], [data-section='horizontal-nav'] > section > .title, [data-section='horizontal-nav'] > .section > [data-section-title], [data-section='horizontal-nav'] > .section > .title, [data-section='horizontal-nav'] > [data-section-region] > [data-section-title], [data-section='horizontal-nav'] > [data-section-region] > .title, .section-container.horizontal-nav > section > [data-section-title], .section-container.horizontal-nav > section > .title, .section-container.horizontal-nav > .section > [data-section-title], .section-container.horizontal-nav > .section > .title, .section-container.horizontal-nav > [data-section-region] > [data-section-title], .section-container.horizontal-nav > [data-section-region] > .title { + margin-bottom: 0; + } + + [data-section='horizontal-nav'] > section > [data-section-title] a, [data-section='horizontal-nav'] > section > .title a, [data-section='horizontal-nav'] > .section > [data-section-title] a, [data-section='horizontal-nav'] > .section > .title a, [data-section='horizontal-nav'] > [data-section-region] > [data-section-title] a, [data-section='horizontal-nav'] > [data-section-region] > .title a, .section-container.horizontal-nav > section > [data-section-title] a, .section-container.horizontal-nav > section > .title a, .section-container.horizontal-nav > .section > [data-section-title] a, .section-container.horizontal-nav > .section > .title a, .section-container.horizontal-nav > [data-section-region] > [data-section-title] a, .section-container.horizontal-nav > [data-section-region] > .title a { + width: 100%; + display: inline-block; + white-space: nowrap; + } + + [data-section='horizontal-nav'] > section > [data-section-content], [data-section='horizontal-nav'] > section > .content, [data-section='horizontal-nav'] > .section > [data-section-content], [data-section='horizontal-nav'] > .section > .content, [data-section='horizontal-nav'] > [data-section-region] > [data-section-content], [data-section='horizontal-nav'] > [data-section-region] > .content, .section-container.horizontal-nav > section > [data-section-content], .section-container.horizontal-nav > section > .content, .section-container.horizontal-nav > .section > [data-section-content], .section-container.horizontal-nav > .section > .content, .section-container.horizontal-nav > [data-section-region] > [data-section-content], .section-container.horizontal-nav > [data-section-region] > .content { + display: none; + } + + [data-section='horizontal-nav'] > section.active > [data-section-content], [data-section='horizontal-nav'] > section.active > .content, [data-section='horizontal-nav'] > .section.active > [data-section-content], [data-section='horizontal-nav'] > .section.active > .content, [data-section='horizontal-nav'] > [data-section-region].active > [data-section-content], [data-section='horizontal-nav'] > [data-section-region].active > .content, .section-container.horizontal-nav > section.active > [data-section-content], .section-container.horizontal-nav > section.active > .content, .section-container.horizontal-nav > .section.active > [data-section-content], .section-container.horizontal-nav > .section.active > .content, .section-container.horizontal-nav > [data-section-region].active > [data-section-content], .section-container.horizontal-nav > [data-section-region].active > .content { + display: block; + } + + [data-section='horizontal-nav'] > section:not(.active), [data-section='horizontal-nav'] > .section:not(.active), [data-section='horizontal-nav'] > [data-section-region]:not(.active), .section-container.horizontal-nav > section:not(.active), .section-container.horizontal-nav > .section:not(.active), .section-container.horizontal-nav > [data-section-region]:not(.active) { + padding: 0 !important; + } + + [data-section='horizontal-nav'] > section > [data-section-title], [data-section='horizontal-nav'] > section > .title, [data-section='horizontal-nav'] > .section > [data-section-title], [data-section='horizontal-nav'] > .section > .title, [data-section='horizontal-nav'] > [data-section-region] > [data-section-title], [data-section='horizontal-nav'] > [data-section-region] > .title, .section-container.horizontal-nav > section > [data-section-title], .section-container.horizontal-nav > section > .title, .section-container.horizontal-nav > .section > [data-section-title], .section-container.horizontal-nav > .section > .title, .section-container.horizontal-nav > [data-section-region] > [data-section-title], .section-container.horizontal-nav > [data-section-region] > .title { + position: static; + width: auto; + } + + [data-section='horizontal-nav'] > section > [data-section-title] a, [data-section='horizontal-nav'] > section > .title a, [data-section='horizontal-nav'] > .section > [data-section-title] a, [data-section='horizontal-nav'] > .section > .title a, [data-section='horizontal-nav'] > [data-section-region] > [data-section-title] a, [data-section='horizontal-nav'] > [data-section-region] > .title a, .section-container.horizontal-nav > section > [data-section-title] a, .section-container.horizontal-nav > section > .title a, .section-container.horizontal-nav > .section > [data-section-title] a, .section-container.horizontal-nav > .section > .title a, .section-container.horizontal-nav > [data-section-region] > [data-section-title] a, .section-container.horizontal-nav > [data-section-region] > .title a { + display: block; + } + + [data-section='horizontal-nav'] > section > [data-section-content], [data-section='horizontal-nav'] > section > .content, [data-section='horizontal-nav'] > .section > [data-section-content], [data-section='horizontal-nav'] > .section > .content, [data-section='horizontal-nav'] > [data-section-region] > [data-section-content], [data-section='horizontal-nav'] > [data-section-region] > .content, .section-container.horizontal-nav > section > [data-section-content], .section-container.horizontal-nav > section > .content, .section-container.horizontal-nav > .section > [data-section-content], .section-container.horizontal-nav > .section > .content, .section-container.horizontal-nav > [data-section-region] > [data-section-content], .section-container.horizontal-nav > [data-section-region] > .content { + width: auto; + position: absolute; + top: 0; + left: 0; + z-index: 999; + min-width: 12.5em; + } + + .section-container.horizontal-nav { + background: #efefef; + border: 1px solid #cccccc; + } + + .section-container.horizontal-nav > section > .title, .section-container.horizontal-nav > .section > .title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #cccccc; + } + + .section-container.horizontal-nav > section > .title a, .section-container.horizontal-nav > .section > .title a { + padding: 0.9375em; + color: #333333; + font-size: 0.875em; + background: none; + } + + .section-container.horizontal-nav > section > .title:hover, .section-container.horizontal-nav > .section > .title:hover { + background-color: #e2e2e2; + } + + .section-container.horizontal-nav > section > .content, .section-container.horizontal-nav > .section > .content { + padding: 0.9375em; + background-color: white; + border: solid 1px #cccccc; + } + + .section-container.horizontal-nav > section > .content > *:last-child, .section-container.horizontal-nav > .section > .content > *:last-child { + margin-bottom: 0; + } + + .section-container.horizontal-nav > section > .content > *:first-child, .section-container.horizontal-nav > .section > .content > *:first-child { + padding-top: 0; + } + + .section-container.horizontal-nav > section > .content > *:last-child:not(.flex-video), .section-container.horizontal-nav > .section > .content > *:last-child:not(.flex-video) { + padding-bottom: 0; + } + + .section-container.horizontal-nav > section.active > .title, .section-container.horizontal-nav > .section.active > .title { + background: #d5d5d5; + } + + .section-container.horizontal-nav > section.active > .title a, .section-container.horizontal-nav > .section.active > .title a { + color: #333333; + } + + .section-container.horizontal-nav > section:not(.active), .section-container.horizontal-nav > .section:not(.active) { + padding: 0 !important; + } +} + +.no-js [data-section], .no-js .section-container { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em; +} + +.no-js [data-section][data-section-small-style], .no-js .section-container[data-section-small-style] { + width: 100% !important; +} + +.no-js [data-section][data-section-small-style] > [data-section-region], .no-js [data-section][data-section-small-style] > section, .no-js [data-section][data-section-small-style] > .section, .no-js .section-container[data-section-small-style] > [data-section-region], .no-js .section-container[data-section-small-style] > section, .no-js .section-container[data-section-small-style] > .section { + padding: 0 !important; + margin: 0 !important; +} + +.no-js [data-section][data-section-small-style] > [data-section-region] > [data-section-title], .no-js [data-section][data-section-small-style] > [data-section-region] > .title, .no-js [data-section][data-section-small-style] > section > [data-section-title], .no-js [data-section][data-section-small-style] > section > .title, .no-js [data-section][data-section-small-style] > .section > [data-section-title], .no-js [data-section][data-section-small-style] > .section > .title, .no-js .section-container[data-section-small-style] > [data-section-region] > [data-section-title], .no-js .section-container[data-section-small-style] > [data-section-region] > .title, .no-js .section-container[data-section-small-style] > section > [data-section-title], .no-js .section-container[data-section-small-style] > section > .title, .no-js .section-container[data-section-small-style] > .section > [data-section-title], .no-js .section-container[data-section-small-style] > .section > .title { + width: 100% !important; +} + +.no-js [data-section] > section, .no-js [data-section] > .section, .no-js [data-section] > [data-section-region], .no-js .section-container > section, .no-js .section-container > .section, .no-js .section-container > [data-section-region] { + margin: 0; +} + +.no-js [data-section] > section > [data-section-title], .no-js [data-section] > section > .title, .no-js [data-section] > .section > [data-section-title], .no-js [data-section] > .section > .title, .no-js [data-section] > [data-section-region] > [data-section-title], .no-js [data-section] > [data-section-region] > .title, .no-js .section-container > section > [data-section-title], .no-js .section-container > section > .title, .no-js .section-container > .section > [data-section-title], .no-js .section-container > .section > .title, .no-js .section-container > [data-section-region] > [data-section-title], .no-js .section-container > [data-section-region] > .title { + margin-bottom: 0; +} + +.no-js [data-section] > section > [data-section-title] a, .no-js [data-section] > section > .title a, .no-js [data-section] > .section > [data-section-title] a, .no-js [data-section] > .section > .title a, .no-js [data-section] > [data-section-region] > [data-section-title] a, .no-js [data-section] > [data-section-region] > .title a, .no-js .section-container > section > [data-section-title] a, .no-js .section-container > section > .title a, .no-js .section-container > .section > [data-section-title] a, .no-js .section-container > .section > .title a, .no-js .section-container > [data-section-region] > [data-section-title] a, .no-js .section-container > [data-section-region] > .title a { + width: 100%; + display: inline-block; + white-space: nowrap; +} + +.no-js [data-section] > section > [data-section-content], .no-js [data-section] > section > .content, .no-js [data-section] > .section > [data-section-content], .no-js [data-section] > .section > .content, .no-js [data-section] > [data-section-region] > [data-section-content], .no-js [data-section] > [data-section-region] > .content, .no-js .section-container > section > [data-section-content], .no-js .section-container > section > .content, .no-js .section-container > .section > [data-section-content], .no-js .section-container > .section > .content, .no-js .section-container > [data-section-region] > [data-section-content], .no-js .section-container > [data-section-region] > .content { + display: none; +} + +.no-js [data-section] > section.active > [data-section-content], .no-js [data-section] > section.active > .content, .no-js [data-section] > .section.active > [data-section-content], .no-js [data-section] > .section.active > .content, .no-js [data-section] > [data-section-region].active > [data-section-content], .no-js [data-section] > [data-section-region].active > .content, .no-js .section-container > section.active > [data-section-content], .no-js .section-container > section.active > .content, .no-js .section-container > .section.active > [data-section-content], .no-js .section-container > .section.active > .content, .no-js .section-container > [data-section-region].active > [data-section-content], .no-js .section-container > [data-section-region].active > .content { + display: block; +} + +.no-js [data-section] > section:not(.active), .no-js [data-section] > .section:not(.active), .no-js [data-section] > [data-section-region]:not(.active), .no-js .section-container > section:not(.active), .no-js .section-container > .section:not(.active), .no-js .section-container > [data-section-region]:not(.active) { + padding: 0 !important; +} + +.no-js [data-section] > section > [data-section-title], .no-js [data-section] > section > .title, .no-js [data-section] > .section > [data-section-title], .no-js [data-section] > .section > .title, .no-js [data-section] > [data-section-region] > [data-section-title], .no-js [data-section] > [data-section-region] > .title, .no-js .section-container > section > [data-section-title], .no-js .section-container > section > .title, .no-js .section-container > .section > [data-section-title], .no-js .section-container > .section > .title, .no-js .section-container > [data-section-region] > [data-section-title], .no-js .section-container > [data-section-region] > .title { + width: 100%; +} + +.no-js .section-container { + border-top: 1px solid #cccccc; +} + +.no-js .section-container > section > .title, .no-js .section-container > .section > .title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #cccccc; +} + +.no-js .section-container > section > .title a, .no-js .section-container > .section > .title a { + padding: 0.9375em; + color: #333333; + font-size: 0.875em; + background: none; +} + +.no-js .section-container > section > .title:hover, .no-js .section-container > .section > .title:hover { + background-color: #e2e2e2; +} + +.no-js .section-container > section > .content, .no-js .section-container > .section > .content { + padding: 0.9375em; + background-color: white; + border: solid 1px #cccccc; +} + +.no-js .section-container > section > .content > *:last-child, .no-js .section-container > .section > .content > *:last-child { + margin-bottom: 0; +} + +.no-js .section-container > section > .content > *:first-child, .no-js .section-container > .section > .content > *:first-child { + padding-top: 0; +} + +.no-js .section-container > section > .content > *:last-child:not(.flex-video), .no-js .section-container > .section > .content > *:last-child:not(.flex-video) { + padding-bottom: 0; +} + +.no-js .section-container > section.active > .title, .no-js .section-container > .section.active > .title { + background: #d5d5d5; +} + +.no-js .section-container > section.active > .title a, .no-js .section-container > .section.active > .title a { + color: #333333; +} + +.no-js .section-container > section:not(.active), .no-js .section-container > .section:not(.active) { + padding: 0 !important; +} + +.no-js .section-container > section > .title, .no-js .section-container > .section > .title { + border-top: none; +} + +/* Wrapped around .top-bar to contain to grid width */ +.contain-to-grid { + width: 100%; + background: #111111; +} + +.contain-to-grid .top-bar { + margin-bottom: 1.875em; +} + +.fixed { + width: 100%; + left: 0; + position: fixed; + top: 0; + z-index: 99; +} + +.top-bar { + overflow: hidden; + height: 45px; + line-height: 45px; + position: relative; + background: #111111; + margin-bottom: 1.875em; +} + +.top-bar ul { + margin-bottom: 0; + list-style: none; +} + +.top-bar .row { + max-width: none; +} + +.top-bar form, +.top-bar input { + margin-bottom: 0; +} + +.top-bar input { + height: 2.45em; +} + +.top-bar .button { + padding-top: .5em; + padding-bottom: .5em; + margin-bottom: 0; +} + +.top-bar .title-area { + position: relative; + margin: 0; +} + +.top-bar .name { + height: 45px; + margin: 0; + font-size: 16; +} + +.top-bar .name h1 { + line-height: 45px; + font-size: 1.0625em; + margin: 0; +} + +.top-bar .name h1 a { + font-weight: bold; + color: white; + width: 50%; + display: block; + padding: 0 15px; +} + +.top-bar .toggle-topbar { + position: absolute; + right: 0; + top: 0; +} + +.top-bar .toggle-topbar a { + color: white; + text-transform: uppercase; + font-size: 0.8125em; + font-weight: bold; + position: relative; + display: block; + padding: 0 15px; + height: 45px; + line-height: 45px; +} + +.top-bar .toggle-topbar.menu-icon { + right: 15px; + top: 50%; + margin-top: -16px; + padding-left: 40px; +} + +.top-bar .toggle-topbar.menu-icon a { + text-indent: -48px; + width: 34px; + height: 34px; + line-height: 33px; + padding: 0; + color: white; +} + +.top-bar .toggle-topbar.menu-icon a span { + position: absolute; + right: 0; + display: block; + width: 16px; + height: 0; + -webkit-box-shadow: 0 10px 0 1px white, 0 16px 0 1px white, 0 22px 0 1px white; + box-shadow: 0 10px 0 1px white, 0 16px 0 1px white, 0 22px 0 1px white; +} + +.top-bar.expanded { + height: auto; + background: transparent; +} + +.top-bar.expanded .title-area { + background: #111111; +} + +.top-bar.expanded .toggle-topbar a { + color: #888888; +} + +.top-bar.expanded .toggle-topbar a span { + -webkit-box-shadow: 0 10px 0 1px #888888, 0 16px 0 1px #888888, 0 22px 0 1px #888888; + box-shadow: 0 10px 0 1px #888888, 0 16px 0 1px #888888, 0 22px 0 1px #888888; +} + +.top-bar-section { + left: 0; + position: relative; + width: auto; + -webkit-transition: left 300ms ease-out; + -moz-transition: left 300ms ease-out; + transition: left 300ms ease-out; +} + +.top-bar-section ul { + width: 100%; + height: auto; + display: block; + background: #222222; + font-size: 16; + margin: 0; +} + +.top-bar-section .divider, +.top-bar-section [role="separator"] { + border-bottom: solid 1px #2b2b2b; + border-top: solid 1px black; + clear: both; + height: 1px; + width: 100%; +} + +.top-bar-section ul li > a { + display: block; + width: 100%; + color: white; + padding: 12px 0 12px 0; + padding-left: 15px; + font-size: 0.8125em; + font-weight: bold; + background: #222222; +} + +.top-bar-section ul li > a.button { + background: #2ba6cb; + font-size: 0.8125em; +} + +.top-bar-section ul li > a.button.hover { + background: #2284a1; +} + +.top-bar-section ul li > a.button.secondary { + background: #e9e9e9; +} + +.top-bar-section ul li > a.button.secondary.hover { + background: #d0d0d0; +} + +.top-bar-section ul li > a.button.success { + background: #5da423; +} + +.top-bar-section ul li > a.button.success.hover { + background: #457a1a; +} + +.top-bar-section ul li > a.button.alert { + background: #c60f13; +} + +.top-bar-section ul li > a.button.alert.hover { + background: #970b0e; +} + +.top-bar-section ul li.hover > a { + background: #090909; + color: white; +} + +.top-bar-section ul li.active > a { + background: #090909; + color: white; +} + +.top-bar-section .has-form { + padding: 15px; +} + +.top-bar-section .has-dropdown { + position: relative; +} + +.top-bar-section .has-dropdown > a:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent transparent transparent rgba(255, 255, 255, 0.5); + border-left-style: solid; + margin-right: 15px; + margin-top: -4.5px; + position: absolute; + top: 50%; + right: 0; +} + +.top-bar-section .has-dropdown.moved { + position: static; +} + +.top-bar-section .has-dropdown.moved > .dropdown { + visibility: visible; +} + +.top-bar-section .dropdown { + position: absolute; + left: 100%; + top: 0; + visibility: hidden; + z-index: 99; +} + +.top-bar-section .dropdown li { + width: 100%; + height: auto; +} + +.top-bar-section .dropdown li a { + font-weight: normal; + padding: 8px 15px; +} + +.top-bar-section .dropdown li a.parent-link { + font-weight: bold; +} + +.top-bar-section .dropdown li.title h5 { + margin-bottom: 0; +} + +.top-bar-section .dropdown li.title h5 a { + color: white; + line-height: 22.5px; + display: block; +} + +.top-bar-section .dropdown label { + padding: 8px 15px 2px; + margin-bottom: 0; + text-transform: uppercase; + color: #555555; + font-weight: bold; + font-size: 0.625em; +} + +.top-bar-js-breakpoint { + width: 58.75em !important; + visibility: hidden; +} + +.js-generated { + display: block; +} + +@media only screen and (min-width: 58.75em) { + .top-bar { + background: #111111; + *zoom: 1; + overflow: visible; + } + + .top-bar:before, .top-bar:after { + content: " "; + display: table; + } + + .top-bar:after { + clear: both; + } + + .top-bar .toggle-topbar { + display: none; + } + + .top-bar .title-area { + float: left; + } + + .top-bar .name h1 a { + width: auto; + } + + .top-bar input, + .top-bar .button { + line-height: 2em; + font-size: 0.875em; + height: 2em; + padding: 0 10px; + position: relative; + top: 8px; + } + + .top-bar.expanded { + background: #111111; + } + + .contain-to-grid .top-bar { + max-width: 62.5em; + margin: 0 auto; + margin-bottom: 1.875em; + } + + .top-bar-section { + -webkit-transition: none 0 0; + -moz-transition: none 0 0; + transition: none 0 0; + left: 0 !important; + } + + .top-bar-section ul { + width: auto; + height: auto !important; + display: inline; + } + + .top-bar-section ul li { + float: left; + } + + .top-bar-section ul li .js-generated { + display: none; + } + + .top-bar-section li a:not(.button) { + padding: 0 15px; + line-height: 45px; + background: #111111; + } + + .top-bar-section li a:not(.button).hover { + background: black; + } + + .top-bar-section .has-dropdown > a { + padding-right: 35px !important; + } + + .top-bar-section .has-dropdown > a:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: rgba(255, 255, 255, 0.5) transparent transparent transparent; + border-top-style: solid; + margin-top: -2.5px; + top: 22.5px; + } + + .top-bar-section .has-dropdown.moved { + position: relative; + } + + .top-bar-section .has-dropdown.moved > .dropdown { + visibility: hidden; + } + + .top-bar-section .has-dropdown.hover > .dropdown, .top-bar-section .has-dropdown.not-click:hover > .dropdown { + visibility: visible; + } + + .top-bar-section .has-dropdown .dropdown li.has-dropdown > a:after { + border: none; + content: "\00bb"; + margin-top: -16px; + right: 5px; + } + + .top-bar-section .dropdown { + left: 0; + top: auto; + background: transparent; + min-width: 100%; + } + + .top-bar-section .dropdown li a { + color: white; + line-height: 1; + white-space: nowrap; + padding: 7px 15px; + background: #1e1e1e; + } + + .top-bar-section .dropdown li label { + white-space: nowrap; + background: #1e1e1e; + } + + .top-bar-section .dropdown li .dropdown { + left: 100%; + top: 0; + } + + .top-bar-section > ul > .divider, .top-bar-section > ul > [role="separator"] { + border-bottom: none; + border-top: none; + border-right: solid 1px #2b2b2b; + border-left: solid 1px black; + clear: none; + height: 45px; + width: 0px; + } + + .top-bar-section .has-form { + background: #111111; + padding: 0 15px; + height: 45px; + } + + .top-bar-section ul.right li .dropdown { + left: auto; + right: 0; + } + + .top-bar-section ul.right li .dropdown li .dropdown { + right: 100%; + } + + .no-js .top-bar-section ul li:hover > a { + background: #090909; + color: white; + } + + .no-js .top-bar-section ul li:active > a { + background: #090909; + color: white; + } + + .no-js .top-bar-section .has-dropdown:hover > .dropdown { + visibility: visible; + } +} + +@-webkit-keyframes rotate { + from { + -webkit-transform: rotate(0deg); + } + + to { + -webkit-transform: rotate(360deg); + } +} + +@-moz-keyframes rotate { + from { + -webkit-transform: rotate(0deg); + } + + to { + -webkit-transform: rotate(360deg); + } +} + +@-o-keyframes rotate { + from { + -webkit-transform: rotate(0deg); + } + + to { + -webkit-transform: rotate(360deg); + } +} + +@keyframes rotate { + from { + -webkit-transform: rotate(0deg); + } + + to { + -webkit-transform: rotate(360deg); + } +} + +/* Orbit Graceful Loading */ +.slideshow-wrapper { + position: relative; +} + +.slideshow-wrapper ul { + list-style-type: none; + margin: 0; +} + +.slideshow-wrapper ul li, +.slideshow-wrapper ul li .orbit-caption { + display: none; +} + +.slideshow-wrapper ul li:first-child { + display: block; +} + +.slideshow-wrapper .orbit-container { + background-color: transparent; +} + +.slideshow-wrapper .orbit-container li { + display: block; +} + +.slideshow-wrapper .orbit-container li .orbit-caption { + display: block; +} + +.preloader { + display: block; + width: 40px; + height: 40px; + position: absolute; + top: 50%; + left: 50%; + margin-top: -20px; + margin-left: -20px; + border: solid 3px; + border-color: #555555 white; + -webkit-border-radius: 1000px; + border-radius: 1000px; + -webkit-animation-name: rotate; + -webkit-animation-duration: 1.5s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + -moz-animation-name: rotate; + -moz-animation-duration: 1.5s; + -moz-animation-iteration-count: infinite; + -moz-animation-timing-function: linear; + -o-animation-name: rotate; + -o-animation-duration: 1.5s; + -o-animation-iteration-count: infinite; + -o-animation-timing-function: linear; + animation-name: rotate; + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +.orbit-container { + overflow: hidden; + width: 100%; + position: relative; + background: whitesmoke; +} + +.orbit-container .orbit-slides-container { + list-style: none; + margin: 0; + padding: 0; + position: relative; +} + +.orbit-container .orbit-slides-container img { + display: block; + max-width: 100%; +} + +.orbit-container .orbit-slides-container > * { + position: absolute; + top: 0; + width: 100%; + margin-left: 100%; +} + +.orbit-container .orbit-slides-container > *:first-child { + margin-left: 0%; +} + +.orbit-container .orbit-slides-container > * .orbit-caption { + position: absolute; + bottom: 0; + background-color: black; + background-color: rgba(0, 0, 0, 0.6); + color: white; + width: 100%; + padding: 10px 14px; + font-size: 0.875em; +} + +.orbit-container .orbit-slide-number { + position: absolute; + top: 10px; + left: 10px; + font-size: 12px; + color: white; + background: rgba(0, 0, 0, 0); + z-index: 10; +} + +.orbit-container .orbit-slide-number span { + font-weight: 700; + padding: 0.3125em; +} + +.orbit-container .orbit-timer { + position: absolute; + top: 10px; + right: 10px; + height: 6px; + width: 100px; + z-index: 10; +} + +.orbit-container .orbit-timer .orbit-progress { + height: 100%; + background-color: black; + background-color: rgba(0, 0, 0, 0.6); + display: block; + width: 0%; +} + +.orbit-container .orbit-timer > span { + display: none; + position: absolute; + top: 10px; + right: 0px; + width: 11px; + height: 14px; + border: solid 4px black; + border-top: none; + border-bottom: none; +} + +.orbit-container .orbit-timer.paused > span { + right: -6px; + top: 9px; + width: 11px; + height: 14px; + border: inset 8px; + border-right-style: solid; + border-color: transparent transparent transparent black; +} + +.orbit-container:hover .orbit-timer > span { + display: block; +} + +.orbit-container .orbit-prev, +.orbit-container .orbit-next { + position: absolute; + top: 50%; + margin-top: -25px; + background-color: black; + background-color: rgba(0, 0, 0, 0.6); + width: 50px; + height: 60px; + line-height: 50px; + color: white; + text-indent: -9999px !important; + z-index: 10; +} + +.orbit-container .orbit-prev > span, +.orbit-container .orbit-next > span { + position: absolute; + top: 50%; + margin-top: -16px; + display: block; + width: 0; + height: 0; + border: inset 16px; +} + +.orbit-container .orbit-prev { + left: 0; +} + +.orbit-container .orbit-prev > span { + border-right-style: solid; + border-color: transparent; + border-right-color: #fff; +} + +.orbit-container .orbit-prev:hover > span { + border-right-color: #ccc; +} + +.orbit-container .orbit-next { + right: 0; +} + +.orbit-container .orbit-next > span { + border-color: transparent; + border-left-style: solid; + border-left-color: #fff; + left: 50%; + margin-left: -8px; +} + +.orbit-container .orbit-next:hover > span { + border-left-color: #ccc; +} + +.orbit-bullets { + margin: 0 auto 30px auto; + overflow: hidden; + position: relative; + top: 10px; +} + +.orbit-bullets li { + display: block; + width: 10px; + height: 10px; + background: #999999; + float: left; + margin-right: 6px; + border: solid 1px #555555; + -webkit-border-radius: 1000px; + border-radius: 1000px; +} + +.orbit-bullets li.active { + background: #555555; +} + +.orbit-bullets li:last-child { + margin-right: 0; +} + +.touch .orbit-container .orbit-prev, +.touch .orbit-container .orbit-next { + display: none; +} + +.touch .orbit-bullets { + display: none; +} + +@media only screen and (min-width: 768px) { + .touch .orbit-container .orbit-prev, + .touch .orbit-container .orbit-next { + display: inherit; + } + + .touch .orbit-bullets { + display: block; + } +} + +@media only screen and (max-width: 768px) { + .orbit-stack-on-small .orbit-slides-container { + height: auto !important; + } + + .orbit-stack-on-small .orbit-slides-container > * { + position: relative; + margin-left: 0% !important; + } + + .orbit-stack-on-small .orbit-timer, + .orbit-stack-on-small .orbit-next, + .orbit-stack-on-small .orbit-prev, + .orbit-stack-on-small .orbit-bullets { + display: none; + } +} + +.reveal-modal-bg { + position: fixed; + height: 100%; + width: 100%; + background: black; + background: rgba(0, 0, 0, 0.45); + z-index: 98; + display: none; + top: 0; + left: 0; +} + +.reveal-modal { + visibility: hidden; + display: none; + position: absolute; + left: 50%; + z-index: 99; + height: auto; + margin-left: -40%; + width: 80%; + background-color: white; + padding: 1.25em; + border: solid 1px #666666; + -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.4); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.4); + top: 50px; +} + +.reveal-modal .column, +.reveal-modal .columns { + min-width: 0; +} + +.reveal-modal > :first-child { + margin-top: 0; +} + +.reveal-modal > :last-child { + margin-bottom: 0; +} + +.reveal-modal .close-reveal-modal { + font-size: 1.375em; + line-height: 1; + position: absolute; + top: 0.5em; + right: 0.6875em; + color: #aaaaaa; + font-weight: bold; + cursor: pointer; +} + +@media only screen and (min-width: 768px) { + .reveal-modal { + padding: 1.875em; + top: 6.25em; + } + + .reveal-modal.tiny { + margin-left: -15%; + width: 30%; + } + + .reveal-modal.small { + margin-left: -20%; + width: 40%; + } + + .reveal-modal.medium { + margin-left: -30%; + width: 60%; + } + + .reveal-modal.large { + margin-left: -35%; + width: 70%; + } + + .reveal-modal.xlarge { + margin-left: -47.5%; + width: 95%; + } +} + +@media print { + .reveal-modal { + background: white !important; + } +} + +/* Foundation Joyride */ +.joyride-list { + display: none; +} + +/* Default styles for the container */ +.joyride-tip-guide { + display: none; + position: absolute; + background: black; + color: white; + z-index: 101; + top: 0; + left: 2.5%; + font-family: inherit; + font-weight: normal; + width: 95%; +} + +.lt-ie9 .joyride-tip-guide { + max-width: 800px; + left: 50%; + margin-left: -400px; +} + +.joyride-content-wrapper { + width: 100%; + padding: 1.125em 1.25em 1.5em; +} + +.joyride-content-wrapper .button { + margin-bottom: 0 !important; +} + +/* Add a little css triangle pip, older browser just miss out on the fanciness of it */ +.joyride-tip-guide .joyride-nub { + display: block; + position: absolute; + left: 22px; + width: 0; + height: 0; + border: inset 14px; +} + +.joyride-tip-guide .joyride-nub.top { + border-top-style: solid; + border-color: black; + border-top-color: transparent !important; + border-left-color: transparent !important; + border-right-color: transparent !important; + top: -28px; +} + +.joyride-tip-guide .joyride-nub.bottom { + border-bottom-style: solid; + border-color: black !important; + border-bottom-color: transparent !important; + border-left-color: transparent !important; + border-right-color: transparent !important; + bottom: -28px; +} + +.joyride-tip-guide .joyride-nub.right { + right: -28px; +} + +.joyride-tip-guide .joyride-nub.left { + left: -28px; +} + +/* Typography */ +.joyride-tip-guide h1, +.joyride-tip-guide h2, +.joyride-tip-guide h3, +.joyride-tip-guide h4, +.joyride-tip-guide h5, +.joyride-tip-guide h6 { + line-height: 1.25; + margin: 0; + font-weight: bold; + color: white; +} + +.joyride-tip-guide p { + margin: 0 0 1.125em 0; + font-size: 0.875em; + line-height: 1.3; +} + +.joyride-timer-indicator-wrap { + width: 50px; + height: 3px; + border: solid 1px #555555; + position: absolute; + right: 1.0625em; + bottom: 1em; +} + +.joyride-timer-indicator { + display: block; + width: 0; + height: inherit; + background: #666666; +} + +.joyride-close-tip { + position: absolute; + right: 12px; + top: 10px; + color: #777777 !important; + text-decoration: none; + font-size: 30px; + font-weight: normal; + line-height: 0.5 !important; +} + +.joyride-close-tip:hover, .joyride-close-tip:focus { + color: #eeeeee !important; +} + +.joyride-modal-bg { + position: fixed; + height: 100%; + width: 100%; + background: transparent; + background: rgba(0, 0, 0, 0.5); + z-index: 100; + display: none; + top: 0; + left: 0; + cursor: pointer; +} + +.joyride-expose-wrapper { + background-color: #ffffff; + position: absolute; + border-radius: 3px; + z-index: 102; + -moz-box-shadow: 0px 0px 30px white; + -webkit-box-shadow: 0px 0px 15px white; + box-shadow: 0px 0px 15px white; +} + +.joyride-expose-cover { + background: transparent; + border-radius: 3px; + position: absolute; + z-index: 9999; + top: 0px; + left: 0px; +} + +/* Styles for screens that are atleast 768px; */ +@media only screen and (min-width: 768px) { + .joyride-tip-guide { + width: 300px; + left: inherit; + } + + .joyride-tip-guide .joyride-nub.bottom { + border-color: black !important; + border-bottom-color: transparent !important; + border-left-color: transparent !important; + border-right-color: transparent !important; + bottom: -28px; + } + + .joyride-tip-guide .joyride-nub.right { + border-color: black !important; + border-top-color: transparent !important; + border-right-color: transparent !important; + border-bottom-color: transparent !important; + top: 22px; + left: auto; + right: -28px; + } + + .joyride-tip-guide .joyride-nub.left { + border-color: black !important; + border-top-color: transparent !important; + border-left-color: transparent !important; + border-bottom-color: transparent !important; + top: 22px; + left: -28px; + right: auto; + } +} + +/* Clearing Styles */ +[data-clearing] { + *zoom: 1; + margin-bottom: 0; + margin-left: 0; + list-style: none; +} + +[data-clearing]:before, [data-clearing]:after { + content: " "; + display: table; +} + +[data-clearing]:after { + clear: both; +} + +[data-clearing] li { + float: left; + margin-right: 10px; +} + +.clearing-blackout { + background: #111111; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 998; +} + +.clearing-blackout .clearing-close { + display: block; +} + +.clearing-container { + position: relative; + z-index: 998; + height: 100%; + overflow: hidden; + margin: 0; +} + +.visible-img { + height: 95%; + position: relative; +} + +.visible-img img { + position: absolute; + left: 50%; + top: 50%; + margin-left: -50%; + max-height: 100%; + max-width: 100%; +} + +.clearing-caption { + color: white; + line-height: 1.3; + margin-bottom: 0; + text-align: center; + bottom: 0; + background: #111111; + width: 100%; + padding: 10px 30px; + position: absolute; + left: 0; +} + +.clearing-close { + z-index: 999; + padding-left: 20px; + padding-top: 10px; + font-size: 40px; + line-height: 1; + color: white; + display: none; +} + +.clearing-close:hover, .clearing-close:focus { + color: #ccc; +} + +.clearing-assembled .clearing-container { + height: 100%; +} + +.clearing-assembled .clearing-container .carousel > ul { + display: none; +} + +.clearing-feature li { + display: none; +} + +.clearing-feature li.clearing-featured-img { + display: block; +} + +@media only screen and (min-width: 768px) { + .clearing-main-prev, + .clearing-main-next { + position: absolute; + height: 100%; + width: 40px; + top: 0; + } + + .clearing-main-prev > span, + .clearing-main-next > span { + position: absolute; + top: 50%; + display: block; + width: 0; + height: 0; + border: solid 16px; + } + + .clearing-main-prev { + left: 0; + } + + .clearing-main-prev > span { + left: 5px; + border-color: transparent; + border-right-color: white; + } + + .clearing-main-next { + right: 0; + } + + .clearing-main-next > span { + border-color: transparent; + border-left-color: white; + } + + .clearing-main-prev.disabled, + .clearing-main-next.disabled { + opacity: 0.5; + } + + .clearing-assembled .clearing-container .carousel { + background: #111111; + height: 150px; + margin-top: 5px; + } + + .clearing-assembled .clearing-container .carousel > ul { + display: block; + z-index: 999; + width: 200%; + height: 100%; + margin-left: 0; + position: relative; + left: 0; + } + + .clearing-assembled .clearing-container .carousel > ul li { + display: block; + width: 175px; + height: inherit; + padding: 0; + float: left; + overflow: hidden; + margin-right: 1px; + position: relative; + cursor: pointer; + opacity: 0.4; + } + + .clearing-assembled .clearing-container .carousel > ul li.fix-height img { + min-height: 100%; + height: 100%; + max-width: none; + } + + .clearing-assembled .clearing-container .carousel > ul li a.th { + border: none; + -webkit-box-shadow: none; + box-shadow: none; + display: block; + } + + .clearing-assembled .clearing-container .carousel > ul li img { + cursor: pointer !important; + min-width: 100% !important; + } + + .clearing-assembled .clearing-container .carousel > ul li.visible { + opacity: 1; + } + + .clearing-assembled .clearing-container .visible-img { + background: #111111; + overflow: hidden; + height: 75%; + } + + .clearing-close { + position: absolute; + top: 10px; + right: 20px; + padding-left: 0; + padding-top: 0; + } +} + +/* Foundation Alerts */ +.alert-box { + border-style: solid; + border-width: 1px; + display: block; + font-weight: bold; + margin-bottom: 1.25em; + position: relative; + padding: 0.6875em 1.3125em 0.75em 0.6875em; + font-size: 0.875em; + background-color: #2ba6cb; + border-color: #2284a1; + color: white; +} + +.alert-box .close { + font-size: 1.375em; + padding: 5px 4px 4px; + line-height: 0; + position: absolute; + top: 0.4375em; + right: 0.3125em; + color: #333333; + opacity: 0.3; +} + +.alert-box .close:hover, .alert-box .close:focus { + opacity: 0.5; +} + +.alert-box.radius { + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.alert-box.round { + -webkit-border-radius: 1000px; + border-radius: 1000px; +} + +.alert-box.success { + background-color: #5da423; + border-color: #457a1a; + color: white; +} + +.alert-box.alert { + background-color: #c60f13; + border-color: #970b0e; + color: white; +} + +.alert-box.secondary { + background-color: #e9e9e9; + border-color: #d0d0d0; + color: #505050; +} + +/* Breadcrumbs */ +.breadcrumbs { + display: block; + padding: 0.5625em 0.875em 0.5625em; + overflow: hidden; + margin-left: 0; + list-style: none; + border-style: solid; + border-width: 1px; + background-color: #f6f6f6; + border-color: gainsboro; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.breadcrumbs > * { + margin: 0; + float: left; + font-size: 0.6875em; + text-transform: uppercase; +} + +.breadcrumbs > *:hover a, .breadcrumbs > *:focus a { + text-decoration: underline; +} + +.breadcrumbs > * a, +.breadcrumbs > * span { + text-transform: uppercase; + color: #2ba6cb; +} + +.breadcrumbs > *.current { + cursor: default; + color: #333333; +} + +.breadcrumbs > *.current a { + cursor: default; + color: #333333; +} + +.breadcrumbs > *.current:hover, .breadcrumbs > *.current:hover a, .breadcrumbs > *.current:focus, .breadcrumbs > *.current:focus a { + text-decoration: none; +} + +.breadcrumbs > *.unavailable { + color: #999999; +} + +.breadcrumbs > *.unavailable a { + color: #999999; +} + +.breadcrumbs > *.unavailable:hover, .breadcrumbs > *.unavailable:hover a, .breadcrumbs > *.unavailable:focus, +.breadcrumbs > *.unavailable a:focus { + text-decoration: none; + color: #999999; + cursor: default; +} + +.breadcrumbs > *:before { + content: "/"; + color: #aaaaaa; + margin: 0 0.75em; + position: relative; + top: 1px; +} + +.breadcrumbs > *:first-child:before { + content: " "; + margin: 0; +} + +/* Custom Checkbox and Radio Inputs */ +form.custom .hidden-field { + margin-left: -99999px; + position: absolute; + visibility: hidden; +} + +form.custom .custom { + display: inline-block; + width: 16px; + height: 16px; + position: relative; + top: -1px; + /* fix centering issue */ + vertical-align: middle; + border: solid 1px #cccccc; + background: white; +} + +form.custom .custom.checkbox { + -webkit-border-radius: 0px; + border-radius: 0px; + padding: -1px; +} + +form.custom .custom.radio { + -webkit-border-radius: 1000px; + border-radius: 1000px; + padding: 3px; +} + +form.custom .custom.checkbox:before { + content: ""; + display: block; + font-size: 16px; + color: white; +} + +form.custom .custom.radio.checked:before { + content: ""; + display: block; + width: 8px; + height: 8px; + -webkit-border-radius: 1000px; + border-radius: 1000px; + background: #222222; + position: relative; +} + +form.custom .custom.checkbox.checked:before { + content: "\00d7"; + color: #222222; + position: absolute; + top: -50%; + left: 50%; + margin-top: 4px; + margin-left: -5px; +} + +/* Custom Select Options and Dropdowns */ +form.custom { + /* Custom input, disabled */ +} + +form.custom .custom.dropdown { + display: block; + position: relative; + top: 0; + height: 2.3125em; + margin-bottom: 1.25em; + margin-top: 0px; + padding: 0px; + width: 100%; + background: white; + background: -moz-linear-gradient(top, white 0%, #f3f3f3 100%); + background: -webkit-linear-gradient(top, white 0%, #f3f3f3 100%); + -webkit-box-shadow: none; + background: linear-gradient(to bottom, white 0%, #f3f3f3 100%); + box-shadow: none; + font-size: 0.875em; + vertical-align: top; +} + +form.custom .custom.dropdown ul { + overflow-y: auto; + max-height: 200px; +} + +form.custom .custom.dropdown .current { + cursor: default; + white-space: nowrap; + line-height: 2.25em; + color: rgba(0, 0, 0, 0.75); + text-decoration: none; + overflow: hidden; + display: block; + margin-left: 0.5em; + margin-right: 2.3125em; +} + +form.custom .custom.dropdown .selector { + cursor: default; + position: absolute; + width: 2.5em; + height: 2.3125em; + display: block; + right: 0; + top: 0; +} + +form.custom .custom.dropdown .selector:after { + content: ""; + display: block; + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: #aaaaaa transparent transparent transparent; + border-top-style: solid; + position: absolute; + left: 0.9375em; + top: 50%; + margin-top: -3px; +} + +form.custom .custom.dropdown:hover a.selector:after, form.custom .custom.dropdown.open a.selector:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: #222222 transparent transparent transparent; + border-top-style: solid; +} + +form.custom .custom.dropdown .disabled { + color: #888888; +} + +form.custom .custom.dropdown .disabled:hover { + background: transparent; + color: #888888; +} + +form.custom .custom.dropdown .disabled:hover:after { + display: none; +} + +form.custom .custom.dropdown.open ul { + display: block; + z-index: 10; + min-width: 100%; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +form.custom .custom.dropdown.small { + max-width: 134px; +} + +form.custom .custom.dropdown.medium { + max-width: 254px; +} + +form.custom .custom.dropdown.large { + max-width: 434px; +} + +form.custom .custom.dropdown.expand { + width: 100% !important; +} + +form.custom .custom.dropdown.open.small ul { + min-width: 134px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +form.custom .custom.dropdown.open.medium ul { + min-width: 254px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +form.custom .custom.dropdown.open.large ul { + min-width: 434px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +form.custom .error .custom.dropdown { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1); + background: rgba(198, 15, 19, 0.1); + margin-bottom: 0; +} + +form.custom .error .custom.dropdown:focus { + background: #fafafa; + border-color: #999999; +} + +form.custom .error .custom.dropdown + small.error { + margin-top: 0; +} + +form.custom .custom.dropdown ul { + position: absolute; + width: auto; + display: none; + margin: 0; + left: -1px; + top: auto; + -webkit-box-shadow: 0 2px 2px 0px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 2px 0px rgba(0, 0, 0, 0.1); + margin: 0; + padding: 0; + background: white; + border: solid 1px #cccccc; + font-size: 16; +} + +form.custom .custom.dropdown ul li { + color: #555555; + font-size: 0.875em; + cursor: default; + padding-top: 0.25em; + padding-bottom: 0.25em; + padding-left: 0.375em; + padding-right: 2.375em; + min-height: 1.5em; + line-height: 1.5em; + margin: 0; + white-space: nowrap; + list-style: none; +} + +form.custom .custom.dropdown ul li.selected { + background: #eeeeee; + color: black; +} + +form.custom .custom.dropdown ul li:hover { + background-color: #e4e4e4; + color: black; +} + +form.custom .custom.dropdown ul li.selected:hover { + background: #eeeeee; + cursor: default; + color: black; +} + +form.custom .custom.dropdown ul.show { + display: block; +} + +form.custom .custom.disabled { + background: #dddddd; +} + +/* Keystroke Characters */ +.keystroke, +kbd { + background-color: #ededed; + border-color: #dbdbdb; + color: #222222; + border-style: solid; + border-width: 1px; + margin: 0; + font-family: "Consolas", "Menlo", "Courier", monospace; + font-size: 0.875em; + padding: 0.125em 0.25em 0; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +/* Labels */ +.label { + font-weight: bold; + text-align: center; + text-decoration: none; + line-height: 1; + white-space: nowrap; + display: inline-block; + position: relative; + padding: 0.1875em 0.625em 0.25em; + font-size: 0.875em; + background-color: #2ba6cb; + color: white; +} + +.label.radius { + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.label.round { + -webkit-border-radius: 1000px; + border-radius: 1000px; +} + +.label.alert { + background-color: #c60f13; + color: white; +} + +.label.success { + background-color: #5da423; + color: white; +} + +.label.secondary { + background-color: #e9e9e9; + color: #333333; +} + +/* Inline Lists */ +.inline-list { + margin: 0 auto 1.0625em auto; + margin-left: -1.375em; + margin-right: 0; + padding: 0; + list-style: none; + overflow: hidden; +} + +.inline-list > li { + list-style: none; + float: left; + margin-left: 1.375em; + display: block; +} + +.inline-list > li > * { + display: block; +} + +/* Default Pagination */ +ul.pagination { + display: block; + height: 1.5em; + margin-left: -0.3125em; +} + +ul.pagination li { + height: 1.5em; + color: #222222; + font-size: 0.875em; + margin-left: 0.3125em; +} + +ul.pagination li a { + display: block; + padding: 0.0625em 0.4375em 0.0625em; + color: #999999; +} + +ul.pagination li:hover a, +ul.pagination li a:focus { + background: #e6e6e6; +} + +ul.pagination li.unavailable a { + cursor: default; + color: #999999; +} + +ul.pagination li.unavailable:hover a, ul.pagination li.unavailable a:focus { + background: transparent; +} + +ul.pagination li.current a { + background: #2ba6cb; + color: white; + font-weight: bold; + cursor: default; +} + +ul.pagination li.current a:hover, ul.pagination li.current a:focus { + background: #2ba6cb; +} + +ul.pagination li { + float: left; + display: block; +} + +/* Pagination centred wrapper */ +.pagination-centered { + text-align: center; +} + +.pagination-centered ul.pagination li { + float: none; + display: inline-block; +} + +/* Panels */ +.panel { + /*border-style: solid; + border-width: 1px; + border-color: #d9d9d9; + margin-bottom: 1.25em; */ + padding: 1.25em; + background: #f2f2f2; +} + +.panel > :first-child { + margin-top: 0; +} + +.panel > :last-child { + margin-bottom: 0; +} + +.panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6, .panel p { + color: #333333; +} + +.panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6 { + line-height: 1; + margin-bottom: 0.625em; +} + +.panel h1.subheader, .panel h2.subheader, .panel h3.subheader, .panel h4.subheader, .panel h5.subheader, .panel h6.subheader { + line-height: 1.4; +} + +.panel.callout { + border-style: solid; + border-width: 1px; + border-color: #2284a1; + margin-bottom: 1.25em; + padding: 1.25em; + background: #2ba6cb; + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset; +} + +.panel.callout > :first-child { + margin-top: 0; +} + +.panel.callout > :last-child { + margin-bottom: 0; +} + +.panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6, .panel.callout p { + color: white; +} + +.panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6 { + line-height: 1; + margin-bottom: 0.625em; +} + +.panel.callout h1.subheader, .panel.callout h2.subheader, .panel.callout h3.subheader, .panel.callout h4.subheader, .panel.callout h5.subheader, .panel.callout h6.subheader { + line-height: 1.4; +} + +.panel.radius { + -webkit-border-radius: 3px; + border-radius: 3px; +} + +/* Pricing Tables */ +.pricing-table { + border: solid 1px #dddddd; + margin-left: 0; + margin-bottom: 1.25em; +} + +.pricing-table * { + list-style: none; + line-height: 1; +} + +.pricing-table .title { + background-color: #dddddd; + padding: 0.9375em 1.25em; + text-align: center; + color: #333333; + font-weight: bold; + font-size: 1em; +} + +.pricing-table .price { + background-color: #eeeeee; + padding: 0.9375em 1.25em; + text-align: center; + color: #333333; + font-weight: normal; + font-size: 1.25em; +} + +.pricing-table .description { + background-color: white; + padding: 0.9375em; + text-align: center; + color: #777777; + font-size: 0.75em; + font-weight: normal; + line-height: 1.4; + border-bottom: dotted 1px #dddddd; +} + +.pricing-table .bullet-item { + background-color: white; + padding: 0.9375em; + text-align: center; + color: #333333; + font-size: 0.875em; + font-weight: normal; + border-bottom: dotted 1px #dddddd; +} + +.pricing-table .cta-button { + background-color: whitesmoke; + text-align: center; + padding: 1.25em 1.25em 0; +} + +/* Progress Bar */ +.progress { + background-color: transparent; + height: 1.5625em; + border: 1px solid #cccccc; + padding: 0.125em; + margin-bottom: 0.625em; +} + +.progress .meter { + background: #2ba6cb; + height: 100%; + display: block; +} + +.progress.secondary .meter { + background: #e9e9e9; + height: 100%; + display: block; +} + +.progress.success .meter { + background: #5da423; + height: 100%; + display: block; +} + +.progress.alert .meter { + background: #c60f13; + height: 100%; + display: block; +} + +.progress.radius { + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.progress.radius .meter { + -webkit-border-radius: 2px; + border-radius: 2px; +} + +.progress.round { + -webkit-border-radius: 1000px; + border-radius: 1000px; +} + +.progress.round .meter { + -webkit-border-radius: 999px; + border-radius: 999px; +} + +/* Side Nav */ +.side-nav { + display: block; + margin: 0; + padding: 0.875em 0; + list-style-type: none; + list-style-position: inside; +} + +.side-nav li { + margin: 0 0 0.4375em 0; + font-size: 0.875em; +} + +.side-nav li a { + display: block; + color: #2ba6cb; +} + +.side-nav li.active > a:first-child { + color: #4d4d4d; + font-weight: bold; +} + +.side-nav li.divider { + border-top: 1px solid; + height: 0; + padding: 0; + list-style: none; + border-top-color: #e6e6e6; +} + +/* Side Nav */ +.sub-nav { + display: block; + width: auto; + overflow: hidden; + margin: -0.25em 0 1.125em; + padding-top: 0.25em; + margin-right: 0; + margin-left: -0.5625em; +} + +.sub-nav dt, +.sub-nav dd { + float: left; + display: inline; + margin-left: 0.5625em; + margin-bottom: 0.625em; + font-weight: normal; + font-size: 0.875em; +} + +.sub-nav dt a, +.sub-nav dd a { + color: #999999; + text-decoration: none; +} + +.sub-nav dt.active a, +.sub-nav dd.active a { + -webkit-border-radius: 1000px; + border-radius: 1000px; + font-weight: bold; + background: #2ba6cb; + padding: 0.1875em 0.5625em; + cursor: default; + color: white; +} + +/* Foundation Switches */ +@media only screen { + div.switch { + position: relative; + width: 100%; + padding: 0; + display: block; + overflow: hidden; + border-style: solid; + border-width: 1px; + margin-bottom: 1.25em; + -webkit-animation: webkitSiblingBugfix infinite 1s; + height: 36px; + background: white; + border-color: #cccccc; + } + + div.switch label { + position: relative; + left: 0; + z-index: 2; + float: left; + width: 50%; + height: 100%; + margin: 0; + font-weight: bold; + text-align: left; + -webkit-transition: all 0.1s ease-out; + -moz-transition: all 0.1s ease-out; + transition: all 0.1s ease-out; + } + + div.switch input { + position: absolute; + z-index: 3; + opacity: 0; + width: 100%; + height: 100%; + -moz-appearance: none; + } + + div.switch input:hover, div.switch input:focus { + cursor: pointer; + } + + div.switch span:last-child { + position: absolute; + top: -1px; + left: -1px; + z-index: 1; + display: block; + padding: 0; + border-width: 1px; + border-style: solid; + -webkit-transition: all 0.1s ease-out; + -moz-transition: all 0.1s ease-out; + transition: all 0.1s ease-out; + } + + div.switch input:not(:checked) + label { + opacity: 0; + } + + div.switch input:checked { + display: none !important; + } + + div.switch input { + left: 0; + display: block !important; + } + + div.switch input:first-of-type + label, + div.switch input:first-of-type + span + label { + left: -50%; + } + + div.switch input:first-of-type:checked + label, + div.switch input:first-of-type:checked + span + label { + left: 0%; + } + + div.switch input:last-of-type + label, + div.switch input:last-of-type + span + label { + right: -50%; + left: auto; + text-align: right; + } + + div.switch input:last-of-type:checked + label, + div.switch input:last-of-type:checked + span + label { + right: 0%; + left: auto; + } + + div.switch span.custom { + display: none !important; + } + + form.custom div.switch .hidden-field { + margin-left: auto; + position: absolute; + visibility: visible; + } + + div.switch label { + padding: 0 0.375em; + line-height: 2.3em; + font-size: 0.875em; + } + + div.switch input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -2.1875em; + } + + div.switch span:last-child { + width: 2.25em; + height: 2.25em; + } + + div.switch span:last-child { + border-color: #b3b3b3; + background: white; + background: -moz-linear-gradient(top, white 0%, #f2f2f2 100%); + background: -webkit-linear-gradient(top, white 0%, #f2f2f2 100%); + background: linear-gradient(to bottom, white 0%, #f2f2f2 100%); + -webkit-box-shadow: 2px 0 10px 0 rgba(0, 0, 0, 0.07), 1000px 0 0 1000px #e1f5d1, -2px 0 10px 0 rgba(0, 0, 0, 0.07), -1000px 0 0 1000px whitesmoke; + box-shadow: 2px 0 10px 0 rgba(0, 0, 0, 0.07), 1000px 0 0 980px #e1f5d1, -2px 0 10px 0 rgba(0, 0, 0, 0.07), -1000px 0 0 1000px whitesmoke; + } + + div.switch:hover span:last-child, div.switch:focus span:last-child { + background: white; + background: -moz-linear-gradient(top, white 0%, #e6e6e6 100%); + background: -webkit-linear-gradient(top, white 0%, #e6e6e6 100%); + background: linear-gradient(to bottom, white 0%, #e6e6e6 100%); + } + + div.switch:active { + background: transparent; + } + + div.switch.large { + height: 44px; + } + + div.switch.large label { + padding: 0 0.375em; + line-height: 2.3em; + font-size: 1.0625em; + } + + div.switch.large input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -2.6875em; + } + + div.switch.large span:last-child { + width: 2.75em; + height: 2.75em; + } + + div.switch.small { + height: 28px; + } + + div.switch.small label { + padding: 0 0.375em; + line-height: 2.1em; + font-size: 0.75em; + } + + div.switch.small input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -1.6875em; + } + + div.switch.small span:last-child { + width: 1.75em; + height: 1.75em; + } + + div.switch.tiny { + height: 22px; + } + + div.switch.tiny label { + padding: 0 0.375em; + line-height: 1.9em; + font-size: 0.6875em; + } + + div.switch.tiny input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -1.3125em; + } + + div.switch.tiny span:last-child { + width: 1.375em; + height: 1.375em; + } + + div.switch.radius { + -webkit-border-radius: 4px; + border-radius: 4px; + } + + div.switch.radius span:last-child { + -webkit-border-radius: 3px; + border-radius: 3px; + } + + div.switch.round { + -webkit-border-radius: 1000px; + border-radius: 1000px; + } + + div.switch.round span:last-child { + -webkit-border-radius: 999px; + border-radius: 999px; + } + + div.switch.round label { + padding: 0 0.5625em; + } + + @-webkit-keyframes webkitSiblingBugfix { + from { + position: relative; + } + + to { + position: relative; + } + } +} + +[data-magellan-expedition] { + background: white; + z-index: 50; + min-width: 100%; + padding: 10px; +} + +[data-magellan-expedition] .sub-nav { + margin-bottom: 0; +} + +[data-magellan-expedition] .sub-nav dd { + margin-bottom: 0; +} + +/* Tables */ +table { + background: white; + margin-bottom: 1.25em; + border: solid 1px #dddddd; +} + +table thead, +table tfoot { + background: whitesmoke; + font-weight: bold; +} + +table thead tr th, +table thead tr td, +table tfoot tr th, +table tfoot tr td { + padding: 0.5em 0.625em 0.625em; + font-size: 0.875em; + color: #222222; + text-align: left; +} + +table tr th, +table tr td { + padding: 0.5625em 0.625em; + font-size: 0.875em; + color: #222222; +} + +table tr.even, table tr.alt, table tr:nth-of-type(even) { + background: #f9f9f9; +} + +table thead tr th, +table tfoot tr th, +table tbody tr td, +table tr td, +table tfoot tr td { + display: table-cell; + line-height: 1.125em; +} + +/* Image Thumbnails */ +.th { + line-height: 0; + display: inline-block; + border: solid 4px white; + -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); + -webkit-transition: all 200ms ease-out; + -moz-transition: all 200ms ease-out; + transition: all 200ms ease-out; +} + +.th:hover, .th:focus { + -webkit-box-shadow: 0 0 6px 1px rgba(43, 166, 203, 0.5); + box-shadow: 0 0 6px 1px rgba(43, 166, 203, 0.5); +} + +.th.radius { + -webkit-border-radius: 3px; + border-radius: 3px; +} + +a.th { + display: inline-block; +} + +/* Tooltips */ +.has-tip { + border-bottom: dotted 1px #cccccc; + cursor: help; + font-weight: bold; + color: #333333; +} + +.has-tip:hover, .has-tip:focus { + border-bottom: dotted 1px #196177; + color: #2ba6cb; +} + +.has-tip.tip-left, .has-tip.tip-right { + float: none !important; +} + +.tooltip { + display: none; + position: absolute; + z-index: 999; + font-weight: bold; + font-size: 0.9375em; + line-height: 1.3; + padding: 0.5em; + max-width: 85%; + left: 50%; + width: 100%; + color: white; + background: black; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.tooltip > .nub { + display: block; + left: 5px; + position: absolute; + width: 0; + height: 0; + border: solid 5px; + border-color: transparent transparent black transparent; + top: -10px; +} + +.tooltip.opened { + color: #2ba6cb !important; + border-bottom: dotted 1px #196177 !important; +} + +.tap-to-close { + display: block; + font-size: 0.625em; + color: #888888; + font-weight: normal; +} + +@media only screen and (min-width: 768px) { + .tooltip > .nub { + border-color: transparent transparent black transparent; + top: -10px; + } + + .tooltip.tip-top > .nub { + border-color: black transparent transparent transparent; + top: auto; + bottom: -10px; + } + + .tooltip.tip-left, .tooltip.tip-right { + float: none !important; + } + + .tooltip.tip-left > .nub { + border-color: transparent transparent transparent black; + right: -10px; + left: auto; + top: 50%; + margin-top: -5px; + } + + .tooltip.tip-right > .nub { + border-color: transparent black transparent transparent; + right: auto; + left: -10px; + top: 50%; + margin-top: -5px; + } +} + +@media only screen and (max-width: 767px) { + .f-dropdown { + max-width: 100%; + left: 0; + } +} + +/* Foundation Dropdowns */ +.f-dropdown { + position: absolute; + top: -9999px; + list-style: none; + margin-left: 0; + width: 100%; + max-height: none; + height: auto; + background: white; + border: solid 1px #cccccc; + font-size: 16; + z-index: 99; + margin-top: 2px; + max-width: 200px; +} + +.f-dropdown > *:first-child { + margin-top: 0; +} + +.f-dropdown > *:last-child { + margin-bottom: 0; +} + +.f-dropdown:before { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 6px; + border-color: transparent transparent white transparent; + border-bottom-style: solid; + position: absolute; + top: -12px; + left: 10px; + z-index: 99; +} + +.f-dropdown:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 7px; + border-color: transparent transparent #cccccc transparent; + border-bottom-style: solid; + position: absolute; + top: -14px; + left: 9px; + z-index: 98; +} + +.f-dropdown.right:before { + left: auto; + right: 10px; +} + +.f-dropdown.right:after { + left: auto; + right: 9px; +} + +.f-dropdown li { + font-size: 0.875em; + cursor: pointer; + line-height: 1.125em; + margin: 0; +} + +.f-dropdown li:hover, .f-dropdown li:focus { + background: #eeeeee; +} + +.f-dropdown li a { + display: block; + padding: 0.3125em 0.625em; + color: #555555; +} + +.f-dropdown.content { + position: absolute; + top: -9999px; + list-style: none; + margin-left: 0; + padding: 1.25em; + width: 100%; + height: auto; + max-height: none; + background: white; + border: solid 1px #cccccc; + font-size: 16; + z-index: 99; + max-width: 200px; +} + +.f-dropdown.content > *:first-child { + margin-top: 0; +} + +.f-dropdown.content > *:last-child { + margin-bottom: 0; +} + +.f-dropdown.tiny { + max-width: 200px; +} + +.f-dropdown.small { + max-width: 300px; +} + +.f-dropdown.medium { + max-width: 500px; +} + +.f-dropdown.large { + max-width: 800px; +} diff --git a/mqtt/rootfs/app/css/foundation.min.css b/mqtt/rootfs/app/css/foundation.min.css new file mode 100644 index 0000000..295a45b --- /dev/null +++ b/mqtt/rootfs/app/css/foundation.min.css @@ -0,0 +1,5853 @@ +*, *:before, *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +html, body { + font-size: 100% +} + +body { + background: #fff; + color: #222; + padding: 0; + margin: 0; + font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; + font-weight: normal; + font-style: normal; + line-height: 1; + position: relative; + cursor: default +} + +a:hover { + cursor: pointer +} + +a:focus { + outline: none +} + +img, object, embed { + max-width: 100%; + height: auto +} + +object, embed { + height: 100% +} + +img { + -ms-interpolation-mode: bicubic +} + +#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { + max-width: none !important +} + +.left { + float: left !important +} + +.right { + float: right !important +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +.text-justify { + text-align: justify !important +} + +.hide { + display: none +} + +.antialiased { + -webkit-font-smoothing: antialiased +} + +img { + display: inline-block; + vertical-align: middle +} + +textarea { + height: auto; + min-height: 50px +} + +select { + width: 100% +} + +.row { + width: 100%; + margin-left: auto; + margin-right: auto; + margin-top: 0; + margin-bottom: 0; + max-width: 62.5em; + *zoom: 1 +} + +.row:before, .row:after { + content: " "; + display: table +} + +.row:after { + clear: both +} + +.row.collapse .column, .row.collapse .columns { + position: relative; + padding-left: 0; + padding-right: 0; + float: left +} + +.row .row { + width: auto; + margin-left: -0.9375em; + margin-right: -0.9375em; + margin-top: 0; + margin-bottom: 0; + max-width: none; + *zoom: 1 +} + +.row .row:before, .row .row:after { + content: " "; + display: table +} + +.row .row:after { + clear: both +} + +.row .row.collapse { + width: auto; + margin: 0; + max-width: none; + *zoom: 1 +} + +.row .row.collapse:before, .row .row.collapse:after { + content: " "; + display: table +} + +.row .row.collapse:after { + clear: both +} + +.column, .columns { + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; + width: 100%; + float: left +} + +@media only screen { + .column, .columns { + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; + float: left + } + + .small-1 { + position: relative; + width: 8.33333% + } + + .small-2 { + position: relative; + width: 16.66667% + } + + .small-3 { + position: relative; + width: 25% + } + + .small-4 { + position: relative; + width: 33.33333% + } + + .small-5 { + position: relative; + width: 41.66667% + } + + .small-6 { + position: relative; + width: 50% + } + + .small-7 { + position: relative; + width: 58.33333% + } + + .small-8 { + position: relative; + width: 66.66667% + } + + .small-9 { + position: relative; + width: 75% + } + + .small-10 { + position: relative; + width: 83.33333% + } + + .small-11 { + position: relative; + width: 91.66667% + } + + .small-12 { + position: relative; + width: 100% + } + + .small-offset-0 { + position: relative; + margin-left: 0% + } + + .small-offset-1 { + position: relative; + margin-left: 8.33333% + } + + .small-offset-2 { + position: relative; + margin-left: 16.66667% + } + + .small-offset-3 { + position: relative; + margin-left: 25% + } + + .small-offset-4 { + position: relative; + margin-left: 33.33333% + } + + .small-offset-5 { + position: relative; + margin-left: 41.66667% + } + + .small-offset-6 { + position: relative; + margin-left: 50% + } + + .small-offset-7 { + position: relative; + margin-left: 58.33333% + } + + .small-offset-8 { + position: relative; + margin-left: 66.66667% + } + + .small-offset-9 { + position: relative; + margin-left: 75% + } + + .small-offset-10 { + position: relative; + margin-left: 83.33333% + } + + [class*="column"]+[class*="column"]:last-child { + float: right + } + + [class*="column"]+[class*="column"].end { + float: left + } + + .column.small-centered, .columns.small-centered { + position: relative; + margin-left: auto; + margin-right: auto; + float: none !important + } +} + +@media only screen and (min-width: 768px) { + .large-1 { + position: relative; + width: 8.33333% + } + + .large-2 { + position: relative; + width: 16.66667% + } + + .large-3 { + position: relative; + width: 25% + } + + .large-4 { + position: relative; + width: 33.33333% + } + + .large-5 { + position: relative; + width: 41.66667% + } + + .large-6 { + position: relative; + width: 50% + } + + .large-7 { + position: relative; + width: 58.33333% + } + + .large-8 { + position: relative; + width: 66.66667% + } + + .large-9 { + position: relative; + width: 75% + } + + .large-10 { + position: relative; + width: 83.33333% + } + + .large-11 { + position: relative; + width: 91.66667% + } + + .large-12 { + position: relative; + width: 100% + } + + .row .large-offset-0 { + position: relative; + margin-left: 0% + } + + .row .large-offset-1 { + position: relative; + margin-left: 8.33333% + } + + .row .large-offset-2 { + position: relative; + margin-left: 16.66667% + } + + .row .large-offset-3 { + position: relative; + margin-left: 25% + } + + .row .large-offset-4 { + position: relative; + margin-left: 33.33333% + } + + .row .large-offset-5 { + position: relative; + margin-left: 41.66667% + } + + .row .large-offset-6 { + position: relative; + margin-left: 50% + } + + .row .large-offset-7 { + position: relative; + margin-left: 58.33333% + } + + .row .large-offset-8 { + position: relative; + margin-left: 66.66667% + } + + .row .large-offset-9 { + position: relative; + margin-left: 75% + } + + .row .large-offset-10 { + position: relative; + margin-left: 83.33333% + } + + .row .large-offset-11 { + position: relative; + margin-left: 91.66667% + } + + .push-1 { + position: relative; + left: 8.33333%; + right: auto + } + + .pull-1 { + position: relative; + right: 8.33333%; + left: auto + } + + .push-2 { + position: relative; + left: 16.66667%; + right: auto + } + + .pull-2 { + position: relative; + right: 16.66667%; + left: auto + } + + .push-3 { + position: relative; + left: 25%; + right: auto + } + + .pull-3 { + position: relative; + right: 25%; + left: auto + } + + .push-4 { + position: relative; + left: 33.33333%; + right: auto + } + + .pull-4 { + position: relative; + right: 33.33333%; + left: auto + } + + .push-5 { + position: relative; + left: 41.66667%; + right: auto + } + + .pull-5 { + position: relative; + right: 41.66667%; + left: auto + } + + .push-6 { + position: relative; + left: 50%; + right: auto + } + + .pull-6 { + position: relative; + right: 50%; + left: auto + } + + .push-7 { + position: relative; + left: 58.33333%; + right: auto + } + + .pull-7 { + position: relative; + right: 58.33333%; + left: auto + } + + .push-8 { + position: relative; + left: 66.66667%; + right: auto + } + + .pull-8 { + position: relative; + right: 66.66667%; + left: auto + } + + .push-9 { + position: relative; + left: 75%; + right: auto + } + + .pull-9 { + position: relative; + right: 75%; + left: auto + } + + .push-10 { + position: relative; + left: 83.33333%; + right: auto + } + + .pull-10 { + position: relative; + right: 83.33333%; + left: auto + } + + .push-11 { + position: relative; + left: 91.66667%; + right: auto + } + + .pull-11 { + position: relative; + right: 91.66667%; + left: auto + } + + .column.large-centered, .columns.large-centered { + position: relative; + margin-left: auto; + margin-right: auto; + float: none !important + } + + .column.large-uncentered, .columns.large-uncentered { + margin-left: 0; + margin-right: 0; + float: left !important + } + + .column.large-uncentered.opposite, .columns.large-uncentered.opposite { + float: right !important + } +} + +.show-for-small, .show-for-medium-down, .show-for-large-down { + display: inherit !important +} + +.show-for-medium, .show-for-medium-up, .show-for-large, .show-for-large-up, .show-for-xlarge { + display: none !important +} + +.hide-for-medium, .hide-for-medium-up, .hide-for-large, .hide-for-large-up, .hide-for-xlarge { + display: inherit !important +} + +.hide-for-small, .hide-for-medium-down, .hide-for-large-down { + display: none !important +} + +table.show-for-small, table.show-for-medium-down, table.show-for-large-down, table.hide-for-medium, table.hide-for-medium-up, table.hide-for-large, table.hide-for-large-up, table.hide-for-xlarge { + display: table +} + +thead.show-for-small, thead.show-for-medium-down, thead.show-for-large-down, thead.hide-for-medium, thead.hide-for-medium-up, thead.hide-for-large, thead.hide-for-large-up, thead.hide-for-xlarge { + display: table-header-group !important +} + +tbody.show-for-small, tbody.show-for-medium-down, tbody.show-for-large-down, tbody.hide-for-medium, tbody.hide-for-medium-up, tbody.hide-for-large, tbody.hide-for-large-up, tbody.hide-for-xlarge { + display: table-row-group !important +} + +tr.show-for-small, tr.show-for-medium-down, tr.show-for-large-down, tr.hide-for-medium, tr.hide-for-medium-up, tr.hide-for-large, tr.hide-for-large-up, tr.hide-for-xlarge { + display: table-row !important +} + +td.show-for-small, td.show-for-medium-down, td.show-for-large-down, td.hide-for-medium, td.hide-for-medium-up, td.hide-for-large, td.hide-for-large-up, td.hide-for-xlarge, th.show-for-small, th.show-for-medium-down, th.show-for-large-down, th.hide-for-medium, th.hide-for-medium-up, th.hide-for-large, th.hide-for-large-up, th.hide-for-xlarge { + display: table-cell !important +} + +@media only screen and (min-width: 768px) { + .show-for-medium, .show-for-medium-up { + display: inherit !important + } + + .show-for-small { + display: none !important + } + + .hide-for-small { + display: inherit !important + } + + .hide-for-medium, .hide-for-medium-up { + display: none !important + } + + table.show-for-medium, table.show-for-medium-up, table.hide-for-small { + display: table + } + + thead.show-for-medium, thead.show-for-medium-up, thead.hide-for-small { + display: table-header-group !important + } + + tbody.show-for-medium, tbody.show-for-medium-up, tbody.hide-for-small { + display: table-row-group !important + } + + tr.show-for-medium, tr.show-for-medium-up, tr.hide-for-small { + display: table-row !important + } + + td.show-for-medium, td.show-for-medium-up, td.hide-for-small, th.show-for-medium, th.show-for-medium-up, th.hide-for-small { + display: table-cell !important + } +} + +@media only screen and (min-width: 1280px) { + .show-for-large, .show-for-large-up { + display: inherit !important + } + + .show-for-medium, .show-for-medium-down { + display: none !important + } + + .hide-for-medium, .hide-for-medium-down { + display: inherit !important + } + + .hide-for-large, .hide-for-large-up { + display: none !important + } + + table.show-for-large, table.show-for-large-up, table.hide-for-medium, table.hide-for-medium-down { + display: table + } + + thead.show-for-large, thead.show-for-large-up, thead.hide-for-medium, thead.hide-for-medium-down { + display: table-header-group !important + } + + tbody.show-for-large, tbody.show-for-large-up, tbody.hide-for-medium, tbody.hide-for-medium-down { + display: table-row-group !important + } + + tr.show-for-large, tr.show-for-large-up, tr.hide-for-medium, tr.hide-for-medium-down { + display: table-row !important + } + + td.show-for-large, td.show-for-large-up, td.hide-for-medium, td.hide-for-medium-down, th.show-for-large, th.show-for-large-up, th.hide-for-medium, th.hide-for-medium-down { + display: table-cell !important + } +} + +@media only screen and (min-width: 1440px) { + .show-for-xlarge { + display: inherit !important + } + + .show-for-large, .show-for-large-down { + display: none !important + } + + .hide-for-large, .hide-for-large-down { + display: inherit !important + } + + .hide-for-xlarge { + display: none !important + } + + table.show-for-xlarge, table.hide-for-large, table.hide-for-large-down { + display: table + } + + thead.show-for-xlarge, thead.hide-for-large, thead.hide-for-large-down { + display: table-header-group !important + } + + tbody.show-for-xlarge, tbody.hide-for-large, tbody.hide-for-large-down { + display: table-row-group !important + } + + tr.show-for-xlarge, tr.hide-for-large, tr.hide-for-large-down { + display: table-row !important + } + + td.show-for-xlarge, td.hide-for-large, td.hide-for-large-down, th.show-for-xlarge, th.hide-for-large, th.hide-for-large-down { + display: table-cell !important + } +} + +.show-for-landscape, .hide-for-portrait { + display: inherit !important +} + +.hide-for-landscape, .show-for-portrait { + display: none !important +} + +table.hide-for-landscape, table.show-for-portrait { + display: table +} + +thead.hide-for-landscape, thead.show-for-portrait { + display: table-header-group !important +} + +tbody.hide-for-landscape, tbody.show-for-portrait { + display: table-row-group !important +} + +tr.hide-for-landscape, tr.show-for-portrait { + display: table-row !important +} + +td.hide-for-landscape, td.show-for-portrait, th.hide-for-landscape, th.show-for-portrait { + display: table-cell !important +} + +@media only screen and (orientation: landscape) { + .show-for-landscape, .hide-for-portrait { + display: inherit !important + } + + .hide-for-landscape, .show-for-portrait { + display: none !important + } + + table.show-for-landscape, table.hide-for-portrait { + display: table + } + + thead.show-for-landscape, thead.hide-for-portrait { + display: table-header-group !important + } + + tbody.show-for-landscape, tbody.hide-for-portrait { + display: table-row-group !important + } + + tr.show-for-landscape, tr.hide-for-portrait { + display: table-row !important + } + + td.show-for-landscape, td.hide-for-portrait, th.show-for-landscape, th.hide-for-portrait { + display: table-cell !important + } +} + +@media only screen and (orientation: portrait) { + .show-for-portrait, .hide-for-landscape { + display: inherit !important + } + + .hide-for-portrait, .show-for-landscape { + display: none !important + } + + table.show-for-portrait, table.hide-for-landscape { + display: table + } + + thead.show-for-portrait, thead.hide-for-landscape { + display: table-header-group !important + } + + tbody.show-for-portrait, tbody.hide-for-landscape { + display: table-row-group !important + } + + tr.show-for-portrait, tr.hide-for-landscape { + display: table-row !important + } + + td.show-for-portrait, td.hide-for-landscape, th.show-for-portrait, th.hide-for-landscape { + display: table-cell !important + } +} + +.show-for-touch { + display: none !important +} + +.hide-for-touch { + display: inherit !important +} + +.touch .show-for-touch { + display: inherit !important +} + +.touch .hide-for-touch { + display: none !important +} + +table.hide-for-touch { + display: table +} + +.touch table.show-for-touch { + display: table +} + +thead.hide-for-touch { + display: table-header-group !important +} + +.touch thead.show-for-touch { + display: table-header-group !important +} + +tbody.hide-for-touch { + display: table-row-group !important +} + +.touch tbody.show-for-touch { + display: table-row-group !important +} + +tr.hide-for-touch { + display: table-row !important +} + +.touch tr.show-for-touch { + display: table-row !important +} + +td.hide-for-touch { + display: table-cell !important +} + +.touch td.show-for-touch { + display: table-cell !important +} + +th.hide-for-touch { + display: table-cell !important +} + +.touch th.show-for-touch { + display: table-cell !important +} + +@media only screen { + [class*="block-grid-"] { + display: block; + padding: 0; + margin: 0 -0.625em; + *zoom: 1 + } + + [class*="block-grid-"]:before, [class*="block-grid-"]:after { + content: " "; + display: table + } + + [class*="block-grid-"]:after { + clear: both + } + + [class*="block-grid-"]>li { + display: inline; + height: auto; + float: left; + padding: 0 0.625em 1.25em + } + + .small-block-grid-1>li { + width: 100%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-1>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-1>li:nth-of-type(1n+1) { + clear: both + } + + .small-block-grid-2>li { + width: 50%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-2>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-2>li:nth-of-type(2n+1) { + clear: both + } + + .small-block-grid-3>li { + width: 33.33333%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-3>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-3>li:nth-of-type(3n+1) { + clear: both + } + + .small-block-grid-4>li { + width: 25%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-4>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-4>li:nth-of-type(4n+1) { + clear: both + } + + .small-block-grid-5>li { + width: 20%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-5>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-5>li:nth-of-type(5n+1) { + clear: both + } + + .small-block-grid-6>li { + width: 16.66667%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-6>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-6>li:nth-of-type(6n+1) { + clear: both + } + + .small-block-grid-7>li { + width: 14.28571%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-7>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-7>li:nth-of-type(7n+1) { + clear: both + } + + .small-block-grid-8>li { + width: 12.5%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-8>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-8>li:nth-of-type(8n+1) { + clear: both + } + + .small-block-grid-9>li { + width: 11.11111%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-9>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-9>li:nth-of-type(9n+1) { + clear: both + } + + .small-block-grid-10>li { + width: 10%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-10>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-10>li:nth-of-type(10n+1) { + clear: both + } + + .small-block-grid-11>li { + width: 9.09091%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-11>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-11>li:nth-of-type(11n+1) { + clear: both + } + + .small-block-grid-12>li { + width: 8.33333%; + padding: 0 0.625em 1.25em + } + + .small-block-grid-12>li:nth-of-type(n) { + clear: none + } + + .small-block-grid-12>li:nth-of-type(12n+1) { + clear: both + } +} + +@media only screen and (min-width: 768px) { + .small-block-grid-1>li:nth-of-type(1n+1) { + clear: none + } + + .small-block-grid-2>li:nth-of-type(2n+1) { + clear: none + } + + .small-block-grid-3>li:nth-of-type(3n+1) { + clear: none + } + + .small-block-grid-4>li:nth-of-type(4n+1) { + clear: none + } + + .small-block-grid-5>li:nth-of-type(5n+1) { + clear: none + } + + .small-block-grid-6>li:nth-of-type(6n+1) { + clear: none + } + + .small-block-grid-7>li:nth-of-type(7n+1) { + clear: none + } + + .small-block-grid-8>li:nth-of-type(8n+1) { + clear: none + } + + .small-block-grid-9>li:nth-of-type(9n+1) { + clear: none + } + + .small-block-grid-10>li:nth-of-type(10n+1) { + clear: none + } + + .small-block-grid-11>li:nth-of-type(11n+1) { + clear: none + } + + .small-block-grid-12>li:nth-of-type(12n+1) { + clear: none + } + + .large-block-grid-1>li { + width: 100%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-1>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-1>li:nth-of-type(1n+1) { + clear: both + } + + .large-block-grid-2>li { + width: 50%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-2>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-2>li:nth-of-type(2n+1) { + clear: both + } + + .large-block-grid-3>li { + width: 33.33333%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-3>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-3>li:nth-of-type(3n+1) { + clear: both + } + + .large-block-grid-4>li { + width: 25%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-4>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-4>li:nth-of-type(4n+1) { + clear: both + } + + .large-block-grid-5>li { + width: 20%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-5>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-5>li:nth-of-type(5n+1) { + clear: both + } + + .large-block-grid-6>li { + width: 16.66667%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-6>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-6>li:nth-of-type(6n+1) { + clear: both + } + + .large-block-grid-7>li { + width: 14.28571%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-7>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-7>li:nth-of-type(7n+1) { + clear: both + } + + .large-block-grid-8>li { + width: 12.5%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-8>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-8>li:nth-of-type(8n+1) { + clear: both + } + + .large-block-grid-9>li { + width: 11.11111%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-9>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-9>li:nth-of-type(9n+1) { + clear: both + } + + .large-block-grid-10>li { + width: 10%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-10>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-10>li:nth-of-type(10n+1) { + clear: both + } + + .large-block-grid-11>li { + width: 9.09091%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-11>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-11>li:nth-of-type(11n+1) { + clear: both + } + + .large-block-grid-12>li { + width: 8.33333%; + padding: 0 0.625em 1.25em + } + + .large-block-grid-12>li:nth-of-type(n) { + clear: none + } + + .large-block-grid-12>li:nth-of-type(12n+1) { + clear: both + } +} + +p.lead { + font-size: 1.21875em; + line-height: 1.6 +} + +.subheader { + line-height: 1.4; + color: #6f6f6f; + font-weight: 300; + margin-top: 0.2em; + margin-bottom: 0.5em +} + +div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, p, blockquote, th, td { + margin: 0; + padding: 0; + direction: ltr +} + +a { + color: #2ba6cb; + text-decoration: none; + line-height: inherit +} + +a:hover, a:focus { + color: #2795b6 +} + +a img { + border: none +} + +p { + font-family: inherit; + font-weight: normal; + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + text-rendering: optimizeLegibility +} + +p aside { + font-size: 0.875em; + line-height: 1.35; + font-style: italic +} + +h1, h2, h3, h4, h5, h6 { + font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; + font-weight: bold; + font-style: normal; + color: #222; + text-rendering: optimizeLegibility; + margin-top: 0.2em; + margin-bottom: 0.5em; + line-height: 1.2125em +} + +h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { + font-size: 60%; + color: #6f6f6f; + line-height: 0 +} + +h1 { + font-size: 2.125em +} + +h2 { + font-size: 1.6875em +} + +h3 { + font-size: 1.375em +} + +h4 { + font-size: 1.125em +} + +h5 { + font-size: 1.125em +} + +h6 { + font-size: 1em +} + +hr { + border: solid #ddd; + border-width: 1px 0 0; + clear: both; + margin: 1.25em 0 1.1875em; + height: 0 +} + +em, i { + font-style: italic; + line-height: inherit +} + +strong, b { + font-weight: bold; + line-height: inherit +} + +small { + font-size: 60%; + line-height: inherit +} + +code { + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: bold; + color: #7f0a0c +} + +ul, ol, dl { + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + list-style-position: outside; + font-family: inherit +} + +ul, ol { + margin-left: 0 +} + +ul li ul, ul li ol { + margin-left: 1.25em; + margin-bottom: 0; + font-size: 1em +} + +ul.square li ul, ul.circle li ul, ul.disc li ul { + list-style: inherit +} + +ul.square { + list-style-type: square +} + +ul.circle { + list-style-type: circle +} + +ul.disc { + list-style-type: disc +} + +ul.no-bullet { + list-style: none +} + +ol li ul, ol li ol { + margin-left: 1.25em; + margin-bottom: 0 +} + +dl dt { + margin-bottom: 0.3em; + font-weight: bold +} + +dl dd { + margin-bottom: 0.75em +} + +abbr, acronym { + text-transform: uppercase; + font-size: 90%; + color: #222; + border-bottom: 1px dotted #ddd; + cursor: help +} + +abbr { + text-transform: none +} + +blockquote { + margin: 0 0 1.25em; + padding: 0.5625em 1.25em 0 1.1875em; + border-left: 1px solid #ddd +} + +blockquote cite { + display: block; + font-size: 0.8125em; + color: #555 +} + +blockquote cite:before { + content: "\2014 \0020" +} + +blockquote cite a, blockquote cite a:visited { + color: #555 +} + +blockquote, blockquote p { + line-height: 1.6; + color: #6f6f6f +} + +.vcard { + display: inline-block; + margin: 0 0 1.25em 0; + border: 1px solid #ddd; + padding: 0.625em 0.75em +} + +.vcard li { + margin: 0; + display: block +} + +.vcard .fn { + font-weight: bold; + font-size: 0.9375em +} + +.vevent .summary { + font-weight: bold +} + +.vevent abbr { + cursor: default; + text-decoration: none; + font-weight: bold; + border: none; + padding: 0 0.0625em +} + +@media only screen and (min-width: 768px) { + h1, h2, h3, h4, h5, h6 { + line-height: 1.4 + } + + h1 { + font-size: 2.75em + } + + h2 { + font-size: 2.3125em + } + + h3 { + font-size: 1.6875em + } + + h4 { + font-size: 1.4375em + } +} + +.print-only { + display: none !important +} + +@media print { + * { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important + } + + a, a:visited { + text-decoration: underline + } + + a[href]:after { + content: " (" attr(href) ")" + } + + abbr[title]:after { + content: " (" attr(title) ")" + } + + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { + content: "" + } + + pre, blockquote { + border: 1px solid #999; + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + tr, img { + page-break-inside: avoid + } + + img { + max-width: 100% !important + } + + @page { + margin: 0.5cm + } + + p, h2, h3 { + orphans: 3; + widows: 3 + } + + h2, h3 { + page-break-after: avoid + } + + .hide-on-print { + display: none !important + } + + .print-only { + display: block !important + } + + .hide-for-print { + display: none !important + } + + .show-for-print { + display: inherit !important + } +} + +button, .button { + border-style: solid; + border-width: 1px; + cursor: pointer; + font-family: inherit; + font-weight: bold; + line-height: 1; + margin: 0 0 1.25em; + position: relative; + text-decoration: none; + text-align: center; + display: inline-block; + padding-top: 0.75em; + padding-right: 1.5em; + padding-bottom: 0.8125em; + padding-left: 1.5em; + font-size: 1em; + background-color: #2ba6cb; + border-color: #2284a1; + color: #fff +} + +button:hover, button:focus, .button:hover, .button:focus { + background-color: #2284a1 +} + +button:hover, button:focus, .button:hover, .button:focus { + color: #fff +} + +button.secondary, .button.secondary { + background-color: #e9e9e9; + border-color: #d0d0d0; + color: #333 +} + +button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus { + background-color: #d0d0d0 +} + +button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus { + color: #333 +} + +button.success, .button.success { + background-color: #5da423; + border-color: #457a1a; + color: #fff +} + +button.success:hover, button.success:focus, .button.success:hover, .button.success:focus { + background-color: #457a1a +} + +button.success:hover, button.success:focus, .button.success:hover, .button.success:focus { + color: #fff +} + +button.alert, .button.alert { + background-color: #c60f13; + border-color: #970b0e; + color: #fff +} + +button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus { + background-color: #970b0e +} + +button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus { + color: #fff +} + +button.large, .button.large { + padding-top: 1em; + padding-right: 2em; + padding-bottom: 1.0625em; + padding-left: 2em; + font-size: 1.25em +} + +button.small, .button.small { + padding-top: 0.5625em; + padding-right: 1.125em; + padding-bottom: 0.625em; + padding-left: 1.125em; + font-size: 0.8125em +} + +button.tiny, .button.tiny { + padding-top: 0.4375em; + padding-right: 0.875em; + padding-bottom: 0.5em; + padding-left: 0.875em; + font-size: 0.6875em +} + +button.expand, .button.expand { + padding-right: 0px; + padding-left: 0px; + width: 100% +} + +button.left-align, .button.left-align { + text-align: left; + text-indent: 0.75em +} + +button.right-align, .button.right-align { + text-align: right; + padding-right: 0.75em +} + +button.disabled, button[disabled], .button.disabled, .button[disabled] { + background-color: #2ba6cb; + border-color: #2284a1; + color: #fff; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none +} + +button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { + background-color: #2284a1 +} + +button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { + color: #fff +} + +button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { + background-color: #2ba6cb +} + +button.disabled.secondary, button[disabled].secondary, .button.disabled.secondary, .button[disabled].secondary { + background-color: #e9e9e9; + border-color: #d0d0d0; + color: #333; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none +} + +button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + background-color: #d0d0d0 +} + +button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + color: #333 +} + +button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + background-color: #e9e9e9 +} + +button.disabled.success, button[disabled].success, .button.disabled.success, .button[disabled].success { + background-color: #5da423; + border-color: #457a1a; + color: #fff; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none +} + +button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { + background-color: #457a1a +} + +button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { + color: #fff +} + +button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { + background-color: #5da423 +} + +button.disabled.alert, button[disabled].alert, .button.disabled.alert, .button[disabled].alert { + background-color: #c60f13; + border-color: #970b0e; + color: #fff; + cursor: default; + opacity: 0.6; + -webkit-box-shadow: none; + box-shadow: none +} + +button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { + background-color: #970b0e +} + +button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { + color: #fff +} + +button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { + background-color: #c60f13 +} + +button, .button { + padding-top: 0.8125em; + padding-bottom: 0.75em; + -webkit-appearance: none +} + +button.tiny, .button.tiny { + padding-top: 0.5em; + padding-bottom: 0.4375em; + -webkit-appearance: none +} + +button.small, .button.small { + padding-top: 0.625em; + padding-bottom: 0.5625em; + -webkit-appearance: none +} + +button.large, .button.large { + padding-top: 1.03125em; + padding-bottom: 1.03125em; + -webkit-appearance: none +} + +@media only screen { + button, .button { + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset; + -webkit-transition: background-color 300ms ease-out; + -moz-transition: background-color 300ms ease-out; + transition: background-color 300ms ease-out + } + + button:active, .button:active { + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2) inset; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2) inset + } + + button.radius, .button.radius { + -webkit-border-radius: 3px; + border-radius: 3px + } + + button.round, .button.round { + -webkit-border-radius: 1000px; + border-radius: 1000px + } +} + +@media only screen and (min-width: 768px) { + button, .button { + display: inline-block + } +} + +form { + margin: 0 0 1em +} + +form .row .row { + margin: 0 -0.5em +} + +form .row .row .column, form .row .row .columns { + padding: 0 0.5em +} + +form .row .row.collapse { + margin: 0 +} + +form .row .row.collapse .column, form .row .row.collapse .columns { + padding: 0 +} + +form .row input.column, form .row input.columns, form .row textarea.column, form .row textarea.columns { + padding-left: 0.5em +} + +label { + font-size: 0.875em; + color: #4d4d4d; + cursor: pointer; + display: block; + font-weight: 500; + margin-bottom: 0.1875em +} + +label.right { + float: none; + text-align: right +} + +label.inline { + margin: 0 0 1em 0; + padding: 0.625em 0 +} + +label small { + text-transform: capitalize; + color: #666 +} + +.prefix, .postfix { + display: block; + position: relative; + z-index: 2; + text-align: center; + width: 100%; + padding-top: 0; + padding-bottom: 0; + border-style: solid; + border-width: 1px; + overflow: hidden; + font-size: 0.875em; + height: 2.3125em; + line-height: 2.3125em +} + +.postfix.button { + padding-left: 0; + padding-right: 0; + padding-top: 0; + padding-bottom: 0; + text-align: center; + line-height: 2.125em +} + +.prefix.button { + padding-left: 0; + padding-right: 0; + padding-top: 0; + padding-bottom: 0; + text-align: center; + line-height: 2.125em +} + +.prefix.button.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px +} + +.postfix.button.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.prefix.button.round { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-bottomleft: 1000px; + -moz-border-radius-topleft: 1000px; + -webkit-border-bottom-left-radius: 1000px; + -webkit-border-top-left-radius: 1000px; + border-bottom-left-radius: 1000px; + border-top-left-radius: 1000px +} + +.postfix.button.round { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px +} + +span.prefix, label.prefix { + background: #f2f2f2; + border-color: #d9d9d9; + border-right: none; + color: #333 +} + +span.prefix.radius, label.prefix.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px +} + +span.postfix, label.postfix { + background: #f2f2f2; + border-color: #ccc; + border-left: none; + color: #333 +} + +span.postfix.radius, label.postfix.radius { + -webkit-border-radius: 0; + border-radius: 0; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.input-group.radius>*:first-child, .input-group.radius>*:first-child * { + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px +} + +.input-group.radius>*:last-child, .input-group.radius>*:last-child * { + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.input-group.round>*:first-child, .input-group.round>*:first-child * { + -moz-border-radius-bottomleft: 1000px; + -moz-border-radius-topleft: 1000px; + -webkit-border-bottom-left-radius: 1000px; + -webkit-border-top-left-radius: 1000px; + border-bottom-left-radius: 1000px; + border-top-left-radius: 1000px +} + +.input-group.round>*:last-child, .input-group.round>*:last-child * { + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px +} + +input[type="text"], input[type="password"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="week"], input[type="email"], input[type="number"], input[type="search"], input[type="tel"], input[type="time"], input[type="url"], textarea { + background-color: #fff; + font-family: inherit; + border: 1px solid #ccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + color: rgba(0, 0, 0, 0.75); + display: block; + font-size: 0.875em; + margin: 0 0 1em 0; + padding: 0.5em; + height: 2.3125em; + width: 100%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: -webkit-box-shadow 0.45s, border-color 0.45s ease-in-out; + -moz-transition: -moz-box-shadow 0.45s, border-color 0.45s ease-in-out; + transition: box-shadow 0.45s, border-color 0.45s ease-in-out +} + +input[type="text"]:focus, input[type="password"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="week"]:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="time"]:focus, input[type="url"]:focus, textarea:focus { + -webkit-box-shadow: 0 0 5px #999; + -moz-box-shadow: 0 0 5px #999; + box-shadow: 0 0 5px #999; + border-color: #999 +} + +input[type="text"]:focus, input[type="password"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="week"]:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="time"]:focus, input[type="url"]:focus, textarea:focus { + background: #fafafa; + border-color: #999; + outline: none +} + +input[type="text"][disabled], input[type="password"][disabled], input[type="date"][disabled], input[type="datetime"][disabled], input[type="datetime-local"][disabled], input[type="month"][disabled], input[type="week"][disabled], input[type="email"][disabled], input[type="number"][disabled], input[type="search"][disabled], input[type="tel"][disabled], input[type="time"][disabled], input[type="url"][disabled], textarea[disabled] { + background-color: #ddd +} + +input[type="file"], input[type="checkbox"], input[type="radio"], select { + margin: 0 0 1em 0 +} + +input[type="file"] { + width: 100% +} + +fieldset { + border: solid 1px #ddd; + padding: 1.25em; + margin: 1.125em 0 +} + +fieldset legend { + font-weight: bold; + background: #fff; + padding: 0 0.1875em; + margin: 0; + margin-left: -0.1875em +} + +[data-abide] .error small.error, [data-abide] span.error, [data-abide] small.error { + display: block; + padding: 0.375em 0.25em; + margin-top: -1.3125em; + margin-bottom: 1em; + font-size: 0.75em; + font-weight: bold; + background: #c60f13; + color: #fff; + margin-top: 0 +} + +[data-abide] span.error, [data-abide] small.error { + display: none +} + +span.error, small.error { + display: block; + padding: 0.375em 0.25em; + margin-top: -1.3125em; + margin-bottom: 1em; + font-size: 0.75em; + font-weight: bold; + background: #c60f13; + color: #fff +} + +.error input, .error textarea, .error select { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1); + margin-bottom: 0 +} + +.error input:focus, .error textarea:focus, .error select:focus { + background: #fafafa; + border-color: #999 +} + +.error label, .error label.error { + color: #c60f13 +} + +.error small.error { + display: block; + padding: 0.375em 0.25em; + margin-top: -1.3125em; + margin-bottom: 1em; + font-size: 0.75em; + font-weight: bold; + background: #c60f13; + color: #fff +} + +.error span.error-message { + display: block +} + +input.error, textarea.error { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1) +} + +input.error:focus, textarea.error:focus { + background: #fafafa; + border-color: #999 +} + +.error select { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1) +} + +.error select:focus { + background: #fafafa; + border-color: #999 +} + +label.error { + color: #c60f13 +} + +.button-group { + list-style: none; + margin: 0; + *zoom: 1 +} + +.button-group:before, .button-group:after { + content: " "; + display: table +} + +.button-group:after { + clear: both +} + +.button-group>* { + margin: 0 0 0 -1px; + float: left +} + +.button-group>*:first-child { + margin-left: 0 +} + +.button-group.radius>*:first-child, .button-group.radius>*:first-child>a, .button-group.radius>*:first-child>button, .button-group.radius>*:first-child>.button { + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px +} + +.button-group.radius>*:last-child, .button-group.radius>*:last-child>a, .button-group.radius>*:last-child>button, .button-group.radius>*:last-child>.button { + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.button-group.round>*:first-child, .button-group.round>*:first-child>a, .button-group.round>*:first-child>button, .button-group.round>*:first-child>.button { + -moz-border-radius-bottomleft: 1000px; + -moz-border-radius-topleft: 1000px; + -webkit-border-bottom-left-radius: 1000px; + -webkit-border-top-left-radius: 1000px; + border-bottom-left-radius: 1000px; + border-top-left-radius: 1000px +} + +.button-group.round>*:last-child, .button-group.round>*:last-child>a, .button-group.round>*:last-child>button, .button-group.round>*:last-child>.button { + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px +} + +.button-group.even-2 li { + width: 50% +} + +.button-group.even-2 li button, .button-group.even-2 li .button { + width: 100% +} + +.button-group.even-3 li { + width: 33.33333% +} + +.button-group.even-3 li button, .button-group.even-3 li .button { + width: 100% +} + +.button-group.even-4 li { + width: 25% +} + +.button-group.even-4 li button, .button-group.even-4 li .button { + width: 100% +} + +.button-group.even-5 li { + width: 20% +} + +.button-group.even-5 li button, .button-group.even-5 li .button { + width: 100% +} + +.button-group.even-6 li { + width: 16.66667% +} + +.button-group.even-6 li button, .button-group.even-6 li .button { + width: 100% +} + +.button-group.even-7 li { + width: 14.28571% +} + +.button-group.even-7 li button, .button-group.even-7 li .button { + width: 100% +} + +.button-group.even-8 li { + width: 12.5% +} + +.button-group.even-8 li button, .button-group.even-8 li .button { + width: 100% +} + +.button-bar { + *zoom: 1 +} + +.button-bar:before, .button-bar:after { + content: " "; + display: table +} + +.button-bar:after { + clear: both +} + +.button-bar .button-group { + float: left; + margin-right: 0.625em +} + +.button-bar .button-group div { + overflow: hidden +} + +.dropdown.button { + position: relative; + padding-right: 3.1875em +} + +.dropdown.button:before { + position: absolute; + content: ""; + width: 0; + height: 0; + display: block; + border-style: solid; + border-color: #fff transparent transparent transparent; + top: 50% +} + +.dropdown.button:before { + border-width: 0.5625em; + right: 1.5em; + margin-top: -0.25em +} + +.dropdown.button:before { + border-color: #fff transparent transparent transparent +} + +.dropdown.button.tiny { + padding-right: 2.1875em +} + +.dropdown.button.tiny:before { + border-width: 0.4375em; + right: 0.875em; + margin-top: -0.15625em +} + +.dropdown.button.tiny:before { + border-color: #fff transparent transparent transparent +} + +.dropdown.button.small { + padding-right: 2.8125em +} + +.dropdown.button.small:before { + border-width: 0.5625em; + right: 1.125em; + margin-top: -0.21875em +} + +.dropdown.button.small:before { + border-color: #fff transparent transparent transparent +} + +.dropdown.button.large { + padding-right: 4em +} + +.dropdown.button.large:before { + border-width: 0.625em; + right: 1.75em; + margin-top: -0.3125em +} + +.dropdown.button.large:before { + border-color: #fff transparent transparent transparent +} + +.dropdown.button.secondary:before { + border-color: #333 transparent transparent transparent +} + +.split.button { + position: relative; + padding-right: 4.8em +} + +.split.button span { + display: block; + height: 100%; + position: absolute; + right: 0; + top: 0; + border-left: solid 1px +} + +.split.button span:before { + position: absolute; + content: ""; + width: 0; + height: 0; + display: block; + border-style: inset; + left: 50% +} + +.split.button span:active { + background-color: rgba(0, 0, 0, 0.1) +} + +.split.button span { + border-left-color: #1e728c +} + +.split.button span { + width: 3em +} + +.split.button span:before { + border-top-style: solid; + border-width: 0.5625em; + top: 1.125em; + margin-left: -0.5625em +} + +.split.button span:before { + border-color: #fff transparent transparent transparent +} + +.split.button.secondary span { + border-left-color: #c3c3c3 +} + +.split.button.secondary span:before { + border-color: #fff transparent transparent transparent +} + +.split.button.alert span { + border-left-color: #7f0a0c +} + +.split.button.success span { + border-left-color: #396516 +} + +.split.button.tiny { + padding-right: 3.9375em +} + +.split.button.tiny span { + width: 2.84375em +} + +.split.button.tiny span:before { + border-top-style: solid; + border-width: 0.4375em; + top: 0.875em; + margin-left: -0.3125em +} + +.split.button.small { + padding-right: 3.9375em +} + +.split.button.small span { + width: 2.8125em +} + +.split.button.small span:before { + border-top-style: solid; + border-width: 0.5625em; + top: 0.84375em; + margin-left: -0.5625em +} + +.split.button.large { + padding-right: 6em +} + +.split.button.large span { + width: 3.75em +} + +.split.button.large span:before { + border-top-style: solid; + border-width: 0.625em; + top: 1.3125em; + margin-left: -0.5625em +} + +.split.button.expand { + padding-left: 2em +} + +.split.button.secondary span:before { + border-color: #333 transparent transparent transparent +} + +.split.button.radius span { + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.split.button.round span { + -moz-border-radius-topright: 1000px; + -moz-border-radius-bottomright: 1000px; + -webkit-border-top-right-radius: 1000px; + -webkit-border-bottom-right-radius: 1000px; + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px +} + +.flex-video { + position: relative; + padding-top: 1.5625em; + padding-bottom: 67.5%; + height: 0; + margin-bottom: 1em; + overflow: hidden +} + +.flex-video.widescreen { + padding-bottom: 57.25% +} + +.flex-video.vimeo { + padding-top: 0 +} + +.flex-video iframe, .flex-video object, .flex-video embed, .flex-video video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100% +} + +[data-section=''], [data-section='auto'], .section-container.auto, [data-section='vertical-tabs'], .section-container.vertical-tabs, [data-section='vertical-nav'], .section-container.vertical-nav, [data-section='horizontal-nav'], .section-container.horizontal-nav, [data-section='accordion'], .section-container.accordion { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em +} + +[data-section=''][data-section-small-style], [data-section='auto'][data-section-small-style], .section-container.auto[data-section-small-style], [data-section='vertical-tabs'][data-section-small-style], .section-container.vertical-tabs[data-section-small-style], [data-section='vertical-nav'][data-section-small-style], .section-container.vertical-nav[data-section-small-style], [data-section='horizontal-nav'][data-section-small-style], .section-container.horizontal-nav[data-section-small-style], [data-section='accordion'][data-section-small-style], .section-container.accordion[data-section-small-style] { + width: 100% !important +} + +[data-section=''][data-section-small-style]>[data-section-region], [data-section=''][data-section-small-style]>section, [data-section=''][data-section-small-style]>.section, [data-section='auto'][data-section-small-style]>[data-section-region], [data-section='auto'][data-section-small-style]>section, [data-section='auto'][data-section-small-style]>.section, .section-container.auto[data-section-small-style]>[data-section-region], .section-container.auto[data-section-small-style]>section, .section-container.auto[data-section-small-style]>.section, [data-section='vertical-tabs'][data-section-small-style]>[data-section-region], [data-section='vertical-tabs'][data-section-small-style]>section, [data-section='vertical-tabs'][data-section-small-style]>.section, .section-container.vertical-tabs[data-section-small-style]>[data-section-region], .section-container.vertical-tabs[data-section-small-style]>section, .section-container.vertical-tabs[data-section-small-style]>.section, [data-section='vertical-nav'][data-section-small-style]>[data-section-region], [data-section='vertical-nav'][data-section-small-style]>section, [data-section='vertical-nav'][data-section-small-style]>.section, .section-container.vertical-nav[data-section-small-style]>[data-section-region], .section-container.vertical-nav[data-section-small-style]>section, .section-container.vertical-nav[data-section-small-style]>.section, [data-section='horizontal-nav'][data-section-small-style]>[data-section-region], [data-section='horizontal-nav'][data-section-small-style]>section, [data-section='horizontal-nav'][data-section-small-style]>.section, .section-container.horizontal-nav[data-section-small-style]>[data-section-region], .section-container.horizontal-nav[data-section-small-style]>section, .section-container.horizontal-nav[data-section-small-style]>.section, [data-section='accordion'][data-section-small-style]>[data-section-region], [data-section='accordion'][data-section-small-style]>section, [data-section='accordion'][data-section-small-style]>.section, .section-container.accordion[data-section-small-style]>[data-section-region], .section-container.accordion[data-section-small-style]>section, .section-container.accordion[data-section-small-style]>.section { + padding: 0 !important; + margin: 0 !important +} + +[data-section=''][data-section-small-style]>[data-section-region]>[data-section-title], [data-section=''][data-section-small-style]>[data-section-region]>.title, [data-section=''][data-section-small-style]>section>[data-section-title], [data-section=''][data-section-small-style]>section>.title, [data-section=''][data-section-small-style]>.section>[data-section-title], [data-section=''][data-section-small-style]>.section>.title, [data-section='auto'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='auto'][data-section-small-style]>[data-section-region]>.title, [data-section='auto'][data-section-small-style]>section>[data-section-title], [data-section='auto'][data-section-small-style]>section>.title, [data-section='auto'][data-section-small-style]>.section>[data-section-title], [data-section='auto'][data-section-small-style]>.section>.title, .section-container.auto[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.auto[data-section-small-style]>[data-section-region]>.title, .section-container.auto[data-section-small-style]>section>[data-section-title], .section-container.auto[data-section-small-style]>section>.title, .section-container.auto[data-section-small-style]>.section>[data-section-title], .section-container.auto[data-section-small-style]>.section>.title, [data-section='vertical-tabs'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='vertical-tabs'][data-section-small-style]>[data-section-region]>.title, [data-section='vertical-tabs'][data-section-small-style]>section>[data-section-title], [data-section='vertical-tabs'][data-section-small-style]>section>.title, [data-section='vertical-tabs'][data-section-small-style]>.section>[data-section-title], [data-section='vertical-tabs'][data-section-small-style]>.section>.title, .section-container.vertical-tabs[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.vertical-tabs[data-section-small-style]>[data-section-region]>.title, .section-container.vertical-tabs[data-section-small-style]>section>[data-section-title], .section-container.vertical-tabs[data-section-small-style]>section>.title, .section-container.vertical-tabs[data-section-small-style]>.section>[data-section-title], .section-container.vertical-tabs[data-section-small-style]>.section>.title, [data-section='vertical-nav'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='vertical-nav'][data-section-small-style]>[data-section-region]>.title, [data-section='vertical-nav'][data-section-small-style]>section>[data-section-title], [data-section='vertical-nav'][data-section-small-style]>section>.title, [data-section='vertical-nav'][data-section-small-style]>.section>[data-section-title], [data-section='vertical-nav'][data-section-small-style]>.section>.title, .section-container.vertical-nav[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.vertical-nav[data-section-small-style]>[data-section-region]>.title, .section-container.vertical-nav[data-section-small-style]>section>[data-section-title], .section-container.vertical-nav[data-section-small-style]>section>.title, .section-container.vertical-nav[data-section-small-style]>.section>[data-section-title], .section-container.vertical-nav[data-section-small-style]>.section>.title, [data-section='horizontal-nav'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='horizontal-nav'][data-section-small-style]>[data-section-region]>.title, [data-section='horizontal-nav'][data-section-small-style]>section>[data-section-title], [data-section='horizontal-nav'][data-section-small-style]>section>.title, [data-section='horizontal-nav'][data-section-small-style]>.section>[data-section-title], [data-section='horizontal-nav'][data-section-small-style]>.section>.title, .section-container.horizontal-nav[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.horizontal-nav[data-section-small-style]>[data-section-region]>.title, .section-container.horizontal-nav[data-section-small-style]>section>[data-section-title], .section-container.horizontal-nav[data-section-small-style]>section>.title, .section-container.horizontal-nav[data-section-small-style]>.section>[data-section-title], .section-container.horizontal-nav[data-section-small-style]>.section>.title, [data-section='accordion'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='accordion'][data-section-small-style]>[data-section-region]>.title, [data-section='accordion'][data-section-small-style]>section>[data-section-title], [data-section='accordion'][data-section-small-style]>section>.title, [data-section='accordion'][data-section-small-style]>.section>[data-section-title], [data-section='accordion'][data-section-small-style]>.section>.title, .section-container.accordion[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.accordion[data-section-small-style]>[data-section-region]>.title, .section-container.accordion[data-section-small-style]>section>[data-section-title], .section-container.accordion[data-section-small-style]>section>.title, .section-container.accordion[data-section-small-style]>.section>[data-section-title], .section-container.accordion[data-section-small-style]>.section>.title { + width: 100% !important +} + +[data-section='']>section, [data-section='']>.section, [data-section='']>[data-section-region], [data-section='auto']>section, [data-section='auto']>.section, [data-section='auto']>[data-section-region], .section-container.auto>section, .section-container.auto>.section, .section-container.auto>[data-section-region], [data-section='vertical-tabs']>section, [data-section='vertical-tabs']>.section, [data-section='vertical-tabs']>[data-section-region], .section-container.vertical-tabs>section, .section-container.vertical-tabs>.section, .section-container.vertical-tabs>[data-section-region], [data-section='vertical-nav']>section, [data-section='vertical-nav']>.section, [data-section='vertical-nav']>[data-section-region], .section-container.vertical-nav>section, .section-container.vertical-nav>.section, .section-container.vertical-nav>[data-section-region], [data-section='horizontal-nav']>section, [data-section='horizontal-nav']>.section, [data-section='horizontal-nav']>[data-section-region], .section-container.horizontal-nav>section, .section-container.horizontal-nav>.section, .section-container.horizontal-nav>[data-section-region], [data-section='accordion']>section, [data-section='accordion']>.section, [data-section='accordion']>[data-section-region], .section-container.accordion>section, .section-container.accordion>.section, .section-container.accordion>[data-section-region] { + margin: 0 +} + +[data-section='']>section>[data-section-title], [data-section='']>section>.title, [data-section='']>.section>[data-section-title], [data-section='']>.section>.title, [data-section='']>[data-section-region]>[data-section-title], [data-section='']>[data-section-region]>.title, [data-section='auto']>section>[data-section-title], [data-section='auto']>section>.title, [data-section='auto']>.section>[data-section-title], [data-section='auto']>.section>.title, [data-section='auto']>[data-section-region]>[data-section-title], [data-section='auto']>[data-section-region]>.title, .section-container.auto>section>[data-section-title], .section-container.auto>section>.title, .section-container.auto>.section>[data-section-title], .section-container.auto>.section>.title, .section-container.auto>[data-section-region]>[data-section-title], .section-container.auto>[data-section-region]>.title, [data-section='vertical-tabs']>section>[data-section-title], [data-section='vertical-tabs']>section>.title, [data-section='vertical-tabs']>.section>[data-section-title], [data-section='vertical-tabs']>.section>.title, [data-section='vertical-tabs']>[data-section-region]>[data-section-title], [data-section='vertical-tabs']>[data-section-region]>.title, .section-container.vertical-tabs>section>[data-section-title], .section-container.vertical-tabs>section>.title, .section-container.vertical-tabs>.section>[data-section-title], .section-container.vertical-tabs>.section>.title, .section-container.vertical-tabs>[data-section-region]>[data-section-title], .section-container.vertical-tabs>[data-section-region]>.title, [data-section='vertical-nav']>section>[data-section-title], [data-section='vertical-nav']>section>.title, [data-section='vertical-nav']>.section>[data-section-title], [data-section='vertical-nav']>.section>.title, [data-section='vertical-nav']>[data-section-region]>[data-section-title], [data-section='vertical-nav']>[data-section-region]>.title, .section-container.vertical-nav>section>[data-section-title], .section-container.vertical-nav>section>.title, .section-container.vertical-nav>.section>[data-section-title], .section-container.vertical-nav>.section>.title, .section-container.vertical-nav>[data-section-region]>[data-section-title], .section-container.vertical-nav>[data-section-region]>.title, [data-section='horizontal-nav']>section>[data-section-title], [data-section='horizontal-nav']>section>.title, [data-section='horizontal-nav']>.section>[data-section-title], [data-section='horizontal-nav']>.section>.title, [data-section='horizontal-nav']>[data-section-region]>[data-section-title], [data-section='horizontal-nav']>[data-section-region]>.title, .section-container.horizontal-nav>section>[data-section-title], .section-container.horizontal-nav>section>.title, .section-container.horizontal-nav>.section>[data-section-title], .section-container.horizontal-nav>.section>.title, .section-container.horizontal-nav>[data-section-region]>[data-section-title], .section-container.horizontal-nav>[data-section-region]>.title, [data-section='accordion']>section>[data-section-title], [data-section='accordion']>section>.title, [data-section='accordion']>.section>[data-section-title], [data-section='accordion']>.section>.title, [data-section='accordion']>[data-section-region]>[data-section-title], [data-section='accordion']>[data-section-region]>.title, .section-container.accordion>section>[data-section-title], .section-container.accordion>section>.title, .section-container.accordion>.section>[data-section-title], .section-container.accordion>.section>.title, .section-container.accordion>[data-section-region]>[data-section-title], .section-container.accordion>[data-section-region]>.title { + margin-bottom: 0 +} + +[data-section='']>section>[data-section-title] a, [data-section='']>section>.title a, [data-section='']>.section>[data-section-title] a, [data-section='']>.section>.title a, [data-section='']>[data-section-region]>[data-section-title] a, [data-section='']>[data-section-region]>.title a, [data-section='auto']>section>[data-section-title] a, [data-section='auto']>section>.title a, [data-section='auto']>.section>[data-section-title] a, [data-section='auto']>.section>.title a, [data-section='auto']>[data-section-region]>[data-section-title] a, [data-section='auto']>[data-section-region]>.title a, .section-container.auto>section>[data-section-title] a, .section-container.auto>section>.title a, .section-container.auto>.section>[data-section-title] a, .section-container.auto>.section>.title a, .section-container.auto>[data-section-region]>[data-section-title] a, .section-container.auto>[data-section-region]>.title a, [data-section='vertical-tabs']>section>[data-section-title] a, [data-section='vertical-tabs']>section>.title a, [data-section='vertical-tabs']>.section>[data-section-title] a, [data-section='vertical-tabs']>.section>.title a, [data-section='vertical-tabs']>[data-section-region]>[data-section-title] a, [data-section='vertical-tabs']>[data-section-region]>.title a, .section-container.vertical-tabs>section>[data-section-title] a, .section-container.vertical-tabs>section>.title a, .section-container.vertical-tabs>.section>[data-section-title] a, .section-container.vertical-tabs>.section>.title a, .section-container.vertical-tabs>[data-section-region]>[data-section-title] a, .section-container.vertical-tabs>[data-section-region]>.title a, [data-section='vertical-nav']>section>[data-section-title] a, [data-section='vertical-nav']>section>.title a, [data-section='vertical-nav']>.section>[data-section-title] a, [data-section='vertical-nav']>.section>.title a, [data-section='vertical-nav']>[data-section-region]>[data-section-title] a, [data-section='vertical-nav']>[data-section-region]>.title a, .section-container.vertical-nav>section>[data-section-title] a, .section-container.vertical-nav>section>.title a, .section-container.vertical-nav>.section>[data-section-title] a, .section-container.vertical-nav>.section>.title a, .section-container.vertical-nav>[data-section-region]>[data-section-title] a, .section-container.vertical-nav>[data-section-region]>.title a, [data-section='horizontal-nav']>section>[data-section-title] a, [data-section='horizontal-nav']>section>.title a, [data-section='horizontal-nav']>.section>[data-section-title] a, [data-section='horizontal-nav']>.section>.title a, [data-section='horizontal-nav']>[data-section-region]>[data-section-title] a, [data-section='horizontal-nav']>[data-section-region]>.title a, .section-container.horizontal-nav>section>[data-section-title] a, .section-container.horizontal-nav>section>.title a, .section-container.horizontal-nav>.section>[data-section-title] a, .section-container.horizontal-nav>.section>.title a, .section-container.horizontal-nav>[data-section-region]>[data-section-title] a, .section-container.horizontal-nav>[data-section-region]>.title a, [data-section='accordion']>section>[data-section-title] a, [data-section='accordion']>section>.title a, [data-section='accordion']>.section>[data-section-title] a, [data-section='accordion']>.section>.title a, [data-section='accordion']>[data-section-region]>[data-section-title] a, [data-section='accordion']>[data-section-region]>.title a, .section-container.accordion>section>[data-section-title] a, .section-container.accordion>section>.title a, .section-container.accordion>.section>[data-section-title] a, .section-container.accordion>.section>.title a, .section-container.accordion>[data-section-region]>[data-section-title] a, .section-container.accordion>[data-section-region]>.title a { + width: 100%; + display: inline-block; + white-space: nowrap +} + +[data-section='']>section>[data-section-content], [data-section='']>section>.content, [data-section='']>.section>[data-section-content], [data-section='']>.section>.content, [data-section='']>[data-section-region]>[data-section-content], [data-section='']>[data-section-region]>.content, [data-section='auto']>section>[data-section-content], [data-section='auto']>section>.content, [data-section='auto']>.section>[data-section-content], [data-section='auto']>.section>.content, [data-section='auto']>[data-section-region]>[data-section-content], [data-section='auto']>[data-section-region]>.content, .section-container.auto>section>[data-section-content], .section-container.auto>section>.content, .section-container.auto>.section>[data-section-content], .section-container.auto>.section>.content, .section-container.auto>[data-section-region]>[data-section-content], .section-container.auto>[data-section-region]>.content, [data-section='vertical-tabs']>section>[data-section-content], [data-section='vertical-tabs']>section>.content, [data-section='vertical-tabs']>.section>[data-section-content], [data-section='vertical-tabs']>.section>.content, [data-section='vertical-tabs']>[data-section-region]>[data-section-content], [data-section='vertical-tabs']>[data-section-region]>.content, .section-container.vertical-tabs>section>[data-section-content], .section-container.vertical-tabs>section>.content, .section-container.vertical-tabs>.section>[data-section-content], .section-container.vertical-tabs>.section>.content, .section-container.vertical-tabs>[data-section-region]>[data-section-content], .section-container.vertical-tabs>[data-section-region]>.content, [data-section='vertical-nav']>section>[data-section-content], [data-section='vertical-nav']>section>.content, [data-section='vertical-nav']>.section>[data-section-content], [data-section='vertical-nav']>.section>.content, [data-section='vertical-nav']>[data-section-region]>[data-section-content], [data-section='vertical-nav']>[data-section-region]>.content, .section-container.vertical-nav>section>[data-section-content], .section-container.vertical-nav>section>.content, .section-container.vertical-nav>.section>[data-section-content], .section-container.vertical-nav>.section>.content, .section-container.vertical-nav>[data-section-region]>[data-section-content], .section-container.vertical-nav>[data-section-region]>.content, [data-section='horizontal-nav']>section>[data-section-content], [data-section='horizontal-nav']>section>.content, [data-section='horizontal-nav']>.section>[data-section-content], [data-section='horizontal-nav']>.section>.content, [data-section='horizontal-nav']>[data-section-region]>[data-section-content], [data-section='horizontal-nav']>[data-section-region]>.content, .section-container.horizontal-nav>section>[data-section-content], .section-container.horizontal-nav>section>.content, .section-container.horizontal-nav>.section>[data-section-content], .section-container.horizontal-nav>.section>.content, .section-container.horizontal-nav>[data-section-region]>[data-section-content], .section-container.horizontal-nav>[data-section-region]>.content, [data-section='accordion']>section>[data-section-content], [data-section='accordion']>section>.content, [data-section='accordion']>.section>[data-section-content], [data-section='accordion']>.section>.content, [data-section='accordion']>[data-section-region]>[data-section-content], [data-section='accordion']>[data-section-region]>.content, .section-container.accordion>section>[data-section-content], .section-container.accordion>section>.content, .section-container.accordion>.section>[data-section-content], .section-container.accordion>.section>.content, .section-container.accordion>[data-section-region]>[data-section-content], .section-container.accordion>[data-section-region]>.content { + display: none +} + +[data-section='']>section.active>[data-section-content], [data-section='']>section.active>.content, [data-section='']>.section.active>[data-section-content], [data-section='']>.section.active>.content, [data-section='']>[data-section-region].active>[data-section-content], [data-section='']>[data-section-region].active>.content, [data-section='auto']>section.active>[data-section-content], [data-section='auto']>section.active>.content, [data-section='auto']>.section.active>[data-section-content], [data-section='auto']>.section.active>.content, [data-section='auto']>[data-section-region].active>[data-section-content], [data-section='auto']>[data-section-region].active>.content, .section-container.auto>section.active>[data-section-content], .section-container.auto>section.active>.content, .section-container.auto>.section.active>[data-section-content], .section-container.auto>.section.active>.content, .section-container.auto>[data-section-region].active>[data-section-content], .section-container.auto>[data-section-region].active>.content, [data-section='vertical-tabs']>section.active>[data-section-content], [data-section='vertical-tabs']>section.active>.content, [data-section='vertical-tabs']>.section.active>[data-section-content], [data-section='vertical-tabs']>.section.active>.content, [data-section='vertical-tabs']>[data-section-region].active>[data-section-content], [data-section='vertical-tabs']>[data-section-region].active>.content, .section-container.vertical-tabs>section.active>[data-section-content], .section-container.vertical-tabs>section.active>.content, .section-container.vertical-tabs>.section.active>[data-section-content], .section-container.vertical-tabs>.section.active>.content, .section-container.vertical-tabs>[data-section-region].active>[data-section-content], .section-container.vertical-tabs>[data-section-region].active>.content, [data-section='vertical-nav']>section.active>[data-section-content], [data-section='vertical-nav']>section.active>.content, [data-section='vertical-nav']>.section.active>[data-section-content], [data-section='vertical-nav']>.section.active>.content, [data-section='vertical-nav']>[data-section-region].active>[data-section-content], [data-section='vertical-nav']>[data-section-region].active>.content, .section-container.vertical-nav>section.active>[data-section-content], .section-container.vertical-nav>section.active>.content, .section-container.vertical-nav>.section.active>[data-section-content], .section-container.vertical-nav>.section.active>.content, .section-container.vertical-nav>[data-section-region].active>[data-section-content], .section-container.vertical-nav>[data-section-region].active>.content, [data-section='horizontal-nav']>section.active>[data-section-content], [data-section='horizontal-nav']>section.active>.content, [data-section='horizontal-nav']>.section.active>[data-section-content], [data-section='horizontal-nav']>.section.active>.content, [data-section='horizontal-nav']>[data-section-region].active>[data-section-content], [data-section='horizontal-nav']>[data-section-region].active>.content, .section-container.horizontal-nav>section.active>[data-section-content], .section-container.horizontal-nav>section.active>.content, .section-container.horizontal-nav>.section.active>[data-section-content], .section-container.horizontal-nav>.section.active>.content, .section-container.horizontal-nav>[data-section-region].active>[data-section-content], .section-container.horizontal-nav>[data-section-region].active>.content, [data-section='accordion']>section.active>[data-section-content], [data-section='accordion']>section.active>.content, [data-section='accordion']>.section.active>[data-section-content], [data-section='accordion']>.section.active>.content, [data-section='accordion']>[data-section-region].active>[data-section-content], [data-section='accordion']>[data-section-region].active>.content, .section-container.accordion>section.active>[data-section-content], .section-container.accordion>section.active>.content, .section-container.accordion>.section.active>[data-section-content], .section-container.accordion>.section.active>.content, .section-container.accordion>[data-section-region].active>[data-section-content], .section-container.accordion>[data-section-region].active>.content { + display: block +} + +[data-section='']>section:not(.active), [data-section='']>.section:not(.active), [data-section='']>[data-section-region]:not(.active), [data-section='auto']>section:not(.active), [data-section='auto']>.section:not(.active), [data-section='auto']>[data-section-region]:not(.active), .section-container.auto>section:not(.active), .section-container.auto>.section:not(.active), .section-container.auto>[data-section-region]:not(.active), [data-section='vertical-tabs']>section:not(.active), [data-section='vertical-tabs']>.section:not(.active), [data-section='vertical-tabs']>[data-section-region]:not(.active), .section-container.vertical-tabs>section:not(.active), .section-container.vertical-tabs>.section:not(.active), .section-container.vertical-tabs>[data-section-region]:not(.active), [data-section='vertical-nav']>section:not(.active), [data-section='vertical-nav']>.section:not(.active), [data-section='vertical-nav']>[data-section-region]:not(.active), .section-container.vertical-nav>section:not(.active), .section-container.vertical-nav>.section:not(.active), .section-container.vertical-nav>[data-section-region]:not(.active), [data-section='horizontal-nav']>section:not(.active), [data-section='horizontal-nav']>.section:not(.active), [data-section='horizontal-nav']>[data-section-region]:not(.active), .section-container.horizontal-nav>section:not(.active), .section-container.horizontal-nav>.section:not(.active), .section-container.horizontal-nav>[data-section-region]:not(.active), [data-section='accordion']>section:not(.active), [data-section='accordion']>.section:not(.active), [data-section='accordion']>[data-section-region]:not(.active), .section-container.accordion>section:not(.active), .section-container.accordion>.section:not(.active), .section-container.accordion>[data-section-region]:not(.active) { + padding: 0 !important +} + +[data-section='']>section>[data-section-title], [data-section='']>section>.title, [data-section='']>.section>[data-section-title], [data-section='']>.section>.title, [data-section='']>[data-section-region]>[data-section-title], [data-section='']>[data-section-region]>.title, [data-section='auto']>section>[data-section-title], [data-section='auto']>section>.title, [data-section='auto']>.section>[data-section-title], [data-section='auto']>.section>.title, [data-section='auto']>[data-section-region]>[data-section-title], [data-section='auto']>[data-section-region]>.title, .section-container.auto>section>[data-section-title], .section-container.auto>section>.title, .section-container.auto>.section>[data-section-title], .section-container.auto>.section>.title, .section-container.auto>[data-section-region]>[data-section-title], .section-container.auto>[data-section-region]>.title, [data-section='vertical-tabs']>section>[data-section-title], [data-section='vertical-tabs']>section>.title, [data-section='vertical-tabs']>.section>[data-section-title], [data-section='vertical-tabs']>.section>.title, [data-section='vertical-tabs']>[data-section-region]>[data-section-title], [data-section='vertical-tabs']>[data-section-region]>.title, .section-container.vertical-tabs>section>[data-section-title], .section-container.vertical-tabs>section>.title, .section-container.vertical-tabs>.section>[data-section-title], .section-container.vertical-tabs>.section>.title, .section-container.vertical-tabs>[data-section-region]>[data-section-title], .section-container.vertical-tabs>[data-section-region]>.title, [data-section='vertical-nav']>section>[data-section-title], [data-section='vertical-nav']>section>.title, [data-section='vertical-nav']>.section>[data-section-title], [data-section='vertical-nav']>.section>.title, [data-section='vertical-nav']>[data-section-region]>[data-section-title], [data-section='vertical-nav']>[data-section-region]>.title, .section-container.vertical-nav>section>[data-section-title], .section-container.vertical-nav>section>.title, .section-container.vertical-nav>.section>[data-section-title], .section-container.vertical-nav>.section>.title, .section-container.vertical-nav>[data-section-region]>[data-section-title], .section-container.vertical-nav>[data-section-region]>.title, [data-section='horizontal-nav']>section>[data-section-title], [data-section='horizontal-nav']>section>.title, [data-section='horizontal-nav']>.section>[data-section-title], [data-section='horizontal-nav']>.section>.title, [data-section='horizontal-nav']>[data-section-region]>[data-section-title], [data-section='horizontal-nav']>[data-section-region]>.title, .section-container.horizontal-nav>section>[data-section-title], .section-container.horizontal-nav>section>.title, .section-container.horizontal-nav>.section>[data-section-title], .section-container.horizontal-nav>.section>.title, .section-container.horizontal-nav>[data-section-region]>[data-section-title], .section-container.horizontal-nav>[data-section-region]>.title, [data-section='accordion']>section>[data-section-title], [data-section='accordion']>section>.title, [data-section='accordion']>.section>[data-section-title], [data-section='accordion']>.section>.title, [data-section='accordion']>[data-section-region]>[data-section-title], [data-section='accordion']>[data-section-region]>.title, .section-container.accordion>section>[data-section-title], .section-container.accordion>section>.title, .section-container.accordion>.section>[data-section-title], .section-container.accordion>.section>.title, .section-container.accordion>[data-section-region]>[data-section-title], .section-container.accordion>[data-section-region]>.title { + width: 100% +} + +.section-container.auto, .section-container.vertical-tabs, .section-container.vertical-nav, .section-container.horizontal-nav, .section-container.accordion { + border-top: 1px solid #ccc +} + +.section-container.auto>section>.title, .section-container.auto>.section>.title, .section-container.vertical-tabs>section>.title, .section-container.vertical-tabs>.section>.title, .section-container.vertical-nav>section>.title, .section-container.vertical-nav>.section>.title, .section-container.horizontal-nav>section>.title, .section-container.horizontal-nav>.section>.title, .section-container.accordion>section>.title, .section-container.accordion>.section>.title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #ccc +} + +.section-container.auto>section>.title a, .section-container.auto>.section>.title a, .section-container.vertical-tabs>section>.title a, .section-container.vertical-tabs>.section>.title a, .section-container.vertical-nav>section>.title a, .section-container.vertical-nav>.section>.title a, .section-container.horizontal-nav>section>.title a, .section-container.horizontal-nav>.section>.title a, .section-container.accordion>section>.title a, .section-container.accordion>.section>.title a { + padding: 0.9375em; + color: #333; + font-size: 0.875em; + background: none +} + +.section-container.auto>section>.title:hover, .section-container.auto>.section>.title:hover, .section-container.vertical-tabs>section>.title:hover, .section-container.vertical-tabs>.section>.title:hover, .section-container.vertical-nav>section>.title:hover, .section-container.vertical-nav>.section>.title:hover, .section-container.horizontal-nav>section>.title:hover, .section-container.horizontal-nav>.section>.title:hover, .section-container.accordion>section>.title:hover, .section-container.accordion>.section>.title:hover { + background-color: #e2e2e2 +} + +.section-container.auto>section>.content, .section-container.auto>.section>.content, .section-container.vertical-tabs>section>.content, .section-container.vertical-tabs>.section>.content, .section-container.vertical-nav>section>.content, .section-container.vertical-nav>.section>.content, .section-container.horizontal-nav>section>.content, .section-container.horizontal-nav>.section>.content, .section-container.accordion>section>.content, .section-container.accordion>.section>.content { + padding: 0.9375em; + background-color: #fff; + border: solid 1px #ccc +} + +.section-container.auto>section>.content>*:last-child, .section-container.auto>.section>.content>*:last-child, .section-container.vertical-tabs>section>.content>*:last-child, .section-container.vertical-tabs>.section>.content>*:last-child, .section-container.vertical-nav>section>.content>*:last-child, .section-container.vertical-nav>.section>.content>*:last-child, .section-container.horizontal-nav>section>.content>*:last-child, .section-container.horizontal-nav>.section>.content>*:last-child, .section-container.accordion>section>.content>*:last-child, .section-container.accordion>.section>.content>*:last-child { + margin-bottom: 0 +} + +.section-container.auto>section>.content>*:first-child, .section-container.auto>.section>.content>*:first-child, .section-container.vertical-tabs>section>.content>*:first-child, .section-container.vertical-tabs>.section>.content>*:first-child, .section-container.vertical-nav>section>.content>*:first-child, .section-container.vertical-nav>.section>.content>*:first-child, .section-container.horizontal-nav>section>.content>*:first-child, .section-container.horizontal-nav>.section>.content>*:first-child, .section-container.accordion>section>.content>*:first-child, .section-container.accordion>.section>.content>*:first-child { + padding-top: 0 +} + +.section-container.auto>section>.content>*:last-child:not(.flex-video), .section-container.auto>.section>.content>*:last-child:not(.flex-video), .section-container.vertical-tabs>section>.content>*:last-child:not(.flex-video), .section-container.vertical-tabs>.section>.content>*:last-child:not(.flex-video), .section-container.vertical-nav>section>.content>*:last-child:not(.flex-video), .section-container.vertical-nav>.section>.content>*:last-child:not(.flex-video), .section-container.horizontal-nav>section>.content>*:last-child:not(.flex-video), .section-container.horizontal-nav>.section>.content>*:last-child:not(.flex-video), .section-container.accordion>section>.content>*:last-child:not(.flex-video), .section-container.accordion>.section>.content>*:last-child:not(.flex-video) { + padding-bottom: 0 +} + +.section-container.auto>section.active>.title, .section-container.auto>.section.active>.title, .section-container.vertical-tabs>section.active>.title, .section-container.vertical-tabs>.section.active>.title, .section-container.vertical-nav>section.active>.title, .section-container.vertical-nav>.section.active>.title, .section-container.horizontal-nav>section.active>.title, .section-container.horizontal-nav>.section.active>.title, .section-container.accordion>section.active>.title, .section-container.accordion>.section.active>.title { + background: #d5d5d5 +} + +.section-container.auto>section.active>.title a, .section-container.auto>.section.active>.title a, .section-container.vertical-tabs>section.active>.title a, .section-container.vertical-tabs>.section.active>.title a, .section-container.vertical-nav>section.active>.title a, .section-container.vertical-nav>.section.active>.title a, .section-container.horizontal-nav>section.active>.title a, .section-container.horizontal-nav>.section.active>.title a, .section-container.accordion>section.active>.title a, .section-container.accordion>.section.active>.title a { + color: #333 +} + +.section-container.auto>section:not(.active), .section-container.auto>.section:not(.active), .section-container.vertical-tabs>section:not(.active), .section-container.vertical-tabs>.section:not(.active), .section-container.vertical-nav>section:not(.active), .section-container.vertical-nav>.section:not(.active), .section-container.horizontal-nav>section:not(.active), .section-container.horizontal-nav>.section:not(.active), .section-container.accordion>section:not(.active), .section-container.accordion>.section:not(.active) { + padding: 0 !important +} + +.section-container.auto>section>.title, .section-container.auto>.section>.title, .section-container.vertical-tabs>section>.title, .section-container.vertical-tabs>.section>.title, .section-container.vertical-nav>section>.title, .section-container.vertical-nav>.section>.title, .section-container.horizontal-nav>section>.title, .section-container.horizontal-nav>.section>.title, .section-container.accordion>section>.title, .section-container.accordion>.section>.title { + border-top: none +} + +[data-section='tabs'], .section-container.tabs { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em +} + +[data-section='tabs']:not([data-section-resized]):not([data-section-small-style]), .section-container.tabs:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden +} + +[data-section='tabs']>section>[data-section-title], [data-section='tabs']>section>.title, [data-section='tabs']>.section>[data-section-title], [data-section='tabs']>.section>.title, [data-section='tabs']>[data-section-region]>[data-section-title], [data-section='tabs']>[data-section-region]>.title, .section-container.tabs>section>[data-section-title], .section-container.tabs>section>.title, .section-container.tabs>.section>[data-section-title], .section-container.tabs>.section>.title, .section-container.tabs>[data-section-region]>[data-section-title], .section-container.tabs>[data-section-region]>.title { + margin-bottom: 0 +} + +[data-section='tabs']>section>[data-section-title] a, [data-section='tabs']>section>.title a, [data-section='tabs']>.section>[data-section-title] a, [data-section='tabs']>.section>.title a, [data-section='tabs']>[data-section-region]>[data-section-title] a, [data-section='tabs']>[data-section-region]>.title a, .section-container.tabs>section>[data-section-title] a, .section-container.tabs>section>.title a, .section-container.tabs>.section>[data-section-title] a, .section-container.tabs>.section>.title a, .section-container.tabs>[data-section-region]>[data-section-title] a, .section-container.tabs>[data-section-region]>.title a { + width: 100%; + display: inline-block; + white-space: nowrap +} + +[data-section='tabs']>section>[data-section-content], [data-section='tabs']>section>.content, [data-section='tabs']>.section>[data-section-content], [data-section='tabs']>.section>.content, [data-section='tabs']>[data-section-region]>[data-section-content], [data-section='tabs']>[data-section-region]>.content, .section-container.tabs>section>[data-section-content], .section-container.tabs>section>.content, .section-container.tabs>.section>[data-section-content], .section-container.tabs>.section>.content, .section-container.tabs>[data-section-region]>[data-section-content], .section-container.tabs>[data-section-region]>.content { + display: none +} + +[data-section='tabs']>section.active>[data-section-content], [data-section='tabs']>section.active>.content, [data-section='tabs']>.section.active>[data-section-content], [data-section='tabs']>.section.active>.content, [data-section='tabs']>[data-section-region].active>[data-section-content], [data-section='tabs']>[data-section-region].active>.content, .section-container.tabs>section.active>[data-section-content], .section-container.tabs>section.active>.content, .section-container.tabs>.section.active>[data-section-content], .section-container.tabs>.section.active>.content, .section-container.tabs>[data-section-region].active>[data-section-content], .section-container.tabs>[data-section-region].active>.content { + display: block +} + +[data-section='tabs']>section:not(.active), [data-section='tabs']>.section:not(.active), [data-section='tabs']>[data-section-region]:not(.active), .section-container.tabs>section:not(.active), .section-container.tabs>.section:not(.active), .section-container.tabs>[data-section-region]:not(.active) { + padding: 0 !important +} + +[data-section='tabs']>section>[data-section-title], [data-section='tabs']>section>.title, [data-section='tabs']>.section>[data-section-title], [data-section='tabs']>.section>.title, [data-section='tabs']>[data-section-region]>[data-section-title], [data-section='tabs']>[data-section-region]>.title, .section-container.tabs>section>[data-section-title], .section-container.tabs>section>.title, .section-container.tabs>.section>[data-section-title], .section-container.tabs>.section>.title, .section-container.tabs>[data-section-region]>[data-section-title], .section-container.tabs>[data-section-region]>.title { + width: auto; + position: absolute; + top: 0; + left: 0 +} + +.section-container.tabs { + border: none +} + +.section-container.tabs>section>.title, .section-container.tabs>.section>.title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #ccc +} + +.section-container.tabs>section>.title a, .section-container.tabs>.section>.title a { + padding: 0.9375em; + color: #333; + font-size: 0.875em; + background: none +} + +.section-container.tabs>section>.title:hover, .section-container.tabs>.section>.title:hover { + background-color: #e2e2e2 +} + +.section-container.tabs>section>.content, .section-container.tabs>.section>.content { + padding: 0.9375em; + background-color: #fff; + border: solid 1px #ccc +} + +.section-container.tabs>section>.content>*:last-child, .section-container.tabs>.section>.content>*:last-child { + margin-bottom: 0 +} + +.section-container.tabs>section>.content>*:first-child, .section-container.tabs>.section>.content>*:first-child { + padding-top: 0 +} + +.section-container.tabs>section>.content>*:last-child:not(.flex-video), .section-container.tabs>.section>.content>*:last-child:not(.flex-video) { + padding-bottom: 0 +} + +.section-container.tabs>section.active>.title, .section-container.tabs>.section.active>.title { + background: #fff +} + +.section-container.tabs>section.active>.title a, .section-container.tabs>.section.active>.title a { + color: #333 +} + +.section-container.tabs>section:not(.active), .section-container.tabs>.section:not(.active) { + padding: 0 !important +} + +.section-container.tabs>section.active>.title, .section-container.tabs>.section.active>.title { + border-bottom: 0 +} + +@media only screen and (min-width: 768px) { + [data-section=''], [data-section='auto'], .section-container.auto { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em + } + + [data-section='']:not([data-section-resized]):not([data-section-small-style]), [data-section='auto']:not([data-section-resized]):not([data-section-small-style]), .section-container.auto:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden + } + + [data-section='']>section>[data-section-title], [data-section='']>section>.title, [data-section='']>.section>[data-section-title], [data-section='']>.section>.title, [data-section='']>[data-section-region]>[data-section-title], [data-section='']>[data-section-region]>.title, [data-section='auto']>section>[data-section-title], [data-section='auto']>section>.title, [data-section='auto']>.section>[data-section-title], [data-section='auto']>.section>.title, [data-section='auto']>[data-section-region]>[data-section-title], [data-section='auto']>[data-section-region]>.title, .section-container.auto>section>[data-section-title], .section-container.auto>section>.title, .section-container.auto>.section>[data-section-title], .section-container.auto>.section>.title, .section-container.auto>[data-section-region]>[data-section-title], .section-container.auto>[data-section-region]>.title { + margin-bottom: 0 + } + + [data-section='']>section>[data-section-title] a, [data-section='']>section>.title a, [data-section='']>.section>[data-section-title] a, [data-section='']>.section>.title a, [data-section='']>[data-section-region]>[data-section-title] a, [data-section='']>[data-section-region]>.title a, [data-section='auto']>section>[data-section-title] a, [data-section='auto']>section>.title a, [data-section='auto']>.section>[data-section-title] a, [data-section='auto']>.section>.title a, [data-section='auto']>[data-section-region]>[data-section-title] a, [data-section='auto']>[data-section-region]>.title a, .section-container.auto>section>[data-section-title] a, .section-container.auto>section>.title a, .section-container.auto>.section>[data-section-title] a, .section-container.auto>.section>.title a, .section-container.auto>[data-section-region]>[data-section-title] a, .section-container.auto>[data-section-region]>.title a { + width: 100%; + display: inline-block; + white-space: nowrap + } + + [data-section='']>section>[data-section-content], [data-section='']>section>.content, [data-section='']>.section>[data-section-content], [data-section='']>.section>.content, [data-section='']>[data-section-region]>[data-section-content], [data-section='']>[data-section-region]>.content, [data-section='auto']>section>[data-section-content], [data-section='auto']>section>.content, [data-section='auto']>.section>[data-section-content], [data-section='auto']>.section>.content, [data-section='auto']>[data-section-region]>[data-section-content], [data-section='auto']>[data-section-region]>.content, .section-container.auto>section>[data-section-content], .section-container.auto>section>.content, .section-container.auto>.section>[data-section-content], .section-container.auto>.section>.content, .section-container.auto>[data-section-region]>[data-section-content], .section-container.auto>[data-section-region]>.content { + display: none + } + + [data-section='']>section.active>[data-section-content], [data-section='']>section.active>.content, [data-section='']>.section.active>[data-section-content], [data-section='']>.section.active>.content, [data-section='']>[data-section-region].active>[data-section-content], [data-section='']>[data-section-region].active>.content, [data-section='auto']>section.active>[data-section-content], [data-section='auto']>section.active>.content, [data-section='auto']>.section.active>[data-section-content], [data-section='auto']>.section.active>.content, [data-section='auto']>[data-section-region].active>[data-section-content], [data-section='auto']>[data-section-region].active>.content, .section-container.auto>section.active>[data-section-content], .section-container.auto>section.active>.content, .section-container.auto>.section.active>[data-section-content], .section-container.auto>.section.active>.content, .section-container.auto>[data-section-region].active>[data-section-content], .section-container.auto>[data-section-region].active>.content { + display: block + } + + [data-section='']>section:not(.active), [data-section='']>.section:not(.active), [data-section='']>[data-section-region]:not(.active), [data-section='auto']>section:not(.active), [data-section='auto']>.section:not(.active), [data-section='auto']>[data-section-region]:not(.active), .section-container.auto>section:not(.active), .section-container.auto>.section:not(.active), .section-container.auto>[data-section-region]:not(.active) { + padding: 0 !important + } + + [data-section='']>section>[data-section-title], [data-section='']>section>.title, [data-section='']>.section>[data-section-title], [data-section='']>.section>.title, [data-section='']>[data-section-region]>[data-section-title], [data-section='']>[data-section-region]>.title, [data-section='auto']>section>[data-section-title], [data-section='auto']>section>.title, [data-section='auto']>.section>[data-section-title], [data-section='auto']>.section>.title, [data-section='auto']>[data-section-region]>[data-section-title], [data-section='auto']>[data-section-region]>.title, .section-container.auto>section>[data-section-title], .section-container.auto>section>.title, .section-container.auto>.section>[data-section-title], .section-container.auto>.section>.title, .section-container.auto>[data-section-region]>[data-section-title], .section-container.auto>[data-section-region]>.title { + width: auto; + position: absolute; + top: 0; + left: 0 + } + + .section-container.auto { + border: none + } + + .section-container.auto>section>.title, .section-container.auto>.section>.title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #ccc + } + + .section-container.auto>section>.title a, .section-container.auto>.section>.title a { + padding: 0.9375em; + color: #333; + font-size: 0.875em; + background: none + } + + .section-container.auto>section>.title:hover, .section-container.auto>.section>.title:hover { + background-color: #e2e2e2 + } + + .section-container.auto>section>.content, .section-container.auto>.section>.content { + padding: 0.9375em; + background-color: #fff; + border: solid 1px #ccc + } + + .section-container.auto>section>.content>*:last-child, .section-container.auto>.section>.content>*:last-child { + margin-bottom: 0 + } + + .section-container.auto>section>.content>*:first-child, .section-container.auto>.section>.content>*:first-child { + padding-top: 0 + } + + .section-container.auto>section>.content>*:last-child:not(.flex-video), .section-container.auto>.section>.content>*:last-child:not(.flex-video) { + padding-bottom: 0 + } + + .section-container.auto>section.active>.title, .section-container.auto>.section.active>.title { + background: #fff + } + + .section-container.auto>section.active>.title a, .section-container.auto>.section.active>.title a { + color: #333 + } + + .section-container.auto>section:not(.active), .section-container.auto>.section:not(.active) { + padding: 0 !important + } + + .section-container.auto>section.active>.title, .section-container.auto>.section.active>.title { + border-bottom: 0 + } + + [data-section='vertical-tabs'], .section-container.vertical-tabs { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em + } + + [data-section='vertical-tabs']:not([data-section-resized]):not([data-section-small-style]), .section-container.vertical-tabs:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden + } + + [data-section='vertical-tabs'][data-section-small-style], .section-container.vertical-tabs[data-section-small-style] { + width: 100% !important + } + + [data-section='vertical-tabs'][data-section-small-style]>[data-section-region], [data-section='vertical-tabs'][data-section-small-style]>section, [data-section='vertical-tabs'][data-section-small-style]>.section, .section-container.vertical-tabs[data-section-small-style]>[data-section-region], .section-container.vertical-tabs[data-section-small-style]>section, .section-container.vertical-tabs[data-section-small-style]>.section { + padding: 0 !important; + margin: 0 !important + } + + [data-section='vertical-tabs'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='vertical-tabs'][data-section-small-style]>[data-section-region]>.title, [data-section='vertical-tabs'][data-section-small-style]>section>[data-section-title], [data-section='vertical-tabs'][data-section-small-style]>section>.title, [data-section='vertical-tabs'][data-section-small-style]>.section>[data-section-title], [data-section='vertical-tabs'][data-section-small-style]>.section>.title, .section-container.vertical-tabs[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.vertical-tabs[data-section-small-style]>[data-section-region]>.title, .section-container.vertical-tabs[data-section-small-style]>section>[data-section-title], .section-container.vertical-tabs[data-section-small-style]>section>.title, .section-container.vertical-tabs[data-section-small-style]>.section>[data-section-title], .section-container.vertical-tabs[data-section-small-style]>.section>.title { + width: 100% !important + } + + [data-section='vertical-tabs']>section>[data-section-title], [data-section='vertical-tabs']>section>.title, [data-section='vertical-tabs']>.section>[data-section-title], [data-section='vertical-tabs']>.section>.title, [data-section='vertical-tabs']>[data-section-region]>[data-section-title], [data-section='vertical-tabs']>[data-section-region]>.title, .section-container.vertical-tabs>section>[data-section-title], .section-container.vertical-tabs>section>.title, .section-container.vertical-tabs>.section>[data-section-title], .section-container.vertical-tabs>.section>.title, .section-container.vertical-tabs>[data-section-region]>[data-section-title], .section-container.vertical-tabs>[data-section-region]>.title { + margin-bottom: 0 + } + + [data-section='vertical-tabs']>section>[data-section-title] a, [data-section='vertical-tabs']>section>.title a, [data-section='vertical-tabs']>.section>[data-section-title] a, [data-section='vertical-tabs']>.section>.title a, [data-section='vertical-tabs']>[data-section-region]>[data-section-title] a, [data-section='vertical-tabs']>[data-section-region]>.title a, .section-container.vertical-tabs>section>[data-section-title] a, .section-container.vertical-tabs>section>.title a, .section-container.vertical-tabs>.section>[data-section-title] a, .section-container.vertical-tabs>.section>.title a, .section-container.vertical-tabs>[data-section-region]>[data-section-title] a, .section-container.vertical-tabs>[data-section-region]>.title a { + width: 100%; + display: inline-block; + white-space: nowrap + } + + [data-section='vertical-tabs']>section>[data-section-content], [data-section='vertical-tabs']>section>.content, [data-section='vertical-tabs']>.section>[data-section-content], [data-section='vertical-tabs']>.section>.content, [data-section='vertical-tabs']>[data-section-region]>[data-section-content], [data-section='vertical-tabs']>[data-section-region]>.content, .section-container.vertical-tabs>section>[data-section-content], .section-container.vertical-tabs>section>.content, .section-container.vertical-tabs>.section>[data-section-content], .section-container.vertical-tabs>.section>.content, .section-container.vertical-tabs>[data-section-region]>[data-section-content], .section-container.vertical-tabs>[data-section-region]>.content { + display: none + } + + [data-section='vertical-tabs']>section.active>[data-section-content], [data-section='vertical-tabs']>section.active>.content, [data-section='vertical-tabs']>.section.active>[data-section-content], [data-section='vertical-tabs']>.section.active>.content, [data-section='vertical-tabs']>[data-section-region].active>[data-section-content], [data-section='vertical-tabs']>[data-section-region].active>.content, .section-container.vertical-tabs>section.active>[data-section-content], .section-container.vertical-tabs>section.active>.content, .section-container.vertical-tabs>.section.active>[data-section-content], .section-container.vertical-tabs>.section.active>.content, .section-container.vertical-tabs>[data-section-region].active>[data-section-content], .section-container.vertical-tabs>[data-section-region].active>.content { + display: block + } + + [data-section='vertical-tabs']>section:not(.active), [data-section='vertical-tabs']>.section:not(.active), [data-section='vertical-tabs']>[data-section-region]:not(.active), .section-container.vertical-tabs>section:not(.active), .section-container.vertical-tabs>.section:not(.active), .section-container.vertical-tabs>[data-section-region]:not(.active) { + padding: 0 !important + } + + [data-section='vertical-tabs']>section>[data-section-title], [data-section='vertical-tabs']>section>.title, [data-section='vertical-tabs']>.section>[data-section-title], [data-section='vertical-tabs']>.section>.title, [data-section='vertical-tabs']>[data-section-region]>[data-section-title], [data-section='vertical-tabs']>[data-section-region]>.title, .section-container.vertical-tabs>section>[data-section-title], .section-container.vertical-tabs>section>.title, .section-container.vertical-tabs>.section>[data-section-title], .section-container.vertical-tabs>.section>.title, .section-container.vertical-tabs>[data-section-region]>[data-section-title], .section-container.vertical-tabs>[data-section-region]>.title { + position: absolute; + top: 0; + left: 0; + width: 12.5em + } + + [data-section='vertical-tabs']>section.active, [data-section='vertical-tabs']>.section.active, [data-section='vertical-tabs']>[data-section-region].active, .section-container.vertical-tabs>section.active, .section-container.vertical-tabs>.section.active, .section-container.vertical-tabs>[data-section-region].active { + padding-left: 12.5em + } + + [data-section='vertical-tabs']>section.active>[data-section-title], [data-section='vertical-tabs']>section.active>.title, [data-section='vertical-tabs']>.section.active>[data-section-title], [data-section='vertical-tabs']>.section.active>.title, [data-section='vertical-tabs']>[data-section-region].active>[data-section-title], [data-section='vertical-tabs']>[data-section-region].active>.title, .section-container.vertical-tabs>section.active>[data-section-title], .section-container.vertical-tabs>section.active>.title, .section-container.vertical-tabs>.section.active>[data-section-title], .section-container.vertical-tabs>.section.active>.title, .section-container.vertical-tabs>[data-section-region].active>[data-section-title], .section-container.vertical-tabs>[data-section-region].active>.title { + width: 12.5em + } + + .section-container.vertical-tabs { + border: none + } + + .section-container.vertical-tabs>section>.title, .section-container.vertical-tabs>.section>.title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #ccc + } + + .section-container.vertical-tabs>section>.title a, .section-container.vertical-tabs>.section>.title a { + padding: 0.9375em; + color: #333; + font-size: 0.875em; + background: none + } + + .section-container.vertical-tabs>section>.title:hover, .section-container.vertical-tabs>.section>.title:hover { + background-color: #e2e2e2 + } + + .section-container.vertical-tabs>section>.content, .section-container.vertical-tabs>.section>.content { + padding: 0.9375em; + background-color: #fff; + border: solid 1px #ccc + } + + .section-container.vertical-tabs>section>.content>*:last-child, .section-container.vertical-tabs>.section>.content>*:last-child { + margin-bottom: 0 + } + + .section-container.vertical-tabs>section>.content>*:first-child, .section-container.vertical-tabs>.section>.content>*:first-child { + padding-top: 0 + } + + .section-container.vertical-tabs>section>.content>*:last-child:not(.flex-video), .section-container.vertical-tabs>.section>.content>*:last-child:not(.flex-video) { + padding-bottom: 0 + } + + .section-container.vertical-tabs>section.active>.title, .section-container.vertical-tabs>.section.active>.title { + background: #d5d5d5 + } + + .section-container.vertical-tabs>section.active>.title a, .section-container.vertical-tabs>.section.active>.title a { + color: #333 + } + + .section-container.vertical-tabs>section:not(.active), .section-container.vertical-tabs>.section:not(.active) { + padding: 0 !important + } + + .section-container.vertical-tabs>section.active, .section-container.vertical-tabs>.section.active { + padding-left: 12.4375em + } + + .section-container.vertical-tabs>section.active>.title, .section-container.vertical-tabs>.section.active>.title { + background-color: #d5d5d5 + } + + [data-section='vertical-nav'], .section-container.vertical-nav { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em + } + + [data-section='vertical-nav']:not([data-section-resized]):not([data-section-small-style]), .section-container.vertical-nav:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden + } + + [data-section='vertical-nav'][data-section-small-style], .section-container.vertical-nav[data-section-small-style] { + width: 100% !important + } + + [data-section='vertical-nav'][data-section-small-style]>[data-section-region], [data-section='vertical-nav'][data-section-small-style]>section, [data-section='vertical-nav'][data-section-small-style]>.section, .section-container.vertical-nav[data-section-small-style]>[data-section-region], .section-container.vertical-nav[data-section-small-style]>section, .section-container.vertical-nav[data-section-small-style]>.section { + padding: 0 !important; + margin: 0 !important + } + + [data-section='vertical-nav'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='vertical-nav'][data-section-small-style]>[data-section-region]>.title, [data-section='vertical-nav'][data-section-small-style]>section>[data-section-title], [data-section='vertical-nav'][data-section-small-style]>section>.title, [data-section='vertical-nav'][data-section-small-style]>.section>[data-section-title], [data-section='vertical-nav'][data-section-small-style]>.section>.title, .section-container.vertical-nav[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.vertical-nav[data-section-small-style]>[data-section-region]>.title, .section-container.vertical-nav[data-section-small-style]>section>[data-section-title], .section-container.vertical-nav[data-section-small-style]>section>.title, .section-container.vertical-nav[data-section-small-style]>.section>[data-section-title], .section-container.vertical-nav[data-section-small-style]>.section>.title { + width: 100% !important + } + + [data-section='vertical-nav']>section, [data-section='vertical-nav']>.section, [data-section='vertical-nav']>[data-section-region], .section-container.vertical-nav>section, .section-container.vertical-nav>.section, .section-container.vertical-nav>[data-section-region] { + position: relative; + display: inline-block + } + + [data-section='vertical-nav']>section>[data-section-title], [data-section='vertical-nav']>section>.title, [data-section='vertical-nav']>.section>[data-section-title], [data-section='vertical-nav']>.section>.title, [data-section='vertical-nav']>[data-section-region]>[data-section-title], [data-section='vertical-nav']>[data-section-region]>.title, .section-container.vertical-nav>section>[data-section-title], .section-container.vertical-nav>section>.title, .section-container.vertical-nav>.section>[data-section-title], .section-container.vertical-nav>.section>.title, .section-container.vertical-nav>[data-section-region]>[data-section-title], .section-container.vertical-nav>[data-section-region]>.title { + margin-bottom: 0 + } + + [data-section='vertical-nav']>section>[data-section-title] a, [data-section='vertical-nav']>section>.title a, [data-section='vertical-nav']>.section>[data-section-title] a, [data-section='vertical-nav']>.section>.title a, [data-section='vertical-nav']>[data-section-region]>[data-section-title] a, [data-section='vertical-nav']>[data-section-region]>.title a, .section-container.vertical-nav>section>[data-section-title] a, .section-container.vertical-nav>section>.title a, .section-container.vertical-nav>.section>[data-section-title] a, .section-container.vertical-nav>.section>.title a, .section-container.vertical-nav>[data-section-region]>[data-section-title] a, .section-container.vertical-nav>[data-section-region]>.title a { + width: 100%; + display: inline-block; + white-space: nowrap + } + + [data-section='vertical-nav']>section>[data-section-content], [data-section='vertical-nav']>section>.content, [data-section='vertical-nav']>.section>[data-section-content], [data-section='vertical-nav']>.section>.content, [data-section='vertical-nav']>[data-section-region]>[data-section-content], [data-section='vertical-nav']>[data-section-region]>.content, .section-container.vertical-nav>section>[data-section-content], .section-container.vertical-nav>section>.content, .section-container.vertical-nav>.section>[data-section-content], .section-container.vertical-nav>.section>.content, .section-container.vertical-nav>[data-section-region]>[data-section-content], .section-container.vertical-nav>[data-section-region]>.content { + display: none + } + + [data-section='vertical-nav']>section.active>[data-section-content], [data-section='vertical-nav']>section.active>.content, [data-section='vertical-nav']>.section.active>[data-section-content], [data-section='vertical-nav']>.section.active>.content, [data-section='vertical-nav']>[data-section-region].active>[data-section-content], [data-section='vertical-nav']>[data-section-region].active>.content, .section-container.vertical-nav>section.active>[data-section-content], .section-container.vertical-nav>section.active>.content, .section-container.vertical-nav>.section.active>[data-section-content], .section-container.vertical-nav>.section.active>.content, .section-container.vertical-nav>[data-section-region].active>[data-section-content], .section-container.vertical-nav>[data-section-region].active>.content { + display: block + } + + [data-section='vertical-nav']>section:not(.active), [data-section='vertical-nav']>.section:not(.active), [data-section='vertical-nav']>[data-section-region]:not(.active), .section-container.vertical-nav>section:not(.active), .section-container.vertical-nav>.section:not(.active), .section-container.vertical-nav>[data-section-region]:not(.active) { + padding: 0 !important + } + + [data-section='vertical-nav']>section>[data-section-title], [data-section='vertical-nav']>section>.title, [data-section='vertical-nav']>.section>[data-section-title], [data-section='vertical-nav']>.section>.title, [data-section='vertical-nav']>[data-section-region]>[data-section-title], [data-section='vertical-nav']>[data-section-region]>.title, .section-container.vertical-nav>section>[data-section-title], .section-container.vertical-nav>section>.title, .section-container.vertical-nav>.section>[data-section-title], .section-container.vertical-nav>.section>.title, .section-container.vertical-nav>[data-section-region]>[data-section-title], .section-container.vertical-nav>[data-section-region]>.title { + position: static; + width: auto + } + + [data-section='vertical-nav']>section>[data-section-title] a, [data-section='vertical-nav']>section>.title a, [data-section='vertical-nav']>.section>[data-section-title] a, [data-section='vertical-nav']>.section>.title a, [data-section='vertical-nav']>[data-section-region]>[data-section-title] a, [data-section='vertical-nav']>[data-section-region]>.title a, .section-container.vertical-nav>section>[data-section-title] a, .section-container.vertical-nav>section>.title a, .section-container.vertical-nav>.section>[data-section-title] a, .section-container.vertical-nav>.section>.title a, .section-container.vertical-nav>[data-section-region]>[data-section-title] a, .section-container.vertical-nav>[data-section-region]>.title a { + display: block + } + + [data-section='vertical-nav']>section>[data-section-content], [data-section='vertical-nav']>section>.content, [data-section='vertical-nav']>.section>[data-section-content], [data-section='vertical-nav']>.section>.content, [data-section='vertical-nav']>[data-section-region]>[data-section-content], [data-section='vertical-nav']>[data-section-region]>.content, .section-container.vertical-nav>section>[data-section-content], .section-container.vertical-nav>section>.content, .section-container.vertical-nav>.section>[data-section-content], .section-container.vertical-nav>.section>.content, .section-container.vertical-nav>[data-section-region]>[data-section-content], .section-container.vertical-nav>[data-section-region]>.content { + position: absolute; + top: 0; + left: 0; + z-index: 999; + min-width: 12.5em + } + + .section-container.vertical-nav { + border: none + } + + .section-container.vertical-nav>section>.title, .section-container.vertical-nav>.section>.title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #ccc + } + + .section-container.vertical-nav>section>.title a, .section-container.vertical-nav>.section>.title a { + padding: 0.9375em; + color: #333; + font-size: 0.875em; + background: none + } + + .section-container.vertical-nav>section>.title:hover, .section-container.vertical-nav>.section>.title:hover { + background-color: #e2e2e2 + } + + .section-container.vertical-nav>section>.content, .section-container.vertical-nav>.section>.content { + padding: 0.9375em; + background-color: #fff; + border: solid 1px #ccc + } + + .section-container.vertical-nav>section>.content>*:last-child, .section-container.vertical-nav>.section>.content>*:last-child { + margin-bottom: 0 + } + + .section-container.vertical-nav>section>.content>*:first-child, .section-container.vertical-nav>.section>.content>*:first-child { + padding-top: 0 + } + + .section-container.vertical-nav>section>.content>*:last-child:not(.flex-video), .section-container.vertical-nav>.section>.content>*:last-child:not(.flex-video) { + padding-bottom: 0 + } + + .section-container.vertical-nav>section.active>.title, .section-container.vertical-nav>.section.active>.title { + background: #d5d5d5 + } + + .section-container.vertical-nav>section.active>.title a, .section-container.vertical-nav>.section.active>.title a { + color: #333 + } + + .section-container.vertical-nav>section:not(.active), .section-container.vertical-nav>.section:not(.active) { + padding: 0 !important + } + + [data-section='horizontal-nav'], .section-container.horizontal-nav { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em + } + + [data-section='horizontal-nav']:not([data-section-resized]):not([data-section-small-style]), .section-container.horizontal-nav:not([data-section-resized]):not([data-section-small-style]) { + visibility: hidden + } + + [data-section='horizontal-nav'][data-section-small-style], .section-container.horizontal-nav[data-section-small-style] { + width: 100% !important + } + + [data-section='horizontal-nav'][data-section-small-style]>[data-section-region], [data-section='horizontal-nav'][data-section-small-style]>section, [data-section='horizontal-nav'][data-section-small-style]>.section, .section-container.horizontal-nav[data-section-small-style]>[data-section-region], .section-container.horizontal-nav[data-section-small-style]>section, .section-container.horizontal-nav[data-section-small-style]>.section { + padding: 0 !important; + margin: 0 !important + } + + [data-section='horizontal-nav'][data-section-small-style]>[data-section-region]>[data-section-title], [data-section='horizontal-nav'][data-section-small-style]>[data-section-region]>.title, [data-section='horizontal-nav'][data-section-small-style]>section>[data-section-title], [data-section='horizontal-nav'][data-section-small-style]>section>.title, [data-section='horizontal-nav'][data-section-small-style]>.section>[data-section-title], [data-section='horizontal-nav'][data-section-small-style]>.section>.title, .section-container.horizontal-nav[data-section-small-style]>[data-section-region]>[data-section-title], .section-container.horizontal-nav[data-section-small-style]>[data-section-region]>.title, .section-container.horizontal-nav[data-section-small-style]>section>[data-section-title], .section-container.horizontal-nav[data-section-small-style]>section>.title, .section-container.horizontal-nav[data-section-small-style]>.section>[data-section-title], .section-container.horizontal-nav[data-section-small-style]>.section>.title { + width: 100% !important + } + + [data-section='horizontal-nav']>section, [data-section='horizontal-nav']>.section, [data-section='horizontal-nav']>[data-section-region], .section-container.horizontal-nav>section, .section-container.horizontal-nav>.section, .section-container.horizontal-nav>[data-section-region] { + position: relative; + float: left + } + + [data-section='horizontal-nav']>section>[data-section-title], [data-section='horizontal-nav']>section>.title, [data-section='horizontal-nav']>.section>[data-section-title], [data-section='horizontal-nav']>.section>.title, [data-section='horizontal-nav']>[data-section-region]>[data-section-title], [data-section='horizontal-nav']>[data-section-region]>.title, .section-container.horizontal-nav>section>[data-section-title], .section-container.horizontal-nav>section>.title, .section-container.horizontal-nav>.section>[data-section-title], .section-container.horizontal-nav>.section>.title, .section-container.horizontal-nav>[data-section-region]>[data-section-title], .section-container.horizontal-nav>[data-section-region]>.title { + margin-bottom: 0 + } + + [data-section='horizontal-nav']>section>[data-section-title] a, [data-section='horizontal-nav']>section>.title a, [data-section='horizontal-nav']>.section>[data-section-title] a, [data-section='horizontal-nav']>.section>.title a, [data-section='horizontal-nav']>[data-section-region]>[data-section-title] a, [data-section='horizontal-nav']>[data-section-region]>.title a, .section-container.horizontal-nav>section>[data-section-title] a, .section-container.horizontal-nav>section>.title a, .section-container.horizontal-nav>.section>[data-section-title] a, .section-container.horizontal-nav>.section>.title a, .section-container.horizontal-nav>[data-section-region]>[data-section-title] a, .section-container.horizontal-nav>[data-section-region]>.title a { + width: 100%; + display: inline-block; + white-space: nowrap + } + + [data-section='horizontal-nav']>section>[data-section-content], [data-section='horizontal-nav']>section>.content, [data-section='horizontal-nav']>.section>[data-section-content], [data-section='horizontal-nav']>.section>.content, [data-section='horizontal-nav']>[data-section-region]>[data-section-content], [data-section='horizontal-nav']>[data-section-region]>.content, .section-container.horizontal-nav>section>[data-section-content], .section-container.horizontal-nav>section>.content, .section-container.horizontal-nav>.section>[data-section-content], .section-container.horizontal-nav>.section>.content, .section-container.horizontal-nav>[data-section-region]>[data-section-content], .section-container.horizontal-nav>[data-section-region]>.content { + display: none + } + + [data-section='horizontal-nav']>section.active>[data-section-content], [data-section='horizontal-nav']>section.active>.content, [data-section='horizontal-nav']>.section.active>[data-section-content], [data-section='horizontal-nav']>.section.active>.content, [data-section='horizontal-nav']>[data-section-region].active>[data-section-content], [data-section='horizontal-nav']>[data-section-region].active>.content, .section-container.horizontal-nav>section.active>[data-section-content], .section-container.horizontal-nav>section.active>.content, .section-container.horizontal-nav>.section.active>[data-section-content], .section-container.horizontal-nav>.section.active>.content, .section-container.horizontal-nav>[data-section-region].active>[data-section-content], .section-container.horizontal-nav>[data-section-region].active>.content { + display: block + } + + [data-section='horizontal-nav']>section:not(.active), [data-section='horizontal-nav']>.section:not(.active), [data-section='horizontal-nav']>[data-section-region]:not(.active), .section-container.horizontal-nav>section:not(.active), .section-container.horizontal-nav>.section:not(.active), .section-container.horizontal-nav>[data-section-region]:not(.active) { + padding: 0 !important + } + + [data-section='horizontal-nav']>section>[data-section-title], [data-section='horizontal-nav']>section>.title, [data-section='horizontal-nav']>.section>[data-section-title], [data-section='horizontal-nav']>.section>.title, [data-section='horizontal-nav']>[data-section-region]>[data-section-title], [data-section='horizontal-nav']>[data-section-region]>.title, .section-container.horizontal-nav>section>[data-section-title], .section-container.horizontal-nav>section>.title, .section-container.horizontal-nav>.section>[data-section-title], .section-container.horizontal-nav>.section>.title, .section-container.horizontal-nav>[data-section-region]>[data-section-title], .section-container.horizontal-nav>[data-section-region]>.title { + position: static; + width: auto + } + + [data-section='horizontal-nav']>section>[data-section-title] a, [data-section='horizontal-nav']>section>.title a, [data-section='horizontal-nav']>.section>[data-section-title] a, [data-section='horizontal-nav']>.section>.title a, [data-section='horizontal-nav']>[data-section-region]>[data-section-title] a, [data-section='horizontal-nav']>[data-section-region]>.title a, .section-container.horizontal-nav>section>[data-section-title] a, .section-container.horizontal-nav>section>.title a, .section-container.horizontal-nav>.section>[data-section-title] a, .section-container.horizontal-nav>.section>.title a, .section-container.horizontal-nav>[data-section-region]>[data-section-title] a, .section-container.horizontal-nav>[data-section-region]>.title a { + display: block + } + + [data-section='horizontal-nav']>section>[data-section-content], [data-section='horizontal-nav']>section>.content, [data-section='horizontal-nav']>.section>[data-section-content], [data-section='horizontal-nav']>.section>.content, [data-section='horizontal-nav']>[data-section-region]>[data-section-content], [data-section='horizontal-nav']>[data-section-region]>.content, .section-container.horizontal-nav>section>[data-section-content], .section-container.horizontal-nav>section>.content, .section-container.horizontal-nav>.section>[data-section-content], .section-container.horizontal-nav>.section>.content, .section-container.horizontal-nav>[data-section-region]>[data-section-content], .section-container.horizontal-nav>[data-section-region]>.content { + width: auto; + position: absolute; + top: 0; + left: 0; + z-index: 999; + min-width: 12.5em + } + + .section-container.horizontal-nav { + background: #efefef; + border: 1px solid #ccc + } + + .section-container.horizontal-nav>section>.title, .section-container.horizontal-nav>.section>.title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #ccc + } + + .section-container.horizontal-nav>section>.title a, .section-container.horizontal-nav>.section>.title a { + padding: 0.9375em; + color: #333; + font-size: 0.875em; + background: none + } + + .section-container.horizontal-nav>section>.title:hover, .section-container.horizontal-nav>.section>.title:hover { + background-color: #e2e2e2 + } + + .section-container.horizontal-nav>section>.content, .section-container.horizontal-nav>.section>.content { + padding: 0.9375em; + background-color: #fff; + border: solid 1px #ccc + } + + .section-container.horizontal-nav>section>.content>*:last-child, .section-container.horizontal-nav>.section>.content>*:last-child { + margin-bottom: 0 + } + + .section-container.horizontal-nav>section>.content>*:first-child, .section-container.horizontal-nav>.section>.content>*:first-child { + padding-top: 0 + } + + .section-container.horizontal-nav>section>.content>*:last-child:not(.flex-video), .section-container.horizontal-nav>.section>.content>*:last-child:not(.flex-video) { + padding-bottom: 0 + } + + .section-container.horizontal-nav>section.active>.title, .section-container.horizontal-nav>.section.active>.title { + background: #d5d5d5 + } + + .section-container.horizontal-nav>section.active>.title a, .section-container.horizontal-nav>.section.active>.title a { + color: #333 + } + + .section-container.horizontal-nav>section:not(.active), .section-container.horizontal-nav>.section:not(.active) { + padding: 0 !important + } +} + +.no-js [data-section], .no-js .section-container { + width: 100%; + position: relative; + display: block; + margin-bottom: 1.25em +} + +.no-js [data-section][data-section-small-style], .no-js .section-container[data-section-small-style] { + width: 100% !important +} + +.no-js [data-section][data-section-small-style]>[data-section-region], .no-js [data-section][data-section-small-style]>section, .no-js [data-section][data-section-small-style]>.section, .no-js .section-container[data-section-small-style]>[data-section-region], .no-js .section-container[data-section-small-style]>section, .no-js .section-container[data-section-small-style]>.section { + padding: 0 !important; + margin: 0 !important +} + +.no-js [data-section][data-section-small-style]>[data-section-region]>[data-section-title], .no-js [data-section][data-section-small-style]>[data-section-region]>.title, .no-js [data-section][data-section-small-style]>section>[data-section-title], .no-js [data-section][data-section-small-style]>section>.title, .no-js [data-section][data-section-small-style]>.section>[data-section-title], .no-js [data-section][data-section-small-style]>.section>.title, .no-js .section-container[data-section-small-style]>[data-section-region]>[data-section-title], .no-js .section-container[data-section-small-style]>[data-section-region]>.title, .no-js .section-container[data-section-small-style]>section>[data-section-title], .no-js .section-container[data-section-small-style]>section>.title, .no-js .section-container[data-section-small-style]>.section>[data-section-title], .no-js .section-container[data-section-small-style]>.section>.title { + width: 100% !important +} + +.no-js [data-section]>section, .no-js [data-section]>.section, .no-js [data-section]>[data-section-region], .no-js .section-container>section, .no-js .section-container>.section, .no-js .section-container>[data-section-region] { + margin: 0 +} + +.no-js [data-section]>section>[data-section-title], .no-js [data-section]>section>.title, .no-js [data-section]>.section>[data-section-title], .no-js [data-section]>.section>.title, .no-js [data-section]>[data-section-region]>[data-section-title], .no-js [data-section]>[data-section-region]>.title, .no-js .section-container>section>[data-section-title], .no-js .section-container>section>.title, .no-js .section-container>.section>[data-section-title], .no-js .section-container>.section>.title, .no-js .section-container>[data-section-region]>[data-section-title], .no-js .section-container>[data-section-region]>.title { + margin-bottom: 0 +} + +.no-js [data-section]>section>[data-section-title] a, .no-js [data-section]>section>.title a, .no-js [data-section]>.section>[data-section-title] a, .no-js [data-section]>.section>.title a, .no-js [data-section]>[data-section-region]>[data-section-title] a, .no-js [data-section]>[data-section-region]>.title a, .no-js .section-container>section>[data-section-title] a, .no-js .section-container>section>.title a, .no-js .section-container>.section>[data-section-title] a, .no-js .section-container>.section>.title a, .no-js .section-container>[data-section-region]>[data-section-title] a, .no-js .section-container>[data-section-region]>.title a { + width: 100%; + display: inline-block; + white-space: nowrap +} + +.no-js [data-section]>section>[data-section-content], .no-js [data-section]>section>.content, .no-js [data-section]>.section>[data-section-content], .no-js [data-section]>.section>.content, .no-js [data-section]>[data-section-region]>[data-section-content], .no-js [data-section]>[data-section-region]>.content, .no-js .section-container>section>[data-section-content], .no-js .section-container>section>.content, .no-js .section-container>.section>[data-section-content], .no-js .section-container>.section>.content, .no-js .section-container>[data-section-region]>[data-section-content], .no-js .section-container>[data-section-region]>.content { + display: none +} + +.no-js [data-section]>section.active>[data-section-content], .no-js [data-section]>section.active>.content, .no-js [data-section]>.section.active>[data-section-content], .no-js [data-section]>.section.active>.content, .no-js [data-section]>[data-section-region].active>[data-section-content], .no-js [data-section]>[data-section-region].active>.content, .no-js .section-container>section.active>[data-section-content], .no-js .section-container>section.active>.content, .no-js .section-container>.section.active>[data-section-content], .no-js .section-container>.section.active>.content, .no-js .section-container>[data-section-region].active>[data-section-content], .no-js .section-container>[data-section-region].active>.content { + display: block +} + +.no-js [data-section]>section:not(.active), .no-js [data-section]>.section:not(.active), .no-js [data-section]>[data-section-region]:not(.active), .no-js .section-container>section:not(.active), .no-js .section-container>.section:not(.active), .no-js .section-container>[data-section-region]:not(.active) { + padding: 0 !important +} + +.no-js [data-section]>section>[data-section-title], .no-js [data-section]>section>.title, .no-js [data-section]>.section>[data-section-title], .no-js [data-section]>.section>.title, .no-js [data-section]>[data-section-region]>[data-section-title], .no-js [data-section]>[data-section-region]>.title, .no-js .section-container>section>[data-section-title], .no-js .section-container>section>.title, .no-js .section-container>.section>[data-section-title], .no-js .section-container>.section>.title, .no-js .section-container>[data-section-region]>[data-section-title], .no-js .section-container>[data-section-region]>.title { + width: 100% +} + +.no-js .section-container { + border-top: 1px solid #ccc +} + +.no-js .section-container>section>.title, .no-js .section-container>.section>.title { + background-color: #efefef; + cursor: pointer; + border: solid 1px #ccc +} + +.no-js .section-container>section>.title a, .no-js .section-container>.section>.title a { + padding: 0.9375em; + color: #333; + font-size: 0.875em; + background: none +} + +.no-js .section-container>section>.title:hover, .no-js .section-container>.section>.title:hover { + background-color: #e2e2e2 +} + +.no-js .section-container>section>.content, .no-js .section-container>.section>.content { + padding: 0.9375em; + background-color: #fff; + border: solid 1px #ccc +} + +.no-js .section-container>section>.content>*:last-child, .no-js .section-container>.section>.content>*:last-child { + margin-bottom: 0 +} + +.no-js .section-container>section>.content>*:first-child, .no-js .section-container>.section>.content>*:first-child { + padding-top: 0 +} + +.no-js .section-container>section>.content>*:last-child:not(.flex-video), .no-js .section-container>.section>.content>*:last-child:not(.flex-video) { + padding-bottom: 0 +} + +.no-js .section-container>section.active>.title, .no-js .section-container>.section.active>.title { + background: #d5d5d5 +} + +.no-js .section-container>section.active>.title a, .no-js .section-container>.section.active>.title a { + color: #333 +} + +.no-js .section-container>section:not(.active), .no-js .section-container>.section:not(.active) { + padding: 0 !important +} + +.no-js .section-container>section>.title, .no-js .section-container>.section>.title { + border-top: none +} + +.contain-to-grid { + width: 100%; + background: #111 +} + +.contain-to-grid .top-bar { + margin-bottom: 1.875em +} + +.fixed { + width: 100%; + left: 0; + position: fixed; + top: 0; + z-index: 99 +} + +.top-bar { + overflow: hidden; + height: 45px; + line-height: 45px; + position: relative; + background: #111; + margin-bottom: 1.875em +} + +.top-bar ul { + margin-bottom: 0; + list-style: none +} + +.top-bar .row { + max-width: none +} + +.top-bar form, .top-bar input { + margin-bottom: 0 +} + +.top-bar input { + height: 2.45em +} + +.top-bar .button { + padding-top: .5em; + padding-bottom: .5em; + margin-bottom: 0 +} + +.top-bar .title-area { + position: relative; + margin: 0 +} + +.top-bar .name { + height: 45px; + margin: 0; + font-size: 16 +} + +.top-bar .name h1 { + line-height: 45px; + font-size: 1.0625em; + margin: 0 +} + +.top-bar .name h1 a { + font-weight: bold; + color: #fff; + width: 50%; + display: block; + padding: 0 15px +} + +.top-bar .toggle-topbar { + position: absolute; + right: 0; + top: 0 +} + +.top-bar .toggle-topbar a { + color: #fff; + text-transform: uppercase; + font-size: 0.8125em; + font-weight: bold; + position: relative; + display: block; + padding: 0 15px; + height: 45px; + line-height: 45px +} + +.top-bar .toggle-topbar.menu-icon { + right: 15px; + top: 50%; + margin-top: -16px; + padding-left: 40px +} + +.top-bar .toggle-topbar.menu-icon a { + text-indent: -48px; + width: 34px; + height: 34px; + line-height: 33px; + padding: 0; + color: #fff +} + +.top-bar .toggle-topbar.menu-icon a span { + position: absolute; + right: 0; + display: block; + width: 16px; + height: 0; + -webkit-box-shadow: 0 10px 0 1px #fff, 0 16px 0 1px #fff, 0 22px 0 1px #fff; + box-shadow: 0 10px 0 1px #fff, 0 16px 0 1px #fff, 0 22px 0 1px #fff +} + +.top-bar.expanded { + height: auto; + background: transparent +} + +.top-bar.expanded .title-area { + background: #111 +} + +.top-bar.expanded .toggle-topbar a { + color: #888 +} + +.top-bar.expanded .toggle-topbar a span { + -webkit-box-shadow: 0 10px 0 1px #888, 0 16px 0 1px #888, 0 22px 0 1px #888; + box-shadow: 0 10px 0 1px #888, 0 16px 0 1px #888, 0 22px 0 1px #888 +} + +.top-bar-section { + left: 0; + position: relative; + width: auto; + -webkit-transition: left 300ms ease-out; + -moz-transition: left 300ms ease-out; + transition: left 300ms ease-out +} + +.top-bar-section ul { + width: 100%; + height: auto; + display: block; + background: #222; + font-size: 16; + margin: 0 +} + +.top-bar-section .divider, .top-bar-section [role="separator"] { + border-bottom: solid 1px #2b2b2b; + border-top: solid 1px #000; + clear: both; + height: 1px; + width: 100% +} + +.top-bar-section ul li>a { + display: block; + width: 100%; + color: #fff; + padding: 12px 0 12px 0; + padding-left: 15px; + font-size: 0.8125em; + font-weight: bold; + background: #222 +} + +.top-bar-section ul li>a.button { + background: #2ba6cb; + font-size: 0.8125em +} + +.top-bar-section ul li>a.button.hover { + background: #2284a1 +} + +.top-bar-section ul li>a.button.secondary { + background: #e9e9e9 +} + +.top-bar-section ul li>a.button.secondary.hover { + background: #d0d0d0 +} + +.top-bar-section ul li>a.button.success { + background: #5da423 +} + +.top-bar-section ul li>a.button.success.hover { + background: #457a1a +} + +.top-bar-section ul li>a.button.alert { + background: #c60f13 +} + +.top-bar-section ul li>a.button.alert.hover { + background: #970b0e +} + +.top-bar-section ul li.hover>a { + background: #090909; + color: #fff +} + +.top-bar-section ul li.active>a { + background: #090909; + color: #fff +} + +.top-bar-section .has-form { + padding: 15px +} + +.top-bar-section .has-dropdown { + position: relative +} + +.top-bar-section .has-dropdown>a:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: transparent transparent transparent rgba(255, 255, 255, 0.5); + border-left-style: solid; + margin-right: 15px; + margin-top: -4.5px; + position: absolute; + top: 50%; + right: 0 +} + +.top-bar-section .has-dropdown.moved { + position: static +} + +.top-bar-section .has-dropdown.moved>.dropdown { + visibility: visible +} + +.top-bar-section .dropdown { + position: absolute; + left: 100%; + top: 0; + visibility: hidden; + z-index: 99 +} + +.top-bar-section .dropdown li { + width: 100%; + height: auto +} + +.top-bar-section .dropdown li a { + font-weight: normal; + padding: 8px 15px +} + +.top-bar-section .dropdown li a.parent-link { + font-weight: bold +} + +.top-bar-section .dropdown li.title h5 { + margin-bottom: 0 +} + +.top-bar-section .dropdown li.title h5 a { + color: #fff; + line-height: 22.5px; + display: block +} + +.top-bar-section .dropdown label { + padding: 8px 15px 2px; + margin-bottom: 0; + text-transform: uppercase; + color: #555; + font-weight: bold; + font-size: 0.625em +} + +.top-bar-js-breakpoint { + width: 58.75em !important; + visibility: hidden +} + +.js-generated { + display: block +} + +@media only screen and (min-width: 58.75em) { + .top-bar { + background: #111; + *zoom: 1; + overflow: visible + } + + .top-bar:before, .top-bar:after { + content: " "; + display: table + } + + .top-bar:after { + clear: both + } + + .top-bar .toggle-topbar { + display: none + } + + .top-bar .title-area { + float: left + } + + .top-bar .name h1 a { + width: auto + } + + .top-bar input, .top-bar .button { + line-height: 2em; + font-size: 0.875em; + height: 2em; + padding: 0 10px; + position: relative; + top: 8px + } + + .top-bar.expanded { + background: #111 + } + + .contain-to-grid .top-bar { + max-width: 62.5em; + margin: 0 auto; + margin-bottom: 1.875em + } + + .top-bar-section { + -webkit-transition: none 0 0; + -moz-transition: none 0 0; + transition: none 0 0; + left: 0 !important + } + + .top-bar-section ul { + width: auto; + height: auto !important; + display: inline + } + + .top-bar-section ul li { + float: left + } + + .top-bar-section ul li .js-generated { + display: none + } + + .top-bar-section li a:not(.button) { + padding: 0 15px; + line-height: 45px; + background: #111 + } + + .top-bar-section li a:not(.button).hover { + background: #000 + } + + .top-bar-section .has-dropdown>a { + padding-right: 35px !important + } + + .top-bar-section .has-dropdown>a:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: rgba(255, 255, 255, 0.5) transparent transparent transparent; + border-top-style: solid; + margin-top: -2.5px; + top: 22.5px + } + + .top-bar-section .has-dropdown.moved { + position: relative + } + + .top-bar-section .has-dropdown.moved>.dropdown { + visibility: hidden + } + + .top-bar-section .has-dropdown.hover>.dropdown, .top-bar-section .has-dropdown.not-click:hover>.dropdown { + visibility: visible + } + + .top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after { + border: none; + content: "\00bb"; + margin-top: -16px; + right: 5px + } + + .top-bar-section .dropdown { + left: 0; + top: auto; + background: transparent; + min-width: 100% + } + + .top-bar-section .dropdown li a { + color: #fff; + line-height: 1; + white-space: nowrap; + padding: 7px 15px; + background: #1e1e1e + } + + .top-bar-section .dropdown li label { + white-space: nowrap; + background: #1e1e1e + } + + .top-bar-section .dropdown li .dropdown { + left: 100%; + top: 0 + } + + .top-bar-section>ul>.divider, .top-bar-section>ul>[role="separator"] { + border-bottom: none; + border-top: none; + border-right: solid 1px #2b2b2b; + border-left: solid 1px #000; + clear: none; + height: 45px; + width: 0px + } + + .top-bar-section .has-form { + background: #111; + padding: 0 15px; + height: 45px + } + + .top-bar-section ul.right li .dropdown { + left: auto; + right: 0 + } + + .top-bar-section ul.right li .dropdown li .dropdown { + right: 100% + } + + .no-js .top-bar-section ul li:hover>a { + background: #090909; + color: #fff + } + + .no-js .top-bar-section ul li:active>a { + background: #090909; + color: #fff + } + + .no-js .top-bar-section .has-dropdown:hover>.dropdown { + visibility: visible + } +} + +@-webkit-keyframes rotate { + from { + -webkit-transform: rotate(0deg) + } + to { + -webkit-transform: rotate(360deg) + } +} + +@-moz-keyframes rotate { + from { + -webkit-transform: rotate(0deg) + } + to { + -webkit-transform: rotate(360deg) + } +} + +@-o-keyframes rotate { + from { + -webkit-transform: rotate(0deg) + } + to { + -webkit-transform: rotate(360deg) + } +} + +@keyframes rotate { + from { + -webkit-transform: rotate(0deg) + } + to { + -webkit-transform: rotate(360deg) + } +} + +.slideshow-wrapper { + position: relative +} + +.slideshow-wrapper ul { + list-style-type: none; + margin: 0 +} + +.slideshow-wrapper ul li, .slideshow-wrapper ul li .orbit-caption { + display: none +} + +.slideshow-wrapper ul li:first-child { + display: block +} + +.slideshow-wrapper .orbit-container { + background-color: transparent +} + +.slideshow-wrapper .orbit-container li { + display: block +} + +.slideshow-wrapper .orbit-container li .orbit-caption { + display: block +} + +.preloader { + display: block; + width: 40px; + height: 40px; + position: absolute; + top: 50%; + left: 50%; + margin-top: -20px; + margin-left: -20px; + border: solid 3px; + border-color: #555 #fff; + -webkit-border-radius: 1000px; + border-radius: 1000px; + -webkit-animation-name: rotate; + -webkit-animation-duration: 1.5s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + -moz-animation-name: rotate; + -moz-animation-duration: 1.5s; + -moz-animation-iteration-count: infinite; + -moz-animation-timing-function: linear; + -o-animation-name: rotate; + -o-animation-duration: 1.5s; + -o-animation-iteration-count: infinite; + -o-animation-timing-function: linear; + animation-name: rotate; + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-timing-function: linear +} + +.orbit-container { + overflow: hidden; + width: 100%; + position: relative; + background: #f5f5f5 +} + +.orbit-container .orbit-slides-container { + list-style: none; + margin: 0; + padding: 0; + position: relative +} + +.orbit-container .orbit-slides-container img { + display: block; + max-width: 100% +} + +.orbit-container .orbit-slides-container>* { + position: absolute; + top: 0; + width: 100%; + margin-left: 100% +} + +.orbit-container .orbit-slides-container>*:first-child { + margin-left: 0% +} + +.orbit-container .orbit-slides-container>* .orbit-caption { + position: absolute; + bottom: 0; + background-color: #000; + background-color: rgba(0, 0, 0, 0.6); + color: #fff; + width: 100%; + padding: 10px 14px; + font-size: 0.875em +} + +.orbit-container .orbit-slide-number { + position: absolute; + top: 10px; + left: 10px; + font-size: 12px; + color: #fff; + background: rgba(0, 0, 0, 0); + z-index: 10 +} + +.orbit-container .orbit-slide-number span { + font-weight: 700; + padding: 0.3125em +} + +.orbit-container .orbit-timer { + position: absolute; + top: 10px; + right: 10px; + height: 6px; + width: 100px; + z-index: 10 +} + +.orbit-container .orbit-timer .orbit-progress { + height: 100%; + background-color: #000; + background-color: rgba(0, 0, 0, 0.6); + display: block; + width: 0% +} + +.orbit-container .orbit-timer>span { + display: none; + position: absolute; + top: 10px; + right: 0px; + width: 11px; + height: 14px; + border: solid 4px #000; + border-top: none; + border-bottom: none +} + +.orbit-container .orbit-timer.paused>span { + right: -6px; + top: 9px; + width: 11px; + height: 14px; + border: inset 8px; + border-right-style: solid; + border-color: transparent transparent transparent #000 +} + +.orbit-container:hover .orbit-timer>span { + display: block +} + +.orbit-container .orbit-prev, .orbit-container .orbit-next { + position: absolute; + top: 50%; + margin-top: -25px; + background-color: #000; + background-color: rgba(0, 0, 0, 0.6); + width: 50px; + height: 60px; + line-height: 50px; + color: white; + text-indent: -9999px !important; + z-index: 10 +} + +.orbit-container .orbit-prev>span, .orbit-container .orbit-next>span { + position: absolute; + top: 50%; + margin-top: -16px; + display: block; + width: 0; + height: 0; + border: inset 16px +} + +.orbit-container .orbit-prev { + left: 0 +} + +.orbit-container .orbit-prev>span { + border-right-style: solid; + border-color: transparent; + border-right-color: #fff +} + +.orbit-container .orbit-prev:hover>span { + border-right-color: #ccc +} + +.orbit-container .orbit-next { + right: 0 +} + +.orbit-container .orbit-next>span { + border-color: transparent; + border-left-style: solid; + border-left-color: #fff; + left: 50%; + margin-left: -8px +} + +.orbit-container .orbit-next:hover>span { + border-left-color: #ccc +} + +.orbit-bullets { + margin: 0 auto 30px auto; + overflow: hidden; + position: relative; + top: 10px +} + +.orbit-bullets li { + display: block; + width: 10px; + height: 10px; + background: #999; + float: left; + margin-right: 6px; + border: solid 1px #555; + -webkit-border-radius: 1000px; + border-radius: 1000px +} + +.orbit-bullets li.active { + background: #555 +} + +.orbit-bullets li:last-child { + margin-right: 0 +} + +.touch .orbit-container .orbit-prev, .touch .orbit-container .orbit-next { + display: none +} + +.touch .orbit-bullets { + display: none +} + +@media only screen and (min-width: 768px) { + .touch .orbit-container .orbit-prev, .touch .orbit-container .orbit-next { + display: inherit + } + + .touch .orbit-bullets { + display: block + } +} + +@media only screen and (max-width: 768px) { + .orbit-stack-on-small .orbit-slides-container { + height: auto !important + } + + .orbit-stack-on-small .orbit-slides-container>* { + position: relative; + margin-left: 0% !important + } + + .orbit-stack-on-small .orbit-timer, .orbit-stack-on-small .orbit-next, .orbit-stack-on-small .orbit-prev, .orbit-stack-on-small .orbit-bullets { + display: none + } +} + +.reveal-modal-bg { + position: fixed; + height: 100%; + width: 100%; + background: #000; + background: rgba(0, 0, 0, 0.45); + z-index: 98; + display: none; + top: 0; + left: 0 +} + +.reveal-modal { + visibility: hidden; + display: none; + position: absolute; + left: 50%; + z-index: 99; + height: auto; + margin-left: -40%; + width: 80%; + background-color: #fff; + padding: 1.25em; + border: solid 1px #666; + -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.4); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.4); + top: 50px +} + +.reveal-modal .column, .reveal-modal .columns { + min-width: 0 +} + +.reveal-modal>:first-child { + margin-top: 0 +} + +.reveal-modal>:last-child { + margin-bottom: 0 +} + +.reveal-modal .close-reveal-modal { + font-size: 1.375em; + line-height: 1; + position: absolute; + top: 0.5em; + right: 0.6875em; + color: #aaa; + font-weight: bold; + cursor: pointer +} + +@media only screen and (min-width: 768px) { + .reveal-modal { + padding: 1.875em; + top: 6.25em + } + + .reveal-modal.tiny { + margin-left: -15%; + width: 30% + } + + .reveal-modal.small { + margin-left: -20%; + width: 40% + } + + .reveal-modal.medium { + margin-left: -30%; + width: 60% + } + + .reveal-modal.large { + margin-left: -35%; + width: 70% + } + + .reveal-modal.xlarge { + margin-left: -47.5%; + width: 95% + } +} + +@media print { + .reveal-modal { + background: #fff !important + } +} + +.joyride-list { + display: none +} + +.joyride-tip-guide { + display: none; + position: absolute; + background: #000; + color: #fff; + z-index: 101; + top: 0; + left: 2.5%; + font-family: inherit; + font-weight: normal; + width: 95% +} + +.lt-ie9 .joyride-tip-guide { + max-width: 800px; + left: 50%; + margin-left: -400px +} + +.joyride-content-wrapper { + width: 100%; + padding: 1.125em 1.25em 1.5em +} + +.joyride-content-wrapper .button { + margin-bottom: 0 !important +} + +.joyride-tip-guide .joyride-nub { + display: block; + position: absolute; + left: 22px; + width: 0; + height: 0; + border: inset 14px +} + +.joyride-tip-guide .joyride-nub.top { + border-top-style: solid; + border-color: #000; + border-top-color: transparent !important; + border-left-color: transparent !important; + border-right-color: transparent !important; + top: -28px +} + +.joyride-tip-guide .joyride-nub.bottom { + border-bottom-style: solid; + border-color: #000 !important; + border-bottom-color: transparent !important; + border-left-color: transparent !important; + border-right-color: transparent !important; + bottom: -28px +} + +.joyride-tip-guide .joyride-nub.right { + right: -28px +} + +.joyride-tip-guide .joyride-nub.left { + left: -28px +} + +.joyride-tip-guide h1, .joyride-tip-guide h2, .joyride-tip-guide h3, .joyride-tip-guide h4, .joyride-tip-guide h5, .joyride-tip-guide h6 { + line-height: 1.25; + margin: 0; + font-weight: bold; + color: #fff +} + +.joyride-tip-guide p { + margin: 0 0 1.125em 0; + font-size: 0.875em; + line-height: 1.3 +} + +.joyride-timer-indicator-wrap { + width: 50px; + height: 3px; + border: solid 1px #555; + position: absolute; + right: 1.0625em; + bottom: 1em +} + +.joyride-timer-indicator { + display: block; + width: 0; + height: inherit; + background: #666 +} + +.joyride-close-tip { + position: absolute; + right: 12px; + top: 10px; + color: #777 !important; + text-decoration: none; + font-size: 30px; + font-weight: normal; + line-height: 0.5 !important +} + +.joyride-close-tip:hover, .joyride-close-tip:focus { + color: #eee !important +} + +.joyride-modal-bg { + position: fixed; + height: 100%; + width: 100%; + background: transparent; + background: rgba(0, 0, 0, 0.5); + z-index: 100; + display: none; + top: 0; + left: 0; + cursor: pointer +} + +.joyride-expose-wrapper { + background-color: #ffffff; + position: absolute; + border-radius: 3px; + z-index: 102; + -moz-box-shadow: 0px 0px 30px #fff; + -webkit-box-shadow: 0px 0px 15px #fff; + box-shadow: 0px 0px 15px #fff +} + +.joyride-expose-cover { + background: transparent; + border-radius: 3px; + position: absolute; + z-index: 9999; + top: 0px; + left: 0px +} + +@media only screen and (min-width: 768px) { + .joyride-tip-guide { + width: 300px; + left: inherit + } + + .joyride-tip-guide .joyride-nub.bottom { + border-color: #000 !important; + border-bottom-color: transparent !important; + border-left-color: transparent !important; + border-right-color: transparent !important; + bottom: -28px + } + + .joyride-tip-guide .joyride-nub.right { + border-color: #000 !important; + border-top-color: transparent !important; + border-right-color: transparent !important; + border-bottom-color: transparent !important; + top: 22px; + left: auto; + right: -28px + } + + .joyride-tip-guide .joyride-nub.left { + border-color: #000 !important; + border-top-color: transparent !important; + border-left-color: transparent !important; + border-bottom-color: transparent !important; + top: 22px; + left: -28px; + right: auto + } +} + +[data-clearing] { + *zoom: 1; + margin-bottom: 0; + margin-left: 0; + list-style: none +} + +[data-clearing]:before, [data-clearing]:after { + content: " "; + display: table +} + +[data-clearing]:after { + clear: both +} + +[data-clearing] li { + float: left; + margin-right: 10px +} + +.clearing-blackout { + background: #111; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 998 +} + +.clearing-blackout .clearing-close { + display: block +} + +.clearing-container { + position: relative; + z-index: 998; + height: 100%; + overflow: hidden; + margin: 0 +} + +.visible-img { + height: 95%; + position: relative +} + +.visible-img img { + position: absolute; + left: 50%; + top: 50%; + margin-left: -50%; + max-height: 100%; + max-width: 100% +} + +.clearing-caption { + color: #fff; + line-height: 1.3; + margin-bottom: 0; + text-align: center; + bottom: 0; + background: #111; + width: 100%; + padding: 10px 30px; + position: absolute; + left: 0 +} + +.clearing-close { + z-index: 999; + padding-left: 20px; + padding-top: 10px; + font-size: 40px; + line-height: 1; + color: #fff; + display: none +} + +.clearing-close:hover, .clearing-close:focus { + color: #ccc +} + +.clearing-assembled .clearing-container { + height: 100% +} + +.clearing-assembled .clearing-container .carousel>ul { + display: none +} + +.clearing-feature li { + display: none +} + +.clearing-feature li.clearing-featured-img { + display: block +} + +@media only screen and (min-width: 768px) { + .clearing-main-prev, .clearing-main-next { + position: absolute; + height: 100%; + width: 40px; + top: 0 + } + + .clearing-main-prev>span, .clearing-main-next>span { + position: absolute; + top: 50%; + display: block; + width: 0; + height: 0; + border: solid 16px + } + + .clearing-main-prev { + left: 0 + } + + .clearing-main-prev>span { + left: 5px; + border-color: transparent; + border-right-color: #fff + } + + .clearing-main-next { + right: 0 + } + + .clearing-main-next>span { + border-color: transparent; + border-left-color: #fff + } + + .clearing-main-prev.disabled, .clearing-main-next.disabled { + opacity: 0.5 + } + + .clearing-assembled .clearing-container .carousel { + background: #111; + height: 150px; + margin-top: 5px + } + + .clearing-assembled .clearing-container .carousel>ul { + display: block; + z-index: 999; + width: 200%; + height: 100%; + margin-left: 0; + position: relative; + left: 0 + } + + .clearing-assembled .clearing-container .carousel>ul li { + display: block; + width: 175px; + height: inherit; + padding: 0; + float: left; + overflow: hidden; + margin-right: 1px; + position: relative; + cursor: pointer; + opacity: 0.4 + } + + .clearing-assembled .clearing-container .carousel>ul li.fix-height img { + min-height: 100%; + height: 100%; + max-width: none + } + + .clearing-assembled .clearing-container .carousel>ul li a.th { + border: none; + -webkit-box-shadow: none; + box-shadow: none; + display: block + } + + .clearing-assembled .clearing-container .carousel>ul li img { + cursor: pointer !important; + min-width: 100% !important + } + + .clearing-assembled .clearing-container .carousel>ul li.visible { + opacity: 1 + } + + .clearing-assembled .clearing-container .visible-img { + background: #111; + overflow: hidden; + height: 75% + } + + .clearing-close { + position: absolute; + top: 10px; + right: 20px; + padding-left: 0; + padding-top: 0 + } +} + +.alert-box { + border-style: solid; + border-width: 1px; + display: block; + font-weight: bold; + margin-bottom: 1.25em; + position: relative; + padding: 0.6875em 1.3125em 0.75em 0.6875em; + font-size: 0.875em; + background-color: #2ba6cb; + border-color: #2284a1; + color: #fff +} + +.alert-box .close { + font-size: 1.375em; + padding: 5px 4px 4px; + line-height: 0; + position: absolute; + top: 0.4375em; + right: 0.3125em; + color: #333; + opacity: 0.3 +} + +.alert-box .close:hover, .alert-box .close:focus { + opacity: 0.5 +} + +.alert-box.radius { + -webkit-border-radius: 3px; + border-radius: 3px +} + +.alert-box.round { + -webkit-border-radius: 1000px; + border-radius: 1000px +} + +.alert-box.success { + background-color: #5da423; + border-color: #457a1a; + color: #fff +} + +.alert-box.alert { + background-color: #c60f13; + border-color: #970b0e; + color: #fff +} + +.alert-box.secondary { + background-color: #e9e9e9; + border-color: #d0d0d0; + color: #505050 +} + +.breadcrumbs { + display: block; + padding: 0.5625em 0.875em 0.5625em; + overflow: hidden; + margin-left: 0; + list-style: none; + border-style: solid; + border-width: 1px; + background-color: #f6f6f6; + border-color: #dcdcdc; + -webkit-border-radius: 3px; + border-radius: 3px +} + +.breadcrumbs>* { + margin: 0; + float: left; + font-size: 0.6875em; + text-transform: uppercase +} + +.breadcrumbs>*:hover a, .breadcrumbs>*:focus a { + text-decoration: underline +} + +.breadcrumbs>* a, .breadcrumbs>* span { + text-transform: uppercase; + color: #2ba6cb +} + +.breadcrumbs>*.current { + cursor: default; + color: #333 +} + +.breadcrumbs>*.current a { + cursor: default; + color: #333 +} + +.breadcrumbs>*.current:hover, .breadcrumbs>*.current:hover a, .breadcrumbs>*.current:focus, .breadcrumbs>*.current:focus a { + text-decoration: none +} + +.breadcrumbs>*.unavailable { + color: #999 +} + +.breadcrumbs>*.unavailable a { + color: #999 +} + +.breadcrumbs>*.unavailable:hover, .breadcrumbs>*.unavailable:hover a, .breadcrumbs>*.unavailable:focus, .breadcrumbs>*.unavailable a:focus { + text-decoration: none; + color: #999; + cursor: default +} + +.breadcrumbs>*:before { + content: "/"; + color: #aaa; + margin: 0 0.75em; + position: relative; + top: 1px +} + +.breadcrumbs>*:first-child:before { + content: " "; + margin: 0 +} + +form.custom .hidden-field { + margin-left: -99999px; + position: absolute; + visibility: hidden +} + +form.custom .custom { + display: inline-block; + width: 16px; + height: 16px; + position: relative; + top: -1px; + vertical-align: middle; + border: solid 1px #ccc; + background: #fff +} + +form.custom .custom.checkbox { + -webkit-border-radius: 0px; + border-radius: 0px; + padding: -1px +} + +form.custom .custom.radio { + -webkit-border-radius: 1000px; + border-radius: 1000px; + padding: 3px +} + +form.custom .custom.checkbox:before { + content: ""; + display: block; + font-size: 16px; + color: #fff +} + +form.custom .custom.radio.checked:before { + content: ""; + display: block; + width: 8px; + height: 8px; + -webkit-border-radius: 1000px; + border-radius: 1000px; + background: #222; + position: relative +} + +form.custom .custom.checkbox.checked:before { + content: "\00d7"; + color: #222; + position: absolute; + top: -50%; + left: 50%; + margin-top: 4px; + margin-left: -5px +} + +form.custom .custom.dropdown { + display: block; + position: relative; + top: 0; + height: 2.3125em; + margin-bottom: 1.25em; + margin-top: 0px; + padding: 0px; + width: 100%; + background: #fff; + background: -moz-linear-gradient(top, #fff 0%, #f3f3f3 100%); + background: -webkit-linear-gradient(top, #fff 0%, #f3f3f3 100%); + -webkit-box-shadow: none; + background: linear-gradient(to bottom, #fff 0%, #f3f3f3 100%); + box-shadow: none; + font-size: 0.875em; + vertical-align: top +} + +form.custom .custom.dropdown ul { + overflow-y: auto; + max-height: 200px +} + +form.custom .custom.dropdown .current { + cursor: default; + white-space: nowrap; + line-height: 2.25em; + color: rgba(0, 0, 0, 0.75); + text-decoration: none; + overflow: hidden; + display: block; + margin-left: 0.5em; + margin-right: 2.3125em +} + +form.custom .custom.dropdown .selector { + cursor: default; + position: absolute; + width: 2.5em; + height: 2.3125em; + display: block; + right: 0; + top: 0 +} + +form.custom .custom.dropdown .selector:after { + content: ""; + display: block; + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: #aaa transparent transparent transparent; + border-top-style: solid; + position: absolute; + left: 0.9375em; + top: 50%; + margin-top: -3px +} + +form.custom .custom.dropdown:hover a.selector:after, form.custom .custom.dropdown.open a.selector:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 5px; + border-color: #222 transparent transparent transparent; + border-top-style: solid +} + +form.custom .custom.dropdown .disabled { + color: #888 +} + +form.custom .custom.dropdown .disabled:hover { + background: transparent; + color: #888 +} + +form.custom .custom.dropdown .disabled:hover:after { + display: none +} + +form.custom .custom.dropdown.open ul { + display: block; + z-index: 10; + min-width: 100%; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box +} + +form.custom .custom.dropdown.small { + max-width: 134px +} + +form.custom .custom.dropdown.medium { + max-width: 254px +} + +form.custom .custom.dropdown.large { + max-width: 434px +} + +form.custom .custom.dropdown.expand { + width: 100% !important +} + +form.custom .custom.dropdown.open.small ul { + min-width: 134px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +form.custom .custom.dropdown.open.medium ul { + min-width: 254px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +form.custom .custom.dropdown.open.large ul { + min-width: 434px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +form.custom .error .custom.dropdown { + border-color: #c60f13; + background-color: rgba(198, 15, 19, 0.1); + background: rgba(198, 15, 19, 0.1); + margin-bottom: 0 +} + +form.custom .error .custom.dropdown:focus { + background: #fafafa; + border-color: #999 +} + +form.custom .error .custom.dropdown+small.error { + margin-top: 0 +} + +form.custom .custom.dropdown ul { + position: absolute; + width: auto; + display: none; + margin: 0; + left: -1px; + top: auto; + -webkit-box-shadow: 0 2px 2px 0px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 2px 0px rgba(0, 0, 0, 0.1); + margin: 0; + padding: 0; + background: #fff; + border: solid 1px #ccc; + font-size: 16 +} + +form.custom .custom.dropdown ul li { + color: #555; + font-size: 0.875em; + cursor: default; + padding-top: 0.25em; + padding-bottom: 0.25em; + padding-left: 0.375em; + padding-right: 2.375em; + min-height: 1.5em; + line-height: 1.5em; + margin: 0; + white-space: nowrap; + list-style: none +} + +form.custom .custom.dropdown ul li.selected { + background: #eee; + color: #000 +} + +form.custom .custom.dropdown ul li:hover { + background-color: #e4e4e4; + color: #000 +} + +form.custom .custom.dropdown ul li.selected:hover { + background: #eee; + cursor: default; + color: #000 +} + +form.custom .custom.dropdown ul.show { + display: block +} + +form.custom .custom.disabled { + background: #ddd +} + +.keystroke, kbd { + background-color: #ededed; + border-color: #dbdbdb; + color: #222; + border-style: solid; + border-width: 1px; + margin: 0; + font-family: "Consolas", "Menlo", "Courier", monospace; + font-size: 0.875em; + padding: 0.125em 0.25em 0; + -webkit-border-radius: 3px; + border-radius: 3px +} + +.label { + font-weight: bold; + text-align: center; + text-decoration: none; + line-height: 1; + white-space: nowrap; + display: inline-block; + position: relative; + padding: 0.1875em 0.625em 0.25em; + font-size: 0.875em; + background-color: #2ba6cb; + color: #fff +} + +.label.radius { + -webkit-border-radius: 3px; + border-radius: 3px +} + +.label.round { + -webkit-border-radius: 1000px; + border-radius: 1000px +} + +.label.alert { + background-color: #c60f13; + color: #fff +} + +.label.success { + background-color: #5da423; + color: #fff +} + +.label.secondary { + background-color: #e9e9e9; + color: #333 +} + +.inline-list { + margin: 0 auto 1.0625em auto; + margin-left: -1.375em; + margin-right: 0; + padding: 0; + list-style: none; + overflow: hidden +} + +.inline-list>li { + list-style: none; + float: left; + margin-left: 1.375em; + display: block +} + +.inline-list>li>* { + display: block +} + +ul.pagination { + display: block; + height: 1.5em; + margin-left: -0.3125em +} + +ul.pagination li { + height: 1.5em; + color: #222; + font-size: 0.875em; + margin-left: 0.3125em +} + +ul.pagination li a { + display: block; + padding: 0.0625em 0.4375em 0.0625em; + color: #999 +} + +ul.pagination li:hover a, ul.pagination li a:focus { + background: #e6e6e6 +} + +ul.pagination li.unavailable a { + cursor: default; + color: #999 +} + +ul.pagination li.unavailable:hover a, ul.pagination li.unavailable a:focus { + background: transparent +} + +ul.pagination li.current a { + background: #2ba6cb; + color: #fff; + font-weight: bold; + cursor: default +} + +ul.pagination li.current a:hover, ul.pagination li.current a:focus { + background: #2ba6cb +} + +ul.pagination li { + float: left; + display: block +} + +.pagination-centered { + text-align: center +} + +.pagination-centered ul.pagination li { + float: none; + display: inline-block +} + +.panel { + border-style: solid; + border-width: 1px; + border-color: #d9d9d9; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f2f2f2 +} + +.panel>:first-child { + margin-top: 0 +} + +.panel>:last-child { + margin-bottom: 0 +} + +.panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6, .panel p { + color: #333 +} + +.panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6 { + line-height: 1; + margin-bottom: 0.625em +} + +.panel h1.subheader, .panel h2.subheader, .panel h3.subheader, .panel h4.subheader, .panel h5.subheader, .panel h6.subheader { + line-height: 1.4 +} + +.panel.callout { + border-style: solid; + border-width: 1px; + border-color: #2284a1; + margin-bottom: 1.25em; + padding: 1.25em; + background: #2ba6cb; + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset +} + +.panel.callout>:first-child { + margin-top: 0 +} + +.panel.callout>:last-child { + margin-bottom: 0 +} + +.panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6, .panel.callout p { + color: #fff +} + +.panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6 { + line-height: 1; + margin-bottom: 0.625em +} + +.panel.callout h1.subheader, .panel.callout h2.subheader, .panel.callout h3.subheader, .panel.callout h4.subheader, .panel.callout h5.subheader, .panel.callout h6.subheader { + line-height: 1.4 +} + +.panel.radius { + -webkit-border-radius: 3px; + border-radius: 3px +} + +.pricing-table { + border: solid 1px #ddd; + margin-left: 0; + margin-bottom: 1.25em +} + +.pricing-table * { + list-style: none; + line-height: 1 +} + +.pricing-table .title { + background-color: #ddd; + padding: 0.9375em 1.25em; + text-align: center; + color: #333; + font-weight: bold; + font-size: 1em +} + +.pricing-table .price { + background-color: #eee; + padding: 0.9375em 1.25em; + text-align: center; + color: #333; + font-weight: normal; + font-size: 1.25em +} + +.pricing-table .description { + background-color: #fff; + padding: 0.9375em; + text-align: center; + color: #777; + font-size: 0.75em; + font-weight: normal; + line-height: 1.4; + border-bottom: dotted 1px #ddd +} + +.pricing-table .bullet-item { + background-color: #fff; + padding: 0.9375em; + text-align: center; + color: #333; + font-size: 0.875em; + font-weight: normal; + border-bottom: dotted 1px #ddd +} + +.pricing-table .cta-button { + background-color: #f5f5f5; + text-align: center; + padding: 1.25em 1.25em 0 +} + +.progress { + background-color: transparent; + height: 1.5625em; + border: 1px solid #ccc; + padding: 0.125em; + margin-bottom: 0.625em +} + +.progress .meter { + background: #2ba6cb; + height: 100%; + display: block +} + +.progress.secondary .meter { + background: #e9e9e9; + height: 100%; + display: block +} + +.progress.success .meter { + background: #5da423; + height: 100%; + display: block +} + +.progress.alert .meter { + background: #c60f13; + height: 100%; + display: block +} + +.progress.radius { + -webkit-border-radius: 3px; + border-radius: 3px +} + +.progress.radius .meter { + -webkit-border-radius: 2px; + border-radius: 2px +} + +.progress.round { + -webkit-border-radius: 1000px; + border-radius: 1000px +} + +.progress.round .meter { + -webkit-border-radius: 999px; + border-radius: 999px +} + +.side-nav { + display: block; + margin: 0; + padding: 0.875em 0; + list-style-type: none; + list-style-position: inside +} + +.side-nav li { + margin: 0 0 0.4375em 0; + font-size: 0.875em +} + +.side-nav li a { + display: block; + color: #2ba6cb +} + +.side-nav li.active>a:first-child { + color: #4d4d4d; + font-weight: bold +} + +.side-nav li.divider { + border-top: 1px solid; + height: 0; + padding: 0; + list-style: none; + border-top-color: #e6e6e6 +} + +.sub-nav { + display: block; + width: auto; + overflow: hidden; + margin: -0.25em 0 1.125em; + padding-top: 0.25em; + margin-right: 0; + margin-left: -0.5625em +} + +.sub-nav dt, .sub-nav dd { + float: left; + display: inline; + margin-left: 0.5625em; + margin-bottom: 0.625em; + font-weight: normal; + font-size: 0.875em +} + +.sub-nav dt a, .sub-nav dd a { + color: #999; + text-decoration: none +} + +.sub-nav dt.active a, .sub-nav dd.active a { + -webkit-border-radius: 1000px; + border-radius: 1000px; + font-weight: bold; + background: #2ba6cb; + padding: 0.1875em 0.5625em; + cursor: default; + color: #fff +} + +@media only screen { + div.switch { + position: relative; + width: 100%; + padding: 0; + display: block; + overflow: hidden; + border-style: solid; + border-width: 1px; + margin-bottom: 1.25em; + -webkit-animation: webkitSiblingBugfix infinite 1s; + height: 36px; + background: #fff; + border-color: #ccc + } + + div.switch label { + position: relative; + left: 0; + z-index: 2; + float: left; + width: 50%; + height: 100%; + margin: 0; + font-weight: bold; + text-align: left; + -webkit-transition: all 0.1s ease-out; + -moz-transition: all 0.1s ease-out; + transition: all 0.1s ease-out + } + + div.switch input { + position: absolute; + z-index: 3; + opacity: 0; + width: 100%; + height: 100%; + -moz-appearance: none + } + + div.switch input:hover, div.switch input:focus { + cursor: pointer + } + + div.switch span:last-child { + position: absolute; + top: -1px; + left: -1px; + z-index: 1; + display: block; + padding: 0; + border-width: 1px; + border-style: solid; + -webkit-transition: all 0.1s ease-out; + -moz-transition: all 0.1s ease-out; + transition: all 0.1s ease-out + } + + div.switch input:not(:checked)+label { + opacity: 0 + } + + div.switch input:checked { + display: none !important + } + + div.switch input { + left: 0; + display: block !important + } + + div.switch input:first-of-type+label, div.switch input:first-of-type+span+label { + left: -50% + } + + div.switch input:first-of-type:checked+label, div.switch input:first-of-type:checked+span+label { + left: 0% + } + + div.switch input:last-of-type+label, div.switch input:last-of-type+span+label { + right: -50%; + left: auto; + text-align: right + } + + div.switch input:last-of-type:checked+label, div.switch input:last-of-type:checked+span+label { + right: 0%; + left: auto + } + + div.switch span.custom { + display: none !important + } + + form.custom div.switch .hidden-field { + margin-left: auto; + position: absolute; + visibility: visible + } + + div.switch label { + padding: 0 0.375em; + line-height: 2.3em; + font-size: 0.875em + } + + div.switch input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -2.1875em + } + + div.switch span:last-child { + width: 2.25em; + height: 2.25em + } + + div.switch span:last-child { + border-color: #b3b3b3; + background: #fff; + background: -moz-linear-gradient(top, #fff 0%, #f2f2f2 100%); + background: -webkit-linear-gradient(top, #fff 0%, #f2f2f2 100%); + background: linear-gradient(to bottom, #fff 0%, #f2f2f2 100%); + -webkit-box-shadow: 2px 0 10px 0 rgba(0, 0, 0, 0.07), 1000px 0 0 1000px #e1f5d1, -2px 0 10px 0 rgba(0, 0, 0, 0.07), -1000px 0 0 1000px #f5f5f5; + box-shadow: 2px 0 10px 0 rgba(0, 0, 0, 0.07), 1000px 0 0 980px #e1f5d1, -2px 0 10px 0 rgba(0, 0, 0, 0.07), -1000px 0 0 1000px #f5f5f5 + } + + div.switch:hover span:last-child, div.switch:focus span:last-child { + background: #fff; + background: -moz-linear-gradient(top, #fff 0%, #e6e6e6 100%); + background: -webkit-linear-gradient(top, #fff 0%, #e6e6e6 100%); + background: linear-gradient(to bottom, #fff 0%, #e6e6e6 100%) + } + + div.switch:active { + background: transparent + } + + div.switch.large { + height: 44px + } + + div.switch.large label { + padding: 0 0.375em; + line-height: 2.3em; + font-size: 1.0625em + } + + div.switch.large input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -2.6875em + } + + div.switch.large span:last-child { + width: 2.75em; + height: 2.75em + } + + div.switch.small { + height: 28px + } + + div.switch.small label { + padding: 0 0.375em; + line-height: 2.1em; + font-size: 0.75em + } + + div.switch.small input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -1.6875em + } + + div.switch.small span:last-child { + width: 1.75em; + height: 1.75em + } + + div.switch.tiny { + height: 22px + } + + div.switch.tiny label { + padding: 0 0.375em; + line-height: 1.9em; + font-size: 0.6875em + } + + div.switch.tiny input:first-of-type:checked ~ span:last-child { + left: 100%; + margin-left: -1.3125em + } + + div.switch.tiny span:last-child { + width: 1.375em; + height: 1.375em + } + + div.switch.radius { + -webkit-border-radius: 4px; + border-radius: 4px + } + + div.switch.radius span:last-child { + -webkit-border-radius: 3px; + border-radius: 3px + } + + div.switch.round { + -webkit-border-radius: 1000px; + border-radius: 1000px + } + + div.switch.round span:last-child { + -webkit-border-radius: 999px; + border-radius: 999px + } + + div.switch.round label { + padding: 0 0.5625em + } + + @-webkit-keyframes webkitSiblingBugfix { + from { + position: relative + } + to { + position: relative + } + } +} + +[data-magellan-expedition] { + background: #fff; + z-index: 50; + min-width: 100%; + padding: 10px +} + +[data-magellan-expedition] .sub-nav { + margin-bottom: 0 +} + +[data-magellan-expedition] .sub-nav dd { + margin-bottom: 0 +} + +table { + background: #fff; + margin-bottom: 1.25em; + border: solid 1px #ddd +} + +table thead, table tfoot { + background: #f5f5f5; + font-weight: bold +} + +table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { + padding: 0.5em 0.625em 0.625em; + font-size: 0.875em; + color: #222; + text-align: left +} + +table tr th, table tr td { + padding: 0.5625em 0.625em; + font-size: 0.875em; + color: #222 +} + +table tr.even, table tr.alt, table tr:nth-of-type(even) { + background: #f9f9f9 +} + +table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { + display: table-cell; + line-height: 1.125em +} + +.th { + line-height: 0; + display: inline-block; + border: solid 4px #fff; + -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); + -webkit-transition: all 200ms ease-out; + -moz-transition: all 200ms ease-out; + transition: all 200ms ease-out +} + +.th:hover, .th:focus { + -webkit-box-shadow: 0 0 6px 1px rgba(43, 166, 203, 0.5); + box-shadow: 0 0 6px 1px rgba(43, 166, 203, 0.5) +} + +.th.radius { + -webkit-border-radius: 3px; + border-radius: 3px +} + +a.th { + display: inline-block +} + +.has-tip { + border-bottom: dotted 1px #ccc; + cursor: help; + font-weight: bold; + color: #333 +} + +.has-tip:hover, .has-tip:focus { + border-bottom: dotted 1px #196177; + color: #2ba6cb +} + +.has-tip.tip-left, .has-tip.tip-right { + float: none !important +} + +.tooltip { + display: none; + position: absolute; + z-index: 999; + font-weight: bold; + font-size: 0.9375em; + line-height: 1.3; + padding: 0.5em; + max-width: 85%; + left: 50%; + width: 100%; + color: #fff; + background: #000; + -webkit-border-radius: 3px; + border-radius: 3px +} + +.tooltip>.nub { + display: block; + left: 5px; + position: absolute; + width: 0; + height: 0; + border: solid 5px; + border-color: transparent transparent #000 transparent; + top: -10px +} + +.tooltip.opened { + color: #2ba6cb !important; + border-bottom: dotted 1px #196177 !important +} + +.tap-to-close { + display: block; + font-size: 0.625em; + color: #888; + font-weight: normal +} + +@media only screen and (min-width: 768px) { + .tooltip>.nub { + border-color: transparent transparent #000 transparent; + top: -10px + } + + .tooltip.tip-top>.nub { + border-color: #000 transparent transparent transparent; + top: auto; + bottom: -10px + } + + .tooltip.tip-left, .tooltip.tip-right { + float: none !important + } + + .tooltip.tip-left>.nub { + border-color: transparent transparent transparent #000; + right: -10px; + left: auto; + top: 50%; + margin-top: -5px + } + + .tooltip.tip-right>.nub { + border-color: transparent #000 transparent transparent; + right: auto; + left: -10px; + top: 50%; + margin-top: -5px + } +} + +@media only screen and (max-width: 767px) { + .f-dropdown { + max-width: 100%; + left: 0 + } +} + +.f-dropdown { + position: absolute; + top: -9999px; + list-style: none; + margin-left: 0; + width: 100%; + max-height: none; + height: auto; + background: #fff; + border: solid 1px #ccc; + font-size: 16; + z-index: 99; + margin-top: 2px; + max-width: 200px +} + +.f-dropdown>*:first-child { + margin-top: 0 +} + +.f-dropdown>*:last-child { + margin-bottom: 0 +} + +.f-dropdown:before { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 6px; + border-color: transparent transparent #fff transparent; + border-bottom-style: solid; + position: absolute; + top: -12px; + left: 10px; + z-index: 99 +} + +.f-dropdown:after { + content: ""; + display: block; + width: 0; + height: 0; + border: inset 7px; + border-color: transparent transparent #ccc transparent; + border-bottom-style: solid; + position: absolute; + top: -14px; + left: 9px; + z-index: 98 +} + +.f-dropdown.right:before { + left: auto; + right: 10px +} + +.f-dropdown.right:after { + left: auto; + right: 9px +} + +.f-dropdown li { + font-size: 0.875em; + cursor: pointer; + line-height: 1.125em; + margin: 0 +} + +.f-dropdown li:hover, .f-dropdown li:focus { + background: #eee +} + +.f-dropdown li a { + display: block; + padding: 0.3125em 0.625em; + color: #555 +} + +.f-dropdown.content { + position: absolute; + top: -9999px; + list-style: none; + margin-left: 0; + padding: 1.25em; + width: 100%; + height: auto; + max-height: none; + background: #fff; + border: solid 1px #ccc; + font-size: 16; + z-index: 99; + max-width: 200px +} + +.f-dropdown.content>*:first-child { + margin-top: 0 +} + +.f-dropdown.content>*:last-child { + margin-bottom: 0 +} + +.f-dropdown.tiny { + max-width: 200px +} + +.f-dropdown.small { + max-width: 300px +} + +.f-dropdown.medium { + max-width: 500px +} + +.f-dropdown.large { + max-width: 800px +} diff --git a/mqtt/rootfs/app/css/jquery.minicolors.css b/mqtt/rootfs/app/css/jquery.minicolors.css new file mode 100644 index 0000000..d7c2874 --- /dev/null +++ b/mqtt/rootfs/app/css/jquery.minicolors.css @@ -0,0 +1,245 @@ +.minicolors { + position: relative; +} + +.minicolors-swatch { + position: absolute; + vertical-align: middle; + background: url(../assets/jquery.minicolors.png) -80px 0; + border: solid 1px #ccc; + cursor: text; + padding: 0; + margin: 0; + display: inline-block; +} + +.minicolors-swatch-color { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.minicolors input[type=hidden] + .minicolors-swatch { + width: 28px; + position: static; + cursor: pointer; +} + +/* Panel */ +.minicolors-panel { + position: absolute; + width: 173px; + height: 152px; + background: white; + border: solid 1px #CCC; + box-shadow: 0 0 20px rgba(0, 0, 0, .2); + z-index: 99999; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + display: none; +} + +.minicolors-panel.minicolors-visible { + display: block; +} + +/* Panel positioning */ +.minicolors-position-top .minicolors-panel { + top: -154px; +} + +.minicolors-position-right .minicolors-panel { + right: 0; +} + +.minicolors-position-bottom .minicolors-panel { + top: auto; +} + +.minicolors-position-left .minicolors-panel { + left: 0; +} + +.minicolors-with-opacity .minicolors-panel { + width: 194px; +} + +.minicolors .minicolors-grid { + position: absolute; + top: 1px; + left: 1px; + width: 150px; + height: 150px; + background: url(../assets/jquery.minicolors.png) -120px 0; + cursor: crosshair; +} + +.minicolors .minicolors-grid-inner { + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: none; +} + +.minicolors-slider-saturation .minicolors-grid { + background-position: -420px 0; +} + +.minicolors-slider-saturation .minicolors-grid-inner { + background: url(../assets/jquery.minicolors.png) -270px 0; + } + + .minicolors-slider-brightness .minicolors-grid { + background-position: -570px 0; + } + + .minicolors-slider-brightness .minicolors-grid-inner { + background: black; + } + + .minicolors-slider-wheel .minicolors-grid { + background-position: -720px 0; + } + + .minicolors-slider, + .minicolors-opacity-slider { + position: absolute; + top: 1px; + left: 152px; + width: 20px; + height: 150px; + background: white url(../assets/jquery.minicolors.png) 0 0; + cursor: row-resize; +} + +.minicolors-slider-saturation .minicolors-slider { + background-position: -60px 0; +} + +.minicolors-slider-brightness .minicolors-slider { + background-position: -20px 0; +} + +.minicolors-slider-wheel .minicolors-slider { + background-position: -20px 0; +} + +.minicolors-opacity-slider { + left: 173px; + background-position: -40px 0; + display: none; +} + +.minicolors-with-opacity .minicolors-opacity-slider { + display: block; +} + +/* Pickers */ +.minicolors-grid .minicolors-picker { + position: absolute; + top: 70px; + left: 70px; + width: 12px; + height: 12px; + border: solid 1px black; + border-radius: 10px; + margin-top: -6px; + margin-left: -6px; + background: none; +} + +.minicolors-grid .minicolors-picker > div { + position: absolute; + top: 0; + left: 0; + width: 8px; + height: 8px; + border-radius: 8px; + border: solid 2px white; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +.minicolors-picker { + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 2px; + background: white; + border: solid 1px black; + margin-top: -2px; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +/* Inline controls */ +.minicolors-inline { + display: inline-block; +} + +.minicolors-inline .minicolors-input { + display: none !important; +} + +.minicolors-inline .minicolors-panel { + position: relative; + top: auto; + left: auto; + box-shadow: none; + z-index: auto; + display: inline-block; +} + +/* Default theme */ +.minicolors-theme-default .minicolors-swatch { + top: 5px; + left: 5px; + width: 18px; + height: 18px; +} +.minicolors-theme-default.minicolors-position-right .minicolors-swatch { + left: auto; + right: 5px; +} +.minicolors-theme-default.minicolors { + width: auto; + display: inline-block; +} +.minicolors-theme-default .minicolors-input { + height: 20px; + width: auto; + display: inline-block; + padding-left: 26px; +} +.minicolors-theme-default.minicolors-position-right .minicolors-input { + padding-right: 26px; + padding-left: inherit; +} + +/* Bootstrap theme */ +.minicolors-theme-bootstrap .minicolors-swatch { + top: 3px; + left: 3px; + width: 28px; + height: 28px; + border-radius: 3px; +} +.minicolors-theme-bootstrap.minicolors-position-right .minicolors-swatch { + left: auto; + right: 3px; +} +.minicolors-theme-bootstrap .minicolors-input { + padding-left: 44px; +} +.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input { + padding-right: 44px; + padding-left: 12px; +} \ No newline at end of file diff --git a/mqtt/rootfs/app/css/normalize.css b/mqtt/rootfs/app/css/normalize.css new file mode 100644 index 0000000..6d24a38 --- /dev/null +++ b/mqtt/rootfs/app/css/normalize.css @@ -0,0 +1,402 @@ +/*! normalize.css v2.1.1 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined in IE 8/9. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +/** + * Correct `inline-block` display not defined in IE 8/9. + */ + +audio, +canvas, +video { + display: inline-block; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/** + * 1. Prevent system color scheme's background color being used in Firefox, IE, + * and Opera. + * 2. Prevent system color scheme's text color being used in Firefox, IE, and + * Opera. + * 3. Set default font family to sans-serif. + * 4. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + background: #fff; /* 1 */ + color: #000; /* 2 */ + font-family: sans-serif; /* 3 */ + -ms-text-size-adjust: 100%; /* 4 */ + -webkit-text-size-adjust: 100%; /* 4 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari 5, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Correct font family set oddly in Safari 5 and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +/** + * Improve readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre-wrap; +} + +/** + * Set consistent quote types. + */ + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9. + */ + +img { + border: 0; +} + +/** + * Correct overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari 5. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Correct font family not being inherited in all browsers. + * 2. Correct font size not being inherited in all browsers. + * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + */ + +button, +input, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to `content-box` in IE 8/9. + * 2. Remove excess padding in IE 8/9. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 8/9. + * 2. Improve readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/mqtt/rootfs/app/css/style.css b/mqtt/rootfs/app/css/style.css new file mode 100644 index 0000000..00a42db --- /dev/null +++ b/mqtt/rootfs/app/css/style.css @@ -0,0 +1,325 @@ +/** + * Copyright 2013 dc-square GmbH + * + * 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. + * + * @author: Christoph Schäbel + * + */ + +#header { + float: none; + margin: 0 auto; + padding: 0; + height: 80px; + background-color: #f2f2f2; + border-bottom: solid 2px #000000; + margin-bottom: 20px; + width: 100%; + background: #f2f2f2; /* Old browsers */ + background-image: -moz-linear-gradient(top, #f8f8f8 0%, #f2f2f2 100%); /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f2f2f2)); /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f8f8f8 0%, #f2f2f2 100%); /* Chrome10+,Safari5.1+ */ + background-image: -o-linear-gradient(top, #f8f8f8 0%, #f2f2f2 100%); /* Opera 11.10+ */ + background-image: -ms-linear-gradient(top, #f8f8f8 0%, #f2f2f2 100%); /* IE10+ */ + background-image: linear-gradient(to bottom, #f8f8f8 0%, #f2f2f2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f2f2f2', GradientType=0); /* IE6-8 */ +} + +#header > div { + max-width: 62.5em; + margin: 0 auto; +} + +#headertitle { + float: right; + margin-top: 30px; + margin-right: 20px; +} + +#headerlogo { + margin-left: 20px; + margin-top: 5px; +} + +.conniTop { + margin-left: 15px; + background-color: #f2f2f2; + width: 180px; +} + +.publishTop { + background-color: #f2f2f2; + width: 160px; +} + +.subTop { + background-color: #f2f2f2; + width: 215px; +} + +.messagesTop { + background-color: #f2f2f2; + width: 180px; +} + +div.conniArrow, div.publishArrow, div.subArrow, div.messagesArrow { + float: right; + text-align: right; +} + +.checky { + margin-left: 22px; +} + +.connection { + margin-bot: 20px; +} + +.publish { + + margin-top: 20px; + width: 60%; +} + +.disc li { + list-style-type: none; + margin-bottom: 10px; + background-color: #ffffff; +} + +#colorChooser { + width: 20px; + padding-left: 30px; + line-height: 24px; +} + +/*.subs0, .mess0{ + border-left: solid 10px #ffff00; + background-color: #ffffff; +} +.subs1, .mess1{ + border-left: solid 10px #ff00ff; + background-color: #ffffff; +} + +.subs2, .mess2{ + border-left: solid 10px #00ffff; + background-color: #ffffff; +} + +.subs3, .mess3{ + border-left: solid 10px #f0fff0; + background-color: #ffffff; +} + +.subs4, .mess4{ + border-left: solid 10px #ff0f0f; + background-color: #ffffff; +}*/ + +.subText { + border-style: solid; + border-width: 1px; + border-color: #cccccc; + background-color: #ffffff; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.messageText { + border: solid 1px #cccccc; +} + +.closer { + margin-bot: 20px; + padding: 0; +} + +.left { + width: 10px; + background-color: #ffff00; +} + +.right { + float: right; + color: #bababa; +} + +.colorSub { + background-color: #ffff00; +} + +.addSubButton { + width: 100%; +} + +.empty { + clear: both; + height: 20px; +} + +#connectButton, #disconnectButton { + margin-top: 17px; +} + +#publishButton { + margin-top: 17px; + margin-left: -10px; +} + +#filterButton { + margin-top: 17px; +} + +#subscribeButton { + margin-top: 17px; + margin-left: -30px; +} + +#lwQosInput { + margin-top: 7px; + margin-left: 20px; + width: 50px; +} + +#publishQoSInput { + margin-top: 7px; + margin-left: -5px; + width: 50px; +} + +#QoSInput { + margin-top: 7px; + margin-left: -5px; + width: 50px; +} + +.qos, .date, .topicM, .retain { + color: #bababa; + font-size: 12px; +} + +.columns h3 { + margin-bottom: 0; + margin-top: 0; + font-size: 23px; +} + +form.custom .custom.dropdown.small { + width: 70px; +} + +form.custom .custom.checkbox { + margin-left: 0.7em; + margin-top: 10px; +} + +#connection, #publish-sub { + width: 100%; +} + +.columns.subArrow, .columns.publishArrow, .columns.messagesArrow { + padding-right: 0; +} + +#addSubButton { + margin-top: 15px; +} + +#publishPanel { + padding-right: 0; + padding-left: 0; +} + +div.messageText { + padding-left: 0; + padding-right: 0; +} + +.row .messLine div.row, .row .subLine div.row { + margin-left: auto; + margin-right: auto; +} + +#messagesMain { + margin-bottom: 20px; +} + +div.icon-arrow-chevron { + background-image: url('../assets/arrow_up.png'); + min-height: 32px; + min-width: 32px; + background-repeat: no-repeat; + background-position: right; +} + +.closed div.icon-arrow-chevron { + background-image: url('../assets/arrow_down.png'); +} + +#connectionStatus { + margin-top: 7px; + width: 16px; + height: 16px; + border-radius: 8px; +} + +body.notconnected #connectionStatus { + background-color: #bc0000; +} + +body.connected #connectionStatus { + background-color: #009700; +} + +body.notconnected #disconnectButton { + display: none; +} + +body.connected #disconnectButton { + display: inline-block; +} + +body.notconnected #connectButton { + display: inline-block; +} + +body.connected #connectButton { + display: none; +} + +body.connected #connectionStatus:after { + content: 'connected'; + padding-left: 22px; +} + +body.connectionbroke #connectionStatus:after { + content: 'disconnected'; + padding-left: 22px; +} + +.columns.subText { + padding-right: 2px; +} + +.truncate { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.break-words { + word-wrap: break-word; +} \ No newline at end of file diff --git a/mqtt/rootfs/app/fancybox/blank.gif b/mqtt/rootfs/app/fancybox/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_close.png b/mqtt/rootfs/app/fancybox/fancy_close.png new file mode 100644 index 0000000000000000000000000000000000000000..07035307ad435f8f2f8eedf0bce50f7ec8a858c2 GIT binary patch literal 1517 zcmV1To%f)hA(E>uTT$~N#GA0orBqo9-jKM;POccZrXJjTzge4|Sa0ca~7y<+{ z2m7~>41(Jqf9L`mBM6zAjf4;hkjP@@B~d6Xz385|dB5iCM=Ro&JZZmk-uHdZd2i=@ zK0a@Md;u9DFE7t8BO^nxckf<*yC?SckUFGmX^jwM@NV80+eiP zQ*s##s^a3}Ldwd@cHO*r^T5i=%Fj}=Cr_R@78e&C((#usU;YFS>C)2Dw4tG)YO=*P zWt;6ZfL46;=u!R1$jGM-hhvcpVyCa+S}Q!T2ALHx;BHe#M~BsHHos=s2iW})#C?}q ztqvud-gYjKsG$zHm2XhmYPB(Bn>kzw z=gS!w6cG`jJ$?H00VK+=!cMnBDn?IFkCkj7KmNq~hrkZvU@n=EP}|7Gxw*M}1_lPI zNx@_?IS^|%_ok<(o3gXBH^f+@(X7_g)K~%n0$gMM{{Ab=%gZ*hH99)_Eo>!VJd8_C zE)WMoNsBB#u&}W3BMEnPby>y64F-cra9>kX)4DJoA0KZ5fitNn`NTT4wY3%+fA;Lz zZ+K4ucJi+Mg!m%<>Ug8kSg^LX_JD-5va;NEM#+V_H)8UHgaj8UJ?LiZVx92t@KxlB zb1oz#Bo|{kAO!IDVfOII$VfwRad8C+y?XV^;VEu~g@tQka>%(zhlYl1p7P=0!-vj9 zYiMYw3l0uW##jWq+eZ-;6r@4F%{+PXGcz;xx78|Q_F7Eb+}ynGO@4TI*h!27r4#SzfR=K~ zhtpe&%-o-olT$}R&!0cHdm}}wbdd`2lO~)PlarHXnm>2$+(ng2^$EtJ+=vwl#Xg-* zSA%x<9|=lJ3CXuACMEY46&1O~{LGm%7HKm8lhZ|+Pv?nF1LcJswy+L%zshO4HzpR4skij zxq<8a{QPpl!oq4$R(*n7$-q`gsjcF2;NWZ?##l9wBW)lu_Bpk)RJgGO&Ey+2dDr3J z*x2~aJFl#)G^5U)q~qh`_b^ru6q9Xf%arlfse$W(T#z5f?cqE0>k)x`c6QcMUS4jN z#$B996B84z1O(|{7{3S{Bb#j7?T~OCi+pq$fP9eGqJ%Evk~i}B@#8tcAnk_QAg)9f z!qn81MJO5W0n6>}?Q|$y25QL`+uU$0x?KbSI<(UOBavf=wCW!^J3Ie)^yty-8!yk& z($YLG4fjwT{k&5mHL@*_7Xi1c4?x$HT^y5qc2zyPPCG3CUKl!f@Zj&~&!7K?fD>&z zDk^G(=74sN=`q$#Wm{gaK5myi7K~vRQ8s=CoB+NC8j<}iKpXzI(SMmt*2r@wST=`s zW7t-}X4hPqXy3W00000NkvXXu0mjftFGKG literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_loading.png b/mqtt/rootfs/app/fancybox/fancy_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..2503017960b3972499d3aa92f89953935ae40934 GIT binary patch literal 10195 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 literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_nav_left.png b/mqtt/rootfs/app/fancybox/fancy_nav_left.png new file mode 100644 index 0000000000000000000000000000000000000000..ebaa6a4fd34e51575a01da366312c20618985cbc GIT binary patch literal 1446 zcmV;X1zGxuP)R`@usIzf?P{x4#0gFqr~|(;IJySuwjr=+Ar78e&sHZ(Lu;P)*wKU%|U#jmpg5~Q6= zNl8{#mZGz>Q!_F$qJ8n=#Z9x>Jn_n|ZEtTsSzllOW_Wn`!@Rt_=!l4jAl`tKb-5%L zv7js_CMF<1KR>Fcr{|nbr~AR4Y-MG|y0EZdwI6@^^5yrikSZ}TQ5hH*C?{R4Q{?KT zKD6U2SFWfB2M0g0TCEGD5GUP%Y0a>J0W!M1fVuVU?d@ix(YV91PjUK7@OzY8E)OJ~ z&Q30n%8njA8kC)#t?uvd&xMXHQZzI)WQmTB-n1vQM_gQ-{_*3-7UA?*_bJ9=m|W(F zT+IHE$H&L3T3T8zSS*%BTHM>)YZi;eI#;9uNVch|X-go#ckf=VQmKq2-ORBYaGo52 zejyg&!SS;_ltMX3~N9_#ORsfn&tMTp}T$j*yAd)6-A(_4O6g z0=-^ug|9bVkxorbSsNQ0x9sPG&EF`laq6qgf=!d ztnQGKnVtDqz_Vx1Y=Kr=TU+Vx?;nS;5H`1m#Lv%9fqI)#T3Y%!3C+yRSpE-E!h;77 zwm7Z1{&Y;%TkkIqz&m9sAKBbnCkzsHry#@vbY{a-wI?zu7 zloV4Q9NtQWLUAT7Ev=G-*4EZ6|HZd^F*!MDB>C#<>PDGN_5sGi_Yq4ZlG7@css!ck z9};wyN`LrygSGPaaLVfqXl2Z+Nkm;ygvo12>(Bf+YwDwC`Hbwy5foiCI>(Z2*F z+nZVe;)K}P*aF#9Y8tUS3{lK|w(!NULrkdP#x17leSb zXU`h&IIwaw4`8eqNV6{>BDOh|vjhZ0E{e&QDDu0Pe|>%Zmb;{dg@s0w$z&rPA0K~+ zu^J$UblaCq5g(ljxEe?Y`8AmFYt-vOfqZ&;+Eh?bV07kp3Z#jN34Zfk3!OW_7k zM!Hz%fopN!Lja&lI}y+lIZjBszTeT&@!Ra|?DQ)q4Us*EN5ey8M=zh0NVTlX;X`2G z(+8kuN)-Dfn@v@Ns?$arfE9ks%*_0?uCDGc0&cYN@bK_KngiO{r&oDx0_$@6^x5~= zW5Gx^5k=$2z;)mYpdQiR47B2ZEBzOVMD;v(on_N_Z6xdRarMj=Ped`)=n zv4Dh?$k=SYcJSdjDa(58`F?t%ZzxBbaRs;9zaA#)un(S!5dZ)H07*qoM6N<$g4RXF AD*ylh literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_nav_right.png b/mqtt/rootfs/app/fancybox/fancy_nav_right.png new file mode 100644 index 0000000000000000000000000000000000000000..873294e969db9160f5ddd4e1ab498ff60b080e3f GIT binary patch literal 1454 zcmV;f1yTBmP)Wa6`&Z+!IVkxf`V#(j>y7#5eg z5*PD+C=wGBwT+F9xi*_^fd=>X_FBba@wz8b0c3ma+OG#c&LYnSBp_4S(*6BG8m#QpsI))yBSw}|WBy?ft)>pk?VIMu|0u-xC@UxO$< zHa9o-0~vR8bXeVyB61x;@W6T@vgyO$TgWvPslhu zJ>BGvFeN3$D2UT9wO!c-2M2E;RvddB6cm(&J}nRg`1!DUaA;_#J})n?kc`&W*6f~w z$XoI8@o`6>)z;Ql1O^7iqc4Qr?IQ^Y2vDQmrd_^#`AagIo}RXO6Tw=o)=2K&OZ?8A zJDVKcH{^2p2j~ms)bf#Ff5Y^8{ZZ7~8Zw%koV0nHJ||9`FbS!%u(0sL`TfAafI}Du zN;}#qfQDkqhr?T=R;!O@W@c89(aOq-SHe5pO)Do4INRL6f8R{+tE;Q)Wir`E=nLN^ zERjf#VBjT`yZ^}0T`IW~brs!I17PDwDHNtJpz(@u7&_Ci&*x`nXGh4eva-_hHlhTo z>wKX6jrLg})!Ef*2q(qH#unh5y~V~`*!#E25W2>+0$@y%jAkE;d^% z7KiBQ=;#CV)c|?K?OZZNymTtyIv@+;=i$b0QLhID@u{gPOF=<_+1^cd)FbceJt|Pr3Z2#UW)pC9hbbpr%#_w3xu>9DucKZSqKjwKC}oa!!=;B zxw)ARh3h~maWUsB$KtMw06>R!GGHKatdM5?eS3TRA2TyEQ!m{-s9LkQG(13d^zuqc z)WBRWF9N%+J^)=)qIgeo*i|*CI?Xfzc;V-hCr|!<<;s9veooizpgD1ug<#0dV!Z literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_shadow_e.png b/mqtt/rootfs/app/fancybox/fancy_shadow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..2eda0893649371f8d92b92976d8542cdd1b601ed GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W@!3HGnP3ltxQbwLGjv*Y^lSRZuwe#}JO|p{EaWGAM`~zK|Yh zF7SQ+m+Ig>B0@o-N8?trihfzZ+Vp1~`{zf0o*#X0$hUAi%N$P)W1wCJ22WQ%mvv4F FO#q)zAp-ya literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_shadow_ne.png b/mqtt/rootfs/app/fancybox/fancy_shadow_ne.png new file mode 100644 index 0000000000000000000000000000000000000000..79f6980a3ba5c43de120d963dbba2516b8f27ac7 GIT binary patch literal 347 zcmV-h0i^zkP)dR9Yb&V8f!h)aDezHAsc|y@|hdQ zYJb}?8~~zFbQ)ku!Ey)KSukutuvdZ@MKMX|x|A3tPyx?YVhN^6z!Mi4Mj2f#%<;nh z2{>?YAzu|{u^;Oq!;f7Z4tPBpJEmZ+^GZ#$=9nz(K+UmK7}|u&EPi%aRt_C3qOFB_ zHc`~N>51%{?ijG?xsHt>MwRChgk=x_z0gh3O2xSL)-6?+2LKZL74~Q>MZjWtwukkA tvjRC=&j+0R$&bLyT7MhBcTXDISHC&xXU0&5CWHV0002ovPDHLkV1fX+la~Mh literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_shadow_nw.png b/mqtt/rootfs/app/fancybox/fancy_shadow_nw.png new file mode 100644 index 0000000000000000000000000000000000000000..7182cd938ae98e7e28c65a0bc55df576042ff9f5 GIT binary patch literal 324 zcmV-K0lWT*P)2-&4CO{qhKP$XKD&mgeXEM77>~`RA}h@U^Z##eQZVtM>a-K?QT4 z&(8BFf(rD5V61)2I__wHYuRwoaDIqw5Vdr_JSDVr){#J@r;{vbDL|tRyCiirf~4OF zX-l=Ecm>@yR)1nSMt~dy90Zb`^`)TQbhf8jR@fA!l6V$musRyB9Y{p$SCW}!$3==V zk)fW)Xo{s^ez$t+XhmZj;ts)!kTokvmM>z)zt70000 literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_shadow_se.png b/mqtt/rootfs/app/fancybox/fancy_shadow_se.png new file mode 100644 index 0000000000000000000000000000000000000000..541e3ffd3e88224b34a4d2097c66a780e6060aeb GIT binary patch literal 352 zcmV-m0iXVfP){pM9=`y8<_IvWD02WY@RZ<9dgjNmAB|sYF}Xw>7Sq@O0000eMf9z;FC21=)67q_`W0*0KnS4AR00W2`RGn3i8UfsEegLO@ zPhds?2e1Tm)FK3=bymIAx?X=YFo3Mdh7W?@I#8s#svp!&PB> zwah@Ngd|l0N4SCfzvjtQnd$dZ0yM)N$X+lqdtN!Pt{Wn*_`0U}m1^#r1 mwpaW{;a?9KKt^WrpTAEd?0j1W(3L*`0000P{ho=rRL|66mGO)=r*Hk83F#~lnc)I$ztaD0e0sy?& B8X5oq literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_title_left.png b/mqtt/rootfs/app/fancybox/fancy_title_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6049223d1ec6af46e100499c01f6489c9e2c6240 GIT binary patch literal 503 zcmV+)0005LNklqcp9&~$uJw{{rUub~E?-XJ#Upm4Fe%-Gl z!u%tb0N102a|s5;SPlQvJlFCTBbvYaK@wIW6Gjx@?i20AlVDJcHNfh25WRlbF6CIq zv9_ZnqOH`}ppaUR0@%ZcM9zpDt2uQM>f+Z#wIMmyuui3DeoYXWE|hQ{D$te=Yhgkq zIvyj+$t8T|S1wITzUftNOe(E+Qjn$kDotY;I5}1lRgwi=?K26ke)djLR5W2|!7CVH zJ-`tuAq|`lK978y+CnqGNCkUke_%Gig ukvFM-ftpWh!il7Wg7kz7Y?7xB@G*olNlgoj4E_Yv!rmdKI;Vst0Ha3^zyJUM literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancy_title_right.png b/mqtt/rootfs/app/fancybox/fancy_title_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d9db2a7c6e570aec993d3665cbc13620115e2 GIT binary patch literal 506 zcmV+)0005ONklxjQB-g>5=x46nGBwseihc$zfzvTFh(=tCRj6cJ4M&ASrCAq-HbokPnRBAHVa2(-|l wYU(UxfYLN;KDSr z1<%~X^wgl##FWaylc_d9MY*0Xjv*Ddw)7kFH5l+P-xcE$W)3=fYI&uMKVzWNT*W|n zhqlRY)q0r(8Mg&Fu_zpISivgz+b7g)c6G&O{~njE??Y{u-MM!p^=9_W+X-j8mhfK? zj`H2Yy;kp%)!V-M3;EVThyB(Z@o88wpMja-vy^g)SgE!<&|(HpS3j3^P6|6H_V+Po~-c6$N>^IEGZ*^681?Yf#{6Zf~e!I`r4y-J+3m*Ue*gH=cNZ zzpU%p61aCO%jt%FHUKW&bEWLcUAGzK?;SYE)E{9#W9O8@uj{O@89qzNU(dkI YVCW(7-@(*!CeU;SPgg&ebxsLQ07`N|KL7v# literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/fancybox/fancybox.png b/mqtt/rootfs/app/fancybox/fancybox.png new file mode 100644 index 0000000000000000000000000000000000000000..65e14f68fd83b87f75c22c0c074e7b20bf20a133 GIT binary patch literal 15287 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 ZMt7F5hocMxav&E)U0Fw|QQ>vO{{ZOG+C=~W literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/index.html b/mqtt/rootfs/app/index.html new file mode 100644 index 0000000..e097a71 --- /dev/null +++ b/mqtt/rootfs/app/index.html @@ -0,0 +1,334 @@ + + + + + + + + + + MQTT Websocket Client + + + + + + + + + +

+
+
+ +
+

Connection

+
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ Connect +
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + + + + + + + +
+
+
+
+
+
+
+
+
+

Publish

+
+ +
+ +
+
+
+ +
+ + +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ Publish +
+
+
+
+ + +
+
+
+
+
+
+
+
+

Messages

+
+ +
+ +
+
+
+ +
+ + +
+
+
+ + + + + + + + + + + + +
+
+
    + +
+
+
+
+ +
+
+ +
+ +
+

Subscriptions

+
+ +
+ +
+
+
+
+
+
+ + Add New Topic Subscription + +
+
+
+
+
+ + +
+
+ + +
+
+ Subscribe +
+
+
+
+ + +
+
+
+
+
+ +
    + +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/mqtt/rootfs/app/js/app.js b/mqtt/rootfs/app/js/app.js new file mode 100644 index 0000000..9903944 --- /dev/null +++ b/mqtt/rootfs/app/js/app.js @@ -0,0 +1,342 @@ +/** + * Copyright 2013 dc-square GmbH + * + * 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. + * + * @author: Christoph Schäbel + */ + +var websocketclient = { + 'client': null, + 'lastMessageId': 1, + 'lastSubId': 1, + 'subscriptions': [], + 'messages': [], + 'connected': false, + + 'connect': function () { + + var host = $('#urlInput').val(); + var port = parseInt($('#portInput').val(), 10); + var clientId = $('#clientIdInput').val(); + var username = $('#userInput').val(); + var password = $('#pwInput').val(); + var keepAlive = parseInt($('#keepAliveInput').val()); + var cleanSession = $('#cleanSessionInput').is(':checked'); + var lwTopic = $('#lwTopicInput').val(); + var lwQos = parseInt($('#lwQosInput').val()); + var lwRetain = $('#LWRInput').is(':checked'); + var lwMessage = $('#LWMInput').val(); + var ssl = $('#sslInput').is(':checked'); + + this.client = new Messaging.Client(host, port, clientId); + this.client.onConnectionLost = this.onConnectionLost; + this.client.onMessageArrived = this.onMessageArrived; + + var options = { + timeout: 3, + keepAliveInterval: keepAlive, + cleanSession: cleanSession, + useSSL: ssl, + onSuccess: this.onConnect, + onFailure: this.onFail + }; + + if (username.length > 0) { + options.userName = username; + } + if (password.length > 0) { + options.password = password; + } + if (lwTopic.length > 0) { + var willmsg = new Messaging.Message(lwMessage); + willmsg.qos = lwQos; + willmsg.destinationName = lwTopic; + willmsg.retained = lwRetain; + options.willMessage = willmsg; + } + + this.client.connect(options); + }, + + 'onConnect': function () { + websocketclient.connected = true; + console.log("connected"); + var body = $('body').addClass('connected').removeClass('notconnected').removeClass('connectionbroke'); + + websocketclient.render.hide('conni'); + websocketclient.render.show('publish'); + websocketclient.render.show('sub'); + websocketclient.render.show('messages'); + }, + + 'onFail': function (message) { + websocketclient.connected = false; + console.log("error: " + message.errorMessage); + websocketclient.render.showError('Connect failed: ' + message.errorMessage); + }, + + 'onConnectionLost': function (responseObject) { + websocketclient.connected = false; + if (responseObject.errorCode !== 0) { + console.log("onConnectionLost:" + responseObject.errorMessage); + } + $('body.connected').removeClass('connected').addClass('notconnected').addClass('connectionbroke'); + websocketclient.render.show('conni'); + websocketclient.render.hide('publish'); + websocketclient.render.hide('sub'); + websocketclient.render.hide('messages'); + + //Cleanup messages + websocketclient.messages = []; + websocketclient.render.clearMessages(); + + //Cleanup subscriptions + websocketclient.subscriptions = []; + websocketclient.render.clearSubscriptions(); + }, + + 'onMessageArrived': function (message) { +// console.log("onMessageArrived:" + message.payloadString + " qos: " + message.qos); + + var subscription = websocketclient.getSubscriptionForTopic(message.destinationName); + + var messageObj = { + 'topic': message.destinationName, + 'retained': message.retained, + 'qos': message.qos, + 'payload': message.payloadString, + 'timestamp': moment(), + 'subscriptionId': subscription.id, + 'color': websocketclient.getColorForSubscription(subscription.id) + }; + + console.log(messageObj); + messageObj.id = websocketclient.render.message(messageObj); + websocketclient.messages.push(messageObj); + }, + + 'disconnect': function () { + this.client.disconnect(); + }, + + 'publish': function (topic, payload, qos, retain) { + + if (!websocketclient.connected) { + websocketclient.render.showError("Not connected"); + return false; + } + + var message = new Messaging.Message(payload); + message.destinationName = topic; + message.qos = qos; + message.retained = retain; + this.client.send(message); + }, + + 'subscribe': function (topic, qosNr, color) { + + if (!websocketclient.connected) { + websocketclient.render.showError("Not connected"); + return false; + } + + if (topic.length < 1) { + websocketclient.render.showError("Topic cannot be empty"); + return false; + } + + if (_.find(this.subscriptions, { 'topic': topic })) { + websocketclient.render.showError('You are already subscribed to this topic'); + return false; + } + + this.client.subscribe(topic, {qos: qosNr}); + if (color.length < 1) { + color = '999999'; + } + + var subscription = {'topic': topic, 'qos': qosNr, 'color': color}; + subscription.id = websocketclient.render.subscription(subscription); + this.subscriptions.push(subscription); + return true; + }, + + 'unsubscribe': function (id) { + var subs = _.find(websocketclient.subscriptions, {'id': id}); + this.client.unsubscribe(subs.topic); + websocketclient.subscriptions = _.filter(websocketclient.subscriptions, function (item) { + return item.id != id; + }); + + websocketclient.render.removeSubscriptionsMessages(id); + }, + + 'deleteSubscription': function (id) { + var elem = $("#sub" + id); + + if (confirm('Are you sure ?')) { + elem.remove(); + this.unsubscribe(id); + } + }, + + 'getRandomColor': function () { + var r = (Math.round(Math.random() * 255)).toString(16); + var g = (Math.round(Math.random() * 255)).toString(16); + var b = (Math.round(Math.random() * 255)).toString(16); + return r + g + b; + }, + + 'getSubscriptionForTopic': function (topic) { + var i; + for (i = 0; i < this.subscriptions.length; i++) { + if (this.compareTopics(topic, this.subscriptions[i].topic)) { + return this.subscriptions[i]; + } + } + return false; + }, + + 'getColorForPublishTopic': function (topic) { + var id = this.getSubscriptionForTopic(topic); + return this.getColorForSubscription(id); + }, + + 'getColorForSubscription': function (id) { + try { + if (!id) { + return '99999'; + } + + var sub = _.find(this.subscriptions, { 'id': id }); + if (!sub) { + return '999999'; + } else { + return sub.color; + } + } catch (e) { + return '999999'; + } + }, + + 'compareTopics': function (topic, subTopic) { + var pattern = subTopic.replace("+", "(.+?)").replace("#", "(.*)"); + var regex = new RegExp("^" + pattern + "$"); + return regex.test(topic); + }, + + 'render': { + + 'showError': function (message) { + alert(message); + }, + 'messages': function () { + + websocketclient.render.clearMessages(); + _.forEach(websocketclient.messages, function (message) { + message.id = websocketclient.render.message(message); + }); + + }, + 'message': function (message) { + + var largest = websocketclient.lastMessageId++; + + var html = '
  • ' + + '
    ' + + '
    ' + + '
    ' + message.timestamp.format("YYYY-MM-DD HH:mm:ss") + '
    ' + + '
    Topic: ' + Encoder.htmlEncode(message.topic) + '
    ' + + '
    Qos: ' + message.qos + '
    ' + + '
    '; + if (message.retained) { + html += 'Retained'; + } + html += '
    ' + + '
    ' + Encoder.htmlEncode(message.payload) + '
    ' + + '
    ' + + '
    ' + + '
  • '; + $("#messEdit").prepend(html); + return largest; + }, + + 'subscriptions': function () { + websocketclient.render.clearSubscriptions(); + _.forEach(websocketclient.subscriptions, function (subs) { + subs.id = websocketclient.render.subscription(subs); + }); + }, + + 'subscription': function (subscription) { + var largest = websocketclient.lastSubId++; + $("#innerEdit").append( + '
  • ' + + '
    ' + + '
    ' + + '
    ' + + ' x' + + '
    ' + + '
    Qos: ' + subscription.qos + '
    ' + + '
    ' + Encoder.htmlEncode(subscription.topic) + '
    ' + + '
    ' + + '
    ' + + '
  • '); + return largest; + }, + + 'toggleAll': function () { + websocketclient.render.toggle('conni'); + websocketclient.render.toggle('publish'); + websocketclient.render.toggle('messages'); + websocketclient.render.toggle('sub'); + }, + + 'toggle': function (name) { + $('.' + name + 'Arrow').toggleClass("closed"); + $('.' + name + 'Top').toggleClass("closed"); + var elem = $('#' + name + 'Main'); + elem.slideToggle(); + }, + + 'hide': function (name) { + $('.' + name + 'Arrow').addClass("closed"); + $('.' + name + 'Top').addClass("closed"); + var elem = $('#' + name + 'Main'); + elem.slideUp(); + }, + + 'show': function (name) { + $('.' + name + 'Arrow').removeClass("closed"); + $('.' + name + 'Top').removeClass("closed"); + var elem = $('#' + name + 'Main'); + elem.slideDown(); + }, + + 'removeSubscriptionsMessages': function (id) { + websocketclient.messages = _.filter(websocketclient.messages, function (item) { + return item.subscriptionId != id; + }); + websocketclient.render.messages(); + }, + + 'clearMessages': function () { + $("#messEdit").empty(); + }, + + 'clearSubscriptions': function () { + $("#innerEdit").empty(); + } + } +}; diff --git a/mqtt/rootfs/app/js/arrow.gif b/mqtt/rootfs/app/js/arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..246478a864f812d93d4cd0e0d0ad1c8e2d09c825 GIT binary patch literal 66 zcmZ?wbhEHbWM|-JSjfZx1poj4Utv=LM2bII7`Ygj7<53QAbAERVV@R>f}L*~a`L;Z PKCZl?^}@uHk--`OML81Y literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/js/cross.gif b/mqtt/rootfs/app/js/cross.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ee9c7ac517bee40b78aea03afa809631f0b69fa GIT binary patch literal 83 zcmZ?wbhEHb "~") { + a.push("&#"); + a.push(c.charCodeAt()); //numeric value of code point + a.push(";"); + } else { + a.push(c); + } + } + + return a.join(""); + }, + + // HTML Decode numerical and HTML entities back to original values + htmlDecode: function (s) { + + var c, m, d = s; + + if (this.isEmpty(d)) return ""; + + // convert HTML entites back to numerical entites first + d = this.HTML2Numerical(d); + + // look for numerical entities " + arr = d.match(/&#[0-9]{1,5};/g); + + // if no matches found in string then skip + if (arr != null) { + for (var x = 0; x < arr.length; x++) { + m = arr[x]; + c = m.substring(2, m.length - 1); //get numeric part which is refernce to unicode character + // if its a valid number we can decode + if (c >= -32768 && c <= 65535) { + // decode every single match within string + d = d.replace(m, String.fromCharCode(c)); + } else { + d = d.replace(m, ""); //invalid so replace with nada + } + } + } + + return d; + }, + + // encode an input string into either numerical or HTML entities + htmlEncode: function (s, dbl) { + + if (this.isEmpty(s)) return ""; + + // do we allow double encoding? E.g will & be turned into &amp; + dbl = dbl || false; //default to prevent double encoding + + // if allowing double encoding we do ampersands first + if (dbl) { + if (this.EncodeType == "numerical") { + s = s.replace(/&/g, "&"); + } else { + s = s.replace(/&/g, "&"); + } + } + + // convert the xss chars to numerical entities ' " < > + s = this.XSSEncode(s, false); + + if (this.EncodeType == "numerical" || !dbl) { + // Now call function that will convert any HTML entities to numerical codes + s = this.HTML2Numerical(s); + } + + // Now encode all chars above 127 e.g unicode + s = this.numEncode(s); + + // now we know anything that needs to be encoded has been converted to numerical entities we + // can encode any ampersands & that are not part of encoded entities + // to handle the fact that I need to do a negative check and handle multiple ampersands &&& + // I am going to use a placeholder + + // if we don't want double encoded entities we ignore the & in existing entities + if (!dbl) { + s = s.replace(/&#/g, "##AMPHASH##"); + + if (this.EncodeType == "numerical") { + s = s.replace(/&/g, "&"); + } else { + s = s.replace(/&/g, "&"); + } + + s = s.replace(/##AMPHASH##/g, "&#"); + } + + // replace any malformed entities + s = s.replace(/&#\d*([^\d;]|$)/g, "$1"); + + if (!dbl) { + // safety check to correct any double encoded & + s = this.correctEncoding(s); + } + + // now do we need to convert our numerical encoded string into entities + if (this.EncodeType == "entity") { + s = this.NumericalToHTML(s); + } + + return s; + }, + + // Encodes the basic 4 characters used to malform HTML in XSS hacks + XSSEncode: function (s, en) { + if (!this.isEmpty(s)) { + en = en || true; + // do we convert to numerical or html entity? + if (en) { + s = s.replace(/\'/g, "'"); //no HTML equivalent as &apos is not cross browser supported + s = s.replace(/\"/g, """); + s = s.replace(//g, ">"); + } else { + s = s.replace(/\'/g, "'"); //no HTML equivalent as &apos is not cross browser supported + s = s.replace(/\"/g, """); + s = s.replace(//g, ">"); + } + return s; + } else { + return ""; + } + }, + + // returns true if a string contains html or numerical encoded entities + hasEncoded: function (s) { + if (/&#[0-9]{1,5};/g.test(s)) { + return true; + } else if (/&[A-Z]{2,6};/gi.test(s)) { + return true; + } else { + return false; + } + }, + + // will remove any unicode characters + stripUnicode: function (s) { + return s.replace(/[^\x20-\x7E]/g, ""); + + }, + + // corrects any double encoded & entities e.g &amp; + correctEncoding: function (s) { + return s.replace(/(&)(amp;)+/, "$1"); + }, + + + // Function to loop through an array swaping each item with the value from another array e.g swap HTML entities with Numericals + swapArrayVals: function (s, arr1, arr2) { + if (this.isEmpty(s)) return ""; + var re; + if (arr1 && arr2) { + //ShowDebug("in swapArrayVals arr1.length = " + arr1.length + " arr2.length = " + arr2.length) + // array lengths must match + if (arr1.length == arr2.length) { + for (var x = 0, i = arr1.length; x < i; x++) { + re = new RegExp(arr1[x], 'g'); + s = s.replace(re, arr2[x]); //swap arr1 item with matching item from arr2 + } + } + } + return s; + }, + + inArray: function (item, arr) { + for (var i = 0, x = arr.length; i < x; i++) { + if (arr[i] === item) { + return i; + } + } + return -1; + } + +} \ No newline at end of file diff --git a/mqtt/rootfs/app/js/hs.png b/mqtt/rootfs/app/js/hs.png new file mode 100644 index 0000000000000000000000000000000000000000..3d94486cedaf7111d010fdaf2cefad45fd1f878b GIT binary patch literal 2684 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 YzFqsNg>|5V=vOIWZ|#VBZRvIQe;Bk#LI3~& literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/js/hv.png b/mqtt/rootfs/app/js/hv.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5e01f8bcecc4cf835e8eeeaa43ef2c06789022 GIT binary patch literal 2865 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 E0LKozl>h($ literal 0 HcmV?d00001 diff --git a/mqtt/rootfs/app/js/jquery.minicolors.min.js b/mqtt/rootfs/app/js/jquery.minicolors.min.js new file mode 100644 index 0000000..520f8d6 --- /dev/null +++ b/mqtt/rootfs/app/js/jquery.minicolors.min.js @@ -0,0 +1,8 @@ +/* + * jQuery MiniColors: A tiny color picker built on jQuery + * + * Copyright Cory LaViska for A Beautiful Site, LLC. (http://www.abeautifulsite.net/) + * + * Licensed under the MIT license: http://opensource.org/licenses/MIT + * + */jQuery&&function(e){function t(t,n){var r=e('
    '),i=e.minicolors.defaults;if(t.data("minicolors-initialized"))return;n=e.extend(!0,{},i,n);r.addClass("minicolors-theme-"+n.theme).toggleClass("minicolors-with-opacity",n.opacity);n.position!==undefined&&e.each(n.position.split(" "),function(){r.addClass("minicolors-position-"+this)});t.addClass("minicolors-input").data("minicolors-initialized",!0).data("minicolors-settings",n).prop("size",7).wrap(r).after('
    '+'
    '+'
    '+"
    "+'
    '+'
    '+"
    "+'
    '+'
    '+'
    '+"
    "+"
    ");if(!n.inline){t.after('');t.next(".minicolors-swatch").on("click",function(e){e.preventDefault();t.focus()})}t.parent().find(".minicolors-panel").on("selectstart",function(){return!1}).end();n.inline&&t.parent().addClass("minicolors-inline");u(t,!1);t.data("minicolors-lastChange",{hex:t.val(),opacity:t.attr("data-opacity")})}function n(e){var t=e.parent();e.removeData("minicolors-initialized").removeData("minicolors-settings").removeProp("size").removeClass("minicolors-input");t.before(e).remove()}function r(e){var t=e.parent(),n=t.find(".minicolors-panel"),r=e.data("minicolors-settings");if(!e.data("minicolors-initialized")||e.prop("disabled")||t.hasClass("minicolors-inline")||t.hasClass("minicolors-focus"))return;i();t.addClass("minicolors-focus");n.stop(!0,!0).fadeIn(r.showSpeed,function(){r.show&&r.show.call(e.get(0))})}function i(){e(".minicolors-input").each(function(){var t=e(this),n=t.data("minicolors-settings"),r=t.parent();if(n.inline)return;r.find(".minicolors-panel").fadeOut(n.hideSpeed,function(){r.hasClass("minicolors-focus")&&n.hide&&n.hide.call(t.get(0));r.removeClass("minicolors-focus")})})}function s(e,t,n){var r=e.parents(".minicolors").find(".minicolors-input"),i=r.data("minicolors-settings"),s=e.find("[class$=-picker]"),u=e.offset().left,a=e.offset().top,f=Math.round(t.pageX-u),l=Math.round(t.pageY-a),c=n?i.animationSpeed:0,h,p,d,v;if(t.originalEvent.changedTouches){f=t.originalEvent.changedTouches[0].pageX-u;l=t.originalEvent.changedTouches[0].pageY-a}f<0&&(f=0);l<0&&(l=0);f>e.width()&&(f=e.width());l>e.height()&&(l=e.height());if(e.parent().is(".minicolors-slider-wheel")&&s.parent().is(".minicolors-grid")){h=75-f;p=75-l;d=Math.sqrt(h*h+p*p);v=Math.atan2(p,h);v<0&&(v+=Math.PI*2);if(d>75){d=75;f=75-75*Math.cos(v);l=75-75*Math.sin(v)}f=Math.round(f);l=Math.round(l)}e.is(".minicolors-grid")?s.stop(!0).animate({top:l+"px",left:f+"px"},c,i.animationEasing,function(){o(r,e)}):s.stop(!0).animate({top:l+"px"},c,i.animationEasing,function(){o(r,e)})}function o(e,t){function n(e,t){var n,r;if(!e.length||!t)return null;n=e.offset().left;r=e.offset().top;return{x:n-t.offset().left+e.outerWidth()/2,y:r-t.offset().top+e.outerHeight()/2}}var r,i,s,o,u,f,l,h=e.val(),d=e.attr("data-opacity"),v=e.parent(),g=e.data("minicolors-settings"),y=v.find(".minicolors-swatch"),b=v.find(".minicolors-grid"),w=v.find(".minicolors-slider"),E=v.find(".minicolors-opacity-slider"),S=b.find("[class$=-picker]"),x=w.find("[class$=-picker]"),T=E.find("[class$=-picker]"),N=n(S,b),C=n(x,w),k=n(T,E);if(t.is(".minicolors-grid, .minicolors-slider")){switch(g.control){case"wheel":o=b.width()/2-N.x;u=b.height()/2-N.y;f=Math.sqrt(o*o+u*u);l=Math.atan2(u,o);l<0&&(l+=Math.PI*2);if(f>75){f=75;N.x=69-75*Math.cos(l);N.y=69-75*Math.sin(l)}i=p(f/.75,0,100);r=p(l*180/Math.PI,0,360);s=p(100-Math.floor(C.y*(100/w.height())),0,100);h=m({h:r,s:i,b:s});w.css("backgroundColor",m({h:r,s:i,b:100}));break;case"saturation":r=p(parseInt(N.x*(360/b.width()),10),0,360);i=p(100-Math.floor(C.y*(100/w.height())),0,100);s=p(100-Math.floor(N.y*(100/b.height())),0,100);h=m({h:r,s:i,b:s});w.css("backgroundColor",m({h:r,s:100,b:s}));v.find(".minicolors-grid-inner").css("opacity",i/100);break;case"brightness":r=p(parseInt(N.x*(360/b.width()),10),0,360);i=p(100-Math.floor(N.y*(100/b.height())),0,100);s=p(100-Math.floor(C.y*(100/w.height())),0,100);h=m({h:r,s:i,b:s});w.css("backgroundColor",m({h:r,s:i,b:100}));v.find(".minicolors-grid-inner").css("opacity",1-s/100);break;default:r=p(360-parseInt(C.y*(360/w.height()),10),0,360);i=p(Math.floor(N.x*(100/b.width())),0,100);s=p(100-Math.floor(N.y*(100/b.height())),0,100);h=m({h:r,s:i,b:s});b.css("backgroundColor",m({h:r,s:100,b:100}))}e.val(c(h,g.letterCase))}if(t.is(".minicolors-opacity-slider")){g.opacity?d=parseFloat(1-k.y/E.height()).toFixed(2):d=1;g.opacity&&e.attr("data-opacity",d)}y.find("SPAN").css({backgroundColor:h,opacity:d});a(e,h,d)}function u(e,t){var n,r,i,s,o,u,a,f=e.parent(),l=e.data("minicolors-settings"),d=f.find(".minicolors-swatch"),v=f.find(".minicolors-grid"),y=f.find(".minicolors-slider"),b=f.find(".minicolors-opacity-slider"),w=v.find("[class$=-picker]"),E=y.find("[class$=-picker]"),S=b.find("[class$=-picker]");n=c(h(e.val(),!0),l.letterCase);n||(n=c(h(l.defaultValue,!0),l.letterCase));r=g(n);t||e.val(n);if(l.opacity){i=e.attr("data-opacity")===""?1:p(parseFloat(e.attr("data-opacity")).toFixed(2),0,1);isNaN(i)&&(i=1);e.attr("data-opacity",i);d.find("SPAN").css("opacity",i);o=p(b.height()-b.height()*i,0,b.height());S.css("top",o+"px")}d.find("SPAN").css("backgroundColor",n);switch(l.control){case"wheel":u=p(Math.ceil(r.s*.75),0,v.height()/2);a=r.h*Math.PI/180;s=p(75-Math.cos(a)*u,0,v.width());o=p(75-Math.sin(a)*u,0,v.height());w.css({top:o+"px",left:s+"px"});o=150-r.b/(100/v.height());n===""&&(o=0);E.css("top",o+"px");y.css("backgroundColor",m({h:r.h,s:r.s,b:100}));break;case"saturation":s=p(5*r.h/12,0,150);o=p(v.height()-Math.ceil(r.b/(100/v.height())),0,v.height());w.css({top:o+"px",left:s+"px"});o=p(y.height()-r.s*(y.height()/100),0,y.height());E.css("top",o+"px");y.css("backgroundColor",m({h:r.h,s:100,b:r.b}));f.find(".minicolors-grid-inner").css("opacity",r.s/100);break;case"brightness":s=p(5*r.h/12,0,150);o=p(v.height()-Math.ceil(r.s/(100/v.height())),0,v.height());w.css({top:o+"px",left:s+"px"});o=p(y.height()-r.b*(y.height()/100),0,y.height());E.css("top",o+"px");y.css("backgroundColor",m({h:r.h,s:r.s,b:100}));f.find(".minicolors-grid-inner").css("opacity",1-r.b/100);break;default:s=p(Math.ceil(r.s/(100/v.width())),0,v.width());o=p(v.height()-Math.ceil(r.b/(100/v.height())),0,v.height());w.css({top:o+"px",left:s+"px"});o=p(y.height()-r.h/(360/y.height()),0,y.height());E.css("top",o+"px");v.css("backgroundColor",m({h:r.h,s:100,b:100}))}}function a(e,t,n){var r=e.data("minicolors-settings"),i=e.data("minicolors-lastChange");if(i.hex!==t||i.opacity!==n){e.data("minicolors-lastChange",{hex:t,opacity:n});if(r.change)if(r.changeDelay){clearTimeout(e.data("minicolors-changeTimeout"));e.data("minicolors-changeTimeout",setTimeout(function(){r.change.call(e.get(0),t,n)},r.changeDelay))}else r.change.call(e.get(0),t,n);e.trigger("change").trigger("input")}}function f(t){var n=h(e(t).val(),!0),r=b(n),i=e(t).attr("data-opacity");if(!r)return null;i!==undefined&&e.extend(r,{a:parseFloat(i)});return r}function l(t,n){var r=h(e(t).val(),!0),i=b(r),s=e(t).attr("data-opacity");if(!i)return null;s===undefined&&(s=1);return n?"rgba("+i.r+", "+i.g+", "+i.b+", "+parseFloat(s)+")":"rgb("+i.r+", "+i.g+", "+i.b+")"}function c(e,t){return t==="uppercase"?e.toUpperCase():e.toLowerCase()}function h(e,t){e=e.replace(/[^A-F0-9]/ig,"");if(e.length!==3&&e.length!==6)return"";e.length===3&&t&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]);return"#"+e}function p(e,t,n){en&&(e=n);return e}function d(e){var t={},n=Math.round(e.h),r=Math.round(e.s*255/100),i=Math.round(e.b*255/100);if(r===0)t.r=t.g=t.b=i;else{var s=i,o=(255-r)*i/255,u=(s-o)*(n%60)/60;n===360&&(n=0);if(n<60){t.r=s;t.b=o;t.g=o+u}else if(n<120){t.g=s;t.b=o;t.r=s-u}else if(n<180){t.g=s;t.r=o;t.b=o+u}else if(n<240){t.b=s;t.r=o;t.g=s-u}else if(n<300){t.b=s;t.g=o;t.r=o+u}else if(n<360){t.r=s;t.g=o;t.b=s-u}else{t.r=0;t.g=0;t.b=0}}return{r:Math.round(t.r),g:Math.round(t.g),b:Math.round(t.b)}}function v(t){var n=[t.r.toString(16),t.g.toString(16),t.b.toString(16)];e.each(n,function(e,t){t.length===1&&(n[e]="0"+t)});return"#"+n.join("")}function m(e){return v(d(e))}function g(e){var t=y(b(e));t.s===0&&(t.h=360);return t}function y(e){var t={h:0,s:0,b:0},n=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),i=r-n;t.b=r;t.s=r!==0?255*i/r:0;t.s!==0?e.r===r?t.h=(e.g-e.b)/i:e.g===r?t.h=2+(e.b-e.r)/i:t.h=4+(e.r-e.g)/i:t.h=-1;t.h*=60;t.h<0&&(t.h+=360);t.s*=100/255;t.b*=100/255;return t}function b(e){e=parseInt(e.indexOf("#")>-1?e.substring(1):e,16);return{r:e>>16,g:(e&65280)>>8,b:e&255}}e.minicolors={defaults:{animationSpeed:50,animationEasing:"swing",change:null,changeDelay:0,control:"hue",defaultValue:"",hide:null,hideSpeed:100,inline:!1,letterCase:"lowercase",opacity:!1,position:"bottom left",show:null,showSpeed:100,theme:"default"}};e.extend(e.fn,{minicolors:function(s,o){switch(s){case"destroy":e(this).each(function(){n(e(this))});return e(this);case"hide":i();return e(this);case"opacity":if(o===undefined)return e(this).attr("data-opacity");e(this).each(function(){u(e(this).attr("data-opacity",o))});return e(this);case"rgbObject":return f(e(this),s==="rgbaObject");case"rgbString":case"rgbaString":return l(e(this),s==="rgbaString");case"settings":if(o===undefined)return e(this).data("minicolors-settings");e(this).each(function(){var t=e(this).data("minicolors-settings")||{};n(e(this));e(this).minicolors(e.extend(!0,t,o))});return e(this);case"show":r(e(this).eq(0));return e(this);case"value":if(o===undefined)return e(this).val();e(this).each(function(){u(e(this).val(o))});return e(this);default:s!=="create"&&(o=s);e(this).each(function(){t(e(this),o)});return e(this)}}});e(document).on("mousedown.minicolors touchstart.minicolors",function(t){e(t.target).parents().add(t.target).hasClass("minicolors")||i()}).on("mousedown.minicolors touchstart.minicolors",".minicolors-grid, .minicolors-slider, .minicolors-opacity-slider",function(t){var n=e(this);t.preventDefault();e(document).data("minicolors-target",n);s(n,t,!0)}).on("mousemove.minicolors touchmove.minicolors",function(t){var n=e(document).data("minicolors-target");n&&s(n,t)}).on("mouseup.minicolors touchend.minicolors",function(){e(this).removeData("minicolors-target")}).on("mousedown.minicolors touchstart.minicolors",".minicolors-swatch",function(t){var n=e(this).parent().find(".minicolors-input");t.preventDefault();r(n)}).on("focus.minicolors",".minicolors-input",function(){var t=e(this);if(!t.data("minicolors-initialized"))return;r(t)}).on("blur.minicolors",".minicolors-input",function(){var t=e(this),n=t.data("minicolors-settings");if(!t.data("minicolors-initialized"))return;t.val(h(t.val(),!0));t.val()===""&&t.val(h(n.defaultValue,!0));t.val(c(t.val(),n.letterCase))}).on("keydown.minicolors",".minicolors-input",function(t){var n=e(this);if(!n.data("minicolors-initialized"))return;switch(t.keyCode){case 9:i();break;case 13:case 27:i();n.blur()}}).on("keyup.minicolors",".minicolors-input",function(){var t=e(this);if(!t.data("minicolors-initialized"))return;u(t,!0)}).on("paste.minicolors",".minicolors-input",function(){var t=e(this);if(!t.data("minicolors-initialized"))return;setTimeout(function(){u(t,!0)},1)})}(jQuery); \ No newline at end of file diff --git a/mqtt/rootfs/app/js/mqttws31.js b/mqtt/rootfs/app/js/mqttws31.js new file mode 100644 index 0000000..463f882 --- /dev/null +++ b/mqtt/rootfs/app/js/mqttws31.js @@ -0,0 +1,1958 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corp. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Eclipse Distribution License v1.0 which accompany this distribution. + * + * The Eclipse Public License is available at + * http://www.eclipse.org/legal/epl-v10.html + * and the Eclipse Distribution License is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * Contributors: + * Andrew Banks - initial API and implementation and initial documentation + *******************************************************************************/ + + +// Only expose a single object name in the global namespace. +// Everything must go through this module. Global Messaging module +// only has a single public function, client, which returns +// a Messaging client object given connection details. + +/** + * @namespace Messaging + * Send and receive messages using web browsers. + *

    + * This programming interface lets a JavaScript client application use the MQTT V3.1 protocol to + * connect to an MQTT-supporting messaging server. + * + * The function supported includes: + *

      + *
    1. Connecting to and disconnecting from a server. The server is identified by its host name and port number. + *
    2. Specifying options that relate to the communications link with the server, + * for example the frequency of keep-alive heartbeats, and whether SSL/TLS is required. + *
    3. Subscribing to and receiving messages from MQTT Topics. + *
    4. Publishing messages to MQTT Topics. + *
    + *

    + *

    The API consists of two main objects:

    + * The Messaging.Client object. This contains methods that provide the functionality of the API, + * including provision of callbacks that notify the application when a message arrives from or is delivered to the messaging server, + * or when the status of its connection to the messaging server changes. + *

    + * The Messaging.Message object. This encapsulates the payload of the message along with various attributes + * associated with its delivery, in particular the destination to which it has been (or is about to be) sent. + *

    + * The programming interface validates parameters passed to it, and will throw an Error containing an error message + * intended for developer use, if it detects an error with any parameter. + *

    + * Example: + * + *

    + client = new Messaging.Client(location.hostname, Number(location.port), "clientId");
    + client.onConnectionLost = onConnectionLost;
    + client.onMessageArrived = onMessageArrived;
    + client.connect({onSuccess:onConnect});
    +
    + function onConnect() {
    +  // Once a connection has been made, make a subscription and send a message.
    +  console.log("onConnect");
    +  client.subscribe("/World");
    +  message = new Messaging.Message("Hello");
    +  message.destinationName = "/World";
    +  client.send(message); 
    +};
    + function onConnectionLost(responseObject) {
    +  if (responseObject.errorCode !== 0)
    +    console.log("onConnectionLost:"+responseObject.errorMessage);
    +};
    + function onMessageArrived(message) {
    +  console.log("onMessageArrived:"+message.payloadString);
    +  client.disconnect(); 
    +};
    + * 
    + *

    + * Other programming languages, + * Java, + * C. + */ +Messaging = (function (global) { + + // Private variables below, these are only visible inside the function closure + // which is used to define the module. + + var version = "0.0.0.0"; + var buildLevel = "@BUILDLEVEL@"; + + /** + * Unique message type identifiers, with associated + * associated integer values. + * @private + */ + var MESSAGE_TYPE = { + CONNECT: 1, + CONNACK: 2, + PUBLISH: 3, + PUBACK: 4, + PUBREC: 5, + PUBREL: 6, + PUBCOMP: 7, + SUBSCRIBE: 8, + SUBACK: 9, + UNSUBSCRIBE: 10, + UNSUBACK: 11, + PINGREQ: 12, + PINGRESP: 13, + DISCONNECT: 14 + }; + + // Collection of utility methods used to simplify module code + // and promote the DRY pattern. + + /** + * Validate an object's parameter names to ensure they + * match a list of expected variables name for this option + * type. Used to ensure option object passed into the API don't + * contain erroneous parameters. + * @param {Object} obj User options object + * @param {key:type, key2:type, ...} valid keys and types that may exist in obj. + * @throws {Error} Invalid option parameter found. + * @private + */ + var validate = function (obj, keys) { + for (key in obj) { + if (obj.hasOwnProperty(key)) { + if (keys.hasOwnProperty(key)) { + if (typeof obj[key] !== keys[key]) + throw new Error(format(ERROR.INVALID_TYPE, [typeof obj[key], key])); + } else { + var errorStr = "Unknown property, " + key + ". Valid properties are:"; + for (key in keys) + if (keys.hasOwnProperty(key)) + errorStr = errorStr + " " + key; + throw new Error(errorStr); + } + } + } + }; + + /** + * Return a new function which runs the user function bound + * to a fixed scope. + * @param {function} User function + * @param {object} Function scope + * @return {function} User function bound to another scope + * @private + */ + var scope = function (f, scope) { + return function () { + return f.apply(scope, arguments); + }; + }; + + /** + * Unique message type identifiers, with associated + * associated integer values. + * @private + */ + var ERROR = { + OK: {code: 0, text: "AMQJSC0000I OK."}, + CONNECT_TIMEOUT: {code: 1, text: "AMQJSC0001E Connect timed out."}, + SUBSCRIBE_TIMEOUT: {code: 2, text: "AMQJS0002E Subscribe timed out."}, + UNSUBSCRIBE_TIMEOUT: {code: 3, text: "AMQJS0003E Unsubscribe timed out."}, + PING_TIMEOUT: {code: 4, text: "AMQJS0004E Ping timed out."}, + INTERNAL_ERROR: {code: 5, text: "AMQJS0005E Internal error."}, + CONNACK_RETURNCODE: {code: 6, text: "AMQJS0006E Bad Connack return code:{0} {1}."}, + SOCKET_ERROR: {code: 7, text: "AMQJS0007E Socket error:{0}."}, + SOCKET_CLOSE: {code: 8, text: "AMQJS0008I Socket closed."}, + MALFORMED_UTF: {code: 9, text: "AMQJS0009E Malformed UTF data:{0} {1} {2}."}, + UNSUPPORTED: {code: 10, text: "AMQJS0010E {0} is not supported by this browser."}, + INVALID_STATE: {code: 11, text: "AMQJS0011E Invalid state {0}."}, + INVALID_TYPE: {code: 12, text: "AMQJS0012E Invalid type {0} for {1}."}, + INVALID_ARGUMENT: {code: 13, text: "AMQJS0013E Invalid argument {0} for {1}."}, + UNSUPPORTED_OPERATION: {code: 14, text: "AMQJS0014E Unsupported operation."}, + INVALID_STORED_DATA: {code: 15, text: "AMQJS0015E Invalid data in local storage key={0} value={1}."}, + INVALID_MQTT_MESSAGE_TYPE: {code: 16, text: "AMQJS0016E Invalid MQTT message type {0}."}, + MALFORMED_UNICODE: {code: 17, text: "AMQJS0017E Malformed Unicode string:{0} {1}."}, + }; + + /** CONNACK RC Meaning. */ + var CONNACK_RC = { + 0: "Connection Accepted", + 1: "Connection Refused: unacceptable protocol version", + 2: "Connection Refused: identifier rejected", + 3: "Connection Refused: server unavailable", + 4: "Connection Refused: bad user name or password", + 5: "Connection Refused: not authorized" + }; + + /** + * Format an error message text. + * @private + * @param {error} ERROR.KEY value above. + * @param {substitutions} [array] substituted into the text. + * @return the text with the substitutions made. + */ + var format = function (error, substitutions) { + var text = error.text; + if (substitutions) { + for (var i = 0; i < substitutions.length; i++) { + field = "{" + i + "}"; + start = text.indexOf(field); + if (start > 0) { + var part1 = text.substring(0, start); + var part2 = text.substring(start + field.length); + text = part1 + substitutions[i] + part2; + } + } + } + return text; + }; + + //MQTT protocol and version 6 M Q I s d p 3 + var MqttProtoIdentifier = [0x00, 0x06, 0x4d, 0x51, 0x49, 0x73, 0x64, 0x70, 0x03]; + + /** + * @ignore + * Construct an MQTT wire protocol message. + * @param type MQTT packet type. + * @param options optional wire message attributes. + * + * Optional properties + * + * messageIdentifier: message ID in the range [0..65535] + * payloadMessage: Application Message - PUBLISH only + * connectStrings: array of 0 or more Strings to be put into the CONNECT payload + * topics: array of strings (SUBSCRIBE, UNSUBSCRIBE) + * requestQoS: array of QoS values [0..2] + * + * "Flag" properties + * cleanSession: true if present / false if absent (CONNECT) + * willMessage: true if present / false if absent (CONNECT) + * isRetained: true if present / false if absent (CONNECT) + * userName: true if present / false if absent (CONNECT) + * password: true if present / false if absent (CONNECT) + * keepAliveInterval: integer [0..65535] (CONNECT) + * + * @private + */ + var WireMessage = function (type, options) { + this.type = type; + for (name in options) { + if (options.hasOwnProperty(name)) { + this[name] = options[name]; + } + } + }; + + WireMessage.prototype.encode = function () { + // Compute the first byte of the fixed header + var first = ((this.type & 0x0f) << 4); + + /* + * Now calculate the length of the variable header + payload by adding up the lengths + * of all the component parts + */ + + remLength = 0; + topicStrLength = new Array(); + + // if the message contains a messageIdentifier then we need two bytes for that + if (this.messageIdentifier != undefined) + remLength += 2; + + switch (this.type) { + // If this a Connect then we need to include 12 bytes for its header + case MESSAGE_TYPE.CONNECT: + remLength += MqttProtoIdentifier.length + 3; + remLength += UTF8Length(this.clientId) + 2; + if (this.willMessage != undefined) { + remLength += UTF8Length(this.willMessage.destinationName) + 2; + // Will message is always a string, sent as UTF-8 characters with a preceding length. + var willMessagePayloadBytes = this.willMessage.payloadBytes; + if (!(willMessagePayloadBytes instanceof Uint8Array)) + willMessagePayloadBytes = new Uint8Array(payloadBytes); + remLength += willMessagePayloadBytes.byteLength + 2; + } + if (this.userName != undefined) + remLength += UTF8Length(this.userName) + 2; + if (this.password != undefined) + remLength += UTF8Length(this.password) + 2; + break; + + // Subscribe, Unsubscribe can both contain topic strings + case MESSAGE_TYPE.SUBSCRIBE: + first |= 0x02; // Qos = 1; + for (var i = 0; i < this.topics.length; i++) { + topicStrLength[i] = UTF8Length(this.topics[i]); + remLength += topicStrLength[i] + 2; + } + remLength += this.requestedQos.length; // 1 byte for each topic's Qos + // QoS on Subscribe only + break; + + case MESSAGE_TYPE.UNSUBSCRIBE: + first |= 0x02; // Qos = 1; + for (var i = 0; i < this.topics.length; i++) { + topicStrLength[i] = UTF8Length(this.topics[i]); + remLength += topicStrLength[i] + 2; + } + break; + + case MESSAGE_TYPE.PUBLISH: + if (this.payloadMessage.duplicate) first |= 0x08; + first = first |= (this.payloadMessage.qos << 1); + if (this.payloadMessage.retained) first |= 0x01; + destinationNameLength = UTF8Length(this.payloadMessage.destinationName); + remLength += destinationNameLength + 2; + var payloadBytes = this.payloadMessage.payloadBytes; + remLength += payloadBytes.byteLength; + if (payloadBytes instanceof ArrayBuffer) + payloadBytes = new Uint8Array(payloadBytes); + else if (!(payloadBytes instanceof Uint8Array)) + payloadBytes = new Uint8Array(payloadBytes.buffer); + break; + + case MESSAGE_TYPE.DISCONNECT: + break; + + default: + ; + } + + // Now we can allocate a buffer for the message + + var mbi = encodeMBI(remLength); // Convert the length to MQTT MBI format + var pos = mbi.length + 1; // Offset of start of variable header + var buffer = new ArrayBuffer(remLength + pos); + var byteStream = new Uint8Array(buffer); // view it as a sequence of bytes + + //Write the fixed header into the buffer + byteStream[0] = first; + byteStream.set(mbi, 1); + + // If this is a PUBLISH then the variable header starts with a topic + if (this.type == MESSAGE_TYPE.PUBLISH) + pos = writeString(this.payloadMessage.destinationName, destinationNameLength, byteStream, pos); + // If this is a CONNECT then the variable header contains the protocol name/version, flags and keepalive time + + else if (this.type == MESSAGE_TYPE.CONNECT) { + byteStream.set(MqttProtoIdentifier, pos); + pos += MqttProtoIdentifier.length; + var connectFlags = 0; + if (this.cleanSession) + connectFlags = 0x02; + if (this.willMessage != undefined) { + connectFlags |= 0x04; + connectFlags |= (this.willMessage.qos << 3); + if (this.willMessage.retained) { + connectFlags |= 0x20; + } + } + if (this.userName != undefined) + connectFlags |= 0x80; + if (this.password != undefined) + connectFlags |= 0x40; + byteStream[pos++] = connectFlags; + pos = writeUint16(this.keepAliveInterval, byteStream, pos); + } + + // Output the messageIdentifier - if there is one + if (this.messageIdentifier != undefined) + pos = writeUint16(this.messageIdentifier, byteStream, pos); + + switch (this.type) { + case MESSAGE_TYPE.CONNECT: + pos = writeString(this.clientId, UTF8Length(this.clientId), byteStream, pos); + if (this.willMessage != undefined) { + pos = writeString(this.willMessage.destinationName, UTF8Length(this.willMessage.destinationName), byteStream, pos); + pos = writeUint16(willMessagePayloadBytes.byteLength, byteStream, pos); + byteStream.set(willMessagePayloadBytes, pos); + pos += willMessagePayloadBytes.byteLength; + + } + if (this.userName != undefined) + pos = writeString(this.userName, UTF8Length(this.userName), byteStream, pos); + if (this.password != undefined) + pos = writeString(this.password, UTF8Length(this.password), byteStream, pos); + break; + + case MESSAGE_TYPE.PUBLISH: + // PUBLISH has a text or binary payload, if text do not add a 2 byte length field, just the UTF characters. + byteStream.set(payloadBytes, pos); + + break; + +// case MESSAGE_TYPE.PUBREC: +// case MESSAGE_TYPE.PUBREL: +// case MESSAGE_TYPE.PUBCOMP: +// break; + + case MESSAGE_TYPE.SUBSCRIBE: + // SUBSCRIBE has a list of topic strings and request QoS + for (var i = 0; i < this.topics.length; i++) { + pos = writeString(this.topics[i], topicStrLength[i], byteStream, pos); + byteStream[pos++] = this.requestedQos[i]; + } + break; + + case MESSAGE_TYPE.UNSUBSCRIBE: + // UNSUBSCRIBE has a list of topic strings + for (var i = 0; i < this.topics.length; i++) + pos = writeString(this.topics[i], topicStrLength[i], byteStream, pos); + break; + + default: + // Do nothing. + } + + return buffer; + } + + function decodeMessage(input) { + //var msg = new Object(); // message to be constructed + var first = input[0]; + var type = first >> 4; + var messageInfo = first &= 0x0f; + var pos = 1; + + + // Decode the remaining length (MBI format) + + var digit; + var remLength = 0; + var multiplier = 1; + do { + digit = input[pos++]; + remLength += ((digit & 0x7F) * multiplier); + multiplier *= 128; + } while ((digit & 0x80) != 0); + + var wireMessage = new WireMessage(type); + switch (type) { + case MESSAGE_TYPE.CONNACK: + wireMessage.topicNameCompressionResponse = input[pos++]; + wireMessage.returnCode = input[pos++]; + break; + + case MESSAGE_TYPE.PUBLISH: + var qos = (messageInfo >> 1) & 0x03; + + var len = readUint16(input, pos); + pos += 2; + var topicName = parseUTF8(input, pos, len); + pos += len; + // If QoS 1 or 2 there will be a messageIdentifier + if (qos > 0) { + wireMessage.messageIdentifier = readUint16(input, pos); + pos += 2; + } + + var message = new Messaging.Message(input.subarray(pos)); + if ((messageInfo & 0x01) == 0x01) + message.retained = true; + if ((messageInfo & 0x08) == 0x08) + message.duplicate = true; + message.qos = qos; + message.destinationName = topicName; + wireMessage.payloadMessage = message; + break; + + case MESSAGE_TYPE.PUBACK: + case MESSAGE_TYPE.PUBREC: + case MESSAGE_TYPE.PUBREL: + case MESSAGE_TYPE.PUBCOMP: + case MESSAGE_TYPE.UNSUBACK: + wireMessage.messageIdentifier = readUint16(input, pos); + break; + + case MESSAGE_TYPE.SUBACK: + wireMessage.messageIdentifier = readUint16(input, pos); + pos += 2; + wireMessage.grantedQos = input.subarray(pos); + break; + + default: + ; + } + + return wireMessage; + } + + function writeUint16(input, buffer, offset) { + buffer[offset++] = input >> 8; //MSB + buffer[offset++] = input % 256; //LSB + return offset; + } + + function writeString(input, utf8Length, buffer, offset) { + offset = writeUint16(utf8Length, buffer, offset); + stringToUTF8(input, buffer, offset); + return offset + utf8Length; + } + + function readUint16(buffer, offset) { + return 256 * buffer[offset] + buffer[offset + 1]; + } + + /** + * Encodes an MQTT Multi-Byte Integer + * @private + */ + function encodeMBI(number) { + var output = new Array(1); + var numBytes = 0; + + do { + var digit = number % 128; + number = number >> 7; + if (number > 0) { + digit |= 0x80; + } + output[numBytes++] = digit; + } while ((number > 0) && (numBytes < 4)); + + return output; + } + + /** + * Takes a String and calculates its length in bytes when encoded in UTF8. + * @private + */ + function UTF8Length(input) { + var output = 0; + for (var i = 0; i < input.length; i++) { + var charCode = input.charCodeAt(i); + if (charCode > 0x7FF) { + // Surrogate pair means its a 4 byte character + if (0xD800 <= charCode && charCode <= 0xDBFF) { + i++; + output++; + } + output += 3; + } + else if (charCode > 0x7F) + output += 2; + else + output++; + } + return output; + } + + /** + * Takes a String and writes it into an array as UTF8 encoded bytes. + * @private + */ + function stringToUTF8(input, output, start) { + var pos = start; + for (var i = 0; i < input.length; i++) { + var charCode = input.charCodeAt(i); + + // Check for a surrogate pair. + if (0xD800 <= charCode && charCode <= 0xDBFF) { + lowCharCode = input.charCodeAt(++i); + if (isNaN(lowCharCode)) { + throw new Error(format(ERROR.MALFORMED_UNICODE, [charCode, lowCharCode])); + } + charCode = ((charCode - 0xD800) << 10) + (lowCharCode - 0xDC00) + 0x10000; + + } + + if (charCode <= 0x7F) { + output[pos++] = charCode; + } else if (charCode <= 0x7FF) { + output[pos++] = charCode >> 6 & 0x1F | 0xC0; + output[pos++] = charCode & 0x3F | 0x80; + } else if (charCode <= 0xFFFF) { + output[pos++] = charCode >> 12 & 0x0F | 0xE0; + output[pos++] = charCode >> 6 & 0x3F | 0x80; + output[pos++] = charCode & 0x3F | 0x80; + } else { + output[pos++] = charCode >> 18 & 0x07 | 0xF0; + output[pos++] = charCode >> 12 & 0x3F | 0x80; + output[pos++] = charCode >> 6 & 0x3F | 0x80; + output[pos++] = charCode & 0x3F | 0x80; + } + ; + } + return output; + } + + function parseUTF8(input, offset, length) { + var output = ""; + var utf16; + var pos = offset; + + while (pos < offset + length) { + var byte1 = input[pos++]; + if (byte1 < 128) + utf16 = byte1; + else { + var byte2 = input[pos++] - 128; + if (byte2 < 0) + throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), ""])); + if (byte1 < 0xE0) // 2 byte character + utf16 = 64 * (byte1 - 0xC0) + byte2; + else { + var byte3 = input[pos++] - 128; + if (byte3 < 0) + throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), byte3.toString(16)])); + if (byte1 < 0xF0) // 3 byte character + utf16 = 4096 * (byte1 - 0xE0) + 64 * byte2 + byte3; + else { + var byte4 = input[pos++] - 128; + if (byte4 < 0) + throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), byte3.toString(16), byte4.toString(16)])); + if (byte1 < 0xF8) // 4 byte character + utf16 = 262144 * (byte1 - 0xF0) + 4096 * byte2 + 64 * byte3 + byte4; + else // longer encodings are not supported + throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), byte3.toString(16), byte4.toString(16)])); + } + } + } + + if (utf16 > 0xFFFF) // 4 byte character - express as a surrogate pair + { + utf16 -= 0x10000; + output += String.fromCharCode(0xD800 + (utf16 >> 10)); // lead character + utf16 = 0xDC00 + (utf16 & 0x3FF); // trail character + } + output += String.fromCharCode(utf16); + } + return output; + } + + /** @ignore Repeat keepalive requests, monitor responses.*/ + var Pinger = function (client, window, keepAliveInterval) { + this._client = client; + this._window = window; + this._keepAliveInterval = keepAliveInterval * 1000; + this.isReset = false; + + var pingReq = new WireMessage(MESSAGE_TYPE.PINGREQ).encode(); + + var doTimeout = function (pinger) { + return function () { + return doPing.apply(pinger); + }; + }; + + /** @ignore */ + var doPing = function () { + if (!this.isReset) { + this._client._trace("Pinger.doPing", "Timed out"); + this._client._disconnected(ERROR.PING_TIMEOUT.code, format(ERROR.PING_TIMEOUT)); + } else { + this.isReset = false; + this._client._trace("Pinger.doPing", "send PINGREQ"); + this._client.socket.send(pingReq); + this.timeout = this._window.setTimeout(doTimeout(this), this._keepAliveInterval); + } + } + + this.reset = function () { + this.isReset = true; + this._window.clearTimeout(this.timeout); + if (this._keepAliveInterval > 0) + this.timeout = setTimeout(doTimeout(this), this._keepAliveInterval); + } + + this.cancel = function () { + this._window.clearTimeout(this.timeout); + } + }; + + /** @ignore Monitor request completion. */ + var Timeout = function (client, window, timeoutSeconds, action, args) { + this._window = window; + if (!timeoutSeconds) + timeoutSeconds = 30; + + var doTimeout = function (action, client, args) { + return function () { + return action.apply(client, args); + }; + }; + this.timeout = setTimeout(doTimeout(action, client, args), timeoutSeconds * 1000); + + this.cancel = function () { + this._window.clearTimeout(this.timeout); + } + }; + + /* + * Internal implementation of the Websockets MQTT V3.1 client. + * + * @name Messaging.ClientImpl @constructor + * @param {String} host the DNS nameof the webSocket host. + * @param {Number} port the port number for that host. + * @param {String} clientId the MQ client identifier. + */ + var ClientImpl = function (host, port, clientId) { + // Check dependencies are satisfied in this browser. + if (!("WebSocket" in global && global["WebSocket"] !== null)) { + throw new Error(format(ERROR.UNSUPPORTED, ["WebSocket"])); + } + if (!("localStorage" in global && global["localStorage"] !== null)) { + throw new Error(format(ERROR.UNSUPPORTED, ["localStorage"])); + } + if (!("ArrayBuffer" in global && global["ArrayBuffer"] !== null)) { + throw new Error(format(ERROR.UNSUPPORTED, ["ArrayBuffer"])); + } + + this._trace("Messaging.Client", host, port, clientId); + + this.host = host; + this.port = port; + this.clientId = clientId; + + // Local storagekeys are qualified with the following string. + this._localKey = host + ":" + port + ":" + clientId + ":"; + + // Create private instance-only message queue + // Internal queue of messages to be sent, in sending order. + this._msg_queue = []; + + // Messages we have sent and are expecting a response for, indexed by their respective message ids. + this._sentMessages = {}; + + // Messages we have received and acknowleged and are expecting a confirm message for + // indexed by their respective message ids. + this._receivedMessages = {}; + + // Internal list of callbacks to be executed when messages + // have been successfully sent over web socket, e.g. disconnect + // when it doesn't have to wait for ACK, just message is dispatched. + this._notify_msg_sent = {}; + + // Unique identifier for SEND messages, incrementing + // counter as messages are sent. + this._message_identifier = 1; + + // Used to determine the transmission sequence of stored sent messages. + this._sequence = 0; + + + // Load the local state, if any, from the saved version, only restore state relevant to this client. + for (key in localStorage) + if (key.indexOf("Sent:" + this._localKey) == 0 + || key.indexOf("Received:" + this._localKey) == 0) + this.restore(key); + }; + + // Messaging Client public instance members. + ClientImpl.prototype.host; + ClientImpl.prototype.port; + ClientImpl.prototype.clientId; + + // Messaging Client private instance members. + ClientImpl.prototype.socket; + /* true once we have received an acknowledgement to a CONNECT packet. */ + ClientImpl.prototype.connected = false; + /* The largest message identifier allowed, may not be larger than 2**16 but + * if set smaller reduces the maximum number of outbound messages allowed. + */ + ClientImpl.prototype.maxMessageIdentifier = 65536; + ClientImpl.prototype.connectOptions; + ClientImpl.prototype.hostIndex; + ClientImpl.prototype.onConnectionLost; + ClientImpl.prototype.onMessageDelivered; + ClientImpl.prototype.onMessageArrived; + ClientImpl.prototype._msg_queue = null; + ClientImpl.prototype._connectTimeout; + /* The sendPinger monitors how long we allow before we send data to prove to the server that we are alive. */ + ClientImpl.prototype.sendPinger = null; + /* The receivePinger monitors how long we allow before we require evidence that the server is alive. */ + ClientImpl.prototype.receivePinger = null; + + ClientImpl.prototype._traceBuffer = null; + ClientImpl.prototype._MAX_TRACE_ENTRIES = 100; + + ClientImpl.prototype.connect = function (connectOptions) { + var connectOptionsMasked = this._traceMask(connectOptions, "password"); + this._trace("Client.connect", connectOptionsMasked, this.socket, this.connected); + + if (this.connected) + throw new Error(format(ERROR.INVALID_STATE, ["already connected"])); + if (this.socket) + throw new Error(format(ERROR.INVALID_STATE, ["already connected"])); + + this.connectOptions = connectOptions; + + if (connectOptions.hosts) { + this.hostIndex = 0; + this._doConnect(connectOptions.hosts[0], connectOptions.ports[0]); + } else { + this._doConnect(this.host, this.port); + } + + }; + + ClientImpl.prototype.subscribe = function (filter, subscribeOptions) { + this._trace("Client.subscribe", filter, subscribeOptions); + + if (!this.connected) + throw new Error(format(ERROR.INVALID_STATE, ["not connected"])); + + var wireMessage = new WireMessage(MESSAGE_TYPE.SUBSCRIBE); + wireMessage.topics = [filter]; + if (subscribeOptions.qos != undefined) + wireMessage.requestedQos = [subscribeOptions.qos]; + else + wireMessage.requestedQos = [0]; + + if (subscribeOptions.onSuccess) { + wireMessage.callback = function () { + subscribeOptions.onSuccess({invocationContext: subscribeOptions.invocationContext}); + }; + } + if (subscribeOptions.timeout) { + wireMessage.timeOut = new Timeout(this, window, subscribeOptions.timeout, subscribeOptions.onFailure + , [ + {invocationContext: subscribeOptions.invocationContext, + errorCode: ERROR.SUBSCRIBE_TIMEOUT.code, + errorMessage: format(ERROR.SUBSCRIBE_TIMEOUT)} + ]); + } + + // All subscriptions return a SUBACK. + this._requires_ack(wireMessage); + this._schedule_message(wireMessage); + }; + + /** @ignore */ + ClientImpl.prototype.unsubscribe = function (filter, unsubscribeOptions) { + this._trace("Client.unsubscribe", filter, unsubscribeOptions); + + if (!this.connected) + throw new Error(format(ERROR.INVALID_STATE, ["not connected"])); + + var wireMessage = new WireMessage(MESSAGE_TYPE.UNSUBSCRIBE); + wireMessage.topics = [filter]; + + if (unsubscribeOptions.onSuccess) { + wireMessage.callback = function () { + unsubscribeOptions.onSuccess({invocationContext: unsubscribeOptions.invocationContext}); + }; + } + if (unsubscribeOptions.timeout) { + wireMessage.timeOut = new Timeout(this, window, unsubscribeOptions.timeout, unsubscribeOptions.onFailure + , [ + {invocationContext: unsubscribeOptions.invocationContext, + errorCode: ERROR.UNSUBSCRIBE_TIMEOUT.code, + errorMessage: format(ERROR.UNSUBSCRIBE_TIMEOUT)} + ]); + } + + // All unsubscribes return a SUBACK. + this._requires_ack(wireMessage); + this._schedule_message(wireMessage); + }; + + ClientImpl.prototype.send = function (message) { + this._trace("Client.send", message); + + if (!this.connected) + throw new Error(format(ERROR.INVALID_STATE, ["not connected"])); + + wireMessage = new WireMessage(MESSAGE_TYPE.PUBLISH); + wireMessage.payloadMessage = message; + + if (message.qos > 0) + this._requires_ack(wireMessage); + else if (this.onMessageDelivered) + this._notify_msg_sent[wireMessage] = this.onMessageDelivered(wireMessage.payloadMessage); + this._schedule_message(wireMessage); + }; + + ClientImpl.prototype.disconnect = function () { + this._trace("Client.disconnect"); + + if (!this.socket) + throw new Error(format(ERROR.INVALID_STATE, ["not connecting or connected"])); + + wireMessage = new WireMessage(MESSAGE_TYPE.DISCONNECT); + + // Run the disconnected call back as soon as the message has been sent, + // in case of a failure later on in the disconnect processing. + // as a consequence, the _disconected call back may be run several times. + this._notify_msg_sent[wireMessage] = scope(this._disconnected, this); + + this._schedule_message(wireMessage); + }; + + ClientImpl.prototype.getTraceLog = function () { + if (this._traceBuffer !== null) { + this._trace("Client.getTraceLog", new Date()); + this._trace("Client.getTraceLog in flight messages", this._sentMessages.length); + for (key in this._sentMessages) + this._trace("_sentMessages ", key, this._sentMessages[key]); + for (key in this._receivedMessages) + this._trace("_receivedMessages ", key, this._receivedMessages[key]); + + return this._traceBuffer; + } + }; + + ClientImpl.prototype.startTrace = function () { + if (this._traceBuffer === null) { + this._traceBuffer = []; + } + this._trace("Client.startTrace", new Date(), version); + }; + + ClientImpl.prototype.stopTrace = function () { + delete this._traceBuffer; + }; + + ClientImpl.prototype._doConnect = function (host, port) { + // When the socket is open, this client will send the CONNECT WireMessage using the saved parameters. + if (this.connectOptions.useSSL) + wsurl = ["wss://", host, ":", port, "/mqtt"].join(""); + else + wsurl = ["ws://", host, ":", port, "/mqtt"].join(""); + this.connected = false; + this.socket = new WebSocket(wsurl, 'mqttv3.1'); + this.socket.binaryType = 'arraybuffer'; + this.socket.onopen = scope(this._on_socket_open, this); + this.socket.onmessage = scope(this._on_socket_message, this); + this.socket.onerror = scope(this._on_socket_error, this); + this.socket.onclose = scope(this._on_socket_close, this); + + this.sendPinger = new Pinger(this, window, this.connectOptions.keepAliveInterval); + this.receivePinger = new Pinger(this, window, this.connectOptions.keepAliveInterval); + + this._connectTimeout = new Timeout(this, window, this.connectOptions.timeout, this._disconnected, [ERROR.CONNECT_TIMEOUT.code, format(ERROR.CONNECT_TIMEOUT)]); + }; + + + // Schedule a new message to be sent over the WebSockets + // connection. CONNECT messages cause WebSocket connection + // to be started. All other messages are queued internally + // until this has happened. When WS connection starts, process + // all outstanding messages. + ClientImpl.prototype._schedule_message = function (message) { + this._msg_queue.push(message); + // Process outstanding messages in the queue if we have an open socket, and have received CONNACK. + if (this.connected) { + this._process_queue(); + } + }; + + ClientImpl.prototype.store = function (prefix, wireMessage) { + storedMessage = {type: wireMessage.type, messageIdentifier: wireMessage.messageIdentifier, version: 1}; + + switch (wireMessage.type) { + case MESSAGE_TYPE.PUBLISH: + if (wireMessage.pubRecReceived) + storedMessage.pubRecReceived = true; + + // Convert the payload to a hex string. + storedMessage.payloadMessage = {}; + var hex = ""; + var messageBytes = wireMessage.payloadMessage.payloadBytes; + for (var i = 0; i < messageBytes.length; i++) { + if (messageBytes[i] <= 0xF) + hex = hex + "0" + messageBytes[i].toString(16); + else + hex = hex + messageBytes[i].toString(16); + } + storedMessage.payloadMessage.payloadHex = hex; + + storedMessage.payloadMessage.qos = wireMessage.payloadMessage.qos; + storedMessage.payloadMessage.destinationName = wireMessage.payloadMessage.destinationName; + if (wireMessage.payloadMessage.duplicate) + storedMessage.payloadMessage.duplicate = true; + if (wireMessage.payloadMessage.retained) + storedMessage.payloadMessage.retained = true; + + // Add a sequence number to sent messages. + if (prefix.indexOf("Sent:") == 0) { + if (wireMessage.sequence === undefined) + wireMessage.sequence = ++this._sequence; + storedMessage.sequence = wireMessage.sequence; + } + break; + + default: + throw Error(format(ERROR.INVALID_STORED_DATA, [key, storedMessage])); + } + localStorage.setItem(prefix + this._localKey + wireMessage.messageIdentifier, JSON.stringify(storedMessage)); + }; + + ClientImpl.prototype.restore = function (key) { + var value = localStorage.getItem(key); + var storedMessage = JSON.parse(value); + + var wireMessage = new WireMessage(storedMessage.type, storedMessage); + + switch (storedMessage.type) { + case MESSAGE_TYPE.PUBLISH: + // Replace the payload message with a Message object. + var hex = storedMessage.payloadMessage.payloadHex; + var buffer = new ArrayBuffer((hex.length) / 2); + var byteStream = new Uint8Array(buffer); + var i = 0; + while (hex.length >= 2) { + var x = parseInt(hex.substring(0, 2), 16); + hex = hex.substring(2, hex.length); + byteStream[i++] = x; + } + var payloadMessage = new Messaging.Message(byteStream); + + payloadMessage.qos = storedMessage.payloadMessage.qos; + payloadMessage.destinationName = storedMessage.payloadMessage.destinationName; + if (storedMessage.payloadMessage.duplicate) + payloadMessage.duplicate = true; + if (storedMessage.payloadMessage.retained) + payloadMessage.retained = true; + wireMessage.payloadMessage = payloadMessage; + + break; + + default: + throw Error(format(ERROR.INVALID_STORED_DATA, [key, value])); + } + + if (key.indexOf("Sent:" + this._localKey) == 0) { + this._sentMessages[wireMessage.messageIdentifier] = wireMessage; + } else if (key.indexOf("Received:" + this._localKey) == 0) { + this._receivedMessages[wireMessage.messageIdentifier] = wireMessage; + } + }; + + ClientImpl.prototype._process_queue = function () { + var message = null; + // Process messages in order they were added + var fifo = this._msg_queue.reverse(); + + // Send all queued messages down socket connection + while ((message = fifo.pop())) { + this._socket_send(message); + // Notify listeners that message was successfully sent + if (this._notify_msg_sent[message]) { + this._notify_msg_sent[message](); + delete this._notify_msg_sent[message]; + } + } + }; + + /** + * @ignore + * Expect an ACK response for this message. Add message to the set of in progress + * messages and set an unused identifier in this message. + */ + ClientImpl.prototype._requires_ack = function (wireMessage) { + var messageCount = Object.keys(this._sentMessages).length; + if (messageCount > this.maxMessageIdentifier) + throw Error("Too many messages:" + messageCount); + + while (this._sentMessages[this._message_identifier] !== undefined) { + this._message_identifier++; + } + wireMessage.messageIdentifier = this._message_identifier; + this._sentMessages[wireMessage.messageIdentifier] = wireMessage; + if (wireMessage.type === MESSAGE_TYPE.PUBLISH) { + this.store("Sent:", wireMessage); + } + if (this._message_identifier === this.maxMessagIdentifier) { + this._message_identifier = 1; + } + }; + + /** + * @ignore + * Called when the underlying websocket has been opened. + */ + ClientImpl.prototype._on_socket_open = function () { + // Create the CONNECT message object. + var wireMessage = new WireMessage(MESSAGE_TYPE.CONNECT, this.connectOptions); + wireMessage.clientId = this.clientId; + this._socket_send(wireMessage); + }; + + /** + * @ignore + * Called when the underlying websocket has received a complete packet. + */ + ClientImpl.prototype._on_socket_message = function (event) { + this._trace("Client._on_socket_message", event.data); + + // Reset the receive ping timer, we now have evidence the server is alive. + this.receivePinger.reset(); + var byteArray = new Uint8Array(event.data); + try { + var wireMessage = decodeMessage(byteArray); + } catch (error) { + this._disconnected(ERROR.INTERNAL_ERROR.code, format(ERROR.INTERNAL_ERROR, [error.message])); + return; + } + this._trace("Client._on_socket_message", wireMessage); + + switch (wireMessage.type) { + case MESSAGE_TYPE.CONNACK: + this._connectTimeout.cancel(); + + // If we have started using clean session then clear up the local state. + if (this.connectOptions.cleanSession) { + for (key in this._sentMessages) { + var sentMessage = this._sentMessages[key]; + localStorage.removeItem("Sent:" + this._localKey + sentMessage.messageIdentifier); + } + this._sentMessages = {}; + + for (key in this._receivedMessages) { + var receivedMessage = this._receivedMessages[key]; + localStorage.removeItem("Received:" + this._localKey + receivedMessage.messageIdentifier); + } + this._receivedMessages = {}; + } + // Client connected and ready for business. + if (wireMessage.returnCode === 0) { + this.connected = true; + // Jump to the end of the list of hosts and stop looking for a good host. + if (this.connectOptions.hosts) + this.hostIndex = this.connectOptions.hosts.length; + } else { + this._disconnected(ERROR.CONNACK_RETURNCODE.code, format(ERROR.CONNACK_RETURNCODE, [wireMessage.returnCode, CONNACK_RC[wireMessage.returnCode]])); + break; + } + + // Resend messages. + var sequencedMessages = new Array(); + for (var msgId in this._sentMessages) { + if (this._sentMessages.hasOwnProperty(msgId)) + sequencedMessages.push(this._sentMessages[msgId]); + } + + // Sort sentMessages into the original sent order. + var sequencedMessages = sequencedMessages.sort(function (a, b) { + return a.sequence - b.sequence; + }); + for (var i = 0, len = sequencedMessages.length; i < len; i++) { + var sentMessage = sequencedMessages[i]; + if (sentMessage.type == MESSAGE_TYPE.PUBLISH && sentMessage.pubRecReceived) { + var pubRelMessage = new WireMessage(MESSAGE_TYPE.PUBREL, {messageIdentifier: sentMessage.messageIdentifier}); + this._schedule_message(pubRelMessage); + } else { + this._schedule_message(sentMessage); + } + ; + } + + // Execute the connectOptions.onSuccess callback if there is one. + if (this.connectOptions.onSuccess) { + this.connectOptions.onSuccess({invocationContext: this.connectOptions.invocationContext}); + } + + // Process all queued messages now that the connection is established. + this._process_queue(); + break; + + case MESSAGE_TYPE.PUBLISH: + this._receivePublish(wireMessage); + break; + + case MESSAGE_TYPE.PUBACK: + var sentMessage = this._sentMessages[wireMessage.messageIdentifier]; + // If this is a re flow of a PUBACK after we have restarted receivedMessage will not exist. + if (sentMessage) { + delete this._sentMessages[wireMessage.messageIdentifier]; + localStorage.removeItem("Sent:" + this._localKey + wireMessage.messageIdentifier); + if (this.onMessageDelivered) + this.onMessageDelivered(sentMessage.payloadMessage); + } + break; + + case MESSAGE_TYPE.PUBREC: + var sentMessage = this._sentMessages[wireMessage.messageIdentifier]; + // If this is a re flow of a PUBREC after we have restarted receivedMessage will not exist. + if (sentMessage) { + sentMessage.pubRecReceived = true; + var pubRelMessage = new WireMessage(MESSAGE_TYPE.PUBREL, {messageIdentifier: wireMessage.messageIdentifier}); + this.store("Sent:", sentMessage); + this._schedule_message(pubRelMessage); + } + break; + + case MESSAGE_TYPE.PUBREL: + var receivedMessage = this._receivedMessages[wireMessage.messageIdentifier]; + localStorage.removeItem("Received:" + this._localKey + wireMessage.messageIdentifier); + // If this is a re flow of a PUBREL after we have restarted receivedMessage will not exist. + if (receivedMessage) { + this._receiveMessage(receivedMessage); + delete this._receivedMessages[wireMessage.messageIdentifier]; + } + // Always flow PubComp, we may have previously flowed PubComp but the server lost it and restarted. + pubCompMessage = new WireMessage(MESSAGE_TYPE.PUBCOMP, {messageIdentifier: wireMessage.messageIdentifier}); + this._schedule_message(pubCompMessage); + + + break; + + case MESSAGE_TYPE.PUBCOMP: + var sentMessage = this._sentMessages[wireMessage.messageIdentifier]; + delete this._sentMessages[wireMessage.messageIdentifier]; + localStorage.removeItem("Sent:" + this._localKey + wireMessage.messageIdentifier); + if (this.onMessageDelivered) + this.onMessageDelivered(sentMessage.payloadMessage); + break; + + case MESSAGE_TYPE.SUBACK: + var sentMessage = this._sentMessages[wireMessage.messageIdentifier]; + if (sentMessage) { + if (sentMessage.timeOut) + sentMessage.timeOut.cancel(); + if (sentMessage.callback) { + sentMessage.callback(); + } + delete this._sentMessages[wireMessage.messageIdentifier]; + } + break; + + case MESSAGE_TYPE.UNSUBACK: + var sentMessage = this._sentMessages[wireMessage.messageIdentifier]; + if (sentMessage) { + if (sentMessage.timeOut) + sentMessage.timeOut.cancel(); + if (sentMessage.callback) { + sentMessage.callback(); + } + delete this._sentMessages[wireMessage.messageIdentifier]; + } + + break; + + case MESSAGE_TYPE.PINGRESP: + /* The sendPinger or receivePinger may have sent a ping, the receivePinger has already been reset. */ + this.sendPinger.reset(); + break; + + case MESSAGE_TYPE.DISCONNECT: + // Clients do not expect to receive disconnect packets. + this._disconnected(ERROR.INVALID_MQTT_MESSAGE_TYPE.code, format(ERROR.INVALID_MQTT_MESSAGE_TYPE, [wireMessage.type])); + break; + + default: + this._disconnected(ERROR.INVALID_MQTT_MESSAGE_TYPE.code, format(ERROR.INVALID_MQTT_MESSAGE_TYPE, [wireMessage.type])); + } + ; + }; + + /** @ignore */ + ClientImpl.prototype._on_socket_error = function (error) { + this._disconnected(ERROR.SOCKET_ERROR.code, format(ERROR.SOCKET_ERROR, [error.data])); + }; + + /** @ignore */ + ClientImpl.prototype._on_socket_close = function () { + this._disconnected(ERROR.SOCKET_CLOSE.code, format(ERROR.SOCKET_CLOSE)); + }; + + /** @ignore */ + ClientImpl.prototype._socket_send = function (wireMessage) { + if (wireMessage.type == 1) { + var wireMessageMasked = this._traceMask(wireMessage, "password"); + this._trace("Client._socket_send", wireMessageMasked); + } + else this._trace("Client._socket_send", wireMessage); + + this.socket.send(wireMessage.encode()); + /* We have proved to the server we are alive. */ + this.sendPinger.reset(); + }; + + /** @ignore */ + ClientImpl.prototype._receivePublish = function (wireMessage) { + switch (wireMessage.payloadMessage.qos) { + case "undefined": + case 0: + this._receiveMessage(wireMessage); + break; + + case 1: + var pubAckMessage = new WireMessage(MESSAGE_TYPE.PUBACK, {messageIdentifier: wireMessage.messageIdentifier}); + this._schedule_message(pubAckMessage); + this._receiveMessage(wireMessage); + break; + + case 2: + this._receivedMessages[wireMessage.messageIdentifier] = wireMessage; + this.store("Received:", wireMessage); + var pubRecMessage = new WireMessage(MESSAGE_TYPE.PUBREC, {messageIdentifier: wireMessage.messageIdentifier}); + this._schedule_message(pubRecMessage); + + break; + + default: + throw Error("Invaild qos=" + wireMmessage.payloadMessage.qos); + } + ; + }; + + /** @ignore */ + ClientImpl.prototype._receiveMessage = function (wireMessage) { + if (this.onMessageArrived) { + this.onMessageArrived(wireMessage.payloadMessage); + } + }; + + /** + * @ignore + * Client has disconnected either at its own request or because the server + * or network disconnected it. Remove all non-durable state. + * @param {errorCode} [number] the error number. + * @param {errorText} [string] the error text. + */ + ClientImpl.prototype._disconnected = function (errorCode, errorText) { + this._trace("Client._disconnected", errorCode, errorText); + + this.sendPinger.cancel(); + this.receivePinger.cancel(); + if (this._connectTimeout) + this._connectTimeout.cancel(); + // Clear message buffers. + this._msg_queue = []; + this._notify_msg_sent = {}; + + if (this.socket) { + // Cancel all socket callbacks so that they cannot be driven again by this socket. + this.socket.onopen = null; + this.socket.onmessage = null; + this.socket.onerror = null; + this.socket.onclose = null; + if (this.socket.readyState === 1) + this.socket.close(); + delete this.socket; + } + + if (this.connectOptions.hosts && this.hostIndex < this.connectOptions.hosts.length - 1) { + // Try the next host. + this.hostIndex++; + this._doConnect(this.connectOptions.hosts[this.hostIndex], this.connectOptions.ports[this.hostIndex]); + + } else { + + if (errorCode === undefined) { + errorCode = ERROR.OK.code; + errorText = format(ERROR.OK); + } + + // Run any application callbacks last as they may attempt to reconnect and hence create a new socket. + if (this.connected) { + this.connected = false; + // Execute the connectionLostCallback if there is one, and we were connected. + if (this.onConnectionLost) + this.onConnectionLost({errorCode: errorCode, errorMessage: errorText}); + } else { + // Otherwise we never had a connection, so indicate that the connect has failed. + if (this.connectOptions.onFailure) + this.connectOptions.onFailure({invocationContext: this.connectOptions.invocationContext, errorCode: errorCode, errorMessage: errorText}); + } + } + }; + + /** @ignore */ + ClientImpl.prototype._trace = function () { + if (this._traceBuffer !== null) { + for (var i = 0, max = arguments.length; i < max; i++) { + if (this._traceBuffer.length == this._MAX_TRACE_ENTRIES) { + this._traceBuffer.shift(); + } + if (i === 0) this._traceBuffer.push(arguments[i]); + else if (typeof arguments[i] === "undefined") this._traceBuffer.push(arguments[i]); + else this._traceBuffer.push(" " + JSON.stringify(arguments[i])); + } + ; + } + ; + }; + + /** @ignore */ + ClientImpl.prototype._traceMask = function (traceObject, masked) { + var traceObjectMasked = {}; + for (var attr in traceObject) { + if (traceObject.hasOwnProperty(attr)) { + if (attr == masked) + traceObjectMasked[attr] = "******"; + else + traceObjectMasked[attr] = traceObject[attr]; + } + } + return traceObjectMasked; + }; + + // ------------------------------------------------------------------------ + // Public Programming interface. + // ------------------------------------------------------------------------ + + /** + * The JavaScript application communicates to the server using a Messaging.Client object. + *

    + * Other programming languages, + * Java, + * C. + *

    + * Most applications will create just one Client object and then call its connect() method, + * however applications can create more than one Client object if they wish. + * In this case the combination of host, port and clientId attributes must be different for each Client object. + *

    + * The send, subscribe and unsubscribe methods are implemented as asynchronous JavaScript methods + * (even though the underlying protocol exchange might be synchronous in nature). + * This means they signal their completion by calling back to the application, + * via Success or Failure callback functions provided by the application on the method in question. + * Such callbacks are called at most once per method invocation and do not persist beyond the lifetime + * of the script that made the invocation. + *

    + * In contrast there are some callback functions most notably onMessageArrived + * that are defined on the Messaging.Client object. + * These may get called multiple times, and aren't directly related to specific method invocations made by the client. + * + * @name Messaging.Client + * + * @constructor + * Creates a Messaging.Client object that can be used to communicate with a Messaging server. + * + * @param {string} host the address of the messaging server, as a DNS name or dotted decimal IP address. + * @param {number} port the port number in the host to connect to. + * @param {string} clientId the Messaging client identifier, between 1 and 23 characters in length. + * + * @property {string} host read only the server's DNS hostname or dotted decimal IP address. + * @property {number} port read only the server's port. + * @property {string} clientId read only used when connecting to the server. + * @property {function} onConnectionLost called when a connection has been lost, + * after a connect() method has succeeded. + * Establish the call back used when a connection has been lost. The connection may be + * lost because the client initiates a disconnect or because the server or network + * cause the client to be disconnected. The disconnect call back may be called without + * the connectionComplete call back being invoked if, for example the client fails to + * connect. + * A single response object parameter is passed to the onConnectionLost callback containing the following fields: + *

      + *
    1. errorCode + *
    2. errorMessage + *
    + * @property {function} onMessageDelivered called when a message has been delivered. + * All processing that this Client will ever do has been completed. So, for example, + * in the case of a Qos=2 message sent by this client, the PubComp flow has been received from the server + * and the message has been removed from persistent storage before this callback is invoked. + * Parameters passed to the onMessageDelivered callback are: + *
      + *
    1. Messaging.Message that was delivered. + *
    + * @property {function} onMessageArrived called when a message has arrived in this Messaging.client. + * Parameters passed to the onMessageArrived callback are: + *
      + *
    1. Messaging.Message that has arrived. + *
    + */ + var Client = function (host, port, clientId) { + if (typeof host !== "string") + throw new Error(format(ERROR.INVALID_TYPE, [typeof host, "host"])); + if (typeof port !== "number" || port < 0) + throw new Error(format(ERROR.INVALID_TYPE, [typeof port, "port"])); + + var clientIdLength = 0; + for (var i = 0; i < clientId.length; i++) { + var charCode = clientId.charCodeAt(i); + if (0xD800 <= charCode && charCode <= 0xDBFF) { + i++; // Surrogate pair. + } + clientIdLength++; + } + if (typeof clientId !== "string" || clientIdLength < 1 | clientIdLength > 23) + throw new Error(format(ERROR.INVALID_ARGUMENT, [clientId, "clientId"])); + + var client = new ClientImpl(host, port, clientId); + this._getHost = function () { + return client.host; + }; + this._setHost = function () { + throw new Error(format(ERROR.UNSUPPORTED_OPERATION)); + }; + + this._getPort = function () { + return client.port; + }; + this._setPort = function () { + throw new Error(format(ERROR.UNSUPPORTED_OPERATION)); + }; + + this._getClientId = function () { + return client.clientId; + }; + this._setClientId = function () { + throw new Error(format(ERROR.UNSUPPORTED_OPERATION)); + }; + + this._getOnConnectionLost = function () { + return client.onConnectionLost; + }; + this._setOnConnectionLost = function (newOnConnectionLost) { + if (typeof newOnConnectionLost === "function") + client.onConnectionLost = newOnConnectionLost; + else + throw new Error(format(ERROR.INVALID_TYPE, [typeof newOnConnectionLost, "onConnectionLost"])); + }; + + this._getOnMessageDelivered = function () { + return client.onMessageDelivered; + }; + this._setOnMessageDelivered = function (newOnMessageDelivered) { + if (typeof newOnMessageDelivered === "function") + client.onMessageDelivered = newOnMessageDelivered; + else + throw new Error(format(ERROR.INVALID_TYPE, [typeof newOnMessageDelivered, "onMessageDelivered"])); + }; + + this._getOnMessageArrived = function () { + return client.onMessageArrived; + }; + this._setOnMessageArrived = function (newOnMessageArrived) { + if (typeof newOnMessageArrived === "function") + client.onMessageArrived = newOnMessageArrived; + else + throw new Error(format(ERROR.INVALID_TYPE, [typeof newOnMessageArrived, "onMessageArrived"])); + }; + + /** + * Connect this Messaging client to its server. + * + * @name Messaging.Client#connect + * @function + * @param {Object} [connectOptions] attributes used with the connection. + *

    + * Properties of the connect options are: + * @config {number} [timeout] If the connect has not succeeded within this number of seconds, it is deemed to have failed. + * The default is 30 seconds. + * @config {string} [userName] Authentication username for this connection. + * @config {string} [password] Authentication password for this connection. + * @config {Messaging.Message} [willMessage] sent by the server when the client disconnects abnormally. + * @config {Number} [keepAliveInterval] the server disconnects this client if there is no activity for this + * number of seconds. The default value of 60 seconds is assumed if not set. + * @config {boolean} [cleanSession] if true(default) the client and server persistent state is deleted on successful connect. + * @config {boolean} [useSSL] if present and true, use an SSL Websocket connection. + * @config {object} [invocationContext] passed to the onSuccess callback or onFailure callback. + * @config {function} [onSuccess] called when the connect acknowledgement has been received from the server. + * A single response object parameter is passed to the onSuccess callback containing the following fields: + *

      + *
    1. invocationContext as passed in to the onSuccess method in the connectOptions. + *
    + * @config {function} [onFailure] called when the connect request has failed or timed out. + * A single response object parameter is passed to the onFailure callback containing the following fields: + *
      + *
    1. invocationContext as passed in to the onFailure method in the connectOptions. + *
    2. errorCode a number indicating the nature of the error. + *
    3. errorMessage text describing the error. + *
    + * @config {Array} [hosts] If present this set of hostnames is tried in order in place + * of the host and port paramater on the construtor. The hosts and the matching ports are tried one at at time in order until + * one of then succeeds. + * @config {Array} [ports] If present this set of ports matching the hosts. + * @throws {InvalidState} if the client is not in disconnected state. The client must have received connectionLost + * or disconnected before calling connect for a second or subsequent time. + */ + this.connect = function (connectOptions) { + connectOptions = connectOptions || {}; + validate(connectOptions, {timeout: "number", + userName: "string", + password: "string", + willMessage: "object", + keepAliveInterval: "number", + cleanSession: "boolean", + useSSL: "boolean", + invocationContext: "object", + onSuccess: "function", + onFailure: "function", + hosts: "object", + ports: "object"}); + + // If no keep alive interval is set, assume 60 seconds. + if (connectOptions.keepAliveInterval === undefined) + connectOptions.keepAliveInterval = 60; + + if (connectOptions.willMessage) { + if (!(connectOptions.willMessage instanceof Message)) + throw new Error(format(ERROR.INVALID_TYPE, [connectOptions.willMessage, "connectOptions.willMessage"])); + // The will message must have a payload that can be represented as a string. + // Cause the willMessage to throw an exception if this is not the case. + connectOptions.willMessage.stringPayload; + + if (typeof connectOptions.willMessage.destinationName === "undefined") + throw new Error(format(ERROR.INVALID_TYPE, [typeof connectOptions.willMessage.destinationName, "connectOptions.willMessage.destinationName"])); + } + if (typeof connectOptions.cleanSession === "undefined") + connectOptions.cleanSession = true; + if (connectOptions.hosts) { + if (!connectOptions.ports) + throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.ports, "connectOptions.ports"])); + if (!(connectOptions.hosts instanceof Array)) + throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.hosts, "connectOptions.hosts"])); + if (!(connectOptions.ports instanceof Array)) + throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.ports, "connectOptions.ports"])); + if (connectOptions.hosts.length < 1) + throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.hosts, "connectOptions.hosts"])); + if (connectOptions.hosts.length != connectOptions.ports.length) + throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.ports, "connectOptions.ports"])); + for (var i = 0; i < connectOptions.hosts.length; i++) { + if (typeof connectOptions.hosts[i] !== "string") + throw new Error(format(ERROR.INVALID_TYPE, [typeof connectOptions.hosts[i], "connectOptions.hosts[" + i + "]"])); + if (typeof connectOptions.ports[i] !== "number" || connectOptions.ports[i] < 0) + throw new Error(format(ERROR.INVALID_TYPE, [typeof connectOptions.ports[i], "connectOptions.ports[" + i + "]"])); + } + } + + client.connect(connectOptions); + }; + + /** + * Subscribe for messages, request receipt of a copy of messages sent to the destinations described by the filter. + * + * @name Messaging.Client#subscribe + * @function + * @param {string} filter describing the destinations to receive messages from. + *
    + * @param {object} [subscribeOptions] used to control the subscription, as follows: + *

    + * @config {number} [qos] the maiximum qos of any publications sent as a result of making this subscription. + * @config {object} [invocationContext] passed to the onSuccess callback or onFailure callback. + * @config {function} [onSuccess] called when the subscribe acknowledgement has been received from the server. + * A single response object parameter is passed to the onSuccess callback containing the following fields: + *

      + *
    1. invocationContext if set in the subscribeOptions. + *
    + * @config {function} [onFailure] called when the subscribe request has failed or timed out. + * A single response object parameter is passed to the onFailure callback containing the following fields: + *
      + *
    1. invocationContext if set in the subscribeOptions. + *
    2. errorCode a number indicating the nature of the error. + *
    3. errorMessage text describing the error. + *
    + * @config {number} [timeout] which if present determines the number of seconds after which the onFailure calback is called + * the presence of a timeout does not prevent the onSuccess callback from being called when the MQTT Suback is eventually received. + * @throws {InvalidState} if the client is not in connected state. + */ + this.subscribe = function (filter, subscribeOptions) { + if (typeof filter !== "string") + throw new Error("Invalid argument:" + filter); + subscribeOptions = subscribeOptions || {}; + validate(subscribeOptions, {qos: "number", + invocationContext: "object", + onSuccess: "function", + onFailure: "function", + timeout: "number" + }); + if (subscribeOptions.timeout && !subscribeOptions.onFailure) + throw new Error("subscribeOptions.timeout specified with no onFailure callback."); + if (typeof subscribeOptions.qos !== "undefined" + && !(subscribeOptions.qos === 0 || subscribeOptions.qos === 1 || subscribeOptions.qos === 2 )) + throw new Error(format(ERROR.INVALID_ARGUMENT, [subscribeOptions.qos, "subscribeOptions.qos"])); + client.subscribe(filter, subscribeOptions); + }; + + /** + * Unsubscribe for messages, stop receiving messages sent to destinations described by the filter. + * + * @name Messaging.Client#unsubscribe + * @function + * @param {string} filter describing the destinations to receive messages from. + * @param {object} [unsubscribeOptions] used to control the subscription, as follows: + *

    + * @config {object} [invocationContext] passed to the onSuccess callback or onFailure callback. + * @config {function} [onSuccess] called when the unsubscribe acknowledgement has been receive dfrom the server. + * A single response object parameter is passed to the onSuccess callback containing the following fields: + *

      + *
    1. invocationContext if set in the unsubscribeOptions. + *
    + * @config {function} [onFailure] called when the unsubscribe request has failed or timed out. + * A single response object parameter is passed to the onFailure callback containing the following fields: + *
      + *
    1. invocationContext if set in the unsubscribeOptions. + *
    2. errorCode a number indicating the nature of the error. + *
    3. errorMessage text describing the error. + *
    + * @config {number} [timeout] which if present determines the number of seconds after which the onFailure callback is called, the + * presence of a timeout does not prevent the onSuccess callback from being called when the MQTT UnSuback is eventually received. + * @throws {InvalidState} if the client is not in connected state. + */ + this.unsubscribe = function (filter, unsubscribeOptions) { + if (typeof filter !== "string") + throw new Error("Invalid argument:" + filter); + unsubscribeOptions = unsubscribeOptions || {}; + validate(unsubscribeOptions, {invocationContext: "object", + onSuccess: "function", + onFailure: "function", + timeout: "number" + }); + if (unsubscribeOptions.timeout && !unsubscribeOptions.onFailure) + throw new Error("unsubscribeOptions.timeout specified with no onFailure callback."); + client.unsubscribe(filter, unsubscribeOptions); + }; + + /** + * Send a message to the consumers of the destination in the Message. + * + * @name Messaging.Client#send + * @function + * @param {Messaging.Message} message to send. + + * @throws {InvalidState} if the client is not in connected state. + */ + this.send = function (message) { + if (!(message instanceof Message)) + throw new Error("Invalid argument:" + typeof message); + if (typeof message.destinationName === "undefined") + throw new Error("Invalid parameter Message.destinationName:" + message.destinationName); + + client.send(message); + }; + + /** + * Normal disconnect of this Messaging client from its server. + * + * @name Messaging.Client#disconnect + * @function + * @throws {InvalidState} if the client is not in connected or connecting state. + */ + this.disconnect = function () { + client.disconnect(); + }; + + /** + * Get the contents of the trace log. + * + * @name Messaging.Client#getTraceLog + * @function + * @return {Object[]} tracebuffer containing the time ordered trace records. + */ + this.getTraceLog = function () { + return client.getTraceLog(); + } + + /** + * Start tracing. + * + * @name Messaging.Client#startTrace + * @function + */ + this.startTrace = function () { + client.startTrace(); + }; + + /** + * Stop tracing. + * + * @name Messaging.Client#stopTrace + * @function + */ + this.stopTrace = function () { + client.stopTrace(); + }; + }; + + Client.prototype = { + get host() { + return this._getHost(); + }, + set host(newHost) { + this._setHost(newHost); + }, + + get port() { + return this._getPort(); + }, + set port(newPort) { + this._setPort(newPort); + }, + + get clientId() { + return this._getClientId(); + }, + set clientId(newClientId) { + this._setClientId(newClientId); + }, + + get onConnectionLost() { + return this._getOnConnectionLost(); + }, + set onConnectionLost(newOnConnectionLost) { + this._setOnConnectionLost(newOnConnectionLost); + }, + + get onMessageDelivered() { + return this._getOnMessageDelivered(); + }, + set onMessageDelivered(newOnMessageDelivered) { + this._setOnMessageDelivered(newOnMessageDelivered); + }, + + get onMessageArrived() { + return this._getOnMessageArrived(); + }, + set onMessageArrived(newOnMessageArrived) { + this._setOnMessageArrived(newOnMessageArrived); + } + }; + + /** + * An application message, sent or received. + *

    + * Other programming languages, + * Java, + * C. + *

    + * All attributes may be null, which implies the default values. + * + * @name Messaging.Message + * @constructor + * @param {String|ArrayBuffer} payload The message data to be sent. + *

    + * @property {string} payloadString read only The payload as a string if the payload consists of valid UTF-8 characters. + * @property {ArrayBuffer} payloadBytes read only The payload as an ArrayBuffer. + *

    + * @property {string} destinationName mandatory The name of the destination to which the message is to be sent + * (for messages about to be sent) or the name of the destination from which the message has been received. + * (for messages received by the onMessage function). + *

    + * @property {number} qos The Quality of Service used to deliver the message. + *

    + *
    0 Best effort (default). + *
    1 At least once. + *
    2 Exactly once. + *
    + *

    + * @property {Boolean} retained If true, the message is to be retained by the server and delivered + * to both current and future subscriptions. + * If false the server only delivers the message to current subscribers, this is the default for new Messages. + * A received message has the retained boolean set to true if the message was published + * with the retained boolean set to true + * and the subscrption was made after the message has been published. + *

    + * @property {Boolean} duplicate read only If true, this message might be a duplicate of one which has already been received. + * This is only set on messages received from the server. + * + */ + var Message = function (newPayload) { + var payload; + if (typeof newPayload === "string" + || newPayload instanceof ArrayBuffer + || newPayload instanceof Int8Array + || newPayload instanceof Uint8Array + || newPayload instanceof Int16Array + || newPayload instanceof Uint16Array + || newPayload instanceof Int32Array + || newPayload instanceof Uint32Array + || newPayload instanceof Float32Array + || newPayload instanceof Float64Array + ) { + payload = newPayload; + } else { + throw (format(ERROR.INVALID_ARGUMENT, [newPayload, "newPayload"])); + } + + this._getPayloadString = function () { + if (typeof payload === "string") + return payload; + else + return parseUTF8(payload, 0, payload.length); + }; + + this._getPayloadBytes = function () { + if (typeof payload === "string") { + var buffer = new ArrayBuffer(UTF8Length(payload)); + var byteStream = new Uint8Array(buffer); + stringToUTF8(payload, byteStream, 0); + + return byteStream; + } else { + return payload; + } + ; + }; + + var destinationName = undefined; + this._getDestinationName = function () { + return destinationName; + }; + this._setDestinationName = function (newDestinationName) { + if (typeof newDestinationName === "string") + destinationName = newDestinationName; + else + throw new Error(format(ERROR.INVALID_ARGUMENT, [newDestinationName, "newDestinationName"])); + }; + + var qos = 0; + this._getQos = function () { + return qos; + }; + this._setQos = function (newQos) { + if (newQos === 0 || newQos === 1 || newQos === 2) + qos = newQos; + else + throw new Error("Invalid argument:" + newQos); + }; + + var retained = false; + this._getRetained = function () { + return retained; + }; + this._setRetained = function (newRetained) { + if (typeof newRetained === "boolean") + retained = newRetained; + else + throw new Error(format(ERROR.INVALID_ARGUMENT, [newRetained, "newRetained"])); + }; + + var duplicate = false; + this._getDuplicate = function () { + return duplicate; + }; + this._setDuplicate = function (newDuplicate) { + duplicate = newDuplicate; + }; + }; + + Message.prototype = { + get payloadString() { + return this._getPayloadString(); + }, + get payloadBytes() { + return this._getPayloadBytes(); + }, + + get destinationName() { + return this._getDestinationName(); + }, + set destinationName(newDestinationName) { + this._setDestinationName(newDestinationName); + }, + + get qos() { + return this._getQos(); + }, + set qos(newQos) { + this._setQos(newQos); + }, + + get retained() { + return this._getRetained(); + }, + set retained(newRetained) { + this._setRetained(newRetained); + }, + + get duplicate() { + return this._getDuplicate(); + }, + set duplicate(newDuplicate) { + this._setDuplicate(newDuplicate); + } + }; + + // Module contents. + return { + Client: Client, + Message: Message + }; +})(window); diff --git a/mqtt/rootfs/etc/apk/repositories b/mqtt/rootfs/etc/apk/repositories new file mode 100644 index 0000000..2f97f46 --- /dev/null +++ b/mqtt/rootfs/etc/apk/repositories @@ -0,0 +1,4 @@ +http://dl-cdn.alpinelinux.org/alpine/v3.7/main +http://dl-cdn.alpinelinux.org/alpine/v3.7/community +http://dl-cdn.alpinelinux.org/alpine/v3.8/main +http://dl-cdn.alpinelinux.org/alpine/v3.8/community \ No newline at end of file diff --git a/mqtt/rootfs/etc/cont-init.d/10-requirements.sh b/mqtt/rootfs/etc/cont-init.d/10-requirements.sh new file mode 100644 index 0000000..6b43446 --- /dev/null +++ b/mqtt/rootfs/etc/cont-init.d/10-requirements.sh @@ -0,0 +1,82 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# This files check if all user configuration requirements are met +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Checks for web client +if hass.config.true 'web.enabled'; then + # Require username / password + if ! hass.config.has_value 'web.username' \ + && ! ( \ + hass.config.exists 'leave_front_door_open' \ + && hass.config.true 'leave_front_door_open' \ + ); + then + hass.die 'You need to set a username!' + fi + + if ! hass.config.has_value 'web.password' \ + && ! ( \ + hass.config.exists 'leave_front_door_open' \ + && hass.config.true 'leave_front_door_open' \ + ); + then + hass.die 'You need to set a password!'; + fi + + # Require a secure password + if hass.config.has_value 'web.password' \ + && ! hass.config.is_safe_password 'web.password'; then + hass.die "Please choose a different password, this one is unsafe!" + fi +fi + +# Checks for broker +if hass.config.true 'broker.enabled'; then + # Require username / password + if ! hass.config.has_value 'broker.username' \ + && ! ( \ + hass.config.exists 'leave_front_door_open' \ + && hass.config.true 'leave_front_door_open' \ + ); + then + hass.die 'You need to set a username!' + fi + + if ! hass.config.has_value 'broker.password' \ + && ! ( \ + hass.config.exists 'leave_front_door_open' \ + && hass.config.true 'leave_front_door_open' \ + ); + then + hass.die 'You need to set a password!'; + fi + + # Require a secure password + if hass.config.has_value 'broker.password' \ + && ! hass.config.is_safe_password 'broker.password'; then + hass.die "Please choose a different password, this one is unsafe!" + fi +fi + +# Check SSL requirements, if enabled +if hass.config.true 'broker.ssl' || hass.config.true 'web.ssl'; then + if ! hass.config.has_value 'certfile'; then + hass.die 'SSL is enabled, but no certfile was specified' + fi + + if ! hass.config.has_value 'keyfile'; then + hass.die 'SSL is enabled, but no keyfile was specified' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'certfile')"; then + hass.die 'The configured certfile is not found' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'keyfile')"; then + hass.die 'The configured keyfile is not found' + fi +fi \ No newline at end of file diff --git a/mqtt/rootfs/etc/cont-init.d/20-mqtt_broker.sh b/mqtt/rootfs/etc/cont-init.d/20-mqtt_broker.sh new file mode 100644 index 0000000..cf88486 --- /dev/null +++ b/mqtt/rootfs/etc/cont-init.d/20-mqtt_broker.sh @@ -0,0 +1,73 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# Configures Hivemq for use with MQTT Broker & Web client +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Set config file +CONFIG='/opt/mosquitto.conf' + +# Remove config file if it exist +if hass.file_exists "$CONFIG"; then + rm "$CONFIG" +fi + +if hass.config.true 'broker.enabled'; then + hass.log.info 'Adding configuration for MQTT broker...' + # Create config file + touch "$CONFIG" + + # Set default config + echo "log_dest stdout" >> $CONFIG + echo "persistence true" >> $CONFIG + echo "persistence_location /data/" >> $CONFIG + + # Set websocket configurtation + if hass.config.true 'broker.enable_ws'; then + hass.log.info 'Setting configuration for websockets...' + echo "listener 1884" >> $CONFIG + echo "protocol websockets" >> $CONFIG + + # Set SSL configuration. + if hass.config.true 'broker.ssl'; then + echo "cafile /ssl/$(hass.config.get 'certfile')" >> $CONFIG + echo "certfile /ssl/$(hass.config.get 'certfile')" >> $CONFIG + echo "keyfile /ssl/$(hass.config.get 'keyfile')" >> $CONFIG + fi + fi + + # Set MQTT configurtation + if hass.config.true 'broker.enable_ws'; then + hass.log.info 'Setting configuration for mqtt...' + echo "listener 1883" >> $CONFIG + echo "protocol mqtt" >> $CONFIG + + # Set SSL configuration. + if hass.config.true 'broker.ssl'; then + echo "cafile /ssl/$(hass.config.get 'certfile')" >> $CONFIG + echo "certfile /ssl/$(hass.config.get 'certfile')" >> $CONFIG + echo "keyfile /ssl/$(hass.config.get 'keyfile')" >> $CONFIG + fi + fi + + # Allow anonymous auth? + if hass.config.true 'broker.allow_anonymous'; then + echo "allow_anonymous true" >> $CONFIG + else + echo "allow_anonymous false" >> $CONFIG + fi + + # Set username and password for the broker + if hass.config.has_value 'broker.username' \ + && hass.config.has_value 'broker.password'; then + touch /opt/pwfile + mosquitto_passwd -b /opt/pwfile "$(hass.config.get 'broker.username')" "$(hass.config.get 'broker.password')" + else + # Remove pefile if it should not be used + if hass.file_exists 'rm /opt/pwfile'; then + rm rm /opt/pwfile + fi + fi +fi \ No newline at end of file diff --git a/mqtt/rootfs/etc/cont-init.d/20-mqtt_web.sh b/mqtt/rootfs/etc/cont-init.d/20-mqtt_web.sh new file mode 100644 index 0000000..b9d48d2 --- /dev/null +++ b/mqtt/rootfs/etc/cont-init.d/20-mqtt_web.sh @@ -0,0 +1,28 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# Configures Hivemq for use with MQTT Broker & Web client +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +CONFIG='/app/config.js' + +# Remove config file if it exist +if hass.file_exists "$CONFIG"; then + rm "$CONFIG" +fi + +# Create config file +touch "$CONFIG" +echo "websocketserver = '""';" >> "$CONFIG" + +# Set default WS port +echo 'websocketport = 1884;' >> "$CONFIG" + +# Enable SSL for broker connection if enabled for the broker +if hass.config.true 'broker.ssl'; then + sed -i 's/%%SSL_VALUE%%/checked="checked"/' /app/index.html +else + sed -i 's/%%SSL_VALUE%%//' /app/index.html +fi \ No newline at end of file diff --git a/mqtt/rootfs/etc/cont-init.d/40-nginx.sh b/mqtt/rootfs/etc/cont-init.d/40-nginx.sh new file mode 100644 index 0000000..39cc748 --- /dev/null +++ b/mqtt/rootfs/etc/cont-init.d/40-nginx.sh @@ -0,0 +1,32 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# Configures NGINX for use with MQTT Broker & Web client +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +declare certfile +declare keyfile + +# Enable SSL +if hass.config.true 'web.ssl'; then + rm /etc/nginx/nginx.conf + mv /etc/nginx/nginx-ssl.conf /etc/nginx/nginx.conf + + certfile=$(hass.config.get 'certfile') + keyfile=$(hass.config.get 'keyfile') + + sed -i "s/%%certfile%%/${certfile}/g" /etc/nginx/nginx.conf + sed -i "s/%%keyfile%%/${keyfile}/g" /etc/nginx/nginx.conf +fi + +# Handles the HTTP auth part +if ! hass.config.has_value 'web.username'; then + hass.log.warning "Username/password protection is disabled!" + sed -i '/auth_basic.*/d' /etc/nginx/nginx.conf +else + username=$(hass.config.get 'web.username') + password=$(hass.config.get 'web.password') + htpasswd -bc /etc/nginx/.htpasswd "${username}" "${password}" +fi diff --git a/mqtt/rootfs/etc/nginx/.htpasswd b/mqtt/rootfs/etc/nginx/.htpasswd new file mode 100644 index 0000000..e69de29 diff --git a/mqtt/rootfs/etc/nginx/nginx-ssl.conf b/mqtt/rootfs/etc/nginx/nginx-ssl.conf new file mode 100644 index 0000000..6d267b1 --- /dev/null +++ b/mqtt/rootfs/etc/nginx/nginx-ssl.conf @@ -0,0 +1,32 @@ +worker_processes 1; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + server { + server_name hassio.local; + listen 5713 default_server ssl; + root /app; + auth_basic "Restricted"; + auth_basic_user_file /etc/nginx/.htpasswd; + ssl_certificate /ssl/%%certfile%%; + ssl_certificate_key /ssl/%%keyfile%%; + ssl_protocols TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA; + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; + ssl_stapling on; + ssl_stapling_verify on; + } +} \ No newline at end of file diff --git a/mqtt/rootfs/etc/nginx/nginx.conf b/mqtt/rootfs/etc/nginx/nginx.conf new file mode 100644 index 0000000..4695ee3 --- /dev/null +++ b/mqtt/rootfs/etc/nginx/nginx.conf @@ -0,0 +1,21 @@ +worker_processes 1; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + server { + server_name hassio.local; + listen 5713 default_server; + root /app; + auth_basic "Restricted"; + auth_basic_user_file /etc/nginx/.htpasswd; + } +} \ No newline at end of file diff --git a/mqtt/rootfs/etc/services.d/mosquitto/finish b/mqtt/rootfs/etc/services.d/mosquitto/finish new file mode 100644 index 0000000..f2d5e02 --- /dev/null +++ b/mqtt/rootfs/etc/services.d/mosquitto/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# Take down the S6 supervision tree when MQTT broker +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/mqtt/rootfs/etc/services.d/mosquitto/run b/mqtt/rootfs/etc/services.d/mosquitto/run new file mode 100644 index 0000000..2ae9f4a --- /dev/null +++ b/mqtt/rootfs/etc/services.d/mosquitto/run @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# Runs the MQTT broker +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +hass.log.info "Starting mosquitto MQTT broker..." +exec mosquitto -c /opt/mosquitto.conf \ No newline at end of file diff --git a/mqtt/rootfs/etc/services.d/nginx/finish b/mqtt/rootfs/etc/services.d/nginx/finish new file mode 100644 index 0000000..9b16114 --- /dev/null +++ b/mqtt/rootfs/etc/services.d/nginx/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# Take down the S6 supervision tree when NGINX fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/mqtt/rootfs/etc/services.d/nginx/run b/mqtt/rootfs/etc/services.d/nginx/run new file mode 100644 index 0000000..91e1d92 --- /dev/null +++ b/mqtt/rootfs/etc/services.d/nginx/run @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: MQTT Broker & Web client +# Runs the NGINX daemon +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +hass.log.info "Starting NGINX for the MQTT client..." +exec nginx -g "daemon off;"