diff --git a/.babelrc b/.babelrc
new file mode 100644
index 00000000..ff3059c3
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,3 @@
+{
+ "presets": ["@babel/preset-env"]
+}
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 2142bc5c..80fbccd5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,6 +5,8 @@ go:
- 1.9
- "1.10"
- 1.11
+ - 1.12
+ - 1.13
- tip
install:
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..f196e216
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,45 @@
+# Minify client side assets (JavaScript)
+FROM node:latest AS build-js
+
+RUN npm install gulp gulp-cli -g
+
+WORKDIR /build
+COPY . .
+RUN npm install --only=dev
+RUN gulp
+
+
+# Build Golang binary
+FROM golang:1.11 AS build-golang
+
+WORKDIR /go/src/github.com/gophish/gophish
+COPY . .
+RUN go get -v && go build -v
+
+
+# Runtime container
+FROM debian:stable-slim
+
+RUN useradd -m -d /opt/gophish -s /bin/bash app
+
+RUN apt-get update && \
+ apt-get install --no-install-recommends -y jq libcap2-bin && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+WORKDIR /opt/gophish
+COPY --from=build-golang /go/src/github.com/gophish/gophish/ ./
+COPY --from=build-js /build/static/js/dist/ ./static/js/dist/
+COPY --from=build-js /build/static/css/dist/ ./static/css/dist/
+COPY --from=build-golang /go/src/github.com/gophish/gophish/config.json ./
+RUN chown app. config.json
+
+RUN setcap 'cap_net_bind_service=+ep' /opt/gophish/gophish
+
+USER app
+RUN sed -i 's/127.0.0.1/0.0.0.0/g' config.json
+RUN touch config.json.tmp
+
+EXPOSE 3333 8080 8443
+
+CMD ["./docker/run.sh"]
diff --git a/auth/auth.go b/auth/auth.go
index 595ed732..3cdc07d0 100644
--- a/auth/auth.go
+++ b/auth/auth.go
@@ -1,49 +1,24 @@
package auth
import (
- "encoding/gob"
"errors"
- "fmt"
- "io"
"net/http"
- "crypto/rand"
-
ctx "github.com/gophish/gophish/context"
- log "github.com/gophish/gophish/logger"
"github.com/gophish/gophish/models"
- "github.com/gorilla/securecookie"
- "github.com/gorilla/sessions"
- "github.com/jinzhu/gorm"
"golang.org/x/crypto/bcrypt"
)
-//init registers the necessary models to be saved in the session later
-func init() {
- gob.Register(&models.User{})
- gob.Register(&models.Flash{})
- Store.Options.HttpOnly = true
- // This sets the maxAge to 5 days for all cookies
- Store.MaxAge(86400 * 5)
-}
-
-// Store contains the session information for the request
-var Store = sessions.NewCookieStore(
- []byte(securecookie.GenerateRandomKey(64)), //Signing key
- []byte(securecookie.GenerateRandomKey(32)))
-
// ErrInvalidPassword is thrown when a user provides an incorrect password.
var ErrInvalidPassword = errors.New("Invalid Password")
+// ErrPasswordMismatch is thrown when a user provides a blank password to the register
+// or change password functions
+var ErrPasswordMismatch = errors.New("Password cannot be blank")
+
// ErrEmptyPassword is thrown when a user provides a blank password to the register
// or change password functions
-var ErrEmptyPassword = errors.New("Password cannot be blank")
-
-// ErrPasswordMismatch is thrown when a user provides passwords that do not match
-var ErrPasswordMismatch = errors.New("Passwords must match")
-
-// ErrUsernameTaken is thrown when a user attempts to register a username that is taken.
-var ErrUsernameTaken = errors.New("Username already taken")
+var ErrEmptyPassword = errors.New("No password provided")
// Login attempts to login the user given a request.
func Login(r *http.Request) (bool, models.User, error) {
@@ -61,54 +36,6 @@ func Login(r *http.Request) (bool, models.User, error) {
return true, u, nil
}
-// Register attempts to register the user given a request.
-func Register(r *http.Request) (bool, error) {
- username := r.FormValue("username")
- newPassword := r.FormValue("password")
- confirmPassword := r.FormValue("confirm_password")
- u, err := models.GetUserByUsername(username)
- // If the given username already exists, throw an error and return false
- if err == nil {
- return false, ErrUsernameTaken
- }
-
- // If we have an error which is not simply indicating that no user was found, report it
- if err != nil && err != gorm.ErrRecordNotFound {
- log.Warn(err)
- return false, err
- }
-
- u = models.User{}
- // If we've made it here, we should have a valid username given
- // Check that the passsword isn't blank
- if newPassword == "" {
- return false, ErrEmptyPassword
- }
- // Make sure passwords match
- if newPassword != confirmPassword {
- return false, ErrPasswordMismatch
- }
- // Let's create the password hash
- h, err := bcrypt.GenerateFromPassword([]byte(newPassword), bcrypt.DefaultCost)
- if err != nil {
- return false, err
- }
- u.Username = username
- u.Hash = string(h)
- u.ApiKey = GenerateSecureKey()
- err = models.PutUser(&u)
- return true, nil
-}
-
-// GenerateSecureKey creates a secure key to use
-// as an API key
-func GenerateSecureKey() string {
- // Inspired from gorilla/securecookie
- k := make([]byte, 32)
- io.ReadFull(rand.Reader, k)
- return fmt.Sprintf("%x", k)
-}
-
// ChangePassword verifies the current password provided in the request and,
// if it's valid, changes the password for the authenticated user.
func ChangePassword(r *http.Request) error {
diff --git a/config/config.go b/config/config.go
index ba81e2f1..ccb6d639 100644
--- a/config/config.go
+++ b/config/config.go
@@ -32,6 +32,7 @@ type Config struct {
PhishConf PhishServer `json:"phish_server"`
DBName string `json:"db_name"`
DBPath string `json:"db_path"`
+ DBSSLCaPath string `json:"db_sslca_path"`
MigrationsPath string `json:"migrations_prefix"`
TestFlag bool `json:"test_flag"`
ContactAddress string `json:"contact_address"`
diff --git a/controllers/api.go b/controllers/api.go
deleted file mode 100644
index a4341355..00000000
--- a/controllers/api.go
+++ /dev/null
@@ -1,772 +0,0 @@
-package controllers
-
-import (
- "bytes"
- "crypto/tls"
- "encoding/json"
- "errors"
- "fmt"
- "net/http"
- "strconv"
- "strings"
- "time"
-
- "github.com/PuerkitoBio/goquery"
- "github.com/gophish/gophish/auth"
- ctx "github.com/gophish/gophish/context"
- log "github.com/gophish/gophish/logger"
- "github.com/gophish/gophish/models"
- "github.com/gophish/gophish/util"
- "github.com/gorilla/mux"
- "github.com/jinzhu/gorm"
- "github.com/jordan-wright/email"
- "github.com/sirupsen/logrus"
-)
-
-// APIReset (/api/reset) resets the currently authenticated user's API key
-func (as *AdminServer) APIReset(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "POST":
- u := ctx.Get(r, "user").(models.User)
- u.ApiKey = auth.GenerateSecureKey()
- err := models.PutUser(&u)
- if err != nil {
- http.Error(w, "Error setting API Key", http.StatusInternalServerError)
- } else {
- JSONResponse(w, models.Response{Success: true, Message: "API Key successfully reset!", Data: u.ApiKey}, http.StatusOK)
- }
- }
-}
-
-// APICampaigns returns a list of campaigns if requested via GET.
-// If requested via POST, APICampaigns creates a new campaign and returns a reference to it.
-func (as *AdminServer) APICampaigns(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- cs, err := models.GetCampaigns(ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- }
- JSONResponse(w, cs, http.StatusOK)
- //POST: Create a new campaign and return it as JSON
- case r.Method == "POST":
- c := models.Campaign{}
- // Put the request into a campaign
- err := json.NewDecoder(r.Body).Decode(&c)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Invalid JSON structure"}, http.StatusBadRequest)
- return
- }
- err = models.PostCampaign(&c, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- // If the campaign is scheduled to launch immediately, send it to the worker.
- // Otherwise, the worker will pick it up at the scheduled time
- if c.Status == models.CampaignInProgress {
- go as.worker.LaunchCampaign(c)
- }
- JSONResponse(w, c, http.StatusCreated)
- }
-}
-
-// APICampaignsSummary returns the summary for the current user's campaigns
-func (as *AdminServer) APICampaignsSummary(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- cs, err := models.GetCampaignSummaries(ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, cs, http.StatusOK)
- }
-}
-
-// APICampaign returns details about the requested campaign. If the campaign is not
-// valid, APICampaign returns null.
-func (as *AdminServer) APICampaign(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- c, err := models.GetCampaign(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: "Campaign not found"}, http.StatusNotFound)
- return
- }
- switch {
- case r.Method == "GET":
- JSONResponse(w, c, http.StatusOK)
- case r.Method == "DELETE":
- err = models.DeleteCampaign(id)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error deleting campaign"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, models.Response{Success: true, Message: "Campaign deleted successfully!"}, http.StatusOK)
- }
-}
-
-// APICampaignResults returns just the results for a given campaign to
-// significantly reduce the information returned.
-func (as *AdminServer) APICampaignResults(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- cr, err := models.GetCampaignResults(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: "Campaign not found"}, http.StatusNotFound)
- return
- }
- if r.Method == "GET" {
- JSONResponse(w, cr, http.StatusOK)
- return
- }
-}
-
-// APICampaignSummary returns the summary for a given campaign.
-func (as *AdminServer) APICampaignSummary(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- switch {
- case r.Method == "GET":
- cs, err := models.GetCampaignSummary(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- if err == gorm.ErrRecordNotFound {
- JSONResponse(w, models.Response{Success: false, Message: "Campaign not found"}, http.StatusNotFound)
- } else {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- }
- log.Error(err)
- return
- }
- JSONResponse(w, cs, http.StatusOK)
- }
-}
-
-// APICampaignComplete effectively "ends" a campaign.
-// Future phishing emails clicked will return a simple "404" page.
-func (as *AdminServer) APICampaignComplete(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- switch {
- case r.Method == "GET":
- err := models.CompleteCampaign(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error completing campaign"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, models.Response{Success: true, Message: "Campaign completed successfully!"}, http.StatusOK)
- }
-}
-
-// APIGroups returns a list of groups if requested via GET.
-// If requested via POST, APIGroups creates a new group and returns a reference to it.
-func (as *AdminServer) APIGroups(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- gs, err := models.GetGroups(ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "No groups found"}, http.StatusNotFound)
- return
- }
- JSONResponse(w, gs, http.StatusOK)
- //POST: Create a new group and return it as JSON
- case r.Method == "POST":
- g := models.Group{}
- // Put the request into a group
- err := json.NewDecoder(r.Body).Decode(&g)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Invalid JSON structure"}, http.StatusBadRequest)
- return
- }
- _, err = models.GetGroupByName(g.Name, ctx.Get(r, "user_id").(int64))
- if err != gorm.ErrRecordNotFound {
- JSONResponse(w, models.Response{Success: false, Message: "Group name already in use"}, http.StatusConflict)
- return
- }
- g.ModifiedDate = time.Now().UTC()
- g.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PostGroup(&g)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- JSONResponse(w, g, http.StatusCreated)
- }
-}
-
-// APIGroupsSummary returns a summary of the groups owned by the current user.
-func (as *AdminServer) APIGroupsSummary(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- gs, err := models.GetGroupSummaries(ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, gs, http.StatusOK)
- }
-}
-
-// APIGroup returns details about the requested group.
-// If the group is not valid, APIGroup returns null.
-func (as *AdminServer) APIGroup(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- g, err := models.GetGroup(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Group not found"}, http.StatusNotFound)
- return
- }
- switch {
- case r.Method == "GET":
- JSONResponse(w, g, http.StatusOK)
- case r.Method == "DELETE":
- err = models.DeleteGroup(&g)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error deleting group"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, models.Response{Success: true, Message: "Group deleted successfully!"}, http.StatusOK)
- case r.Method == "PUT":
- // Change this to get from URL and uid (don't bother with id in r.Body)
- g = models.Group{}
- err = json.NewDecoder(r.Body).Decode(&g)
- if g.Id != id {
- JSONResponse(w, models.Response{Success: false, Message: "Error: /:id and group_id mismatch"}, http.StatusInternalServerError)
- return
- }
- g.ModifiedDate = time.Now().UTC()
- g.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PutGroup(&g)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- JSONResponse(w, g, http.StatusOK)
- }
-}
-
-// APIGroupSummary returns a summary of the groups owned by the current user.
-func (as *AdminServer) APIGroupSummary(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- g, err := models.GetGroupSummary(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Group not found"}, http.StatusNotFound)
- return
- }
- JSONResponse(w, g, http.StatusOK)
- }
-}
-
-// APITemplates handles the functionality for the /api/templates endpoint
-func (as *AdminServer) APITemplates(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- ts, err := models.GetTemplates(ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- }
- JSONResponse(w, ts, http.StatusOK)
- //POST: Create a new template and return it as JSON
- case r.Method == "POST":
- t := models.Template{}
- // Put the request into a template
- err := json.NewDecoder(r.Body).Decode(&t)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Invalid JSON structure"}, http.StatusBadRequest)
- return
- }
- _, err = models.GetTemplateByName(t.Name, ctx.Get(r, "user_id").(int64))
- if err != gorm.ErrRecordNotFound {
- JSONResponse(w, models.Response{Success: false, Message: "Template name already in use"}, http.StatusConflict)
- return
- }
- t.ModifiedDate = time.Now().UTC()
- t.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PostTemplate(&t)
- if err == models.ErrTemplateNameNotSpecified {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- if err == models.ErrTemplateMissingParameter {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error inserting template into database"}, http.StatusInternalServerError)
- log.Error(err)
- return
- }
- JSONResponse(w, t, http.StatusCreated)
- }
-}
-
-// APITemplate handles the functions for the /api/templates/:id endpoint
-func (as *AdminServer) APITemplate(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- t, err := models.GetTemplate(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Template not found"}, http.StatusNotFound)
- return
- }
- switch {
- case r.Method == "GET":
- JSONResponse(w, t, http.StatusOK)
- case r.Method == "DELETE":
- err = models.DeleteTemplate(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error deleting template"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, models.Response{Success: true, Message: "Template deleted successfully!"}, http.StatusOK)
- case r.Method == "PUT":
- t = models.Template{}
- err = json.NewDecoder(r.Body).Decode(&t)
- if err != nil {
- log.Error(err)
- }
- if t.Id != id {
- JSONResponse(w, models.Response{Success: false, Message: "Error: /:id and template_id mismatch"}, http.StatusBadRequest)
- return
- }
- t.ModifiedDate = time.Now().UTC()
- t.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PutTemplate(&t)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- JSONResponse(w, t, http.StatusOK)
- }
-}
-
-// APIPages handles requests for the /api/pages/ endpoint
-func (as *AdminServer) APIPages(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- ps, err := models.GetPages(ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- }
- JSONResponse(w, ps, http.StatusOK)
- //POST: Create a new page and return it as JSON
- case r.Method == "POST":
- p := models.Page{}
- // Put the request into a page
- err := json.NewDecoder(r.Body).Decode(&p)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Invalid request"}, http.StatusBadRequest)
- return
- }
- // Check to make sure the name is unique
- _, err = models.GetPageByName(p.Name, ctx.Get(r, "user_id").(int64))
- if err != gorm.ErrRecordNotFound {
- JSONResponse(w, models.Response{Success: false, Message: "Page name already in use"}, http.StatusConflict)
- log.Error(err)
- return
- }
- p.ModifiedDate = time.Now().UTC()
- p.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PostPage(&p)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, p, http.StatusCreated)
- }
-}
-
-// APIPage contains functions to handle the GET'ing, DELETE'ing, and PUT'ing
-// of a Page object
-func (as *AdminServer) APIPage(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- p, err := models.GetPage(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Page not found"}, http.StatusNotFound)
- return
- }
- switch {
- case r.Method == "GET":
- JSONResponse(w, p, http.StatusOK)
- case r.Method == "DELETE":
- err = models.DeletePage(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error deleting page"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, models.Response{Success: true, Message: "Page Deleted Successfully"}, http.StatusOK)
- case r.Method == "PUT":
- p = models.Page{}
- err = json.NewDecoder(r.Body).Decode(&p)
- if err != nil {
- log.Error(err)
- }
- if p.Id != id {
- JSONResponse(w, models.Response{Success: false, Message: "/:id and /:page_id mismatch"}, http.StatusBadRequest)
- return
- }
- p.ModifiedDate = time.Now().UTC()
- p.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PutPage(&p)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error updating page: " + err.Error()}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, p, http.StatusOK)
- }
-}
-
-// APISendingProfiles handles requests for the /api/smtp/ endpoint
-func (as *AdminServer) APISendingProfiles(w http.ResponseWriter, r *http.Request) {
- switch {
- case r.Method == "GET":
- ss, err := models.GetSMTPs(ctx.Get(r, "user_id").(int64))
- if err != nil {
- log.Error(err)
- }
- JSONResponse(w, ss, http.StatusOK)
- //POST: Create a new SMTP and return it as JSON
- case r.Method == "POST":
- s := models.SMTP{}
- // Put the request into a page
- err := json.NewDecoder(r.Body).Decode(&s)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Invalid request"}, http.StatusBadRequest)
- return
- }
- // Check to make sure the name is unique
- _, err = models.GetSMTPByName(s.Name, ctx.Get(r, "user_id").(int64))
- if err != gorm.ErrRecordNotFound {
- JSONResponse(w, models.Response{Success: false, Message: "SMTP name already in use"}, http.StatusConflict)
- log.Error(err)
- return
- }
- s.ModifiedDate = time.Now().UTC()
- s.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PostSMTP(&s)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, s, http.StatusCreated)
- }
-}
-
-// APISendingProfile contains functions to handle the GET'ing, DELETE'ing, and PUT'ing
-// of a SMTP object
-func (as *AdminServer) APISendingProfile(w http.ResponseWriter, r *http.Request) {
- vars := mux.Vars(r)
- id, _ := strconv.ParseInt(vars["id"], 0, 64)
- s, err := models.GetSMTP(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "SMTP not found"}, http.StatusNotFound)
- return
- }
- switch {
- case r.Method == "GET":
- JSONResponse(w, s, http.StatusOK)
- case r.Method == "DELETE":
- err = models.DeleteSMTP(id, ctx.Get(r, "user_id").(int64))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error deleting SMTP"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, models.Response{Success: true, Message: "SMTP Deleted Successfully"}, http.StatusOK)
- case r.Method == "PUT":
- s = models.SMTP{}
- err = json.NewDecoder(r.Body).Decode(&s)
- if err != nil {
- log.Error(err)
- }
- if s.Id != id {
- JSONResponse(w, models.Response{Success: false, Message: "/:id and /:smtp_id mismatch"}, http.StatusBadRequest)
- return
- }
- err = s.Validate()
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- s.ModifiedDate = time.Now().UTC()
- s.UserId = ctx.Get(r, "user_id").(int64)
- err = models.PutSMTP(&s)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error updating page"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, s, http.StatusOK)
- }
-}
-
-// APIImportGroup imports a CSV of group members
-func (as *AdminServer) APIImportGroup(w http.ResponseWriter, r *http.Request) {
- ts, err := util.ParseCSV(r)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error parsing CSV"}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, ts, http.StatusOK)
- return
-}
-
-// APIImportEmail allows for the importing of email.
-// Returns a Message object
-func (as *AdminServer) APIImportEmail(w http.ResponseWriter, r *http.Request) {
- if r.Method != "POST" {
- JSONResponse(w, models.Response{Success: false, Message: "Method not allowed"}, http.StatusBadRequest)
- return
- }
- ir := struct {
- Content string `json:"content"`
- ConvertLinks bool `json:"convert_links"`
- }{}
- err := json.NewDecoder(r.Body).Decode(&ir)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error decoding JSON Request"}, http.StatusBadRequest)
- return
- }
- e, err := email.NewEmailFromReader(strings.NewReader(ir.Content))
- if err != nil {
- log.Error(err)
- }
- // If the user wants to convert links to point to
- // the landing page, let's make it happen by changing up
- // e.HTML
- if ir.ConvertLinks {
- d, err := goquery.NewDocumentFromReader(bytes.NewReader(e.HTML))
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- d.Find("a").Each(func(i int, a *goquery.Selection) {
- a.SetAttr("href", "{{.URL}}")
- })
- h, err := d.Html()
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- e.HTML = []byte(h)
- }
- er := emailResponse{
- Subject: e.Subject,
- Text: string(e.Text),
- HTML: string(e.HTML),
- }
- JSONResponse(w, er, http.StatusOK)
- return
-}
-
-// APIImportSite allows for the importing of HTML from a website
-// Without "include_resources" set, it will merely place a "base" tag
-// so that all resources can be loaded relative to the given URL.
-func (as *AdminServer) APIImportSite(w http.ResponseWriter, r *http.Request) {
- cr := cloneRequest{}
- if r.Method != "POST" {
- JSONResponse(w, models.Response{Success: false, Message: "Method not allowed"}, http.StatusBadRequest)
- return
- }
- err := json.NewDecoder(r.Body).Decode(&cr)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error decoding JSON Request"}, http.StatusBadRequest)
- return
- }
- if err = cr.validate(); err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- tr := &http.Transport{
- TLSClientConfig: &tls.Config{
- InsecureSkipVerify: true,
- },
- }
- client := &http.Client{Transport: tr}
- resp, err := client.Get(cr.URL)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- // Insert the base href tag to better handle relative resources
- d, err := goquery.NewDocumentFromResponse(resp)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- // Assuming we don't want to include resources, we'll need a base href
- if d.Find("head base").Length() == 0 {
- d.Find("head").PrependHtml(fmt.Sprintf("", cr.URL))
- }
- forms := d.Find("form")
- forms.Each(func(i int, f *goquery.Selection) {
- // We'll want to store where we got the form from
- // (the current URL)
- url := f.AttrOr("action", cr.URL)
- if !strings.HasPrefix(url, "http") {
- url = fmt.Sprintf("%s%s", cr.URL, url)
- }
- f.PrependHtml(fmt.Sprintf("", url))
- })
- h, err := d.Html()
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- cs := cloneResponse{HTML: h}
- JSONResponse(w, cs, http.StatusOK)
- return
-}
-
-// APISendTestEmail sends a test email using the template name
-// and Target given.
-func (as *AdminServer) APISendTestEmail(w http.ResponseWriter, r *http.Request) {
- s := &models.EmailRequest{
- ErrorChan: make(chan error),
- UserId: ctx.Get(r, "user_id").(int64),
- }
- if r.Method != "POST" {
- JSONResponse(w, models.Response{Success: false, Message: "Method not allowed"}, http.StatusBadRequest)
- return
- }
- err := json.NewDecoder(r.Body).Decode(s)
- if err != nil {
- JSONResponse(w, models.Response{Success: false, Message: "Error decoding JSON Request"}, http.StatusBadRequest)
- return
- }
-
- storeRequest := false
-
- // If a Template is not specified use a default
- if s.Template.Name == "" {
- //default message body
- text := "It works!\n\nThis is an email letting you know that your gophish\nconfiguration was successful.\n" +
- "Here are the details:\n\nWho you sent from: {{.From}}\n\nWho you sent to: \n" +
- "{{if .FirstName}} First Name: {{.FirstName}}\n{{end}}" +
- "{{if .LastName}} Last Name: {{.LastName}}\n{{end}}" +
- "{{if .Position}} Position: {{.Position}}\n{{end}}" +
- "\nNow go send some phish!"
- t := models.Template{
- Subject: "Default Email from Gophish",
- Text: text,
- }
- s.Template = t
- } else {
- // Get the Template requested by name
- s.Template, err = models.GetTemplateByName(s.Template.Name, s.UserId)
- if err == gorm.ErrRecordNotFound {
- log.WithFields(logrus.Fields{
- "template": s.Template.Name,
- }).Error("Template does not exist")
- JSONResponse(w, models.Response{Success: false, Message: models.ErrTemplateNotFound.Error()}, http.StatusBadRequest)
- return
- } else if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- s.TemplateId = s.Template.Id
- // We'll only save the test request to the database if there is a
- // user-specified template to use.
- storeRequest = true
- }
-
- if s.Page.Name != "" {
- s.Page, err = models.GetPageByName(s.Page.Name, s.UserId)
- if err == gorm.ErrRecordNotFound {
- log.WithFields(logrus.Fields{
- "page": s.Page.Name,
- }).Error("Page does not exist")
- JSONResponse(w, models.Response{Success: false, Message: models.ErrPageNotFound.Error()}, http.StatusBadRequest)
- return
- } else if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- s.PageId = s.Page.Id
- }
-
- // If a complete sending profile is provided use it
- if err := s.SMTP.Validate(); err != nil {
- // Otherwise get the SMTP requested by name
- smtp, lookupErr := models.GetSMTPByName(s.SMTP.Name, s.UserId)
- // If the Sending Profile doesn't exist, let's err on the side
- // of caution and assume that the validation failure was more important.
- if lookupErr != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
- s.SMTP = smtp
- }
- s.FromAddress = s.SMTP.FromAddress
-
- // Validate the given request
- if err = s.Validate(); err != nil {
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
- return
- }
-
- // Store the request if this wasn't the default template
- if storeRequest {
- err = models.PostEmailRequest(s)
- if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- }
- // Send the test email
- err = as.worker.SendTestEmail(s)
- if err != nil {
- log.Error(err)
- JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
- return
- }
- JSONResponse(w, models.Response{Success: true, Message: "Email Sent"}, http.StatusOK)
- return
-}
-
-// JSONResponse attempts to set the status code, c, and marshal the given interface, d, into a response that
-// is written to the given ResponseWriter.
-func JSONResponse(w http.ResponseWriter, d interface{}, c int) {
- dj, err := json.MarshalIndent(d, "", " ")
- if err != nil {
- http.Error(w, "Error creating JSON response", http.StatusInternalServerError)
- log.Error(err)
- }
- w.Header().Set("Content-Type", "application/json")
- w.WriteHeader(c)
- fmt.Fprintf(w, "%s", dj)
-}
-
-type cloneRequest struct {
- URL string `json:"url"`
- IncludeResources bool `json:"include_resources"`
-}
-
-func (cr *cloneRequest) validate() error {
- if cr.URL == "" {
- return errors.New("No URL Specified")
- }
- return nil
-}
-
-type cloneResponse struct {
- HTML string `json:"html"`
-}
-
-type emailResponse struct {
- Text string `json:"text"`
- HTML string `json:"html"`
- Subject string `json:"subject"`
-}
diff --git a/controllers/api/api_test.go b/controllers/api/api_test.go
new file mode 100644
index 00000000..09339799
--- /dev/null
+++ b/controllers/api/api_test.go
@@ -0,0 +1,133 @@
+package api
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "testing"
+
+ "github.com/gophish/gophish/config"
+ "github.com/gophish/gophish/models"
+ "github.com/stretchr/testify/suite"
+)
+
+type APISuite struct {
+ suite.Suite
+ apiKey string
+ config *config.Config
+ apiServer *Server
+ admin models.User
+}
+
+func (s *APISuite) SetupSuite() {
+ conf := &config.Config{
+ DBName: "sqlite3",
+ DBPath: ":memory:",
+ MigrationsPath: "../../db/db_sqlite3/migrations/",
+ }
+ err := models.Setup(conf)
+ if err != nil {
+ s.T().Fatalf("Failed creating database: %v", err)
+ }
+ s.config = conf
+ s.Nil(err)
+ // Get the API key to use for these tests
+ u, err := models.GetUser(1)
+ s.Nil(err)
+ s.apiKey = u.ApiKey
+ s.admin = u
+ // Move our cwd up to the project root for help with resolving
+ // static assets
+ err = os.Chdir("../")
+ s.Nil(err)
+ s.apiServer = NewServer()
+}
+
+func (s *APISuite) TearDownTest() {
+ campaigns, _ := models.GetCampaigns(1)
+ for _, campaign := range campaigns {
+ models.DeleteCampaign(campaign.Id)
+ }
+ // Cleanup all users except the original admin
+ users, _ := models.GetUsers()
+ for _, user := range users {
+ if user.Id == 1 {
+ continue
+ }
+ err := models.DeleteUser(user.Id)
+ s.Nil(err)
+ }
+}
+
+func (s *APISuite) SetupTest() {
+ // Add a group
+ group := models.Group{Name: "Test Group"}
+ group.Targets = []models.Target{
+ models.Target{BaseRecipient: models.BaseRecipient{Email: "test1@example.com", FirstName: "First", LastName: "Example"}},
+ models.Target{BaseRecipient: models.BaseRecipient{Email: "test2@example.com", FirstName: "Second", LastName: "Example"}},
+ }
+ group.UserId = 1
+ models.PostGroup(&group)
+
+ // Add a template
+ t := models.Template{Name: "Test Template"}
+ t.Subject = "Test subject"
+ t.Text = "Text text"
+ t.HTML = "Test"
+ t.UserId = 1
+ models.PostTemplate(&t)
+
+ // Add a landing page
+ p := models.Page{Name: "Test Page"}
+ p.HTML = "Test"
+ p.UserId = 1
+ models.PostPage(&p)
+
+ // Add a sending profile
+ smtp := models.SMTP{Name: "Test Page"}
+ smtp.UserId = 1
+ smtp.Host = "example.com"
+ smtp.FromAddress = "test@test.com"
+ models.PostSMTP(&smtp)
+
+ // Setup and "launch" our campaign
+ // Set the status such that no emails are attempted
+ c := models.Campaign{Name: "Test campaign"}
+ c.UserId = 1
+ c.Template = t
+ c.Page = p
+ c.SMTP = smtp
+ c.Groups = []models.Group{group}
+ models.PostCampaign(&c, c.UserId)
+ c.UpdateStatus(models.CampaignEmailsSent)
+}
+
+func (s *APISuite) TestSiteImportBaseHref() {
+ h := "
"
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, h)
+ }))
+ hr := fmt.Sprintf("\n", ts.URL)
+ defer ts.Close()
+ req := httptest.NewRequest(http.MethodPost, "/api/import/site",
+ bytes.NewBuffer([]byte(fmt.Sprintf(`
+ {
+ "url" : "%s",
+ "include_resources" : false
+ }
+ `, ts.URL))))
+ req.Header.Set("Content-Type", "application/json")
+ response := httptest.NewRecorder()
+ s.apiServer.ImportSite(response, req)
+ cs := cloneResponse{}
+ err := json.NewDecoder(response.Body).Decode(&cs)
+ s.Nil(err)
+ s.Equal(cs.HTML, hr)
+}
+
+func TestAPISuite(t *testing.T) {
+ suite.Run(t, new(APISuite))
+}
diff --git a/controllers/api/campaign.go b/controllers/api/campaign.go
new file mode 100644
index 00000000..33c08fe7
--- /dev/null
+++ b/controllers/api/campaign.go
@@ -0,0 +1,137 @@
+package api
+
+import (
+ "encoding/json"
+ "net/http"
+ "strconv"
+
+ ctx "github.com/gophish/gophish/context"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/gorilla/mux"
+ "github.com/jinzhu/gorm"
+)
+
+// Campaigns returns a list of campaigns if requested via GET.
+// If requested via POST, APICampaigns creates a new campaign and returns a reference to it.
+func (as *Server) Campaigns(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ cs, err := models.GetCampaigns(ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ }
+ JSONResponse(w, cs, http.StatusOK)
+ //POST: Create a new campaign and return it as JSON
+ case r.Method == "POST":
+ c := models.Campaign{}
+ // Put the request into a campaign
+ err := json.NewDecoder(r.Body).Decode(&c)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Invalid JSON structure"}, http.StatusBadRequest)
+ return
+ }
+ err = models.PostCampaign(&c, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ // If the campaign is scheduled to launch immediately, send it to the worker.
+ // Otherwise, the worker will pick it up at the scheduled time
+ if c.Status == models.CampaignInProgress {
+ go as.worker.LaunchCampaign(c)
+ }
+ JSONResponse(w, c, http.StatusCreated)
+ }
+}
+
+// CampaignsSummary returns the summary for the current user's campaigns
+func (as *Server) CampaignsSummary(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ cs, err := models.GetCampaignSummaries(ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, cs, http.StatusOK)
+ }
+}
+
+// Campaign returns details about the requested campaign. If the campaign is not
+// valid, APICampaign returns null.
+func (as *Server) Campaign(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ c, err := models.GetCampaign(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: "Campaign not found"}, http.StatusNotFound)
+ return
+ }
+ switch {
+ case r.Method == "GET":
+ JSONResponse(w, c, http.StatusOK)
+ case r.Method == "DELETE":
+ err = models.DeleteCampaign(id)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error deleting campaign"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, models.Response{Success: true, Message: "Campaign deleted successfully!"}, http.StatusOK)
+ }
+}
+
+// CampaignResults returns just the results for a given campaign to
+// significantly reduce the information returned.
+func (as *Server) CampaignResults(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ cr, err := models.GetCampaignResults(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: "Campaign not found"}, http.StatusNotFound)
+ return
+ }
+ if r.Method == "GET" {
+ JSONResponse(w, cr, http.StatusOK)
+ return
+ }
+}
+
+// CampaignSummary returns the summary for a given campaign.
+func (as *Server) CampaignSummary(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ switch {
+ case r.Method == "GET":
+ cs, err := models.GetCampaignSummary(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ JSONResponse(w, models.Response{Success: false, Message: "Campaign not found"}, http.StatusNotFound)
+ } else {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ }
+ log.Error(err)
+ return
+ }
+ JSONResponse(w, cs, http.StatusOK)
+ }
+}
+
+// CampaignComplete effectively "ends" a campaign.
+// Future phishing emails clicked will return a simple "404" page.
+func (as *Server) CampaignComplete(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ switch {
+ case r.Method == "GET":
+ err := models.CompleteCampaign(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error completing campaign"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, models.Response{Success: true, Message: "Campaign completed successfully!"}, http.StatusOK)
+ }
+}
diff --git a/controllers/api/group.go b/controllers/api/group.go
new file mode 100644
index 00000000..26dcfb39
--- /dev/null
+++ b/controllers/api/group.go
@@ -0,0 +1,118 @@
+package api
+
+import (
+ "encoding/json"
+ "net/http"
+ "strconv"
+ "time"
+
+ ctx "github.com/gophish/gophish/context"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/gorilla/mux"
+ "github.com/jinzhu/gorm"
+)
+
+// Groups returns a list of groups if requested via GET.
+// If requested via POST, APIGroups creates a new group and returns a reference to it.
+func (as *Server) Groups(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ gs, err := models.GetGroups(ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "No groups found"}, http.StatusNotFound)
+ return
+ }
+ JSONResponse(w, gs, http.StatusOK)
+ //POST: Create a new group and return it as JSON
+ case r.Method == "POST":
+ g := models.Group{}
+ // Put the request into a group
+ err := json.NewDecoder(r.Body).Decode(&g)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Invalid JSON structure"}, http.StatusBadRequest)
+ return
+ }
+ _, err = models.GetGroupByName(g.Name, ctx.Get(r, "user_id").(int64))
+ if err != gorm.ErrRecordNotFound {
+ JSONResponse(w, models.Response{Success: false, Message: "Group name already in use"}, http.StatusConflict)
+ return
+ }
+ g.ModifiedDate = time.Now().UTC()
+ g.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PostGroup(&g)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ JSONResponse(w, g, http.StatusCreated)
+ }
+}
+
+// GroupsSummary returns a summary of the groups owned by the current user.
+func (as *Server) GroupsSummary(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ gs, err := models.GetGroupSummaries(ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, gs, http.StatusOK)
+ }
+}
+
+// Group returns details about the requested group.
+// If the group is not valid, Group returns null.
+func (as *Server) Group(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ g, err := models.GetGroup(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Group not found"}, http.StatusNotFound)
+ return
+ }
+ switch {
+ case r.Method == "GET":
+ JSONResponse(w, g, http.StatusOK)
+ case r.Method == "DELETE":
+ err = models.DeleteGroup(&g)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error deleting group"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, models.Response{Success: true, Message: "Group deleted successfully!"}, http.StatusOK)
+ case r.Method == "PUT":
+ // Change this to get from URL and uid (don't bother with id in r.Body)
+ g = models.Group{}
+ err = json.NewDecoder(r.Body).Decode(&g)
+ if g.Id != id {
+ JSONResponse(w, models.Response{Success: false, Message: "Error: /:id and group_id mismatch"}, http.StatusInternalServerError)
+ return
+ }
+ g.ModifiedDate = time.Now().UTC()
+ g.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PutGroup(&g)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ JSONResponse(w, g, http.StatusOK)
+ }
+}
+
+// GroupSummary returns a summary of the groups owned by the current user.
+func (as *Server) GroupSummary(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ g, err := models.GetGroupSummary(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Group not found"}, http.StatusNotFound)
+ return
+ }
+ JSONResponse(w, g, http.StatusOK)
+ }
+}
diff --git a/controllers/api/import.go b/controllers/api/import.go
new file mode 100644
index 00000000..f1b164d9
--- /dev/null
+++ b/controllers/api/import.go
@@ -0,0 +1,157 @@
+package api
+
+import (
+ "bytes"
+ "crypto/tls"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "net/http"
+ "strings"
+
+ "github.com/PuerkitoBio/goquery"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/gophish/gophish/util"
+ "github.com/jordan-wright/email"
+)
+
+type cloneRequest struct {
+ URL string `json:"url"`
+ IncludeResources bool `json:"include_resources"`
+}
+
+func (cr *cloneRequest) validate() error {
+ if cr.URL == "" {
+ return errors.New("No URL Specified")
+ }
+ return nil
+}
+
+type cloneResponse struct {
+ HTML string `json:"html"`
+}
+
+type emailResponse struct {
+ Text string `json:"text"`
+ HTML string `json:"html"`
+ Subject string `json:"subject"`
+}
+
+// ImportGroup imports a CSV of group members
+func (as *Server) ImportGroup(w http.ResponseWriter, r *http.Request) {
+ ts, err := util.ParseCSV(r)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error parsing CSV"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, ts, http.StatusOK)
+ return
+}
+
+// ImportEmail allows for the importing of email.
+// Returns a Message object
+func (as *Server) ImportEmail(w http.ResponseWriter, r *http.Request) {
+ if r.Method != "POST" {
+ JSONResponse(w, models.Response{Success: false, Message: "Method not allowed"}, http.StatusBadRequest)
+ return
+ }
+ ir := struct {
+ Content string `json:"content"`
+ ConvertLinks bool `json:"convert_links"`
+ }{}
+ err := json.NewDecoder(r.Body).Decode(&ir)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error decoding JSON Request"}, http.StatusBadRequest)
+ return
+ }
+ e, err := email.NewEmailFromReader(strings.NewReader(ir.Content))
+ if err != nil {
+ log.Error(err)
+ }
+ // If the user wants to convert links to point to
+ // the landing page, let's make it happen by changing up
+ // e.HTML
+ if ir.ConvertLinks {
+ d, err := goquery.NewDocumentFromReader(bytes.NewReader(e.HTML))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ d.Find("a").Each(func(i int, a *goquery.Selection) {
+ a.SetAttr("href", "{{.URL}}")
+ })
+ h, err := d.Html()
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ e.HTML = []byte(h)
+ }
+ er := emailResponse{
+ Subject: e.Subject,
+ Text: string(e.Text),
+ HTML: string(e.HTML),
+ }
+ JSONResponse(w, er, http.StatusOK)
+ return
+}
+
+// ImportSite allows for the importing of HTML from a website
+// Without "include_resources" set, it will merely place a "base" tag
+// so that all resources can be loaded relative to the given URL.
+func (as *Server) ImportSite(w http.ResponseWriter, r *http.Request) {
+ cr := cloneRequest{}
+ if r.Method != "POST" {
+ JSONResponse(w, models.Response{Success: false, Message: "Method not allowed"}, http.StatusBadRequest)
+ return
+ }
+ err := json.NewDecoder(r.Body).Decode(&cr)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error decoding JSON Request"}, http.StatusBadRequest)
+ return
+ }
+ if err = cr.validate(); err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ tr := &http.Transport{
+ TLSClientConfig: &tls.Config{
+ InsecureSkipVerify: true,
+ },
+ }
+ client := &http.Client{Transport: tr}
+ resp, err := client.Get(cr.URL)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ // Insert the base href tag to better handle relative resources
+ d, err := goquery.NewDocumentFromResponse(resp)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ // Assuming we don't want to include resources, we'll need a base href
+ if d.Find("head base").Length() == 0 {
+ d.Find("head").PrependHtml(fmt.Sprintf("", cr.URL))
+ }
+ forms := d.Find("form")
+ forms.Each(func(i int, f *goquery.Selection) {
+ // We'll want to store where we got the form from
+ // (the current URL)
+ url := f.AttrOr("action", cr.URL)
+ if !strings.HasPrefix(url, "http") {
+ url = fmt.Sprintf("%s%s", cr.URL, url)
+ }
+ f.PrependHtml(fmt.Sprintf("", url))
+ })
+ h, err := d.Html()
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ cs := cloneResponse{HTML: h}
+ JSONResponse(w, cs, http.StatusOK)
+ return
+}
diff --git a/controllers/api/page.go b/controllers/api/page.go
new file mode 100644
index 00000000..bdebf5a7
--- /dev/null
+++ b/controllers/api/page.go
@@ -0,0 +1,91 @@
+package api
+
+import (
+ "encoding/json"
+ "net/http"
+ "strconv"
+ "time"
+
+ ctx "github.com/gophish/gophish/context"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/gorilla/mux"
+ "github.com/jinzhu/gorm"
+)
+
+// Pages handles requests for the /api/pages/ endpoint
+func (as *Server) Pages(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ ps, err := models.GetPages(ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ }
+ JSONResponse(w, ps, http.StatusOK)
+ //POST: Create a new page and return it as JSON
+ case r.Method == "POST":
+ p := models.Page{}
+ // Put the request into a page
+ err := json.NewDecoder(r.Body).Decode(&p)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Invalid request"}, http.StatusBadRequest)
+ return
+ }
+ // Check to make sure the name is unique
+ _, err = models.GetPageByName(p.Name, ctx.Get(r, "user_id").(int64))
+ if err != gorm.ErrRecordNotFound {
+ JSONResponse(w, models.Response{Success: false, Message: "Page name already in use"}, http.StatusConflict)
+ log.Error(err)
+ return
+ }
+ p.ModifiedDate = time.Now().UTC()
+ p.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PostPage(&p)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, p, http.StatusCreated)
+ }
+}
+
+// Page contains functions to handle the GET'ing, DELETE'ing, and PUT'ing
+// of a Page object
+func (as *Server) Page(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ p, err := models.GetPage(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Page not found"}, http.StatusNotFound)
+ return
+ }
+ switch {
+ case r.Method == "GET":
+ JSONResponse(w, p, http.StatusOK)
+ case r.Method == "DELETE":
+ err = models.DeletePage(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error deleting page"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, models.Response{Success: true, Message: "Page Deleted Successfully"}, http.StatusOK)
+ case r.Method == "PUT":
+ p = models.Page{}
+ err = json.NewDecoder(r.Body).Decode(&p)
+ if err != nil {
+ log.Error(err)
+ }
+ if p.Id != id {
+ JSONResponse(w, models.Response{Success: false, Message: "/:id and /:page_id mismatch"}, http.StatusBadRequest)
+ return
+ }
+ p.ModifiedDate = time.Now().UTC()
+ p.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PutPage(&p)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error updating page: " + err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, p, http.StatusOK)
+ }
+}
diff --git a/controllers/api/reset.go b/controllers/api/reset.go
new file mode 100644
index 00000000..c7853ad9
--- /dev/null
+++ b/controllers/api/reset.go
@@ -0,0 +1,24 @@
+package api
+
+import (
+ "net/http"
+
+ ctx "github.com/gophish/gophish/context"
+ "github.com/gophish/gophish/models"
+ "github.com/gophish/gophish/util"
+)
+
+// Reset (/api/reset) resets the currently authenticated user's API key
+func (as *Server) Reset(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "POST":
+ u := ctx.Get(r, "user").(models.User)
+ u.ApiKey = util.GenerateSecureKey()
+ err := models.PutUser(&u)
+ if err != nil {
+ http.Error(w, "Error setting API Key", http.StatusInternalServerError)
+ } else {
+ JSONResponse(w, models.Response{Success: true, Message: "API Key successfully reset!", Data: u.ApiKey}, http.StatusOK)
+ }
+ }
+}
diff --git a/controllers/api/response.go b/controllers/api/response.go
new file mode 100644
index 00000000..bf53014a
--- /dev/null
+++ b/controllers/api/response.go
@@ -0,0 +1,22 @@
+package api
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+
+ log "github.com/gophish/gophish/logger"
+)
+
+// JSONResponse attempts to set the status code, c, and marshal the given interface, d, into a response that
+// is written to the given ResponseWriter.
+func JSONResponse(w http.ResponseWriter, d interface{}, c int) {
+ dj, err := json.MarshalIndent(d, "", " ")
+ if err != nil {
+ http.Error(w, "Error creating JSON response", http.StatusInternalServerError)
+ log.Error(err)
+ }
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(c)
+ fmt.Fprintf(w, "%s", dj)
+}
diff --git a/controllers/api/server.go b/controllers/api/server.go
new file mode 100644
index 00000000..9f2bec65
--- /dev/null
+++ b/controllers/api/server.go
@@ -0,0 +1,79 @@
+package api
+
+import (
+ "net/http"
+
+ mid "github.com/gophish/gophish/middleware"
+ "github.com/gophish/gophish/models"
+ "github.com/gophish/gophish/worker"
+ "github.com/gorilla/mux"
+)
+
+// ServerOption is an option to apply to the API server.
+type ServerOption func(*Server)
+
+// Server represents the routes and functionality of the Gophish API.
+// It's not a server in the traditional sense, in that it isn't started and
+// stopped. Rather, it's meant to be used as an http.Handler in the
+// AdminServer.
+type Server struct {
+ handler http.Handler
+ worker worker.Worker
+}
+
+// NewServer returns a new instance of the API handler with the provided
+// options applied.
+func NewServer(options ...ServerOption) *Server {
+ defaultWorker, _ := worker.New()
+ as := &Server{
+ worker: defaultWorker,
+ }
+ for _, opt := range options {
+ opt(as)
+ }
+ as.registerRoutes()
+ return as
+}
+
+// WithWorker is an option that sets the background worker.
+func WithWorker(w worker.Worker) ServerOption {
+ return func(as *Server) {
+ as.worker = w
+ }
+}
+
+func (as *Server) registerRoutes() {
+ root := mux.NewRouter()
+ root = root.StrictSlash(true)
+ router := root.PathPrefix("/api/").Subrouter()
+ router.Use(mid.RequireAPIKey)
+ router.Use(mid.EnforceViewOnly)
+ router.HandleFunc("/reset", as.Reset)
+ router.HandleFunc("/campaigns/", as.Campaigns)
+ router.HandleFunc("/campaigns/summary", as.CampaignsSummary)
+ router.HandleFunc("/campaigns/{id:[0-9]+}", as.Campaign)
+ router.HandleFunc("/campaigns/{id:[0-9]+}/results", as.CampaignResults)
+ router.HandleFunc("/campaigns/{id:[0-9]+}/summary", as.CampaignSummary)
+ router.HandleFunc("/campaigns/{id:[0-9]+}/complete", as.CampaignComplete)
+ router.HandleFunc("/groups/", as.Groups)
+ router.HandleFunc("/groups/summary", as.GroupsSummary)
+ router.HandleFunc("/groups/{id:[0-9]+}", as.Group)
+ router.HandleFunc("/groups/{id:[0-9]+}/summary", as.GroupSummary)
+ router.HandleFunc("/templates/", as.Templates)
+ router.HandleFunc("/templates/{id:[0-9]+}", as.Template)
+ router.HandleFunc("/pages/", as.Pages)
+ router.HandleFunc("/pages/{id:[0-9]+}", as.Page)
+ router.HandleFunc("/smtp/", as.SendingProfiles)
+ router.HandleFunc("/smtp/{id:[0-9]+}", as.SendingProfile)
+ router.HandleFunc("/users/", mid.Use(as.Users, mid.RequirePermission(models.PermissionModifySystem)))
+ router.HandleFunc("/users/{id:[0-9]+}", mid.Use(as.User))
+ router.HandleFunc("/util/send_test_email", as.SendTestEmail)
+ router.HandleFunc("/import/group", as.ImportGroup)
+ router.HandleFunc("/import/email", as.ImportEmail)
+ router.HandleFunc("/import/site", as.ImportSite)
+ as.handler = router
+}
+
+func (as *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ as.handler.ServeHTTP(w, r)
+}
diff --git a/controllers/api/smtp.go b/controllers/api/smtp.go
new file mode 100644
index 00000000..2da33c93
--- /dev/null
+++ b/controllers/api/smtp.go
@@ -0,0 +1,96 @@
+package api
+
+import (
+ "encoding/json"
+ "net/http"
+ "strconv"
+ "time"
+
+ ctx "github.com/gophish/gophish/context"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/gorilla/mux"
+ "github.com/jinzhu/gorm"
+)
+
+// SendingProfiles handles requests for the /api/smtp/ endpoint
+func (as *Server) SendingProfiles(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ ss, err := models.GetSMTPs(ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ }
+ JSONResponse(w, ss, http.StatusOK)
+ //POST: Create a new SMTP and return it as JSON
+ case r.Method == "POST":
+ s := models.SMTP{}
+ // Put the request into a page
+ err := json.NewDecoder(r.Body).Decode(&s)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Invalid request"}, http.StatusBadRequest)
+ return
+ }
+ // Check to make sure the name is unique
+ _, err = models.GetSMTPByName(s.Name, ctx.Get(r, "user_id").(int64))
+ if err != gorm.ErrRecordNotFound {
+ JSONResponse(w, models.Response{Success: false, Message: "SMTP name already in use"}, http.StatusConflict)
+ log.Error(err)
+ return
+ }
+ s.ModifiedDate = time.Now().UTC()
+ s.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PostSMTP(&s)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, s, http.StatusCreated)
+ }
+}
+
+// SendingProfile contains functions to handle the GET'ing, DELETE'ing, and PUT'ing
+// of a SMTP object
+func (as *Server) SendingProfile(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ s, err := models.GetSMTP(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "SMTP not found"}, http.StatusNotFound)
+ return
+ }
+ switch {
+ case r.Method == "GET":
+ JSONResponse(w, s, http.StatusOK)
+ case r.Method == "DELETE":
+ err = models.DeleteSMTP(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error deleting SMTP"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, models.Response{Success: true, Message: "SMTP Deleted Successfully"}, http.StatusOK)
+ case r.Method == "PUT":
+ s = models.SMTP{}
+ err = json.NewDecoder(r.Body).Decode(&s)
+ if err != nil {
+ log.Error(err)
+ }
+ if s.Id != id {
+ JSONResponse(w, models.Response{Success: false, Message: "/:id and /:smtp_id mismatch"}, http.StatusBadRequest)
+ return
+ }
+ err = s.Validate()
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ s.ModifiedDate = time.Now().UTC()
+ s.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PutSMTP(&s)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error updating page"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, s, http.StatusOK)
+ }
+}
diff --git a/controllers/api/template.go b/controllers/api/template.go
new file mode 100644
index 00000000..da8cd90c
--- /dev/null
+++ b/controllers/api/template.go
@@ -0,0 +1,97 @@
+package api
+
+import (
+ "encoding/json"
+ "net/http"
+ "strconv"
+ "time"
+
+ ctx "github.com/gophish/gophish/context"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/gorilla/mux"
+ "github.com/jinzhu/gorm"
+)
+
+// Templates handles the functionality for the /api/templates endpoint
+func (as *Server) Templates(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ ts, err := models.GetTemplates(ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ log.Error(err)
+ }
+ JSONResponse(w, ts, http.StatusOK)
+ //POST: Create a new template and return it as JSON
+ case r.Method == "POST":
+ t := models.Template{}
+ // Put the request into a template
+ err := json.NewDecoder(r.Body).Decode(&t)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Invalid JSON structure"}, http.StatusBadRequest)
+ return
+ }
+ _, err = models.GetTemplateByName(t.Name, ctx.Get(r, "user_id").(int64))
+ if err != gorm.ErrRecordNotFound {
+ JSONResponse(w, models.Response{Success: false, Message: "Template name already in use"}, http.StatusConflict)
+ return
+ }
+ t.ModifiedDate = time.Now().UTC()
+ t.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PostTemplate(&t)
+ if err == models.ErrTemplateNameNotSpecified {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ if err == models.ErrTemplateMissingParameter {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error inserting template into database"}, http.StatusInternalServerError)
+ log.Error(err)
+ return
+ }
+ JSONResponse(w, t, http.StatusCreated)
+ }
+}
+
+// Template handles the functions for the /api/templates/:id endpoint
+func (as *Server) Template(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ t, err := models.GetTemplate(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Template not found"}, http.StatusNotFound)
+ return
+ }
+ switch {
+ case r.Method == "GET":
+ JSONResponse(w, t, http.StatusOK)
+ case r.Method == "DELETE":
+ err = models.DeleteTemplate(id, ctx.Get(r, "user_id").(int64))
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error deleting template"}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, models.Response{Success: true, Message: "Template deleted successfully!"}, http.StatusOK)
+ case r.Method == "PUT":
+ t = models.Template{}
+ err = json.NewDecoder(r.Body).Decode(&t)
+ if err != nil {
+ log.Error(err)
+ }
+ if t.Id != id {
+ JSONResponse(w, models.Response{Success: false, Message: "Error: /:id and template_id mismatch"}, http.StatusBadRequest)
+ return
+ }
+ t.ModifiedDate = time.Now().UTC()
+ t.UserId = ctx.Get(r, "user_id").(int64)
+ err = models.PutTemplate(&t)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ JSONResponse(w, t, http.StatusOK)
+ }
+}
diff --git a/controllers/api/user.go b/controllers/api/user.go
new file mode 100644
index 00000000..484db16f
--- /dev/null
+++ b/controllers/api/user.go
@@ -0,0 +1,218 @@
+package api
+
+import (
+ "encoding/json"
+ "errors"
+ "net/http"
+ "strconv"
+
+ ctx "github.com/gophish/gophish/context"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/gophish/gophish/util"
+ "github.com/gorilla/mux"
+ "github.com/jinzhu/gorm"
+)
+
+// ErrEmptyPassword is thrown when a user provides a blank password to the register
+// or change password functions
+var ErrEmptyPassword = errors.New("No password provided")
+
+// ErrUsernameTaken is thrown when a user attempts to register a username that is taken.
+var ErrUsernameTaken = errors.New("Username already taken")
+
+// ErrEmptyUsername is thrown when a user attempts to register a username that is taken.
+var ErrEmptyUsername = errors.New("No username provided")
+
+// ErrEmptyRole is throws when no role is provided when creating or modifying a user.
+var ErrEmptyRole = errors.New("No role specified")
+
+// ErrInsufficientPermission is thrown when a user attempts to change an
+// attribute (such as the role) for which they don't have permission.
+var ErrInsufficientPermission = errors.New("Permission denied")
+
+// userRequest is the payload which represents the creation of a new user.
+type userRequest struct {
+ Username string `json:"username"`
+ Password string `json:"password"`
+ Role string `json:"role"`
+}
+
+func (ur *userRequest) Validate(existingUser *models.User) error {
+ switch {
+ case ur.Username == "":
+ return ErrEmptyUsername
+ case ur.Role == "":
+ return ErrEmptyRole
+ }
+ // Verify that the username isn't already taken. We consider two cases:
+ // * We're creating a new user, in which case any match is a conflict
+ // * We're modifying a user, in which case any match with a different ID is
+ // a conflict.
+ possibleConflict, err := models.GetUserByUsername(ur.Username)
+ if err == nil {
+ if existingUser == nil {
+ return ErrUsernameTaken
+ }
+ if possibleConflict.Id != existingUser.Id {
+ return ErrUsernameTaken
+ }
+ }
+ // If we have an error which is not simply indicating that no user was found, report it
+ if err != nil && err != gorm.ErrRecordNotFound {
+ return err
+ }
+ return nil
+}
+
+// Users contains functions to retrieve a list of existing users or create a
+// new user. Users with the ModifySystem permissions can view and create users.
+func (as *Server) Users(w http.ResponseWriter, r *http.Request) {
+ switch {
+ case r.Method == "GET":
+ us, err := models.GetUsers()
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, us, http.StatusOK)
+ return
+ case r.Method == "POST":
+ ur := &userRequest{}
+ err := json.NewDecoder(r.Body).Decode(ur)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ err = ur.Validate(nil)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ if ur.Password == "" {
+ JSONResponse(w, models.Response{Success: false, Message: ErrEmptyPassword.Error()}, http.StatusBadRequest)
+ return
+ }
+ hash, err := util.NewHash(ur.Password)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ role, err := models.GetRoleBySlug(ur.Role)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ user := models.User{
+ Username: ur.Username,
+ Hash: hash,
+ ApiKey: util.GenerateSecureKey(),
+ Role: role,
+ RoleID: role.ID,
+ }
+ err = models.PutUser(&user)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, user, http.StatusOK)
+ return
+ }
+}
+
+// User contains functions to retrieve or delete a single user. Users with
+// the ModifySystem permission can view and modify any user. Otherwise, users
+// may only view or delete their own account.
+func (as *Server) User(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, _ := strconv.ParseInt(vars["id"], 0, 64)
+ // If the user doesn't have ModifySystem permissions, we need to verify
+ // that they're only taking action on their account.
+ currentUser := ctx.Get(r, "user").(models.User)
+ hasSystem, err := currentUser.HasPermission(models.PermissionModifySystem)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ if !hasSystem && currentUser.Id != id {
+ JSONResponse(w, models.Response{Success: false, Message: http.StatusText(http.StatusForbidden)}, http.StatusForbidden)
+ return
+ }
+ existingUser, err := models.GetUser(id)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "User not found"}, http.StatusNotFound)
+ return
+ }
+ switch {
+ case r.Method == "GET":
+ JSONResponse(w, existingUser, http.StatusOK)
+ case r.Method == "DELETE":
+ err = models.DeleteUser(id)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ log.Infof("Deleted user account for %s", existingUser.Username)
+ JSONResponse(w, models.Response{Success: true, Message: "User deleted Successfully!"}, http.StatusOK)
+ case r.Method == "PUT":
+ ur := &userRequest{}
+ err = json.NewDecoder(r.Body).Decode(ur)
+ if err != nil {
+ log.Errorf("error decoding user request: %v", err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ err = ur.Validate(&existingUser)
+ if err != nil {
+ log.Errorf("invalid user request received: %v", err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ existingUser.Username = ur.Username
+ // Only users with the ModifySystem permission are able to update a
+ // user's role. This prevents a privilege escalation letting users
+ // upgrade their own account.
+ if !hasSystem && ur.Role != existingUser.Role.Slug {
+ JSONResponse(w, models.Response{Success: false, Message: ErrInsufficientPermission.Error()}, http.StatusBadRequest)
+ return
+ }
+ role, err := models.GetRoleBySlug(ur.Role)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ // If our user is trying to change the role of an admin, we need to
+ // ensure that it isn't the last user account with the Admin role.
+ if existingUser.Role.Slug == models.RoleAdmin && existingUser.Role.ID != role.ID {
+ err = models.EnsureEnoughAdmins()
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ }
+ existingUser.Role = role
+ existingUser.RoleID = role.ID
+ // We don't force the password to be provided, since it may be an admin
+ // managing the user's account, and making a simple change like
+ // updating the username or role. However, if it _is_ provided, we'll
+ // update the stored hash.
+ //
+ // Note that we don't force the current password to be provided. The
+ // assumption here is that the API key is a proper bearer token proving
+ // authenticated access to the account.
+ if ur.Password != "" {
+ hash, err := util.NewHash(ur.Password)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ existingUser.Hash = hash
+ }
+ err = models.PutUser(&existingUser)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, existingUser, http.StatusOK)
+ }
+}
diff --git a/controllers/api/user_test.go b/controllers/api/user_test.go
new file mode 100644
index 00000000..65dc0255
--- /dev/null
+++ b/controllers/api/user_test.go
@@ -0,0 +1,188 @@
+package api
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+
+ "golang.org/x/crypto/bcrypt"
+
+ ctx "github.com/gophish/gophish/context"
+ "github.com/gophish/gophish/models"
+)
+
+func (s *APISuite) createUnpriviledgedUser(slug string) *models.User {
+ role, err := models.GetRoleBySlug(slug)
+ s.Nil(err)
+ unauthorizedUser := &models.User{
+ Username: "foo",
+ Hash: "bar",
+ ApiKey: "12345",
+ Role: role,
+ RoleID: role.ID,
+ }
+ err = models.PutUser(unauthorizedUser)
+ s.Nil(err)
+ return unauthorizedUser
+}
+
+func (s *APISuite) TestGetUsers() {
+ r := httptest.NewRequest(http.MethodGet, "/api/users", nil)
+ r = ctx.Set(r, "user", s.admin)
+ w := httptest.NewRecorder()
+
+ s.apiServer.Users(w, r)
+ s.Equal(w.Code, http.StatusOK)
+
+ got := []models.User{}
+ err := json.NewDecoder(w.Body).Decode(&got)
+ s.Nil(err)
+
+ // We only expect one user
+ s.Equal(1, len(got))
+ // And it should be the admin user
+ s.Equal(s.admin.Id, got[0].Id)
+}
+
+func (s *APISuite) TestCreateUser() {
+ payload := &userRequest{
+ Username: "foo",
+ Password: "bar",
+ Role: models.RoleUser,
+ }
+ body, err := json.Marshal(payload)
+ s.Nil(err)
+
+ r := httptest.NewRequest(http.MethodPost, "/api/users", bytes.NewBuffer(body))
+ r.Header.Set("Content-Type", "application/json")
+ r = ctx.Set(r, "user", s.admin)
+ w := httptest.NewRecorder()
+
+ s.apiServer.Users(w, r)
+ s.Equal(w.Code, http.StatusOK)
+
+ got := &models.User{}
+ err = json.NewDecoder(w.Body).Decode(got)
+ s.Nil(err)
+ s.Equal(got.Username, payload.Username)
+ s.Equal(got.Role.Slug, payload.Role)
+}
+
+// TestModifyUser tests that a user with the appropriate access is able to
+// modify their username and password.
+func (s *APISuite) TestModifyUser() {
+ unpriviledgedUser := s.createUnpriviledgedUser(models.RoleUser)
+ newPassword := "new-password"
+ newUsername := "new-username"
+ payload := userRequest{
+ Username: newUsername,
+ Password: newPassword,
+ Role: unpriviledgedUser.Role.Slug,
+ }
+ body, err := json.Marshal(payload)
+ s.Nil(err)
+ url := fmt.Sprintf("/api/users/%d", unpriviledgedUser.Id)
+ r := httptest.NewRequest(http.MethodPut, url, bytes.NewBuffer(body))
+ r.Header.Set("Content-Type", "application/json")
+ r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", unpriviledgedUser.ApiKey))
+ w := httptest.NewRecorder()
+
+ s.apiServer.ServeHTTP(w, r)
+ response := &models.User{}
+ err = json.NewDecoder(w.Body).Decode(response)
+ s.Nil(err)
+ s.Equal(w.Code, http.StatusOK)
+ s.Equal(response.Username, newUsername)
+ got, err := models.GetUser(unpriviledgedUser.Id)
+ s.Nil(err)
+ s.Equal(response.Username, got.Username)
+ s.Equal(newUsername, got.Username)
+ err = bcrypt.CompareHashAndPassword([]byte(got.Hash), []byte(newPassword))
+ s.Nil(err)
+}
+
+// TestUnauthorizedListUsers ensures that users without the ModifySystem
+// permission are unable to list the users registered in Gophish.
+func (s *APISuite) TestUnauthorizedListUsers() {
+ // First, let's create a standard user which doesn't
+ // have ModifySystem permissions.
+ unauthorizedUser := s.createUnpriviledgedUser(models.RoleUser)
+ // We'll try to make a request to the various users API endpoints to
+ // ensure that they fail. Previously, we could hit the handlers directly
+ // but we need to go through the router for this test to ensure the
+ // middleware gets applied.
+ r := httptest.NewRequest(http.MethodGet, "/api/users/", nil)
+ r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", unauthorizedUser.ApiKey))
+ w := httptest.NewRecorder()
+
+ s.apiServer.ServeHTTP(w, r)
+ s.Equal(w.Code, http.StatusForbidden)
+}
+
+// TestUnauthorizedModifyUsers verifies that users without ModifySystem
+// permission (a "standard" user) can only get or modify their own information.
+func (s *APISuite) TestUnauthorizedGetUser() {
+ // First, we'll make sure that a user with the "user" role is unable to
+ // get the information of another user (in this case, the main admin).
+ unauthorizedUser := s.createUnpriviledgedUser(models.RoleUser)
+ url := fmt.Sprintf("/api/users/%d", s.admin.Id)
+ r := httptest.NewRequest(http.MethodGet, url, nil)
+ r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", unauthorizedUser.ApiKey))
+ w := httptest.NewRecorder()
+
+ s.apiServer.ServeHTTP(w, r)
+ s.Equal(w.Code, http.StatusForbidden)
+}
+
+// TestUnauthorizedModifyRole ensures that users without the ModifySystem
+// privilege are unable to modify their own role, preventing a potential
+// privilege escalation issue.
+func (s *APISuite) TestUnauthorizedSetRole() {
+ unauthorizedUser := s.createUnpriviledgedUser(models.RoleUser)
+ url := fmt.Sprintf("/api/users/%d", unauthorizedUser.Id)
+ payload := &userRequest{
+ Username: unauthorizedUser.Username,
+ Role: models.RoleAdmin,
+ }
+ body, err := json.Marshal(payload)
+ s.Nil(err)
+ r := httptest.NewRequest(http.MethodPut, url, bytes.NewBuffer(body))
+ r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", unauthorizedUser.ApiKey))
+ w := httptest.NewRecorder()
+
+ s.apiServer.ServeHTTP(w, r)
+ s.Equal(w.Code, http.StatusBadRequest)
+ response := &models.Response{}
+ err = json.NewDecoder(w.Body).Decode(response)
+ s.Nil(err)
+ s.Equal(response.Message, ErrInsufficientPermission.Error())
+}
+
+// TestModifyWithExistingUsername verifies that it's not possible to modify
+// an user's username to one which already exists.
+func (s *APISuite) TestModifyWithExistingUsername() {
+ unauthorizedUser := s.createUnpriviledgedUser(models.RoleUser)
+ payload := &userRequest{
+ Username: s.admin.Username,
+ Role: unauthorizedUser.Role.Slug,
+ }
+ body, err := json.Marshal(payload)
+ s.Nil(err)
+ url := fmt.Sprintf("/api/users/%d", unauthorizedUser.Id)
+ r := httptest.NewRequest(http.MethodPut, url, bytes.NewReader(body))
+ r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", unauthorizedUser.ApiKey))
+ w := httptest.NewRecorder()
+
+ s.apiServer.ServeHTTP(w, r)
+ s.Equal(w.Code, http.StatusBadRequest)
+ expected := &models.Response{
+ Message: ErrUsernameTaken.Error(),
+ Success: false,
+ }
+ got := &models.Response{}
+ err = json.NewDecoder(w.Body).Decode(got)
+ s.Nil(err)
+ s.Equal(got.Message, expected.Message)
+}
diff --git a/controllers/api/util.go b/controllers/api/util.go
new file mode 100644
index 00000000..0f6c215c
--- /dev/null
+++ b/controllers/api/util.go
@@ -0,0 +1,122 @@
+package api
+
+import (
+ "encoding/json"
+ "net/http"
+
+ ctx "github.com/gophish/gophish/context"
+ log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/models"
+ "github.com/jinzhu/gorm"
+ "github.com/sirupsen/logrus"
+)
+
+// SendTestEmail sends a test email using the template name
+// and Target given.
+func (as *Server) SendTestEmail(w http.ResponseWriter, r *http.Request) {
+ s := &models.EmailRequest{
+ ErrorChan: make(chan error),
+ UserId: ctx.Get(r, "user_id").(int64),
+ }
+ if r.Method != "POST" {
+ JSONResponse(w, models.Response{Success: false, Message: "Method not allowed"}, http.StatusBadRequest)
+ return
+ }
+ err := json.NewDecoder(r.Body).Decode(s)
+ if err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: "Error decoding JSON Request"}, http.StatusBadRequest)
+ return
+ }
+
+ storeRequest := false
+
+ // If a Template is not specified use a default
+ if s.Template.Name == "" {
+ //default message body
+ text := "It works!\n\nThis is an email letting you know that your gophish\nconfiguration was successful.\n" +
+ "Here are the details:\n\nWho you sent from: {{.From}}\n\nWho you sent to: \n" +
+ "{{if .FirstName}} First Name: {{.FirstName}}\n{{end}}" +
+ "{{if .LastName}} Last Name: {{.LastName}}\n{{end}}" +
+ "{{if .Position}} Position: {{.Position}}\n{{end}}" +
+ "\nNow go send some phish!"
+ t := models.Template{
+ Subject: "Default Email from Gophish",
+ Text: text,
+ }
+ s.Template = t
+ } else {
+ // Get the Template requested by name
+ s.Template, err = models.GetTemplateByName(s.Template.Name, s.UserId)
+ if err == gorm.ErrRecordNotFound {
+ log.WithFields(logrus.Fields{
+ "template": s.Template.Name,
+ }).Error("Template does not exist")
+ JSONResponse(w, models.Response{Success: false, Message: models.ErrTemplateNotFound.Error()}, http.StatusBadRequest)
+ return
+ } else if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ s.TemplateId = s.Template.Id
+ // We'll only save the test request to the database if there is a
+ // user-specified template to use.
+ storeRequest = true
+ }
+
+ if s.Page.Name != "" {
+ s.Page, err = models.GetPageByName(s.Page.Name, s.UserId)
+ if err == gorm.ErrRecordNotFound {
+ log.WithFields(logrus.Fields{
+ "page": s.Page.Name,
+ }).Error("Page does not exist")
+ JSONResponse(w, models.Response{Success: false, Message: models.ErrPageNotFound.Error()}, http.StatusBadRequest)
+ return
+ } else if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ s.PageId = s.Page.Id
+ }
+
+ // If a complete sending profile is provided use it
+ if err := s.SMTP.Validate(); err != nil {
+ // Otherwise get the SMTP requested by name
+ smtp, lookupErr := models.GetSMTPByName(s.SMTP.Name, s.UserId)
+ // If the Sending Profile doesn't exist, let's err on the side
+ // of caution and assume that the validation failure was more important.
+ if lookupErr != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+ s.SMTP = smtp
+ }
+ s.FromAddress = s.SMTP.FromAddress
+
+ // Validate the given request
+ if err = s.Validate(); err != nil {
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
+ return
+ }
+
+ // Store the request if this wasn't the default template
+ if storeRequest {
+ err = models.PostEmailRequest(s)
+ if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ }
+ // Send the test email
+ err = as.worker.SendTestEmail(s)
+ if err != nil {
+ log.Error(err)
+ JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
+ return
+ }
+ JSONResponse(w, models.Response{Success: true, Message: "Email Sent"}, http.StatusOK)
+ return
+}
diff --git a/controllers/api_test.go b/controllers/controllers_test.go
similarity index 64%
rename from controllers/api_test.go
rename to controllers/controllers_test.go
index 9f9e26d9..de0a7366 100644
--- a/controllers/api_test.go
+++ b/controllers/controllers_test.go
@@ -1,10 +1,6 @@
package controllers
import (
- "bytes"
- "encoding/json"
- "fmt"
- "net/http"
"net/http/httptest"
"os"
"testing"
@@ -103,52 +99,6 @@ func (s *ControllersSuite) SetupTest() {
c.UpdateStatus(models.CampaignEmailsSent)
}
-func (s *ControllersSuite) TestRequireAPIKey() {
- resp, err := http.Post(fmt.Sprintf("%s/api/import/site", s.adminServer.URL), "application/json", nil)
- s.Nil(err)
- defer resp.Body.Close()
- s.Equal(resp.StatusCode, http.StatusUnauthorized)
-}
-
-func (s *ControllersSuite) TestInvalidAPIKey() {
- resp, err := http.Get(fmt.Sprintf("%s/api/groups/?api_key=%s", s.adminServer.URL, "bogus-api-key"))
- s.Nil(err)
- defer resp.Body.Close()
- s.Equal(resp.StatusCode, http.StatusUnauthorized)
-}
-
-func (s *ControllersSuite) TestBearerToken() {
- req, err := http.NewRequest("GET", fmt.Sprintf("%s/api/groups/", s.adminServer.URL), nil)
- s.Nil(err)
- req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", s.apiKey))
- resp, err := http.DefaultClient.Do(req)
- s.Nil(err)
- defer resp.Body.Close()
- s.Equal(resp.StatusCode, http.StatusOK)
-}
-
-func (s *ControllersSuite) TestSiteImportBaseHref() {
- h := ""
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- fmt.Fprintln(w, h)
- }))
- hr := fmt.Sprintf("\n", ts.URL)
- defer ts.Close()
- resp, err := http.Post(fmt.Sprintf("%s/api/import/site?api_key=%s", s.adminServer.URL, s.apiKey), "application/json",
- bytes.NewBuffer([]byte(fmt.Sprintf(`
- {
- "url" : "%s",
- "include_resources" : false
- }
- `, ts.URL))))
- s.Nil(err)
- defer resp.Body.Close()
- cs := cloneResponse{}
- err = json.NewDecoder(resp.Body).Decode(&cs)
- s.Nil(err)
- s.Equal(cs.HTML, hr)
-}
-
func (s *ControllersSuite) TearDownSuite() {
// Tear down the admin and phishing servers
s.adminServer.Close()
diff --git a/controllers/phish.go b/controllers/phish.go
index e2ff7870..0d9fc262 100644
--- a/controllers/phish.go
+++ b/controllers/phish.go
@@ -13,6 +13,7 @@ import (
"github.com/NYTimes/gziphandler"
"github.com/gophish/gophish/config"
ctx "github.com/gophish/gophish/context"
+ "github.com/gophish/gophish/controllers/api"
log "github.com/gophish/gophish/logger"
"github.com/gophish/gophish/models"
"github.com/gophish/gophish/util"
@@ -81,19 +82,18 @@ func WithContactAddress(addr string) PhishingServerOption {
}
// Start launches the phishing server, listening on the configured address.
-func (ps *PhishingServer) Start() error {
+func (ps *PhishingServer) Start() {
if ps.config.UseTLS {
err := util.CheckAndCreateSSL(ps.config.CertPath, ps.config.KeyPath)
if err != nil {
log.Fatal(err)
- return err
}
log.Infof("Starting phishing server at https://%s", ps.config.ListenURL)
- return ps.server.ListenAndServeTLS(ps.config.CertPath, ps.config.KeyPath)
+ log.Fatal(ps.server.ListenAndServeTLS(ps.config.CertPath, ps.config.KeyPath))
}
// If TLS isn't configured, just listen on HTTP
log.Infof("Starting phishing server at http://%s", ps.config.ListenURL)
- return ps.server.ListenAndServe()
+ log.Fatal(ps.server.ListenAndServe())
}
// Shutdown attempts to gracefully shutdown the server.
@@ -160,6 +160,7 @@ func (ps *PhishingServer) TrackHandler(w http.ResponseWriter, r *http.Request) {
// ReportHandler tracks emails as they are reported, updating the status for the given Result
func (ps *PhishingServer) ReportHandler(w http.ResponseWriter, r *http.Request) {
r, err := setupContext(r)
+ w.Header().Set("Access-Control-Allow-Origin", "*") // To allow Chrome extensions (or other pages) to report a campaign without violating CORS
if err != nil {
// Log the error if it wasn't something we can safely ignore
if err != ErrInvalidRequest && err != ErrCampaignComplete {
@@ -202,6 +203,7 @@ func (ps *PhishingServer) PhishHandler(w http.ResponseWriter, r *http.Request) {
http.NotFound(w, r)
return
}
+ w.Header().Set("X-Server", config.ServerName) // Useful for checking if this is a GoPhish server (e.g. for campaign reporting plugins)
var ptx models.PhishingTemplateContext
// Check for a preview
if preview, ok := ctx.Get(r, "result").(models.EmailRequest); ok {
@@ -299,7 +301,7 @@ func (ps *PhishingServer) TransparencyHandler(w http.ResponseWriter, r *http.Req
SendDate: rs.SendDate,
ContactAddress: ps.contactAddress,
}
- JSONResponse(w, tr, http.StatusOK)
+ api.JSONResponse(w, tr, http.StatusOK)
}
// setupContext handles some of the administrative work around receiving a new
diff --git a/controllers/route.go b/controllers/route.go
index 9adc3e4f..72cf545d 100644
--- a/controllers/route.go
+++ b/controllers/route.go
@@ -12,6 +12,7 @@ import (
"github.com/gophish/gophish/auth"
"github.com/gophish/gophish/config"
ctx "github.com/gophish/gophish/context"
+ "github.com/gophish/gophish/controllers/api"
log "github.com/gophish/gophish/logger"
mid "github.com/gophish/gophish/middleware"
"github.com/gophish/gophish/models"
@@ -64,7 +65,7 @@ func NewAdminServer(config config.AdminServer, options ...AdminServerOption) *Ad
}
// Start launches the admin server, listening on the configured address.
-func (as *AdminServer) Start() error {
+func (as *AdminServer) Start() {
if as.worker != nil {
go as.worker.Start()
}
@@ -72,14 +73,13 @@ func (as *AdminServer) Start() error {
err := util.CheckAndCreateSSL(as.config.CertPath, as.config.KeyPath)
if err != nil {
log.Fatal(err)
- return err
}
log.Infof("Starting admin server at https://%s", as.config.ListenURL)
- return as.server.ListenAndServeTLS(as.config.CertPath, as.config.KeyPath)
+ log.Fatal(as.server.ListenAndServeTLS(as.config.CertPath, as.config.KeyPath))
}
// If TLS isn't configured, just listen on HTTP
log.Infof("Starting admin server at http://%s", as.config.ListenURL)
- return as.server.ListenAndServe()
+ log.Fatal(as.server.ListenAndServe())
}
// Shutdown attempts to gracefully shutdown the server.
@@ -94,53 +94,30 @@ func (as *AdminServer) Shutdown() error {
func (as *AdminServer) registerRoutes() {
router := mux.NewRouter()
// Base Front-end routes
- router.HandleFunc("/", Use(as.Base, mid.RequireLogin))
+ router.HandleFunc("/", mid.Use(as.Base, mid.RequireLogin))
router.HandleFunc("/login", as.Login)
- router.HandleFunc("/logout", Use(as.Logout, mid.RequireLogin))
- router.HandleFunc("/campaigns", Use(as.Campaigns, mid.RequireLogin))
- router.HandleFunc("/campaigns/{id:[0-9]+}", Use(as.CampaignID, mid.RequireLogin))
- router.HandleFunc("/templates", Use(as.Templates, mid.RequireLogin))
- router.HandleFunc("/users", Use(as.Users, mid.RequireLogin))
- router.HandleFunc("/landing_pages", Use(as.LandingPages, mid.RequireLogin))
- router.HandleFunc("/sending_profiles", Use(as.SendingProfiles, mid.RequireLogin))
- router.HandleFunc("/settings", Use(as.Settings, mid.RequireLogin))
- router.HandleFunc("/register", Use(as.Register, mid.RequireLogin, mid.RequirePermission(models.PermissionModifySystem)))
+ router.HandleFunc("/logout", mid.Use(as.Logout, mid.RequireLogin))
+ router.HandleFunc("/campaigns", mid.Use(as.Campaigns, mid.RequireLogin))
+ router.HandleFunc("/campaigns/{id:[0-9]+}", mid.Use(as.CampaignID, mid.RequireLogin))
+ router.HandleFunc("/templates", mid.Use(as.Templates, mid.RequireLogin))
+ router.HandleFunc("/groups", mid.Use(as.Groups, mid.RequireLogin))
+ router.HandleFunc("/landing_pages", mid.Use(as.LandingPages, mid.RequireLogin))
+ router.HandleFunc("/sending_profiles", mid.Use(as.SendingProfiles, mid.RequireLogin))
+ router.HandleFunc("/settings", mid.Use(as.Settings, mid.RequireLogin))
+ router.HandleFunc("/users", mid.Use(as.UserManagement, mid.RequirePermission(models.PermissionModifySystem), mid.RequireLogin))
// Create the API routes
- api := router.PathPrefix("/api").Subrouter()
- api = api.StrictSlash(true)
- api.Use(mid.RequireAPIKey)
- api.Use(mid.EnforceViewOnly)
- api.HandleFunc("/reset", as.APIReset)
- api.HandleFunc("/campaigns/", as.APICampaigns)
- api.HandleFunc("/campaigns/summary", as.APICampaignsSummary)
- api.HandleFunc("/campaigns/{id:[0-9]+}", as.APICampaign)
- api.HandleFunc("/campaigns/{id:[0-9]+}/results", as.APICampaignResults)
- api.HandleFunc("/campaigns/{id:[0-9]+}/summary", as.APICampaignSummary)
- api.HandleFunc("/campaigns/{id:[0-9]+}/complete", as.APICampaignComplete)
- api.HandleFunc("/groups/", as.APIGroups)
- api.HandleFunc("/groups/summary", as.APIGroupsSummary)
- api.HandleFunc("/groups/{id:[0-9]+}", as.APIGroup)
- api.HandleFunc("/groups/{id:[0-9]+}/summary", as.APIGroupSummary)
- api.HandleFunc("/templates/", as.APITemplates)
- api.HandleFunc("/templates/{id:[0-9]+}", as.APITemplate)
- api.HandleFunc("/pages/", as.APIPages)
- api.HandleFunc("/pages/{id:[0-9]+}", as.APIPage)
- api.HandleFunc("/smtp/", as.APISendingProfiles)
- api.HandleFunc("/smtp/{id:[0-9]+}", as.APISendingProfile)
- api.HandleFunc("/util/send_test_email", as.APISendTestEmail)
- api.HandleFunc("/import/group", as.APIImportGroup)
- api.HandleFunc("/import/email", as.APIImportEmail)
- api.HandleFunc("/import/site", as.APIImportSite)
+ api := api.NewServer(api.WithWorker(as.worker))
+ router.PathPrefix("/api/").Handler(api)
// Setup static file serving
router.PathPrefix("/").Handler(http.FileServer(unindexed.Dir("./static/")))
// Setup CSRF Protection
- csrfHandler := csrf.Protect([]byte(auth.GenerateSecureKey()),
+ csrfHandler := csrf.Protect([]byte(util.GenerateSecureKey()),
csrf.FieldName("csrf_token"),
csrf.Secure(as.config.UseTLS))
adminHandler := csrfHandler(router)
- adminHandler = Use(adminHandler.ServeHTTP, mid.CSRFExceptions, mid.GetContext)
+ adminHandler = mid.Use(adminHandler.ServeHTTP, mid.CSRFExceptions, mid.GetContext)
// Setup GZIP compression
gzipWrapper, _ := gziphandler.NewGzipLevelHandler(gzip.BestCompression)
@@ -151,15 +128,6 @@ func (as *AdminServer) registerRoutes() {
as.server.Handler = adminHandler
}
-// Use allows us to stack middleware to process the request
-// Example taken from https://github.com/gorilla/mux/pull/36#issuecomment-25849172
-func Use(handler http.HandlerFunc, mid ...func(http.Handler) http.HandlerFunc) http.HandlerFunc {
- for _, m := range mid {
- handler = m(handler)
- }
- return handler
-}
-
type templateParams struct {
Title string
Flashes []interface{}
@@ -182,42 +150,6 @@ func newTemplateParams(r *http.Request) templateParams {
}
}
-// Register creates a new user
-func (as *AdminServer) Register(w http.ResponseWriter, r *http.Request) {
- // If it is a post request, attempt to register the account
- // Now that we are all registered, we can log the user in
- params := templateParams{Title: "Register", Token: csrf.Token(r)}
- session := ctx.Get(r, "session").(*sessions.Session)
- switch {
- case r.Method == "GET":
- params.Flashes = session.Flashes()
- session.Save(r, w)
- templates := template.New("template")
- _, err := templates.ParseFiles("templates/register.html", "templates/flashes.html")
- if err != nil {
- log.Error(err)
- }
- template.Must(templates, err).ExecuteTemplate(w, "base", params)
- case r.Method == "POST":
- //Attempt to register
- succ, err := auth.Register(r)
- //If we've registered, redirect to the login page
- if succ {
- Flash(w, r, "success", "Registration successful!")
- session.Save(r, w)
- http.Redirect(w, r, "/login", 302)
- return
- }
- // Check the error
- m := err.Error()
- log.Error(err)
- Flash(w, r, "danger", m)
- session.Save(r, w)
- http.Redirect(w, r, "/register", 302)
- return
- }
-}
-
// Base handles the default path and template execution
func (as *AdminServer) Base(w http.ResponseWriter, r *http.Request) {
params := newTemplateParams(r)
@@ -246,11 +178,11 @@ func (as *AdminServer) Templates(w http.ResponseWriter, r *http.Request) {
getTemplate(w, "templates").ExecuteTemplate(w, "base", params)
}
-// Users handles the default path and template execution
-func (as *AdminServer) Users(w http.ResponseWriter, r *http.Request) {
+// Groups handles the default path and template execution
+func (as *AdminServer) Groups(w http.ResponseWriter, r *http.Request) {
params := newTemplateParams(r)
params.Title = "Users & Groups"
- getTemplate(w, "users").ExecuteTemplate(w, "base", params)
+ getTemplate(w, "groups").ExecuteTemplate(w, "base", params)
}
// LandingPages handles the default path and template execution
@@ -280,19 +212,27 @@ func (as *AdminServer) Settings(w http.ResponseWriter, r *http.Request) {
if err == auth.ErrInvalidPassword {
msg.Message = "Invalid Password"
msg.Success = false
- JSONResponse(w, msg, http.StatusBadRequest)
+ api.JSONResponse(w, msg, http.StatusBadRequest)
return
}
if err != nil {
msg.Message = err.Error()
msg.Success = false
- JSONResponse(w, msg, http.StatusBadRequest)
+ api.JSONResponse(w, msg, http.StatusBadRequest)
return
}
- JSONResponse(w, msg, http.StatusOK)
+ api.JSONResponse(w, msg, http.StatusOK)
}
}
+// UserManagement is an admin-only handler that allows for the registration
+// and management of user accounts within Gophish.
+func (as *AdminServer) UserManagement(w http.ResponseWriter, r *http.Request) {
+ params := newTemplateParams(r)
+ params.Title = "User Management"
+ getTemplate(w, "users").ExecuteTemplate(w, "base", params)
+}
+
// Login handles the authentication flow for a user. If credentials are valid,
// a session is created
func (as *AdminServer) Login(w http.ResponseWriter, r *http.Request) {
diff --git a/docker/run.sh b/docker/run.sh
new file mode 100755
index 00000000..17cceb5d
--- /dev/null
+++ b/docker/run.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+
+# set config for admin_server
+if [ -n "${ADMIN_LISTEN_URL+set}" ] ; then
+ jq -r \
+ --arg ADMIN_LISTEN_URL "${ADMIN_LISTEN_URL}" \
+ '.admin_server.listen_url = $ADMIN_LISTEN_URL' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+if [ -n "${ADMIN_USE_TLS+set}" ] ; then
+ jq -r \
+ --argjson ADMIN_USE_TLS "${ADMIN_USE_TLS}" \
+ '.admin_server.use_tls = $ADMIN_USE_TLS' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+if [ -n "${ADMIN_CERT_PATH+set}" ] ; then
+ jq -r \
+ --arg ADMIN_CERT_PATH "${ADMIN_CERT_PATH}" \
+ '.admin_server.cert_path = $ADMIN_CERT_PATH' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+if [ -n "${ADMIN_KEY_PATH+set}" ] ; then
+ jq -r \
+ --arg ADMIN_KEY_PATH "${ADMIN_KEY_PATH}" \
+ '.admin_server.key_path = $ADMIN_KEY_PATH' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+
+# set config for phish_server
+if [ -n "${PHISH_LISTEN_URL+set}" ] ; then
+ jq -r \
+ --arg PHISH_LISTEN_URL "${PHISH_LISTEN_URL}" \
+ '.phish_server.listen_url = $PHISH_LISTEN_URL' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+if [ -n "${PHISH_USE_TLS+set}" ] ; then
+ jq -r \
+ --argjson PHISH_USE_TLS "${PHISH_USE_TLS}" \
+ '.phish_server.use_tls = $PHISH_USE_TLS' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+if [ -n "${PHISH_CERT_PATH+set}" ] ; then
+ jq -r \
+ --arg PHISH_CERT_PATH "${PHISH_CERT_PATH}" \
+ '.phish_server.cert_path = $PHISH_CERT_PATH' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+if [ -n "${PHISH_KEY_PATH+set}" ] ; then
+ jq -r \
+ --arg PHISH_KEY_PATH "${PHISH_KEY_PATH}" \
+ '.phish_server.key_path = $PHISH_KEY_PATH' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+
+# set contact_address
+if [ -n "${CONTACT_ADDRESS+set}" ] ; then
+ jq -r \
+ --arg CONTACT_ADDRESS "${CONTACT_ADDRESS}" \
+ '.contact_address = $CONTACT_ADDRESS' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+
+if [ -n "${DB_FILE_PATH+set}" ] ; then
+ jq -r \
+ --arg DB_FILE_PATH "${DB_FILE_PATH}" \
+ '.db_path = $DB_FILE_PATH' config.json > config.json.tmp && \
+ cat config.json.tmp > config.json
+fi
+
+echo "Runtime configuration: "
+cat config.json
+
+# start gophish
+./gophish
diff --git a/gophish.go b/gophish.go
index 6c6fbd9f..e86393d7 100644
--- a/gophish.go
+++ b/gophish.go
@@ -32,10 +32,10 @@ import (
"gopkg.in/alecthomas/kingpin.v2"
- "github.com/gophish/gophish/auth"
"github.com/gophish/gophish/config"
"github.com/gophish/gophish/controllers"
log "github.com/gophish/gophish/logger"
+ "github.com/gophish/gophish/middleware"
"github.com/gophish/gophish/models"
)
@@ -94,7 +94,7 @@ func main() {
}
adminConfig := conf.AdminConf
adminServer := controllers.NewAdminServer(adminConfig, adminOptions...)
- auth.Store.Options.Secure = adminConfig.UseTLS
+ middleware.Store.Options.Secure = adminConfig.UseTLS
phishConfig := conf.PhishConf
phishServer := controllers.NewPhishingServer(phishConfig)
diff --git a/gulpfile.js b/gulpfile.js
index ea8e31b5..809c28f0 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -9,16 +9,16 @@ var gulp = require('gulp'),
concat = require('gulp-concat'),
uglify = require('gulp-uglify'),
cleanCSS = require('gulp-clean-css'),
+ babel = require('gulp-babel'),
js_directory = 'static/js/src/',
css_directory = 'static/css/',
vendor_directory = js_directory + 'vendor/',
- app_directory = js_directory + 'app/**/*.js',
+ app_directory = js_directory + 'app/',
dest_js_directory = 'static/js/dist/',
dest_css_directory = 'static/css/dist/';
-gulp.task('vendorjs', function () {
- // Vendor minifying / concat
+vendorjs = function () {
return gulp.src([
vendor_directory + 'jquery.js',
vendor_directory + 'bootstrap.min.js',
@@ -46,11 +46,22 @@ gulp.task('vendorjs', function () {
}))
.pipe(uglify())
.pipe(gulp.dest(dest_js_directory));
-})
+}
-gulp.task('scripts', function () {
- // Gophish app files
- gulp.src(app_directory)
+scripts = function () {
+ // Gophish app files - non-ES6
+ return gulp.src([
+ app_directory + 'autocomplete.js',
+ app_directory + 'campaign_results.js',
+ app_directory + 'campaigns.js',
+ app_directory + 'dashboard.js',
+ app_directory + 'groups.js',
+ app_directory + 'landing_pages.js',
+ app_directory + 'sending_profiles.js',
+ app_directory + 'settings.js',
+ app_directory + 'templates.js',
+ app_directory + 'gophish.js',
+ ])
.pipe(rename({
suffix: '.min'
}))
@@ -58,9 +69,9 @@ gulp.task('scripts', function () {
console.log(e);
}))
.pipe(gulp.dest(dest_js_directory + 'app/'));
-})
+}
-gulp.task('styles', function () {
+styles = function () {
return gulp.src([
css_directory + 'bootstrap.min.css',
css_directory + 'main.css',
@@ -80,8 +91,10 @@ gulp.task('styles', function () {
}))
.pipe(concat('gophish.css'))
.pipe(gulp.dest(dest_css_directory));
-})
+}
-gulp.task('build', ['vendorjs', 'scripts', 'styles']);
-
-gulp.task('default', ['build']);
\ No newline at end of file
+exports.vendorjs = vendorjs
+exports.scripts = scripts
+exports.styles = styles
+exports.build = gulp.parallel(vendorjs, scripts, styles)
+exports.default = exports.build
\ No newline at end of file
diff --git a/middleware/middleware.go b/middleware/middleware.go
index 281aa6be..628763cc 100644
--- a/middleware/middleware.go
+++ b/middleware/middleware.go
@@ -6,7 +6,6 @@ import (
"net/http"
"strings"
- "github.com/gophish/gophish/auth"
ctx "github.com/gophish/gophish/context"
"github.com/gophish/gophish/models"
"github.com/gorilla/csrf"
@@ -31,6 +30,15 @@ func CSRFExceptions(handler http.Handler) http.HandlerFunc {
}
}
+// Use allows us to stack middleware to process the request
+// Example taken from https://github.com/gorilla/mux/pull/36#issuecomment-25849172
+func Use(handler http.HandlerFunc, mid ...func(http.Handler) http.HandlerFunc) http.HandlerFunc {
+ for _, m := range mid {
+ handler = m(handler)
+ }
+ return handler
+}
+
// GetContext wraps each request in a function which fills in the context for a given request.
// This includes setting the User and Session keys and values as necessary for use in later functions.
func GetContext(handler http.Handler) http.HandlerFunc {
@@ -43,7 +51,7 @@ func GetContext(handler http.Handler) http.HandlerFunc {
}
// Set the context appropriately here.
// Set the session
- session, _ := auth.Store.Get(r, "gophish")
+ session, _ := Store.Get(r, "gophish")
// Put the session in the context so that we can
// reuse the values in different handlers
r = ctx.Set(r, "session", session)
@@ -107,11 +115,12 @@ func RequireLogin(handler http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if u := ctx.Get(r, "user"); u != nil {
handler.ServeHTTP(w, r)
- } else {
- q := r.URL.Query()
- q.Set("next", r.URL.Path)
- http.Redirect(w, r, fmt.Sprintf("/login?%s", q.Encode()), http.StatusTemporaryRedirect)
+ return
}
+ q := r.URL.Query()
+ q.Set("next", r.URL.Path)
+ http.Redirect(w, r, fmt.Sprintf("/login?%s", q.Encode()), http.StatusTemporaryRedirect)
+ return
}
}
diff --git a/middleware/middleware_test.go b/middleware/middleware_test.go
index b17b6351..30752b01 100644
--- a/middleware/middleware_test.go
+++ b/middleware/middleware_test.go
@@ -1,6 +1,7 @@
package middleware
import (
+ "fmt"
"net/http"
"net/http/httptest"
"testing"
@@ -17,6 +18,7 @@ var successHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Reques
type MiddlewareSuite struct {
suite.Suite
+ apiKey string
}
func (s *MiddlewareSuite) SetupSuite() {
@@ -29,6 +31,10 @@ func (s *MiddlewareSuite) SetupSuite() {
if err != nil {
s.T().Fatalf("Failed creating database: %v", err)
}
+ // Get the API key to use for these tests
+ u, err := models.GetUser(1)
+ s.Nil(err)
+ s.apiKey = u.ApiKey
}
// MiddlewarePermissionTest maps an expected HTTP Method to an expected HTTP
@@ -99,6 +105,35 @@ func (s *MiddlewareSuite) TestRequirePermission() {
}
}
+func (s *MiddlewareSuite) TestRequireAPIKey() {
+ req := httptest.NewRequest(http.MethodGet, "/", nil)
+ req.Header.Set("Content-Type", "application/json")
+ response := httptest.NewRecorder()
+ // Test that making a request without an API key is denied
+ RequireAPIKey(successHandler).ServeHTTP(response, req)
+ s.Equal(response.Code, http.StatusUnauthorized)
+}
+
+func (s *MiddlewareSuite) TestInvalidAPIKey() {
+ req := httptest.NewRequest(http.MethodGet, "/", nil)
+ query := req.URL.Query()
+ query.Set("api_key", "bogus-api-key")
+ req.URL.RawQuery = query.Encode()
+ req.Header.Set("Content-Type", "application/json")
+ response := httptest.NewRecorder()
+ RequireAPIKey(successHandler).ServeHTTP(response, req)
+ s.Equal(response.Code, http.StatusUnauthorized)
+}
+
+func (s *MiddlewareSuite) TestBearerToken() {
+ req := httptest.NewRequest(http.MethodGet, "/", nil)
+ req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", s.apiKey))
+ req.Header.Set("Content-Type", "application/json")
+ response := httptest.NewRecorder()
+ RequireAPIKey(successHandler).ServeHTTP(response, req)
+ s.Equal(response.Code, http.StatusOK)
+}
+
func TestMiddlewareSuite(t *testing.T) {
suite.Run(t, new(MiddlewareSuite))
}
diff --git a/middleware/session.go b/middleware/session.go
new file mode 100644
index 00000000..fe96701b
--- /dev/null
+++ b/middleware/session.go
@@ -0,0 +1,23 @@
+package middleware
+
+import (
+ "encoding/gob"
+
+ "github.com/gophish/gophish/models"
+ "github.com/gorilla/securecookie"
+ "github.com/gorilla/sessions"
+)
+
+// init registers the necessary models to be saved in the session later
+func init() {
+ gob.Register(&models.User{})
+ gob.Register(&models.Flash{})
+ Store.Options.HttpOnly = true
+ // This sets the maxAge to 5 days for all cookies
+ Store.MaxAge(86400 * 5)
+}
+
+// Store contains the session information for the request
+var Store = sessions.NewCookieStore(
+ []byte(securecookie.GenerateRandomKey(64)), //Signing key
+ []byte(securecookie.GenerateRandomKey(32)))
diff --git a/models/maillog.go b/models/maillog.go
index 98e4a904..59a7f639 100644
--- a/models/maillog.go
+++ b/models/maillog.go
@@ -1,12 +1,15 @@
package models
import (
+ "crypto/rand"
"encoding/base64"
"errors"
"fmt"
"io"
"math"
+ "math/big"
"net/mail"
+ "os"
"strings"
"time"
@@ -162,6 +165,14 @@ func (m *MailLog) Generate(msg *gomail.Message) error {
if conf.ContactAddress != "" {
msg.SetHeader("X-Gophish-Contact", conf.ContactAddress)
}
+
+ // Add Message-Id header as described in RFC 2822.
+ messageID, err := m.generateMessageID()
+ if err != nil {
+ return err
+ }
+ msg.SetHeader("Message-Id", messageID)
+
// Parse the customHeader templates
for _, header := range c.SMTP.Headers {
key, err := ExecuteTemplate(header.Key, ptx)
@@ -261,3 +272,30 @@ func LockMailLogs(ms []*MailLog, lock bool) error {
func UnlockAllMailLogs() error {
return db.Model(&MailLog{}).Update("processing", false).Error
}
+
+var maxBigInt = big.NewInt(math.MaxInt64)
+
+// generateMessageID generates and returns a string suitable for an RFC 2822
+// compliant Message-ID, e.g.:
+// <1444789264909237300.3464.1819418242800517193@DESKTOP01>
+//
+// The following parameters are used to generate a Message-ID:
+// - The nanoseconds since Epoch
+// - The calling PID
+// - A cryptographically random int64
+// - The sending hostname
+func (m *MailLog) generateMessageID() (string, error) {
+ t := time.Now().UnixNano()
+ pid := os.Getpid()
+ rint, err := rand.Int(rand.Reader, maxBigInt)
+ if err != nil {
+ return "", err
+ }
+ h, err := os.Hostname()
+ // If we can't get the hostname, we'll use localhost
+ if err != nil {
+ h = "localhost.localdomain"
+ }
+ msgid := fmt.Sprintf("<%d.%d.%d@%s>", t, pid, rint, h)
+ return msgid, nil
+}
diff --git a/models/models.go b/models/models.go
index 3b1c82f9..e929af02 100644
--- a/models/models.go
+++ b/models/models.go
@@ -4,10 +4,14 @@ import (
"crypto/rand"
"fmt"
"io"
+ "time"
+ "crypto/tls"
+ "crypto/x509"
+ "io/ioutil"
"bitbucket.org/liamstask/goose/lib/goose"
- _ "github.com/go-sql-driver/mysql" // Blank import needed to import mysql
+ mysql "github.com/go-sql-driver/mysql"
"github.com/gophish/gophish/config"
log "github.com/gophish/gophish/logger"
"github.com/jinzhu/gorm"
@@ -17,6 +21,8 @@ import (
var db *gorm.DB
var conf *config.Config
+const MaxDatabaseConnectionAttempts int = 10
+
const (
CampaignInProgress string = "In progress"
CampaignQueued string = "Queued"
@@ -93,8 +99,45 @@ func Setup(c *config.Config) error {
log.Error(err)
return err
}
+
+ // Register certificates for tls encrypted db connections
+ if conf.DBSSLCaPath != "" {
+ switch conf.DBName {
+ case "mysql":
+ rootCertPool := x509.NewCertPool()
+ pem, err := ioutil.ReadFile(conf.DBSSLCaPath)
+ if err != nil {
+ log.Error(err)
+ return err
+ }
+ if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
+ log.Error("Failed to append PEM.")
+ return err
+ }
+ mysql.RegisterTLSConfig("ssl_ca", &tls.Config{
+ RootCAs: rootCertPool,
+ })
+ // Default database is sqlite3, which supports no tls, as connection
+ // is file based
+ default:
+ }
+ }
+
// Open our database connection
- db, err = gorm.Open(conf.DBName, conf.DBPath)
+ i := 0
+ for {
+ db, err = gorm.Open(conf.DBName, conf.DBPath)
+ if err == nil {
+ break
+ }
+ if err != nil && i >= MaxDatabaseConnectionAttempts {
+ log.Error(err)
+ return err
+ }
+ i += 1
+ log.Warn("waiting for database to be up...")
+ time.Sleep(5 * time.Second)
+ }
db.LogMode(false)
db.SetLogger(log.Logger)
db.DB().SetMaxOpenConns(1)
diff --git a/models/rbac.go b/models/rbac.go
index fc1139fd..00f1346a 100644
--- a/models/rbac.go
+++ b/models/rbac.go
@@ -48,7 +48,7 @@ const (
// Role represents a user role within Gophish. Each user has a single role
// which maps to a set of permissions.
type Role struct {
- ID int64 `json:"id"`
+ ID int64 `json:"-"`
Slug string `json:"slug"`
Name string `json:"name"`
Description string `json:"description"`
diff --git a/models/smtp.go b/models/smtp.go
index 10441ad4..a78d82fd 100644
--- a/models/smtp.go
+++ b/models/smtp.go
@@ -218,6 +218,7 @@ func PutSMTP(s *SMTP) error {
log.Error(err)
return err
}
+ // Save custom headers
for i := range s.Headers {
s.Headers[i].SMTPId = s.Id
err := db.Save(&s.Headers[i]).Error
diff --git a/models/template_context.go b/models/template_context.go
index 96e03f3e..a524d304 100644
--- a/models/template_context.go
+++ b/models/template_context.go
@@ -45,7 +45,10 @@ func NewPhishingTemplateContext(ctx TemplateContext, r BaseRecipient, rid string
// For the base URL, we'll reset the the path and the query
// This will create a URL in the form of http://example.com
- baseURL, _ := url.Parse(templateURL)
+ baseURL, err:= url.Parse(templateURL)
+ if err != nil {
+ return PhishingTemplateContext{}, err
+ }
baseURL.Path = ""
baseURL.RawQuery = ""
diff --git a/models/user.go b/models/user.go
index 9ce92bbc..e8374e8c 100644
--- a/models/user.go
+++ b/models/user.go
@@ -1,5 +1,16 @@
package models
+import (
+ "errors"
+
+ log "github.com/gophish/gophish/logger"
+)
+
+// ErrModifyingOnlyAdmin occurs when there is an attempt to modify the only
+// user account with the Admin role in such a way that there will be no user
+// accounts left in Gophish with that role.
+var ErrModifyingOnlyAdmin = errors.New("Cannot remove the only administrator")
+
// User represents the user model for gophish.
type User struct {
Id int64 `json:"id"`
@@ -18,6 +29,13 @@ func GetUser(id int64) (User, error) {
return u, err
}
+// GetUsers returns the users registered in Gophish
+func GetUsers() ([]User, error) {
+ us := []User{}
+ err := db.Preload("Role").Find(&us).Error
+ return us, err
+}
+
// GetUserByAPIKey returns the user that the given API Key corresponds to. If no user is found, an
// error is thrown.
func GetUserByAPIKey(key string) (User, error) {
@@ -39,3 +57,102 @@ func PutUser(u *User) error {
err := db.Save(u).Error
return err
}
+
+// EnsureEnoughAdmins ensures that there is more than one user account in
+// Gophish with the Admin role. This function is meant to be called before
+// modifying a user account with the Admin role in a non-revokable way.
+func EnsureEnoughAdmins() error {
+ role, err := GetRoleBySlug(RoleAdmin)
+ if err != nil {
+ return err
+ }
+ var adminCount int
+ err = db.Model(&User{}).Where("role_id=?", role.ID).Count(&adminCount).Error
+ if err != nil {
+ return err
+ }
+ if adminCount == 1 {
+ return ErrModifyingOnlyAdmin
+ }
+ return nil
+}
+
+// DeleteUser deletes the given user. To ensure that there is always at least
+// one user account with the Admin role, this function will refuse to delete
+// the last Admin.
+func DeleteUser(id int64) error {
+ existing, err := GetUser(id)
+ if err != nil {
+ return err
+ }
+ // If the user is an admin, we need to verify that it's not the last one.
+ if existing.Role.Slug == RoleAdmin {
+ err = EnsureEnoughAdmins()
+ if err != nil {
+ return err
+ }
+ }
+ campaigns, err := GetCampaigns(id)
+ if err != nil {
+ return err
+ }
+ // Delete the campaigns
+ log.Infof("Deleting campaigns for user ID %d", id)
+ for _, campaign := range campaigns {
+ err = DeleteCampaign(campaign.Id)
+ if err != nil {
+ return err
+ }
+ }
+ log.Infof("Deleting pages for user ID %d", id)
+ // Delete the landing pages
+ pages, err := GetPages(id)
+ if err != nil {
+ return err
+ }
+ for _, page := range pages {
+ err = DeletePage(page.Id, id)
+ if err != nil {
+ return err
+ }
+ }
+ // Delete the templates
+ log.Infof("Deleting templates for user ID %d", id)
+ templates, err := GetTemplates(id)
+ if err != nil {
+ return err
+ }
+ for _, template := range templates {
+ err = DeleteTemplate(template.Id, id)
+ if err != nil {
+ return err
+ }
+ }
+ // Delete the groups
+ log.Infof("Deleting groups for user ID %d", id)
+ groups, err := GetGroups(id)
+ if err != nil {
+ return err
+ }
+ for _, group := range groups {
+ err = DeleteGroup(&group)
+ if err != nil {
+ return err
+ }
+ }
+ // Delete the sending profiles
+ log.Infof("Deleting sending profiles for user ID %d", id)
+ profiles, err := GetSMTPs(id)
+ if err != nil {
+ return err
+ }
+ for _, profile := range profiles {
+ err = DeleteSMTP(profile.Id, id)
+ if err != nil {
+ return err
+ }
+ }
+ // Finally, delete the user
+ err = db.Where("id=?", id).Delete(&User{}).Error
+ return err
+}
diff --git a/models/user_test.go b/models/user_test.go
index 7e86eecb..c869d82e 100644
--- a/models/user_test.go
+++ b/models/user_test.go
@@ -59,3 +59,44 @@ func (s *ModelsSuite) TestGeneratedAPIKey(c *check.C) {
c.Assert(err, check.Equals, nil)
c.Assert(u.ApiKey, check.Not(check.Equals), "12345678901234567890123456789012")
}
+
+func (s *ModelsSuite) verifyRoleCount(c *check.C, roleID, expected int64) {
+ var adminCount int64
+ err := db.Model(&User{}).Where("role_id=?", roleID).Count(&adminCount).Error
+ c.Assert(err, check.Equals, nil)
+ c.Assert(adminCount, check.Equals, expected)
+}
+
+func (s *ModelsSuite) TestDeleteLastAdmin(c *check.C) {
+ // Create a new admin user
+ role, err := GetRoleBySlug(RoleAdmin)
+ c.Assert(err, check.Equals, nil)
+ newAdmin := User{
+ Username: "new-admin",
+ Hash: "123456",
+ ApiKey: "123456",
+ Role: role,
+ RoleID: role.ID,
+ }
+ err = PutUser(&newAdmin)
+ c.Assert(err, check.Equals, nil)
+
+ // Ensure that there are two admins
+ s.verifyRoleCount(c, role.ID, 2)
+
+ // Delete the newly created admin - this should work since we have more
+ // than one current admin.
+ err = DeleteUser(newAdmin.Id)
+ c.Assert(err, check.Equals, nil)
+
+ // Verify that we now have one admin
+ s.verifyRoleCount(c, role.ID, 1)
+
+ // Try to delete the last admin - this should fail since we always want at
+ // least one admin active in Gophish.
+ err = DeleteUser(1)
+ c.Assert(err, check.Equals, ErrModifyingOnlyAdmin)
+
+ // Verify that the admin wasn't deleted
+ s.verifyRoleCount(c, role.ID, 1)
+}
diff --git a/package.json b/package.json
index 36d7e62c..10a1cdad 100644
--- a/package.json
+++ b/package.json
@@ -12,17 +12,22 @@
},
"homepage": "https://getgophish.com",
"devDependencies": {
- "clean-css": "^3.4.23",
- "gulp": "^3.9.1",
- "gulp-clean-css": "^2.3.2",
- "gulp-cli": "^1.4.0",
+ "@babel/core": "^7.4.5",
+ "@babel/preset-env": "^7.4.5",
+ "babel-loader": "^8.0.6",
+ "clean-css": "^4.2.1",
+ "gulp": "^4.0.0",
+ "gulp-babel": "^8.0.0",
+ "gulp-clean-css": "^4.0.0",
+ "gulp-cli": "^2.2.0",
"gulp-concat": "^2.6.1",
- "gulp-jshint": "^2.0.4",
- "gulp-rename": "^1.2.2",
- "gulp-uglify": "^2.0.0",
- "gulp-util": "^3.0.8",
- "gulp-wrap": "^0.13.0",
- "jshint": "^2.9.4",
- "jshint-stylish": "^2.2.1"
+ "gulp-jshint": "^2.1.0",
+ "gulp-rename": "^1.4.0",
+ "gulp-uglify": "^3.0.2",
+ "gulp-wrap": "^0.15.0",
+ "jshint": "^2.10.2",
+ "jshint-stylish": "^2.2.1",
+ "webpack": "^4.32.2",
+ "webpack-cli": "^3.3.2"
}
}
diff --git a/static/css/dist/gophish.css b/static/css/dist/gophish.css
index f80dfc2f..23288b1d 100644
--- a/static/css/dist/gophish.css
+++ b/static/css/dist/gophish.css
@@ -3,7 +3,7 @@
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(/font/glyphicons-halflings-regular.eot);src:url(/font/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(/font/glyphicons-halflings-regular.woff2) format('woff2'),url(/font/glyphicons-halflings-regular.woff) format('woff'),url(/font/glyphicons-halflings-regular.ttf) format('truetype'),url(/font/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;opacity:0;line-break:auto}.tooltip.in{opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
-.nav-tabs{cursor:pointer}.datatable_hidden{display:none}.navbar-logo{margin:4px 0;float:left}#navbar-login{padding-top:8px;padding-bottom:0}#navbar-dropdown{margin-top:6px;margin-right:15px}.sans{font-family:'Open Sans',sans-serif!important}.label{font-family:Roboto,sans-serif!important}.form-signin{max-width:400px;padding:15px;margin:40px auto 0 auto}ul .dropdown-menu .ng-isolate-scope{visibility:visible;display:block;opacity:1}#login-button{padding:10px 15px}.form-signin-heading{text-align:center}.form-signin .checkbox,.form-signin .form-signin-heading{margin-bottom:10px}.form-signin .checkbox{font-weight:400}.form-signin .form-control{font-family:'Open Sans',sans-serif;position:relative;font-size:16px;height:auto;padding:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.form-signin .form-control:focus{z-index:2}.form-signin .top-input{margin-bottom:-1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.form-signin .middle-input{margin-bottom:-1px;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.form-signin .bottom-input{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}#logo{display:block;margin-left:auto;margin-right:auto}footer>p{color:#444;font-family:'Open Sans',sans-serif}.header{margin-top:10px}.sidebar{padding-left:0}.sidebar a{color:#201e1c}.sidebar a:hover{color:#201e1c}.api_heading{font-family:'Open Sans',sans-serif;background-color:#201e1c;border-radius:5px;padding:10px;color:#e2e2e2;width:100%}p{font-size:1.2em}.form-label{padding-top:7px}.hover{visibility:visible}.edit-button{display:none}.editable-row:hover .edit-button{display:inline-block;padding:3px 6px;font-size:9px}.remove-row{float:right;cursor:pointer}.pagination{margin:0}@media (min-width:992px){.modal-dialog{width:700px}}.dropdown-menu>li>a{cursor:pointer}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;text-align:right;opacity:0;outline:0;background:#fff;cursor:inherit;display:block}.typeahead{border-left-radius:6px!important;float:none!important}.tt-query{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.tt-hint{color:#999}.tt-menu{width:422px;margin-top:4px;padding:4px 0;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.tt-suggestion{padding:3px 20px;line-height:24px}.tt-suggestion.tt-cursor{color:#fff;background-color:#0097cf}.tt-suggestion p{margin:0}.typeahead-button{line-height:1.39!important}.ct-point{cursor:pointer}.ct-timeline-point{cursor:pointer;stroke:#fff;stroke-width:1px}.ct-point-sending{fill:#428bca!important}.ct-point-error{fill:#6c7a89!important}.ct-point-clicked{fill:#f39c12!important}.ct-point-opened{fill:#f9bf3b!important}.ct-point-sent{fill:#1abc9c!important}.ct-point-success{fill:#f05b4f!important}.chartist-tooltip{position:absolute;display:inline-block;min-width:5em;padding:.5em;background:#283f50;color:#fff;font-weight:700;text-align:center;pointer-events:none;z-index:1;margin-left:1.25em;font-size:.75em;border-radius:4px}.chartist-pie-tooltip{position:absolute;display:inline-block;min-width:5em;padding:.5em;background:#283f50;color:#fff;font-weight:700;text-align:center;pointer-events:none;z-index:1;margin-left:1.25em;font-size:.75em;border-radius:4px}.chartist-tooltip:after{content:"";position:absolute;top:100%;left:50%;width:0;height:0;margin-left:-15px;border:15px solid transparent;border-top-color:#283f50}.chartist-chart{height:175px}.chartist-legend{list-style:none;position:absolute;padding-left:0;top:0}.chartist-legend li{display:block;position:relative;margin-bottom:4px;border-radius:5px;padding:2px 8px 2px 8px;font-size:14px;cursor:default;-webkit-transition:background-color .2s ease-in-out;-moz-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.chartist-legend li span{display:inline-block;vertical-align:middle;width:20px;height:20px;margin-right:10px;border-radius:50%}.ct-series-a .ct-slice-donut{stroke:#1abc9c!important}.ct-slice-donut.ct-slice-donut-error{stroke:#6c7a89!important}.ct-slice-donut.ct-slice-donut-sent{stroke:#1abc9c!important}.ct-slice-donut.ct-slice-donut-opened{stroke:#f9bf3b!important}.ct-slice-donut.ct-slice-donut-success{stroke:#f05b4f!important}.ct-slice-donut.ct-slice-donut-clicked{stroke:#f39c12!important}.ct-slice-donut.ct-slice-donut-sending{stroke:#428bca!important}.ct-legend-error{background-color:#6c7a89!important}.ct-legend-sent{background-color:#1abc9c!important}.ct-legend-opened{background-color:#f9bf3b!important}.ct-legend-success{background-color:#f05b4f!important}.ct-legend-clicked{background-color:#f39c12!important}.ct-legend-sending{background-color:#428bca!important}.label-clicked{background-color:#f39c12!important}.gophish-editor{font-family:'Courier New',Monospace!important;font-size:small!important}#resultsMap{margin-top:-30px}@media (min-width:768px) and (max-width:1300px){.navbar-collapse.collapse{display:none!important}.navbar-collapse.collapse.in{display:block!important}.navbar-header .collapse,.navbar-toggle{display:block!important}.navbar-header{float:none!important}}.modal-content table{table-layout:fixed}.modal-content .dataTable tbody td{font-size:16px;overflow:hidden;text-overflow:ellipsis}.dataTables_info{font-size:15px}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after{font-family:FontAwesome!important;position:relative!important;display:initial!important;top:initial!important;right:initial!important;left:6px;color:#1abc9c}table.dataTable thead .sorting:after{content:"\f0dc"!important;color:initial}table.dataTable thead .sorting_asc:after{content:"\f0de"!important;opacity:.8!important}table.dataTable thead .sorting_desc:after{content:"\f0dd"!important;opacity:.8!important}td.details-control{cursor:pointer}.timeline{text-align:left;background-color:#fff}.timeline-graph{margin-left:30px}.timeline>h6{margin-top:0;margin-bottom:5px}.timeline>.subtitle{color:#999;font-style:italic;margin-bottom:15px;display:block}.timeline-entry{position:relative;padding-bottom:36px}.timeline-bar{display:block;content:"";position:absolute;top:5px;bottom:0;width:1px;left:-6px;background:#aaa}.timeline-entry:last-child .timeline-bar{display:none}.timeline-entry:last-child{padding-bottom:0}.timeline-icon{position:relative;float:left;margin-left:-24px;width:36px;top:-5px;height:36px;text-align:center;border-radius:50%}.timeline-icon>i{margin-top:10px;color:#fff}.timeline-message{padding-left:30px}.timeline-date{float:right;color:#999;font-style:italic}.timeline-event-details{font-size:16px;margin-top:5px;cursor:pointer}.timeline-replay-button{margin-top:10px}.timeline-event-details>.table-responsive{display:none}.timeline-event-details{margin-top:10px;margin-bottom:10px}.timeline-event-results{font-size:16px;display:none}.timeline-device-details{font-size:.8em;margin-top:10px}.timeline-device-os>span.fa-stack{font-size:.8em}.timeline-device-browser>span.fa-stack{font-size:.8em}.timeline-device-browser>span.fa-stack>i.fa-stack-1x{font-size:1.5em}i.fa-vendor-icon{font-size:.6em}i.fa-tablet+i.fa-vendor-icon{top:-2px}i.fa-tablet+i.fa-vendor-icon{top:-2px}i.fa-laptop+i.fa-vendor-icon{top:-2px}.tooltip-inner{width:300px!important}#refresh_message{display:none}#capture_passwords{display:none}#redirect_url{display:none}@media (max-width:767px){.navbar-header{margin-left:10px!important}}table.dataTable{width:100%!important}.btn-blue{color:#fff;background-color:#428bca;border-color:#428bca}.btn-blue:hover{background-color:#64a1d6}.select2-container--bootstrap .select2-selection--single .select2-selection__rendered{font-size:15px!important}.select2-container--bootstrap .select2-selection--single{height:42px!important;padding:8px 12px!important}.input-group-btn .btn{line-height:20px!important}.highcharts-title{font-family:"Source Sans Pro",Helvetica,Arial,sans-serif;font-size:16px!important}.color-success{font-weight:700;color:#f05b4f}.color-sent{font-weight:700;color:#1abc9c}.color-opened{font-weight:700;color:#f9bf3b}.color-clicked{font-weight:700;color:#f39c12}.color-reported{font-weight:700;color:#45d6ef}.color-success{color:#f05b4f}.nav-sidebar>li.active>a:focus,.nav-sidebar>li.active>a:hover{background-color:#37485a}#resultsMapContainer{display:none}#csv-template{margin-left:15px;cursor:pointer}.cke_chrome{border-top:0!important}.cke_autocomplete_panel{width:400px!important}.cke_autocomplete_panel>li{padding:10px 5px!important}
+.swal2-popup{font-size:1.6rem!important}.nav-tabs{cursor:pointer}.datatable_hidden{display:none}.navbar-logo{margin:4px 0;float:left}#navbar-login{padding-top:8px;padding-bottom:0}#navbar-dropdown{margin-top:6px;margin-right:15px}.sans{font-family:'Open Sans',sans-serif!important}.label{font-family:Roboto,sans-serif!important}.form-signin{max-width:400px;padding:15px;margin:40px auto 0 auto}ul .dropdown-menu .ng-isolate-scope{visibility:visible;display:block;opacity:1}#login-button{padding:10px 15px}.form-signin-heading{text-align:center}.form-signin .checkbox,.form-signin .form-signin-heading{margin-bottom:10px}.form-signin .checkbox{font-weight:400}.form-signin .form-control{font-family:'Open Sans',sans-serif;position:relative;font-size:16px;height:auto;padding:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.form-signin .form-control:focus{z-index:2}.form-signin .top-input{margin-bottom:-1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.form-signin .middle-input{margin-bottom:-1px;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.form-signin .bottom-input{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}#logo{display:block;margin-left:auto;margin-right:auto}footer>p{color:#444;font-family:'Open Sans',sans-serif}.header{margin-top:10px}.sidebar{padding-left:0}.sidebar a{color:#201e1c}.sidebar a:hover{color:#201e1c}.api_heading{font-family:'Open Sans',sans-serif;background-color:#201e1c;border-radius:5px;padding:10px;color:#e2e2e2;width:100%}p{font-size:1.2em}.form-label{padding-top:7px}.hover{visibility:visible}.edit-button{display:none}.editable-row:hover .edit-button{display:inline-block;padding:3px 6px;font-size:9px}.remove-row{float:right;cursor:pointer}.pagination{margin:0}@media (min-width:992px){.modal-dialog{width:700px}}.dropdown-menu>li>a{cursor:pointer}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;text-align:right;opacity:0;outline:0;background:#fff;cursor:inherit;display:block}.typeahead{border-left-radius:6px!important;float:none!important}.tt-query{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.tt-hint{color:#999}.tt-menu{width:422px;margin-top:4px;padding:4px 0;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.tt-suggestion{padding:3px 20px;line-height:24px}.tt-suggestion.tt-cursor{color:#fff;background-color:#0097cf}.tt-suggestion p{margin:0}.typeahead-button{line-height:1.39!important}.ct-point{cursor:pointer}.ct-timeline-point{cursor:pointer;stroke:#fff;stroke-width:1px}.ct-point-sending{fill:#428bca!important}.ct-point-error{fill:#6c7a89!important}.ct-point-clicked{fill:#f39c12!important}.ct-point-opened{fill:#f9bf3b!important}.ct-point-sent{fill:#1abc9c!important}.ct-point-success{fill:#f05b4f!important}.chartist-tooltip{position:absolute;display:inline-block;min-width:5em;padding:.5em;background:#283f50;color:#fff;font-weight:700;text-align:center;pointer-events:none;z-index:1;margin-left:1.25em;font-size:.75em;border-radius:4px}.chartist-pie-tooltip{position:absolute;display:inline-block;min-width:5em;padding:.5em;background:#283f50;color:#fff;font-weight:700;text-align:center;pointer-events:none;z-index:1;margin-left:1.25em;font-size:.75em;border-radius:4px}.chartist-tooltip:after{content:"";position:absolute;top:100%;left:50%;width:0;height:0;margin-left:-15px;border:15px solid transparent;border-top-color:#283f50}.chartist-chart{height:175px}.chartist-legend{list-style:none;position:absolute;padding-left:0;top:0}.chartist-legend li{display:block;position:relative;margin-bottom:4px;border-radius:5px;padding:2px 8px 2px 8px;font-size:14px;cursor:default;-webkit-transition:background-color .2s ease-in-out;-moz-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.chartist-legend li span{display:inline-block;vertical-align:middle;width:20px;height:20px;margin-right:10px;border-radius:50%}.ct-series-a .ct-slice-donut{stroke:#1abc9c!important}.ct-slice-donut.ct-slice-donut-error{stroke:#6c7a89!important}.ct-slice-donut.ct-slice-donut-sent{stroke:#1abc9c!important}.ct-slice-donut.ct-slice-donut-opened{stroke:#f9bf3b!important}.ct-slice-donut.ct-slice-donut-success{stroke:#f05b4f!important}.ct-slice-donut.ct-slice-donut-clicked{stroke:#f39c12!important}.ct-slice-donut.ct-slice-donut-sending{stroke:#428bca!important}.ct-legend-error{background-color:#6c7a89!important}.ct-legend-sent{background-color:#1abc9c!important}.ct-legend-opened{background-color:#f9bf3b!important}.ct-legend-success{background-color:#f05b4f!important}.ct-legend-clicked{background-color:#f39c12!important}.ct-legend-sending{background-color:#428bca!important}.label-clicked{background-color:#f39c12!important}.gophish-editor{font-family:'Courier New',Monospace!important;font-size:small!important}#resultsMap{margin-top:-30px}@media (min-width:768px) and (max-width:1300px){.navbar-collapse.collapse{display:none!important}.navbar-collapse.collapse.in{display:block!important}.navbar-header .collapse,.navbar-toggle{display:block!important}.navbar-header{float:none!important}}.modal-content table{table-layout:fixed}.modal-content .dataTable tbody td{font-size:16px;overflow:hidden;text-overflow:ellipsis}.dataTables_info{font-size:15px}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after{font-family:FontAwesome!important;position:relative!important;display:initial!important;top:initial!important;right:initial!important;left:6px;color:#1abc9c}table.dataTable thead .sorting:after{content:"\f0dc"!important;color:initial}table.dataTable thead .sorting_asc:after{content:"\f0de"!important;opacity:.8!important}table.dataTable thead .sorting_desc:after{content:"\f0dd"!important;opacity:.8!important}td.details-control{cursor:pointer}.timeline{text-align:left;background-color:#fff}.timeline-graph{margin-left:30px}.timeline>h6{margin-top:0;margin-bottom:5px}.timeline>.subtitle{color:#999;font-style:italic;margin-bottom:15px;display:block}.timeline-entry{position:relative;padding-bottom:36px}.timeline-bar{display:block;content:"";position:absolute;top:5px;bottom:0;width:1px;left:-6px;background:#aaa}.timeline-entry:last-child .timeline-bar{display:none}.timeline-entry:last-child{padding-bottom:0}.timeline-icon{position:relative;float:left;margin-left:-24px;width:36px;top:-5px;height:36px;text-align:center;border-radius:50%}.timeline-icon>i{margin-top:10px;color:#fff}.timeline-message{padding-left:30px}.timeline-date{float:right;color:#999;font-style:italic}.timeline-event-details{font-size:16px;margin-top:5px;cursor:pointer}.timeline-replay-button{margin-top:10px}.timeline-event-details>.table-responsive{display:none}.timeline-event-details{margin-top:10px;margin-bottom:10px}.timeline-event-results{font-size:16px;display:none}.timeline-device-details{font-size:.8em;margin-top:10px}.timeline-device-os>span.fa-stack{font-size:.8em}.timeline-device-browser>span.fa-stack{font-size:.8em}.timeline-device-browser>span.fa-stack>i.fa-stack-1x{font-size:1.5em}i.fa-vendor-icon{font-size:.6em}i.fa-tablet+i.fa-vendor-icon{top:-2px}i.fa-tablet+i.fa-vendor-icon{top:-2px}i.fa-laptop+i.fa-vendor-icon{top:-2px}.tooltip-inner{width:300px!important}#refresh_message{display:none}#capture_passwords{display:none}#redirect_url{display:none}@media (max-width:767px){.navbar-header{margin-left:10px!important}}table.dataTable{width:100%!important}.btn-blue{color:#fff;background-color:#428bca;border-color:#428bca}.btn-blue:hover{background-color:#64a1d6}.select2-container--bootstrap .select2-selection--single .select2-selection__rendered{font-size:15px!important}.select2-container--bootstrap .select2-selection--single{height:42px!important;padding:8px 12px!important}.input-group-btn .btn{line-height:20px!important}.highcharts-title{font-family:"Source Sans Pro",Helvetica,Arial,sans-serif;font-size:16px!important}.color-success{font-weight:700;color:#f05b4f}.color-sent{font-weight:700;color:#1abc9c}.color-opened{font-weight:700;color:#f9bf3b}.color-clicked{font-weight:700;color:#f39c12}.color-reported{font-weight:700;color:#45d6ef}.color-success{color:#f05b4f}.nav-sidebar>li.active>a:focus,.nav-sidebar>li.active>a:hover{background-color:#37485a}.nav-badge{margin-top:5px}#resultsMapContainer{display:none}#csv-template{margin-left:15px;cursor:pointer}.cke_chrome{border-top:0!important}.cke_autocomplete_panel{width:400px!important}.cke_autocomplete_panel>li{padding:10px 5px!important}
body{padding-top:50px}.sub-header{padding-bottom:10px;border-bottom:1px solid #eee}.sidebar{display:none}@media (min-width:768px){.sidebar{position:fixed;top:51px;bottom:0;left:0;display:block;padding:20px;overflow-x:hidden;overflow-y:auto;background-color:#f5f5f5;border-right:1px solid #eee}}.nav-sidebar{margin-right:-21px;margin-bottom:20px;margin-left:-20px}.nav-sidebar>li>a{padding-right:20px;padding-left:20px}.nav-sidebar>.active>a{color:#fff;background-color:#283f50}.main{padding:20px}@media (min-width:768px){.main{padding-right:40px;padding-left:40px}}.main .page-header{margin-top:0}.placeholders{margin-bottom:30px;text-align:center}.placeholders h4{margin-bottom:0}.placeholder{margin-bottom:20px}.placeholder img{display:inline-block;border-radius:50%}
@font-face{font-family:Flat-UI-Icons;src:url(../font/flat-ui-icons-regular.eot);src:url(../font/flat-ui-icons-regular.eot?#iefix) format('embedded-opentype'),url(../font/flat-ui-icons-regular.woff) format('woff'),url(../font/flat-ui-icons-regular.ttf) format('truetype'),url(../font/flat-ui-icons-regular.svg#flat-ui-icons-regular) format('svg');font-weight:400;font-style:normal}[data-icon]:before{font-family:Flat-UI-Icons;content:attr(data-icon);speak:none;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fui-arrow-left,.fui-arrow-right,.fui-calendar-solid,.fui-chat,.fui-check,.fui-check-inverted,.fui-check-inverted-2,.fui-checkbox-checked,.fui-checkbox-unchecked,.fui-cmd,.fui-cross,.fui-eye,.fui-gear,.fui-heart,.fui-list,.fui-location,.fui-lock,.fui-mail,.fui-new,.fui-pause,.fui-photo,.fui-play,.fui-plus,.fui-radio-checked,.fui-radio-unchecked,.fui-search,.fui-time,.fui-user,.fui-video,.fui-volume{display:inline-block;font-family:Flat-UI-Icons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fui-arrow-right:before{content:"\e02c"}.fui-arrow-left:before{content:"\e02d"}.fui-cmd:before{content:"\e02f"}.fui-check-inverted:before{content:"\e006"}.fui-heart:before{content:"\e007"}.fui-location:before{content:"\e008"}.fui-plus:before{content:"\e009"}.fui-check:before{content:"\e00a"}.fui-cross:before{content:"\e00b"}.fui-list:before{content:"\e00c"}.fui-new:before{content:"\e00d"}.fui-video:before{content:"\e00e"}.fui-photo:before{content:"\e00f"}.fui-volume:before{content:"\e010"}.fui-time:before{content:"\e011"}.fui-eye:before{content:"\e012"}.fui-chat:before{content:"\e013"}.fui-search:before{content:"\e01c"}.fui-user:before{content:"\e01d"}.fui-mail:before{content:"\e01e"}.fui-lock:before{content:"\e01f"}.fui-gear:before{content:"\e024"}.fui-radio-unchecked:before{content:"\e02b"}.fui-radio-checked:before{content:"\e032"}.fui-checkbox-unchecked:before{content:"\e033"}.fui-checkbox-checked:before{content:"\e034"}.fui-calendar-solid:before{content:"\e022"}.fui-pause:before{content:"\e03b"}.fui-play:before{content:"\e03c"}.fui-check-inverted-2:before{content:"\e000"}.dropdown-arrow-inverse{border-bottom-color:#283f50!important;border-top-color:#283f50!important}body{font-family:"Source Sans Pro",Helvetica,Arial,sans-serif;font-size:16px;line-height:1.72222;color:#283f50;background-color:#fff}a{color:#16a085;text-decoration:none;-webkit-transition:.25s;transition:.25s}a:focus,a:hover{color:#1abc9c;text-decoration:none}a:focus{outline:0}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.72222;background-color:#fff;border:2px solid #bdc3c7;border-radius:6px;-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-comment{font-size:15px;line-height:1.2;font-style:italic;margin:24px 0}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.1;color:inherit}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#e7e9ec}h1,h2,h3{margin-top:30px;margin-bottom:15px}h4,h5,h6{margin-top:15px;margin-bottom:15px}h6{font-weight:400}.h1,h1{font-size:61px}.h2,h2{font-size:53px}.h3,h3{font-size:40px}.h4,h4{font-size:29px}.h5,h5{font-size:28px}.h6,h6{font-size:24px}p{font-size:16px;line-height:1.72222;margin:0 0 15px}.lead{margin-bottom:30px;font-size:28px;line-height:1.46428571;font-weight:300}@media (min-width:768px){.lead{font-size:30.006px}}.small,small{font-size:83%;line-height:2.067}.text-muted{color:#bdc3c7}.text-inverse{color:#fff}.text-primary{color:#1abc9c}a.text-primary:hover{color:#15967d}.text-warning{color:#f1c40f}a.text-warning:hover{color:#c19d0c}.text-danger{color:#e74c3c}a.text-danger:hover{color:#b93d30}.text-success{color:#2ecc71}a.text-success:hover{color:#25a35a}.text-info{color:#3498db}a.text-info:hover{color:#2a7aaf}.bg-primary{color:#fff;background-color:#283f50}a.bg-primary:hover{background-color:#222f3d}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:14px;margin:60px 0 30px;border-bottom:1px solid #e7e9ec}ol,ul{margin-bottom:15px}dl{margin-bottom:30px}dd,dt{line-height:1.72222}@media (min-width:768px){.dl-horizontal dt{width:160px}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{border-bottom:1px dotted #bdc3c7}blockquote{border-left:3px solid #e7e9ec;padding:0 0 0 16px;margin:0 0 30px}blockquote p{font-size:20px;line-height:1.55;font-weight:400;margin-bottom:.4em}blockquote .small,blockquote small{font-size:16px;line-height:1.72222;font-style:italic;color:inherit}blockquote .small:before,blockquote small:before{content:""}blockquote.pull-right{padding-right:16px;padding-left:0;border-right:3px solid #e7e9ec;border-left:0}blockquote.pull-right small:after{content:""}address{margin-bottom:30px;line-height:1.72222}code,kbd,pre,samp{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 6px;font-size:85%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 6px;font-size:85%;color:#fff;background-color:#283f50;border-radius:4px;box-shadow:none}pre{padding:8px;margin:0 0 15px;font-size:13px;line-height:1.72222;color:inherit;background-color:#fff;border:2px solid #e7e9ec;border-radius:6px;white-space:pre}.pre-scrollable{max-height:340px}.thumbnail{display:block;padding:4px;margin-bottom:5px;line-height:1.72222;background-color:#fff;border:2px solid #bdc3c7;border-radius:6px;-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#16a085}.thumbnail .caption{padding:9px;color:#283f50}.btn{border:none;font-size:15px;font-weight:400;line-height:1.4;border-radius:4px;padding:10px 15px;-webkit-font-smoothing:subpixel-antialiased;-webkit-transition:border .25s linear,color .25s linear,background-color .25s linear;transition:border .25s linear,color .25s linear,background-color .25s linear}.btn:focus,.btn:hover{outline:0;color:#fff}.btn.active,.btn:active{outline:0;-webkit-box-shadow:none;box-shadow:none}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{background-color:#bdc3c7;color:rgba(255,255,255,.75);opacity:.7}.btn>[class^=fui-]{margin:0 1px;position:relative;line-height:1;top:1px}.btn-xs.btn>[class^=fui-]{font-size:11px;top:0}.btn-hg.btn>[class^=fui-]{top:2px}.btn-default{color:#fff;background-color:#bdc3c7}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open .dropdown-toggle.btn-default{color:#fff;background-color:#cacfd2;border-color:#cacfd2}.btn-default.active,.btn-default:active,.open .dropdown-toggle.btn-default{background:#a1a6a9;border-color:#a1a6a9}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#bdc3c7;border-color:#bdc3c7}.btn-primary{color:#fff;background-color:#1abc9c}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#48c9b0;border-color:#48c9b0}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background:#16a085;border-color:#16a085}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#1abc9c;border-color:#1abc9c}.btn-info{color:#fff;background-color:#3498db}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#fff;background-color:#5dade2;border-color:#5dade2}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background:#2c81ba;border-color:#2c81ba}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#3498db;border-color:#3498db}.btn-danger{color:#fff;background-color:#e74c3c}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#ec7063;border-color:#ec7063}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background:#c44133;border-color:#c44133}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#e74c3c;border-color:#e74c3c}.btn-success{color:#fff;background-color:#2ecc71}.btn-success.active,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:#58d68d;border-color:#58d68d}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background:#27ad60;border-color:#27ad60}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#2ecc71;border-color:#2ecc71}.btn-warning{color:#fff;background-color:#f1c40f}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#f5d313;border-color:#f5d313}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background:#cda70d;border-color:#cda70d}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f1c40f;border-color:#f1c40f}.btn-inverse{color:#fff;background-color:#283f50}.btn-inverse.active,.btn-inverse:active,.btn-inverse:focus,.btn-inverse:hover,.open .dropdown-toggle.btn-inverse{color:#fff;background-color:#415b76;border-color:#415b76}.btn-inverse.active,.btn-inverse:active,.open .dropdown-toggle.btn-inverse{background:#2c3e50;border-color:#2c3e50}.btn-inverse.disabled,.btn-inverse.disabled.active,.btn-inverse.disabled:active,.btn-inverse.disabled:focus,.btn-inverse.disabled:hover,.btn-inverse[disabled],.btn-inverse[disabled].active,.btn-inverse[disabled]:active,.btn-inverse[disabled]:focus,.btn-inverse[disabled]:hover,fieldset[disabled] .btn-inverse,fieldset[disabled] .btn-inverse.active,fieldset[disabled] .btn-inverse:active,fieldset[disabled] .btn-inverse:focus,fieldset[disabled] .btn-inverse:hover{background-color:#283f50;border-color:#283f50}.btn-embossed{-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,.15);box-shadow:inset 0 -2px 0 rgba(0,0,0,.15)}.btn-embossed.active,.btn-embossed:active{-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,.15);box-shadow:inset 0 2px 0 rgba(0,0,0,.15)}.btn-wide{min-width:140px;padding-left:30px;padding-right:30px}.btn-link{color:#16a085}.btn-link:focus,.btn-link:hover{color:#1abc9c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#bdc3c7;text-decoration:none}.btn-hg{padding:13px 20px;font-size:22px;line-height:1.227;border-radius:6px}.btn-lg{padding:10px 19px;font-size:17px;line-height:1.471;border-radius:6px}.btn-sm{padding:9px 13px;font-size:13px;line-height:1.385;border-radius:4px}.btn-xs{padding:6px 9px;font-size:12px;line-height:1.083;border-radius:3px}.btn-tip{font-weight:300;padding-left:10px;font-size:92%}.btn-block{white-space:normal}.btn-default .caret{border-top-color:#fff}.btn-danger .caret,.btn-info .caret,.btn-primary .caret,.btn-success .caret,.btn-warning .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#fff}.dropup .btn-danger .caret,.dropup .btn-info .caret,.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret{border-bottom-color:#fff}.btn-group-xs>.btn{padding:6px 9px;font-size:12px;line-height:1.083;border-radius:3px}.btn-group-sm>.btn{padding:9px 13px;font-size:13px;line-height:1.385;border-radius:4px}.btn-group-lg>.btn{padding:10px 19px;font-size:17px;line-height:1.471;border-radius:6px}.btn-group-gh>.btn{padding:13px 20px;font-size:22px;line-height:1.227;border-radius:6px}.btn-group>.btn+.btn{margin-left:0}.btn-group>.btn+.dropdown-toggle{border-left:2px solid rgba(52,73,94,.15);padding-left:12px;padding-right:12px}.btn-group>.btn+.dropdown-toggle .caret{margin-left:3px;margin-right:3px}.btn-group>.btn.btn-gh+.dropdown-toggle .caret{margin-left:7px;margin-right:7px}.btn-group>.btn.btn-sm+.dropdown-toggle .caret{margin-left:0;margin-right:0}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-weight:400}.btn-group:focus .dropdown-toggle{outline:0;-webkit-transition:.25s;transition:.25s}.btn-group.open .dropdown-toggle{color:rgba(255,255,255,.75);-webkit-box-shadow:none;box-shadow:none}.btn-toolbar .btn.active{color:#fff}.btn-toolbar .btn>[class^=fui-]{font-size:16px;margin:0 1px}.caret{border-width:8px 6px;border-bottom-color:#283f50;border-top-color:#283f50;border-style:solid;border-bottom-style:none;-webkit-transition:.25s;transition:.25s;-webkit-transform:scale(1.001);-ms-transform:scale(1.001);transform:scale(1.001)}.dropup .btn-lg .caret,.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-bottom-width:8px}.btn-lg .caret{border-top-width:8px;border-right-width:6px;border-left-width:6px}.select{display:inline-block;margin-bottom:10px}[class*=span]>.select[class*=span]{margin-left:0}.select[class*=span] .btn{width:100%}.select.select-block{display:block;float:none;margin-left:0;width:auto}.select.select-block:after,.select.select-block:before{content:" ";display:table}.select.select-block:after{clear:both}.select.select-block .btn{width:100%}.select.select-block .dropdown-menu{width:100%}.select .btn{width:220px}.select .btn.btn-hg .filter-option{left:20px;right:40px;top:13px}.select .btn.btn-hg .caret{right:20px}.select .btn.btn-lg .filter-option{left:16px;right:38px}.select .btn.btn-sm .filter-option{left:13px;right:33px}.select .btn.btn-sm .caret{right:13px}.select .btn.btn-xs .filter-option{left:13px;right:33px;top:5px}.select .btn.btn-xs .caret{right:13px}.select .btn .filter-option{height:26px;left:13px;overflow:hidden;position:absolute;right:33px;text-align:left;top:10px}.select .btn .caret{position:absolute;right:16px;top:50%;margin-top:-3px}.select .btn .dropdown-toggle{border-radius:6px}.select .btn .dropdown-menu{min-width:100%}.select .btn .dropdown-menu dt{cursor:default;display:block;padding:3px 20px}.select .btn .dropdown-menu li:not(.disabled)>a:hover small{color:rgba(255,255,255,.004)}.select .btn .dropdown-menu li>a{min-height:20px}.select .btn .dropdown-menu li>a.opt{padding-left:35px}.select .btn .dropdown-menu li small{padding-left:.5em}.select .btn .dropdown-menu li>dt small{font-weight:400}.select .btn .dropdown-menu li.disabled>a,.select .btn>.disabled{cursor:default}.select .caret{border-bottom-color:#fff;border-top-color:#fff}legend{display:block;width:100%;padding:0;margin-bottom:15px;font-size:24px;line-height:inherit;color:inherit;border-bottom:none}textarea{font-size:20px;line-height:24px;padding:5px 11px}input[type=search]{-webkit-appearance:none!important}label{font-weight:400;font-size:15px;line-height:2.4}.form-control:-moz-placeholder{color:#b2bcc5}.form-control::-moz-placeholder{color:#b2bcc5;opacity:1}.form-control:-ms-input-placeholder{color:#b2bcc5}.form-control::-webkit-input-placeholder{color:#b2bcc5}.form-control.placeholder{color:#b2bcc5}.form-control{border:1px solid #bdc3c7;color:#283f50;font-family:"Source Sans Pro",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.467;padding:8px 12px;height:42px;-webkit-appearance:none;border-radius:6px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border .25s linear,color .25s linear,background-color .25s linear;transition:border .25s linear,color .25s linear,background-color .25s linear}.form-control:focus,.form-group.focus .form-control{border-color:#1abc9c;outline:0;-webkit-box-shadow:none;box-shadow:none}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f4f6f6;border-color:#d5dbdb;color:#555;cursor:default;opacity:.7}.form-control.flat{border-color:transparent}.form-control.flat:hover{border-color:#bdc3c7}.form-control.flat:focus{border-color:#1abc9c}.input-sm{height:35px;padding:6px 10px;font-size:13px;line-height:1.462;border-radius:6px}select.input-sm{height:35px}select[multiple].input-sm,textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 15px;font-size:17px;line-height:1.235;border-radius:6px}select.input-lg{height:45px;line-height:45px}select[multiple].input-lg,textarea.input-lg{height:auto}.input-hg{height:53px;padding:10px 16px;font-size:22px;line-height:1.318;border-radius:6px}select.input-hg{height:53px;line-height:53px}select[multiple].input-hg,textarea.input-hg{height:auto}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#f1c40f}.has-warning .form-control{color:#f1c40f;border-color:#f1c40f;-webkit-box-shadow:none;box-shadow:none}.has-warning .form-control:-moz-placeholder{color:#f1c40f}.has-warning .form-control::-moz-placeholder{color:#f1c40f;opacity:1}.has-warning .form-control:-ms-input-placeholder{color:#f1c40f}.has-warning .form-control::-webkit-input-placeholder{color:#f1c40f}.has-warning .form-control.placeholder{color:#f1c40f}.has-warning .form-control:focus{border-color:#f1c40f;-webkit-box-shadow:none;box-shadow:none}.has-warning .input-group-addon{color:#f1c40f;border-color:#f1c40f;background-color:#fff}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#e74c3c}.has-error .form-control{color:#e74c3c;border-color:#e74c3c;-webkit-box-shadow:none;box-shadow:none}.has-error .form-control:-moz-placeholder{color:#e74c3c}.has-error .form-control::-moz-placeholder{color:#e74c3c;opacity:1}.has-error .form-control:-ms-input-placeholder{color:#e74c3c}.has-error .form-control::-webkit-input-placeholder{color:#e74c3c}.has-error .form-control.placeholder{color:#e74c3c}.has-error .form-control:focus{border-color:#e74c3c;-webkit-box-shadow:none;box-shadow:none}.has-error .input-group-addon{color:#e74c3c;border-color:#e74c3c;background-color:#fff}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#2ecc71}.has-success .form-control{color:#2ecc71;border-color:#2ecc71;-webkit-box-shadow:none;box-shadow:none}.has-success .form-control:-moz-placeholder{color:#2ecc71}.has-success .form-control::-moz-placeholder{color:#2ecc71;opacity:1}.has-success .form-control:-ms-input-placeholder{color:#2ecc71}.has-success .form-control::-webkit-input-placeholder{color:#2ecc71}.has-success .form-control.placeholder{color:#2ecc71}.has-success .form-control:focus{border-color:#2ecc71;-webkit-box-shadow:none;box-shadow:none}.has-success .input-group-addon{color:#2ecc71;border-color:#2ecc71;background-color:#fff}.help-block{font-size:15px;margin-bottom:5px;color:inherit}.form-group{position:relative;margin-bottom:20px}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:6px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after,.form-horizontal .form-group:before{content:" ";display:table}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:6px}.form-group{position:relative}.form-control+.input-icon{position:absolute;top:2px;right:2px;line-height:37px;vertical-align:middle;font-size:20px;color:#b2bcc5;background-color:#fff;padding:0 12px 0 0;border-radius:6px}.input-hg+.input-icon{line-height:49px;padding:0 16px 0 0}.input-lg+.input-icon{line-height:41px;padding:0 15px 0 0}.input-sm+.input-icon{font-size:16px;line-height:30px;padding:0 10px 0 0}.has-success .input-icon{color:#2ecc71}.has-warning .input-icon{color:#f1c40f}.has-error .input-icon{color:#e74c3c}.form-control.disabled+.input-icon,.form-control[disabled]+.input-icon,.form-control[readonly]+.input-icon,fieldset[disabled] .form-control+.input-icon{color:#d5dbdb;background-color:transparent;opacity:.7}.input-group-hg>.form-control,.input-group-hg>.input-group-addon,.input-group-hg>.input-group-btn>.btn{height:53px;padding:10px 16px;font-size:22px;line-height:1.318;border-radius:6px}select.input-group-hg>.form-control,select.input-group-hg>.input-group-addon,select.input-group-hg>.input-group-btn>.btn{height:53px;line-height:53px}select[multiple].input-group-hg>.form-control,select[multiple].input-group-hg>.input-group-addon,select[multiple].input-group-hg>.input-group-btn>.btn,textarea.input-group-hg>.form-control,textarea.input-group-hg>.input-group-addon,textarea.input-group-hg>.input-group-btn>.btn{height:auto}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 15px;font-size:17px;line-height:1.235;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:35px;padding:6px 10px;font-size:13px;line-height:1.462;border-radius:6px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:35px;line-height:35px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon{padding:10px 12px;font-size:15px;color:#fff;text-align:center;background-color:#bdc3c7;border:1px solid #bdc3c7;border-radius:6px;-webkit-transition:border .25s linear,color .25s linear,background-color .25s linear;transition:border .25s linear,color .25s linear,background-color .25s linear}.input-group-hg .input-group-addon,.input-group-lg .input-group-addon,.input-group-sm .input-group-addon{line-height:1}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.form-group.focus .input-group-addon,.input-group.focus .input-group-addon{background-color:#1abc9c;border-color:#1abc9c}.form-group.focus .input-group-btn>.btn-default+.btn-default,.input-group.focus .input-group-btn>.btn-default+.btn-default{border-left-color:#16a085}.form-group.focus .input-group-btn .btn,.input-group.focus .input-group-btn .btn{border-color:#1abc9c;background-color:#fff;color:#1abc9c}.form-group.focus .input-group-btn .btn-default,.input-group.focus .input-group-btn .btn-default{color:#fff;background-color:#1abc9c}.form-group.focus .input-group-btn .btn-default.active,.form-group.focus .input-group-btn .btn-default:active,.form-group.focus .input-group-btn .btn-default:focus,.form-group.focus .input-group-btn .btn-default:hover,.input-group.focus .input-group-btn .btn-default.active,.input-group.focus .input-group-btn .btn-default:active,.input-group.focus .input-group-btn .btn-default:focus,.input-group.focus .input-group-btn .btn-default:hover,.open .dropdown-toggle.form-group.focus .input-group-btn .btn-default,.open .dropdown-toggle.input-group.focus .input-group-btn .btn-default{color:#fff;background-color:#48c9b0;border-color:#48c9b0}.form-group.focus .input-group-btn .btn-default.active,.form-group.focus .input-group-btn .btn-default:active,.input-group.focus .input-group-btn .btn-default.active,.input-group.focus .input-group-btn .btn-default:active,.open .dropdown-toggle.form-group.focus .input-group-btn .btn-default,.open .dropdown-toggle.input-group.focus .input-group-btn .btn-default{background:#16a085;border-color:#16a085}.form-group.focus .input-group-btn .btn-default.disabled,.form-group.focus .input-group-btn .btn-default.disabled.active,.form-group.focus .input-group-btn .btn-default.disabled:active,.form-group.focus .input-group-btn .btn-default.disabled:focus,.form-group.focus .input-group-btn .btn-default.disabled:hover,.form-group.focus .input-group-btn .btn-default[disabled],.form-group.focus .input-group-btn .btn-default[disabled].active,.form-group.focus .input-group-btn .btn-default[disabled]:active,.form-group.focus .input-group-btn .btn-default[disabled]:focus,.form-group.focus .input-group-btn .btn-default[disabled]:hover,.input-group.focus .input-group-btn .btn-default.disabled,.input-group.focus .input-group-btn .btn-default.disabled.active,.input-group.focus .input-group-btn .btn-default.disabled:active,.input-group.focus .input-group-btn .btn-default.disabled:focus,.input-group.focus .input-group-btn .btn-default.disabled:hover,.input-group.focus .input-group-btn .btn-default[disabled],.input-group.focus .input-group-btn .btn-default[disabled].active,.input-group.focus .input-group-btn .btn-default[disabled]:active,.input-group.focus .input-group-btn .btn-default[disabled]:focus,.input-group.focus .input-group-btn .btn-default[disabled]:hover,fieldset[disabled] .form-group.focus .input-group-btn .btn-default,fieldset[disabled] .form-group.focus .input-group-btn .btn-default.active,fieldset[disabled] .form-group.focus .input-group-btn .btn-default:active,fieldset[disabled] .form-group.focus .input-group-btn .btn-default:focus,fieldset[disabled] .form-group.focus .input-group-btn .btn-default:hover,fieldset[disabled] .input-group.focus .input-group-btn .btn-default,fieldset[disabled] .input-group.focus .input-group-btn .btn-default.active,fieldset[disabled] .input-group.focus .input-group-btn .btn-default:active,fieldset[disabled] .input-group.focus .input-group-btn .btn-default:focus,fieldset[disabled] .input-group.focus .input-group-btn .btn-default:hover{background-color:#1abc9c;border-color:#1abc9c}.input-group-btn .btn{background-color:#fff;border:1px solid #bdc3c7;color:#bdc3c7;line-height:18px}.input-group-btn .btn-default{color:#fff;background-color:#bdc3c7}.input-group-btn .btn-default.active,.input-group-btn .btn-default:active,.input-group-btn .btn-default:focus,.input-group-btn .btn-default:hover,.open .dropdown-toggle.input-group-btn .btn-default{color:#fff;background-color:#cacfd2;border-color:#cacfd2}.input-group-btn .btn-default.active,.input-group-btn .btn-default:active,.open .dropdown-toggle.input-group-btn .btn-default{background:#a1a6a9;border-color:#a1a6a9}.input-group-btn .btn-default.disabled,.input-group-btn .btn-default.disabled.active,.input-group-btn .btn-default.disabled:active,.input-group-btn .btn-default.disabled:focus,.input-group-btn .btn-default.disabled:hover,.input-group-btn .btn-default[disabled],.input-group-btn .btn-default[disabled].active,.input-group-btn .btn-default[disabled]:active,.input-group-btn .btn-default[disabled]:focus,.input-group-btn .btn-default[disabled]:hover,fieldset[disabled] .input-group-btn .btn-default,fieldset[disabled] .input-group-btn .btn-default.active,fieldset[disabled] .input-group-btn .btn-default:active,fieldset[disabled] .input-group-btn .btn-default:focus,fieldset[disabled] .input-group-btn .btn-default:hover{background-color:#bdc3c7;border-color:#bdc3c7}.input-group-hg .input-group-btn .btn{line-height:31px}.input-group-lg .input-group-btn .btn{line-height:21px}.input-group-sm .input-group-btn .btn{line-height:19px}.input-group-btn:first-child>.btn{border-right-width:0;margin-right:-2px}.input-group-btn:last-child>.btn{border-left-width:0;margin-left:-2px}.input-group-btn>.btn-default+.btn-default{border-left:2px solid #bdc3c7}.input-group-btn>.btn:first-child+.btn .caret{margin-left:0}.input-group-rounded .input-group-btn+.form-control,.input-group-rounded .input-group-btn:last-child .btn{border-bottom-right-radius:20px;border-top-right-radius:20px}.input-group-hg.input-group-rounded .input-group-btn+.form-control,.input-group-hg.input-group-rounded .input-group-btn:last-child .btn{border-bottom-right-radius:27px;border-top-right-radius:27px}.input-group-lg.input-group-rounded .input-group-btn+.form-control,.input-group-lg.input-group-rounded .input-group-btn:last-child .btn{border-bottom-right-radius:25px;border-top-right-radius:25px}.input-group-rounded .form-control:first-child,.input-group-rounded .input-group-btn:first-child .btn{border-bottom-left-radius:20px;border-top-left-radius:20px}.input-group-hg.input-group-rounded .form-control:first-child,.input-group-hg.input-group-rounded .input-group-btn:first-child .btn{border-bottom-left-radius:27px;border-top-left-radius:27px}.input-group-lg.input-group-rounded .form-control:first-child,.input-group-lg.input-group-rounded .input-group-btn:first-child .btn{border-bottom-left-radius:25px;border-top-left-radius:25px}.input-group-rounded .input-group-btn+.form-control{padding-left:0}.checkbox,.radio{margin-bottom:12px;padding-left:32px;position:relative;-webkit-transition:color .25s linear;transition:color .25s linear;font-size:14px;line-height:1.5}.checkbox input,.radio input{outline:0!important;display:none}.checkbox .icons,.radio .icons{color:#bdc3c7;display:block;height:20px;left:0;position:absolute;top:0;width:20px;text-align:center;line-height:21px;font-size:20px;cursor:pointer;-webkit-transition:color .25s linear;transition:color .25s linear}.checkbox .icons .first-icon,.checkbox .icons .second-icon,.radio .icons .first-icon,.radio .icons .second-icon{display:inline-table;position:absolute;left:0;top:0;background-color:transparent;margin:0;opacity:1}.checkbox .icons .second-icon,.radio .icons .second-icon{opacity:0}.checkbox:hover,.radio:hover{-webkit-transition:color .25s linear;transition:color .25s linear}.checkbox:hover .first-icon,.radio:hover .first-icon{opacity:0}.checkbox:hover .second-icon,.radio:hover .second-icon{opacity:1}.checkbox.checked,.radio.checked{color:#1abc9c}.checkbox.checked .first-icon,.radio.checked .first-icon{opacity:0}.checkbox.checked .second-icon,.radio.checked .second-icon{opacity:1;color:#1abc9c;-webkit-transition:color .25s linear;transition:color .25s linear}.checkbox.disabled,.radio.disabled{cursor:default;color:#e6e8ea}.checkbox.disabled .icons,.radio.disabled .icons{color:#e6e8ea}.checkbox.disabled .first-icon,.radio.disabled .first-icon{opacity:1}.checkbox.disabled .second-icon,.radio.disabled .second-icon{opacity:0}.checkbox.disabled.checked .icons,.radio.disabled.checked .icons{color:#e6e8ea}.checkbox.disabled.checked .first-icon,.radio.disabled.checked .first-icon{opacity:0}.checkbox.disabled.checked .second-icon,.radio.disabled.checked .second-icon{opacity:1;color:#e6e8ea}.checkbox.primary .icons,.radio.primary .icons{color:#283f50}.checkbox.primary.checked,.radio.primary.checked{color:#1abc9c}.checkbox.primary.checked .icons,.radio.primary.checked .icons{color:#1abc9c}.checkbox.primary.disabled,.radio.primary.disabled{cursor:default;color:#bdc3c7}.checkbox.primary.disabled .icons,.radio.primary.disabled .icons{color:#bdc3c7}.checkbox.primary.disabled.checked .icons,.radio.primary.disabled.checked .icons{color:#bdc3c7}.checkbox+.checkbox,.radio+.radio{margin-top:10px}.navbar{font-size:16px;min-height:53px;margin-bottom:30px;border:none;border-radius:6px}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{box-shadow:none;padding-right:21px;padding-left:21px}@media (min-width:768px){.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-21px}.navbar-collapse .navbar-nav.navbar-left:first-child>li:first-child a{border-bottom-left-radius:6px;border-top-left-radius:6px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-21px}.navbar>.container .navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-36px}.navbar-collapse .navbar-nav.navbar-right:last-child>.dropdown:last-child>a{border-radius:0 6px 6px 0}.navbar-collapse .navbar-form.navbar-right:last-child{margin-right:-17px}.navbar-fixed-bottom .navbar-collapse .navbar-form.navbar-right:last-child,.navbar-fixed-top .navbar-collapse .navbar-form.navbar-right:last-child{margin-right:0}}@media (max-width:767px){.navbar-collapse .navbar-nav.navbar-right:last-child{margin-bottom:3px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-21px;margin-left:-21px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0;border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{z-index:1030;border-radius:0}.navbar-fixed-top{border-width:0}.navbar-fixed-bottom{margin-bottom:0;border-width:0}.navbar-brand{font-size:24px;line-height:1.042;font-weight:700;padding:14px 21px}.navbar-brand>[class*=fui-]{font-size:19px;line-height:1.263;vertical-align:top}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-21px}}.navbar-toggle{border:none;color:#283f50;margin:0 0 0 21px;padding:0 21px;height:53px;line-height:53px}.navbar-toggle:focus,.navbar-toggle:hover{outline:0}.navbar-toggle:focus:before,.navbar-toggle:hover:before{color:#1abc9c}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:0}.navbar-nav>li>a{font-size:16px;padding:15px 21px;line-height:23px;font-weight:700}.navbar-nav .dropdown-toggle .caret{border-top-color:#16a085;border-bottom-color:#16a085;border-width:8px 6px 0;margin-left:12px}.navbar-nav .open>a:focus,.navbar-nav .open>a:hover,.navbar-nav>li>a:focus,.navbar-nav>li>a:hover{background-color:transparent}.navbar-nav .open>a:focus .caret,.navbar-nav .open>a:hover .caret,.navbar-nav>li>a:focus .caret,.navbar-nav>li>a:hover .caret{border-top-color:#1abc9c;border-bottom-color:#1abc9c}.navbar-nav [class^=fui-]{line-height:20px;position:relative;top:1px}.navbar-nav .visible-sm>[class^=fui-],.navbar-nav .visible-xs>[class^=fui-]{margin-left:12px}@media (max-width:767px){.navbar-nav{margin:0 -21px}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:7px 15px 7px 31px!important}.navbar-nav .open .dropdown-menu>li>a{line-height:23px}.navbar-nav>li>a{padding-top:7px;padding-bottom:7px}}.navbar-input{height:35px;padding:5px 10px;font-size:13px;line-height:1.4;border-radius:6px}select.navbar-input{height:35px;line-height:35px}select[multiple].navbar-input,textarea.navbar-input{height:auto}.navbar-form{-webkit-box-shadow:none;box-shadow:none;margin-top:0;margin-bottom:0;padding-right:19px;padding-left:19px;padding-top:9px;padding-bottom:9px}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (max-width:767px){.navbar-form{margin:3px -21px;width:auto}}@media (min-width:768px){.navbar-form.navbar-right:last-child,.navbar-nav+.navbar-form.navbar-left{width:260px}}.navbar-form .btn,.navbar-form .form-control,.navbar-form .input-group-addon{height:35px;padding:5px 10px;font-size:13px;line-height:1.4;border-radius:6px}select.navbar-form .btn,select.navbar-form .form-control,select.navbar-form .input-group-addon{height:35px;line-height:35px}select[multiple].navbar-form .btn,select[multiple].navbar-form .form-control,select[multiple].navbar-form .input-group-addon,textarea.navbar-form .btn,textarea.navbar-form .form-control,textarea.navbar-form .input-group-addon{height:auto}.navbar-form .input-group .form-control:first-child,.navbar-form .input-group-addon:first-child,.navbar-form .input-group-btn:first-child>.btn,.navbar-form .input-group-btn:first-child>.dropdown-toggle,.navbar-form .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.navbar-form .input-group .form-control:last-child,.navbar-form .input-group-addon:last-child,.navbar-form .input-group-btn:first-child>.btn:not(:first-child),.navbar-form .input-group-btn:last-child>.btn,.navbar-form .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.navbar-form .form-control{font-size:15px;border-radius:5px;display:table-cell}.navbar-form .form-group+.btn{font-size:15px;border-radius:5px;margin-left:4px}@media (max-width:767px){.navbar-form .form-group{margin-bottom:0}.navbar-form .form-group+.btn{margin-top:9px;margin-left:0}}.navbar-nav>li>.dropdown-menu{min-width:100%;border-radius:4px}@media (max-width:767px){.navbar-nav>li>.dropdown-menu{-webkit-transition:all 0s;transition:all 0s;display:none}}@media (max-width:767px){.navbar-nav>li.open>.dropdown-menu{margin-top:0!important;display:block}}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.open>.dropdown-toggle,.navbar-nav>.open>.dropdown-toggle:focus,.navbar-nav>.open>.dropdown-toggle:hover{background-color:transparent}.navbar-text{font-size:16px;line-height:1.438;color:#283f50;margin-top:0;margin-bottom:0;padding-top:15px;padding-bottom:15px}@media (min-width:768px){.navbar-text{margin-left:21px;margin-right:21px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-btn{margin-top:6px;margin-bottom:6px}.navbar-btn.btn-sm{margin-top:9px;margin-bottom:8px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-new,.navbar-unread{font-family:"Source Sans Pro",Helvetica,Arial,sans-serif;background-color:#1abc9c;border-radius:50%;color:#fff;font-size:0;font-weight:700;height:6px;line-height:1;position:absolute;right:12px;text-align:center;top:35%;width:6px;z-index:10}@media (max-width:768px){.navbar-new,.navbar-unread{position:static;float:right;margin:0 0 0 10px}}.active .navbar-new,.active .navbar-unread{background-color:#fff;display:none}.navbar-new{background-color:#e74c3c;font-size:12px;height:18px;line-height:17px;margin:-6px -10px;min-width:18px;padding:0 1px;width:auto;-webkit-font-smoothing:subpixel-antialiased}.navbar-default{background-color:#ecf0f1}.navbar-default .navbar-brand{color:#283f50}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#1abc9c;background-color:transparent}.navbar-default .navbar-toggle:before{color:#283f50}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:transparent}.navbar-default .navbar-toggle:focus:before,.navbar-default .navbar-toggle:hover:before{color:#1abc9c}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e5e9ea;border-width:2px}.navbar-default .navbar-nav>li>a{color:#283f50}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#1abc9c;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#1abc9c;background-color:transparent}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#283f50;border-bottom-color:#283f50}.navbar-default .navbar-nav>.active>a .caret{border-top-color:#1abc9c;border-bottom-color:#1abc9c}.navbar-default .navbar-nav>.dropdown>a:focus .caret,.navbar-default .navbar-nav>.dropdown>a:hover .caret{border-top-color:#1abc9c;border-bottom-color:#1abc9c}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:transparent;color:#1abc9c}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:focus .caret,.navbar-default .navbar-nav>.open>a:hover .caret{border-top-color:#1abc9c;border-bottom-color:#1abc9c}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#283f50}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#1abc9c;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#1abc9c;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-form .form-control{border-color:transparent}.navbar-default .navbar-form .form-control:-moz-placeholder{color:#aeb6bf}.navbar-default .navbar-form .form-control::-moz-placeholder{color:#aeb6bf;opacity:1}.navbar-default .navbar-form .form-control:-ms-input-placeholder{color:#aeb6bf}.navbar-default .navbar-form .form-control::-webkit-input-placeholder{color:#aeb6bf}.navbar-default .navbar-form .form-control.placeholder{color:#aeb6bf}.navbar-default .navbar-form .form-control:focus{border-color:#1abc9c;color:#1abc9c}.navbar-default .navbar-form .input-group-btn .btn{border-color:transparent;color:#919ba4}.navbar-default .navbar-form .input-group.focus .form-control,.navbar-default .navbar-form .input-group.focus .input-group-btn .btn{border-color:#1abc9c;color:#1abc9c}.navbar-default .navbar-text{color:#283f50}.navbar-default .navbar-text a{color:#283f50}.navbar-default .navbar-text a:focus,.navbar-default .navbar-text a:hover{color:#1abc9c}.navbar-inverse{background-color:#283f50}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#1abc9c;background-color:transparent}.navbar-inverse .navbar-toggle:before{color:#fff}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:transparent}.navbar-inverse .navbar-toggle:focus:before,.navbar-inverse .navbar-toggle:hover:before{color:#1abc9c}.navbar-inverse .navbar-collapse{border-color:#2f4154;border-width:2px}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#1abc9c;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#1abc9c}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.dropdown>a:focus .caret,.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#1abc9c;border-bottom-color:#1abc9c}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#1abc9c;color:#fff;border-left-color:transparent}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#4b6075;border-bottom-color:#4b6075}.navbar-inverse .navbar-nav>.open>.dropdown-arrow{border-top-color:#283f50;border-bottom-color:#283f50}.navbar-inverse .navbar-nav>.open>.dropdown-menu{background-color:#283f50;padding:3px 4px}.navbar-inverse .navbar-nav>.open>.dropdown-menu>li>a{color:#e1e4e7;border-radius:4px;padding:6px 9px}.navbar-inverse .navbar-nav>.open>.dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav>.open>.dropdown-menu>li>a:hover{color:#fff;background-color:#1abc9c}.navbar-inverse .navbar-nav>.open>.dropdown-menu>.divider{background-color:#2f4154;height:2px;margin-left:-4px;margin-right:-4px}@media (max-width:767px){.navbar-inverse .navbar-nav>li>a{border-left-width:0}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#1abc9c;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#1abc9c}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav .dropdown-menu .divider{background-color:#2f4154}}.navbar-inverse .navbar-form .form-control{color:#536a81;border-color:transparent;background-color:#293a4a}.navbar-inverse .navbar-form .form-control:-moz-placeholder{color:#536a81}.navbar-inverse .navbar-form .form-control::-moz-placeholder{color:#536a81;opacity:1}.navbar-inverse .navbar-form .form-control:-ms-input-placeholder{color:#536a81}.navbar-inverse .navbar-form .form-control::-webkit-input-placeholder{color:#536a81}.navbar-inverse .navbar-form .form-control.placeholder{color:#536a81}.navbar-inverse .navbar-form .form-control:focus{border-color:#1abc9c;color:#1abc9c}.navbar-inverse .navbar-form .btn{color:#fff;background-color:#1abc9c}.navbar-inverse .navbar-form .btn.active,.navbar-inverse .navbar-form .btn:active,.navbar-inverse .navbar-form .btn:focus,.navbar-inverse .navbar-form .btn:hover,.open .dropdown-toggle.navbar-inverse .navbar-form .btn{color:#fff;background-color:#48c9b0;border-color:#48c9b0}.navbar-inverse .navbar-form .btn.active,.navbar-inverse .navbar-form .btn:active,.open .dropdown-toggle.navbar-inverse .navbar-form .btn{background:#16a085;border-color:#16a085}.navbar-inverse .navbar-form .btn.disabled,.navbar-inverse .navbar-form .btn.disabled.active,.navbar-inverse .navbar-form .btn.disabled:active,.navbar-inverse .navbar-form .btn.disabled:focus,.navbar-inverse .navbar-form .btn.disabled:hover,.navbar-inverse .navbar-form .btn[disabled],.navbar-inverse .navbar-form .btn[disabled].active,.navbar-inverse .navbar-form .btn[disabled]:active,.navbar-inverse .navbar-form .btn[disabled]:focus,.navbar-inverse .navbar-form .btn[disabled]:hover,fieldset[disabled] .navbar-inverse .navbar-form .btn,fieldset[disabled] .navbar-inverse .navbar-form .btn.active,fieldset[disabled] .navbar-inverse .navbar-form .btn:active,fieldset[disabled] .navbar-inverse .navbar-form .btn:focus,fieldset[disabled] .navbar-inverse .navbar-form .btn:hover{background-color:#1abc9c;border-color:#1abc9c}.navbar-inverse .navbar-form .input-group-btn .btn{border-color:transparent;background-color:#293a4a;color:#526a82}.navbar-inverse .navbar-form .input-group.focus .form-control,.navbar-inverse .navbar-form .input-group.focus .input-group-btn .btn{border-color:#1abc9c;color:#1abc9c}@media (max-width:767px){.navbar-inverse .navbar-form{border-color:#2f4154;border-width:2px 0}}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-text a{color:#fff}.navbar-inverse .navbar-text a:focus,.navbar-inverse .navbar-text a:hover{color:#1abc9c}.navbar-inverse .navbar-btn{color:#fff;background-color:#1abc9c}.navbar-inverse .navbar-btn.active,.navbar-inverse .navbar-btn:active,.navbar-inverse .navbar-btn:focus,.navbar-inverse .navbar-btn:hover,.open .dropdown-toggle.navbar-inverse .navbar-btn{color:#fff;background-color:#48c9b0;border-color:#48c9b0}.navbar-inverse .navbar-btn.active,.navbar-inverse .navbar-btn:active,.open .dropdown-toggle.navbar-inverse .navbar-btn{background:#16a085;border-color:#16a085}.navbar-inverse .navbar-btn.disabled,.navbar-inverse .navbar-btn.disabled.active,.navbar-inverse .navbar-btn.disabled:active,.navbar-inverse .navbar-btn.disabled:focus,.navbar-inverse .navbar-btn.disabled:hover,.navbar-inverse .navbar-btn[disabled],.navbar-inverse .navbar-btn[disabled].active,.navbar-inverse .navbar-btn[disabled]:active,.navbar-inverse .navbar-btn[disabled]:focus,.navbar-inverse .navbar-btn[disabled]:hover,fieldset[disabled] .navbar-inverse .navbar-btn,fieldset[disabled] .navbar-inverse .navbar-btn.active,fieldset[disabled] .navbar-inverse .navbar-btn:active,fieldset[disabled] .navbar-inverse .navbar-btn:focus,fieldset[disabled] .navbar-inverse .navbar-btn:hover{background-color:#1abc9c;border-color:#1abc9c}@media (min-width:768px){.navbar-embossed>.navbar-collapse{border-radius:6px;-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,.15);box-shadow:inset 0 -2px 0 rgba(0,0,0,.15)}.navbar-embossed.navbar-inverse .navbar-nav .active>a,.navbar-embossed.navbar-inverse .navbar-nav .open>a{-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,.15);box-shadow:inset 0 -2px 0 rgba(0,0,0,.15)}}.navbar-lg{min-height:76px}.navbar-lg .navbar-brand{line-height:1;padding-top:26px;padding-bottom:26px}.navbar-lg .navbar-brand>[class*=fui-]{font-size:24px;line-height:1}.navbar-lg .navbar-nav>li>a{font-size:15px;line-height:1.6}@media (min-width:768px){.navbar-lg .navbar-nav>li>a{padding-top:26px;padding-bottom:26px}}.navbar-lg .navbar-toggle{height:76px;line-height:76px}.navbar-lg .navbar-form{padding-top:20.5px;padding-bottom:20.5px}.navbar-lg .navbar-text{padding-top:26.5px;padding-bottom:26.5px}.navbar-lg .navbar-btn{margin-top:17.5px;margin-bottom:17.5px}.navbar-lg .navbar-btn.btn-sm{margin-top:20.5px;margin-bottom:20.5px}.navbar-lg .navbar-btn.btn-xs{margin-top:25.5px;margin-bottom:25.5px}.tagsinput{background:#fff;border:2px solid #1abc9c;border-radius:6px;height:100px;margin-bottom:18px;padding:6px 1px 1px 6px;overflow-y:auto;text-align:left}.tagsinput .tag{border-radius:4px;background-color:#1abc9c;color:#fff;font-size:14px;cursor:pointer;display:inline-block;margin-right:5px;margin-bottom:5px;overflow:hidden;line-height:15px;padding:6px 13px 8px 19px;position:relative;vertical-align:middle;-webkit-transition:.25s linear;transition:.25s linear}.tagsinput .tag:hover{background-color:#16a085;color:#fff;padding-left:12px;padding-right:20px}.tagsinput .tag:hover .tagsinput-remove-link{color:#fff;opacity:1}.tagsinput input{background:0 0;border:none;color:#283f50;font-family:"Source Sans Pro",Helvetica,Arial,sans-serif;font-size:14px;margin:0;padding:0 0 0 5px;outline:0!important;margin:6px 5px 0 0;vertical-align:top;width:12px}.tagsinput-remove-link{bottom:0;color:#fff;cursor:pointer;font-size:12px;opacity:0;padding:7px 7px 5px 0;position:absolute;right:0;text-align:right;text-decoration:none;top:0;width:100%;z-index:2}.tagsinput-remove-link:before{color:#fff;content:"\e00b";font-family:Flat-UI-Icons}.tagsinput-add-container{vertical-align:middle;display:inline-block}.tagsinput-add{background-color:#d6dbdf;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;font-size:14px;line-height:1;margin-bottom:5px;padding:7px 9px;vertical-align:top;-webkit-transition:.25s linear;transition:.25s linear}.tagsinput-add:hover{background-color:#1abc9c}.tagsinput-add:before{content:"\e009";font-family:Flat-UI-Icons}.tags_clear{clear:both;width:100%;height:0}.not_valid{background:#fbd8db!important;color:#90111a!important;margin-left:5px!important}.twitter-typeahead{width:100%}.twitter-typeahead .tt-hint,.twitter-typeahead .tt-query{border:2px solid #bdc3c7;color:#283f50;font-family:"Source Sans Pro",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.467;padding:8px 12px;height:42px;-webkit-appearance:none;border-radius:6px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border .25s linear,color .25s linear,background-color .25s linear;transition:border .25s linear,color .25s linear,background-color .25s linear}.twitter-typeahead .tt-hint:-moz-placeholder,.twitter-typeahead .tt-query:-moz-placeholder{color:#b2bcc5}.twitter-typeahead .tt-hint::-moz-placeholder,.twitter-typeahead .tt-query::-moz-placeholder{color:#b2bcc5;opacity:1}.twitter-typeahead .tt-hint:-ms-input-placeholder,.twitter-typeahead .tt-query:-ms-input-placeholder{color:#b2bcc5}.twitter-typeahead .tt-hint::-webkit-input-placeholder,.twitter-typeahead .tt-query::-webkit-input-placeholder{color:#b2bcc5}.twitter-typeahead .tt-hint.placeholder,.twitter-typeahead .tt-query.placeholder{color:#b2bcc5}.form-group.focus .twitter-typeahead .tt-hint,.form-group.focus .twitter-typeahead .tt-query,.twitter-typeahead .tt-hint:focus,.twitter-typeahead .tt-query:focus{border-color:#1abc9c;outline:0;-webkit-box-shadow:none;box-shadow:none}.twitter-typeahead .tt-hint[disabled],.twitter-typeahead .tt-hint[readonly],.twitter-typeahead .tt-query[disabled],.twitter-typeahead .tt-query[readonly],fieldset[disabled] .twitter-typeahead .tt-hint,fieldset[disabled] .twitter-typeahead .tt-query{background-color:#f4f6f6;border-color:#d5dbdb;color:#d5dbdb;cursor:default;opacity:.7}.twitter-typeahead .tt-hint.flat,.twitter-typeahead .tt-query.flat{border-color:transparent}.twitter-typeahead .tt-hint.flat:hover,.twitter-typeahead .tt-query.flat:hover{border-color:#bdc3c7}.twitter-typeahead .tt-hint.flat:focus,.twitter-typeahead .tt-query.flat:focus{border-color:#1abc9c}.twitter-typeahead .tt-hint+.input-icon,.twitter-typeahead .tt-query+.input-icon{position:absolute;top:2px;right:2px;line-height:37px;vertical-align:middle;font-size:20px;color:#b2bcc5;background-color:#fff;padding:0 12px 0 0;border-radius:6px}.twitter-typeahead .tt-dropdown-menu{width:100%;margin-top:5px;border:2px solid #1abc9c;padding:5px 0;background-color:#fff;border-radius:6px}.twitter-typeahead .tt-suggestion p{padding:6px 14px;font-size:14px;line-height:1.429;margin:0}.twitter-typeahead .tt-suggestion:first-child p,.twitter-typeahead .tt-suggestion:last-child p{padding:6px 14px}.twitter-typeahead .tt-suggestion.tt-is-under-cursor{color:#fff;background-color:#16a085}.progress{background:#ebedef;border-radius:32px;height:12px;-webkit-box-shadow:none;box-shadow:none}.progress-bar{background:#1abc9c;line-height:12px;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#2ecc71}.progress-bar-warning{background-color:#f1c40f}.progress-bar-danger{background-color:#e74c3c}.progress-bar-info{background-color:#3498db}.ui-slider{background:#ebedef;border-radius:32px;height:12px;-webkit-box-shadow:none;box-shadow:none;margin-bottom:20px;position:relative;cursor:pointer}.ui-slider-handle{background-color:#16a085;border-radius:50%;cursor:pointer;height:18px;position:absolute;width:18px;z-index:2;-webkit-transition:background .25s;transition:background .25s}.ui-slider-handle:focus,.ui-slider-handle:hover{background-color:#48c9b0;outline:0}.ui-slider-handle:active{background-color:#16a085}.ui-slider-range{background-color:#1abc9c;display:block;height:100%;position:absolute;z-index:1}.ui-slider-segment{background-color:#d9dbdd;border-radius:50%;height:6px;width:6px}.ui-slider-value{float:right;font-size:13px;margin-top:12px}.ui-slider-value.first{clear:left;float:left}.ui-slider-horizontal .ui-slider-handle{margin-left:-9px;top:-3px}.ui-slider-horizontal .ui-slider-handle[style*="100"]{margin-left:-15px}.ui-slider-horizontal .ui-slider-range{border-radius:30px 0 0 30px}.ui-slider-horizontal .ui-slider-segment{float:left;margin:3px -6px 0 0}.ui-slider-vertical{width:12px}.ui-slider-vertical .ui-slider-handle{margin-left:-3px;margin-bottom:-11px;top:auto}.ui-slider-vertical .ui-slider-range{width:100%;bottom:0;border-radius:0 0 30px 30px}.ui-slider-vertical .ui-slider-segment{position:absolute;right:3px}.pager{background-color:#283f50;border-radius:6px;color:#fff;font-size:16px;font-weight:700;display:inline-block}.pager li:first-child>a,.pager li:first-child>span{border-left:none;border-radius:6px 0 0 6px}.pager li>a,.pager li>span{background:0 0;border:none;border-left:2px solid #2c3e50;color:#fff;padding:9px 15px 10px;text-decoration:none;white-space:nowrap;border-radius:0 6px 6px 0;line-height:1.313}.pager li>a:focus,.pager li>a:hover,.pager li>span:focus,.pager li>span:hover{background-color:#2c3e50}.pager li>a:active,.pager li>span:active{background-color:#2c3e50}.pager li>a [class*=fui-]+span,.pager li>span [class*=fui-]+span{margin-left:8px}.pager li>a span+[class*=fui-],.pager li>span span+[class*=fui-]{margin-left:8px}.pagination{position:relative}.pagination ul{background:#d6dbdf;color:#fff;padding:0;margin:0;display:inline-block;border-radius:6px}.pagination ul li{display:inline-block;margin-right:-3px;vertical-align:middle}.pagination ul li:first-child{border-radius:6px 0 0 6px}.pagination ul li:first-child.previous+li>a,.pagination ul li:first-child.previous+li>span{border-left-width:5px}.pagination ul li:last-child{border-radius:0 6px 6px 0;margin-right:0}.pagination ul li.next>a,.pagination ul li.next>span,.pagination ul li.previous>a,.pagination ul li.previous>span{background:0 0;border:none;border-right:2px solid #e4e7ea;font-size:16px;margin:0 9px 0 0;padding:12px 17px;border-radius:6px 0 0 6px}.pagination ul li.next>a,.pagination ul li.next>a:focus,.pagination ul li.next>a:hover,.pagination ul li.next>span,.pagination ul li.next>span:focus,.pagination ul li.next>span:hover,.pagination ul li.previous>a,.pagination ul li.previous>a:focus,.pagination ul li.previous>a:hover,.pagination ul li.previous>span,.pagination ul li.previous>span:focus,.pagination ul li.previous>span:hover{border-color:#e4e7ea!important}@media (max-width:480px){.pagination ul li.next>a,.pagination ul li.next>span,.pagination ul li.previous>a,.pagination ul li.previous>span{margin-right:0}}.pagination ul li.next{margin-left:9px}.pagination ul li.next>a,.pagination ul li.next>span{border-left:2px solid #e4e7ea;border-right:none;margin:0;border-radius:0 6px 6px 0}.pagination ul li.active>a,.pagination ul li.active>span{background-color:#fff;border-color:#fff;border-width:2px!important;color:#d6dbdf;margin:10px 5px 9px}.pagination ul li.active>a:focus,.pagination ul li.active>a:hover,.pagination ul li.active>span:focus,.pagination ul li.active>span:hover{background-color:#fff;border-color:#fff;color:#d6dbdf}.pagination ul li.active.next,.pagination ul li.active.previous{border-color:#e4e7ea}.pagination ul li.active.next>a,.pagination ul li.active.next>span,.pagination ul li.active.previous>a,.pagination ul li.active.previous>span{margin:0}.pagination ul li.active.next>a,.pagination ul li.active.next>a:focus,.pagination ul li.active.next>a:hover,.pagination ul li.active.next>span,.pagination ul li.active.next>span:focus,.pagination ul li.active.next>span:hover,.pagination ul li.active.previous>a,.pagination ul li.active.previous>a:focus,.pagination ul li.active.previous>a:hover,.pagination ul li.active.previous>span,.pagination ul li.active.previous>span:focus,.pagination ul li.active.previous>span:hover{background-color:#1abc9c;color:#fff}.pagination ul li.active.previous{margin-right:6px}.pagination ul li>a,.pagination ul li>span{display:inline-block;background:#fff;border:5px solid #d6dbdf;color:#fff;font-size:14px;line-height:16px;margin:7px 2px 6px;min-width:0;min-height:16px;padding:0 4px;border-radius:50px;-webkit-transition:background .2s ease-out,border-color 0s ease-out,color .2s ease-out;transition:background .2s ease-out,border-color 0s ease-out,color .2s ease-out}.pagination ul li>a:focus,.pagination ul li>a:hover,.pagination ul li>span:focus,.pagination ul li>span:hover{background-color:#1abc9c;border-color:#1abc9c;color:#fff;-webkit-transition:background .2s ease-out,border-color .2s ease-out,color .2s ease-out;transition:background .2s ease-out,border-color .2s ease-out,color .2s ease-out}.pagination ul li>a:active,.pagination ul li>span:active{background-color:#16a085;border-color:#16a085}.pagination>.btn.next,.pagination>.btn.previous{margin-right:8px;font-size:14px;line-height:1.429;padding-left:23px;padding-right:23px}.pagination>.btn.next [class*=fui-],.pagination>.btn.previous [class*=fui-]{font-size:16px;margin-left:-2px;margin-top:-2px}.pagination>.btn.next{margin-left:8px;margin-right:0}.pagination>.btn.next [class*=fui-]{margin-right:-2px;margin-left:4px}.tooltip{font-size:14px;line-height:1.286}.tooltip.in{opacity:1}.tooltip.top{padding-bottom:9px}.tooltip.top .tooltip-arrow{border-top-color:#283f50;border-width:9px 9px 0;bottom:0;margin-left:-9px}.tooltip.right .tooltip-arrow{border-right-color:#283f50;border-width:9px 9px 9px 0;margin-top:-9px;left:-3px}.tooltip.bottom{padding-top:8px}.tooltip.bottom .tooltip-arrow{border-bottom-color:#283f50;border-width:0 9px 9px;margin-left:-9px;top:-1px}.tooltip.left .tooltip-arrow{border-left-color:#283f50;border-width:9px 0 9px 9px;margin-top:-9px;right:-3px}.tooltip-inner{background-color:#283f50;line-height:1.286;padding:12px 12px;text-align:center;width:183px;border-radius:6px}.dropup .dropdown-arrow,.navbar-fixed-bottom .dropdown .dropdown-arrow{border-bottom:none;border-top:8px outset #f3f4f5;bottom:100%;top:auto}.navbar-fixed-bottom .nav>li>ul:before{border-bottom:none;border-top:9px outset #283f50;bottom:4px;top:auto}.open.dropup>.dropdown-menu{margin-bottom:18px}.open.dropup>.dropdown-arrow{margin-bottom:10px}.open.dropup>.dropdown-arrow.dropdown-arrow-inverse{border-top-color:#283f50}.open>.dropdown-arrow{margin-top:11px;opacity:1}.dropdown-arrow{border-style:solid;border-width:0 8px 7px;border-color:transparent transparent #f3f4f5 transparent;height:0;margin-top:0;opacity:0;position:absolute;right:19px;top:100%;width:0;z-index:10;-webkit-transform:rotate(360deg);-webkit-transition:.25s;transition:.25s}.dropdown-inverse{background-color:#283f50;color:#ccc;padding:4px 0 6px}.dropdown-inverse li{margin:0 4px -2px}.dropdown-inverse li:first-child>a,.dropdown-inverse li:last-child>a{border-radius:2px;padding-bottom:7px;padding-top:5px}.dropdown-inverse li:first-child dt+a,.dropdown-inverse li:last-child dt+a{border-radius:2px}.dropdown-inverse li.active>a,.dropdown-inverse li.selected>a{background:#1abc9c;color:#fff;position:relative;z-index:1}.dropdown-inverse li dt{padding-left:11px;padding-right:11px}.dropdown-inverse li .divider{margin-left:11px;margin-right:11px}.dropdown-inverse li>a{border-radius:2px;color:#fff;padding:5px 11px 7px}.dropdown-inverse li>a:active,.dropdown-inverse li>a:focus,.dropdown-inverse li>a:hover{background:#2c3e50}.dropdown-inverse li>a.highlighted{background:#526476}.dropdown-inverse li>a.highlighted:focus,.dropdown-inverse li>a.highlighted:hover{background:#677786}.dropdown-inverse li .divider{background-color:#526476;border-bottom-color:#526476}.has-switch{border-radius:30px;display:inline-block;cursor:pointer;line-height:1.72222;overflow:hidden;position:relative;text-align:left;width:80px;-webkit-mask:url(../images/switch/mask.png) 0 0 no-repeat;mask:url(../images/switch/mask.png) 0 0 no-repeat;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.has-switch.deactivate{opacity:.5;cursor:default!important}.has-switch.deactivate label,.has-switch.deactivate span{cursor:default!important}.has-switch>div{width:130px;position:relative;top:0}.has-switch>div.switch-animate{-webkit-transition:left .25s ease-out;transition:left .25s ease-out}.has-switch>div.switch-off{left:-50px}.has-switch>div.switch-off label{background-color:#7f8c9a;border-color:#bdc3c7;-webkit-box-shadow:-1px 0 0 rgba(255,255,255,.5);box-shadow:-1px 0 0 rgba(255,255,255,.5)}.has-switch>div.switch-on{left:0}.has-switch>div.switch-on label{background-color:#1abc9c}.has-switch input[type=checkbox]{display:none}.has-switch span{cursor:pointer;font-size:15px;font-weight:700;float:left;height:29px;line-height:19px;margin:0;padding-bottom:6px;padding-top:5px;position:relative;text-align:center;width:50%;z-index:1;-webkit-transition:.25s ease-out;transition:.25s ease-out}.has-switch span.switch-left{border-radius:30px 0 0 30px;background-color:#283f50;color:#1abc9c;border-left:1px solid transparent}.has-switch span.switch-right{border-radius:0 30px 30px 0;background-color:#bdc3c7;color:#fff;text-indent:7px}.has-switch span.switch-right [class*=fui-]{text-indent:0}.has-switch label{border:4px solid #283f50;border-radius:50%;float:left;height:29px;margin:0 -15px;padding:0;position:relative;vertical-align:middle;width:29px;z-index:100;-webkit-transition:.25s ease-out;transition:.25s ease-out}.switch-square{border-radius:6px;-webkit-mask:url(../images/switch/mask.png) 0 0 no-repeat;mask:url(../images/switch/mask.png) 0 0 no-repeat}.switch-square>div.switch-off label{border-color:#7f8c9a;border-radius:6px 0 0 6px}.switch-square span.switch-left{border-radius:6px 0 0 6px}.switch-square span.switch-left [class*=fui-]{text-indent:-10px}.switch-square span.switch-right{border-radius:0 6px 6px 0}.switch-square span.switch-right [class*=fui-]{text-indent:5px}.switch-square label{border-radius:0 6px 6px 0;border-color:#1abc9c}.share{background-color:#eff0f2;position:relative;border-radius:6px}.share:before{content:"";border-style:solid;border-width:0 9px 9px 9px;border-color:transparent transparent #eff0f2 transparent;height:0;position:absolute;left:23px;top:-9px;width:0;-webkit-transform:rotate(360deg)}.share ul{list-style-type:none;margin:0;padding:15px}.share li{font-size:15px;line-height:1.4;padding-top:11px}.share li:after,.share li:before{content:" ";display:table}.share li:after{clear:both}.share li:first-child{padding-top:0}.share .toggle{float:right;margin:0}.share .btn{border-radius:0 0 6px 6px}.share-label{float:left;font-size:15px;line-height:1.4;padding-top:5px;width:50%}.pallete-item{width:140px;float:left;margin:0 0 20px 20px}.palette{font-size:14px;line-height:1.214;color:#fff;margin:0;padding:15px;text-transform:uppercase}.palette dd,.palette dt{line-height:1.429}.palette dt{display:block;font-weight:700;opacity:.8}.palette dd{font-weight:300;margin-left:0;opacity:.8;-webkit-font-smoothing:subpixel-antialiased}.palette-turquoise{background-color:#1abc9c}.palette-green-sea{background-color:#16a085}.palette-emerald{background-color:#2ecc71}.palette-nephritis{background-color:#27ae60}.palette-peter-river{background-color:#3498db}.palette-belize-hole{background-color:#2980b9}.palette-amethyst{background-color:#9b59b6}.palette-wisteria{background-color:#8e44ad}.palette-wet-asphalt{background-color:#283f50}.palette-midnight-blue{background-color:#2c3e50}.palette-sun-flower{background-color:#f1c40f}.palette-orange{background-color:#f39c12}.palette-carrot{background-color:#e67e22}.palette-pumpkin{background-color:#d35400}.palette-alizarin{background-color:#e74c3c}.palette-pomegranate{background-color:#c0392b}.palette-clouds{background-color:#ecf0f1}.palette-silver{background-color:#bdc3c7}.palette-concrete{background-color:#95a5a6}.palette-asbestos{background-color:#7f8c8d}.palette-clouds{color:#bdc3c7}.palette-paragraph{color:#7f8c8d;font-size:12px;line-height:17px}.palette-paragraph span{color:#bdc3c7}.palette-headline{color:#7f8c8d;font-size:13px;font-weight:700;margin-top:-3px}.tile{background-color:#eff0f2;border-radius:6px;padding:14px;position:relative;text-align:center}.tile.tile-hot:before{background:url(../images/tile/ribbon.png) 0 0 no-repeat;background-size:82px 82px;content:'';height:82px;position:absolute;right:-4px;top:-4px;width:82px}.tile p{font-size:15px;margin-bottom:33px}.tile-image{height:100px;margin:31px 0 27px;vertical-align:bottom}.tile-image.big-illustration{height:111px;margin-top:20px;width:112px}.tile-title{font-size:20px;margin:0}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (-moz-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:3/2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (-moz-min-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:2){.tile.tile-hot:before{background-image:url(../images/tile/ribbon-2x.png)}}.todo{color:#798795;margin-bottom:20px;border-radius:6px}.todo ul{background-color:#2c3e50;margin:0;padding:0;list-style-type:none;border-radius:0 0 6px 6px}.todo li{background:#283f50 url(../images/todo/todo.png) 92% center no-repeat;background-size:20px 20px;cursor:pointer;font-size:14px;line-height:1.214;margin-top:2px;padding:18px 42px 21px 25px;position:relative;-webkit-transition:.25s;transition:.25s}.todo li:first-child{margin-top:0}.todo li:last-child{border-radius:0 0 6px 6px;padding-bottom:21px}.todo li.todo-done{background:transparent url(../images/todo/done.png) 92% center no-repeat;background-size:20px 20px;color:#1abc9c}.todo li.todo-done .todo-name{color:#1abc9c}.todo-search{position:relative;background:#1abc9c;background-size:16px 16px;border-radius:6px 6px 0 0;color:#283f50;padding:19px 25px 20px}.todo-search:before{position:absolute;font-family:Flat-UI-Icons;content:"\e01c";font-size:16px;line-height:17px;display:inline-block;top:50%;left:92%;margin:-.5em 0 0 -1em}input.todo-search-field{background:0 0;border:none;color:#283f50;font-size:19px;font-weight:700;margin:0;line-height:23px;padding:5px 0;text-indent:0;-webkit-box-shadow:none;box-shadow:none}input.todo-search-field:-moz-placeholder{color:#283f50}input.todo-search-field::-moz-placeholder{color:#283f50;opacity:1}input.todo-search-field:-ms-input-placeholder{color:#283f50}input.todo-search-field::-webkit-input-placeholder{color:#283f50}input.todo-search-field.placeholder{color:#283f50}.todo-icon{float:left;font-size:24px;padding:11px 22px 0 0}.todo-content{padding-top:1px;overflow:hidden}.todo-name{color:#fff;font-size:17px;margin:1px 0 3px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (-moz-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:3/2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (-moz-min-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:2){.todo li{background-image:url(../images/todo/todo-2x.png)}.todo li.todo-done{background-image:url(../images/todo/done-2x.png)}}.video-js{background-color:transparent;margin-top:-95px;position:relative;padding:0;font-size:10px;vertical-align:middle;border-radius:6px 6px 0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:6px 6px 0 0}.video-js:-moz-full-screen{position:absolute}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0;width:100%!important;height:100%!important}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.vjs-poster{margin:0 auto;padding:0;cursor:pointer;position:relative;width:100%;max-height:100%;border-radius:6px 6px 0 0}.video-js .vjs-text-track-display{text-align:center;position:absolute;bottom:4em;left:1em;right:1em;font-family:"Source Sans Pro",Helvetica,Arial,sans-serif}.video-js .vjs-text-track{display:none;color:#fff;font-size:1.4em;text-align:center;margin-bottom:.1em;background:#000;background:rgba(0,0,0,.5)}.video-js .vjs-subtitles{color:#fff}.video-js .vjs-captions{color:#fc6}.vjs-tt-cue{display:block}.vjs-fade-in{visibility:visible!important;opacity:1!important;-webkit-transition:visibility 0s linear 0s,opacity .3s linear;transition:visibility 0s linear 0s,opacity .3s linear}.vjs-fade-out{visibility:hidden!important;opacity:0!important;-webkit-transition:visibility 0s linear 1.5s,opacity 1.5s linear;transition:visibility 0s linear 1.5s,opacity 1.5s linear}.vjs-control-bar{position:absolute;bottom:-47px;left:0;right:0;margin:0;padding:0;height:47px;color:#fff;background:#273747;border-radius:0 0 6px 6px}.vjs-control-bar.vjs-fade-out{visibility:visible!important;opacity:1!important}.vjs-control{background-position:center center;background-repeat:no-repeat;position:relative;float:left;text-align:center;margin:0;padding:0;height:18px;width:18px}.vjs-control:focus{outline:0}.vjs-control div{background-position:center center;background-repeat:no-repeat}.vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-play-control{cursor:pointer!important;height:47px;left:0;position:absolute;top:0;width:58px}.vjs-play-control div{position:relative;height:47px}.vjs-play-control div:after,.vjs-play-control div:before{position:absolute;font-family:Flat-UI-Icons;color:#1abc9c;font-size:16px;top:50%;left:50%;margin:-.55em 0 0 -.5em;-webkit-transition:color .25s,opacity .25s;transition:color .25s,opacity .25s}.vjs-play-control div:after{content:"\e03b"}.vjs-play-control div:before{content:"\e03c"}.vjs-paused .vjs-play-control:hover div:before{color:#16a085}.vjs-paused .vjs-play-control div:after{opacity:0}.vjs-paused .vjs-play-control div:before{opacity:1}.vjs-playing .vjs-play-control:hover div:after{color:#16a085}.vjs-playing .vjs-play-control div:after{opacity:1}.vjs-playing .vjs-play-control div:before{opacity:0}.vjs-rewind-control{width:5em;cursor:pointer!important}.vjs-rewind-control div{width:19px;height:16px;background:none transparent;margin:.5em auto 0}.vjs-mute-control{background:url(../images/video/volume-full.png) center -48px no-repeat;background-size:16px 64px;cursor:pointer!important;position:absolute;right:51px;top:14px}.vjs-mute-control:focus div,.vjs-mute-control:hover div{opacity:0}.vjs-mute-control.vjs-vol-0,.vjs-mute-control.vjs-vol-0 div{background-image:url(../images/video/volume-off.png)}.vjs-mute-control div{background:#273747 url(../images/video/volume-full.png) no-repeat center 2px;background-size:16px 64px;height:18px;-webkit-transition:opacity .25s;transition:opacity .25s}.vjs-volume-bar,.vjs-volume-control,.vjs-volume-handle,.vjs-volume-level{display:none}.vjs-progress-control{position:absolute;left:60px;right:180px;height:12px;width:auto;top:18px;background:#425669;border-radius:32px}.vjs-progress-holder{position:relative;cursor:pointer!important;padding:0;margin:0;height:12px}.vjs-load-progress,.vjs-play-progress{position:absolute;display:block;height:12px;margin:0;padding:0;left:0;top:0;border-radius:32px}.vjs-play-progress{background:#1abc9c;left:-1px}.vjs-load-progress{background:#d6dbdf;border-radius:32px 0 0 32px}.vjs-load-progress[style*='100%'],.vjs-load-progress[style*='99%']{border-radius:32px}.vjs-seek-handle{background-color:#16a085;position:absolute;width:18px;height:18px;margin:-3px 0 0 1px;left:0;top:0;border-radius:50%;-webkit-transition:background-color .25s;transition:background-color .25s}.vjs-seek-handle[style*='95.']{margin-left:3px}.vjs-seek-handle[style='left: 0%;']{margin-left:-2px}.vjs-seek-handle:focus,.vjs-seek-handle:hover{background-color:#148d75}.vjs-seek-handle:active{background-color:#117a65}.vjs-time-controls{position:absolute;height:20px;width:50px;top:16px;font:300 13px "Source Sans Pro",Helvetica,Arial,sans-serif}.vjs-current-time{right:128px;text-align:right}.vjs-duration{color:#5d6d7e;right:69px;text-align:left}.vjs-remaining-time{display:none}.vjs-time-divider{color:#5d6d7e;font-size:14px;position:absolute;right:121px;top:15px}.vjs-secondary-controls{float:right}.vjs-fullscreen-control{background-image:url(../images/video/fullscreen.png);background-position:center -47px;background-size:15px 64px;cursor:pointer!important;position:absolute;right:17px;top:13px}.vjs-fullscreen-control:focus div,.vjs-fullscreen-control:hover div{opacity:0}.vjs-fullscreen-control div{height:18px;background:url(../images/video/fullscreen.png) no-repeat center 2px;background-size:15px 64px;-webkit-transition:opacity .25s;transition:opacity .25s}.vjs-menu-button{display:none!important}@-webkit-keyframes sharp{0%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}50%{background:#ebedee;border-radius:0;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}100%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes sharp{0%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}50%{background:#ebedee;border-radius:0;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}100%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes sharp{0%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}50%{background:#ebedee;border-radius:0;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}100%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sharp{0%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}50%{background:#ebedee;border-radius:0;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}100%{background:#e74c3c;border-radius:10px;-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}.vjs-loading-spinner{background:#ebedee;display:none;height:16px;left:50%;margin:-8px 0 0 -8px;position:absolute;top:50%;width:16px;border-radius:10px;-webkit-animation:sharp 2s ease infinite;animation:sharp 2s ease infinite}.login{background:url(../images/login/imac.png) 0 0 no-repeat;background-size:940px 778px;color:#fff;margin-bottom:77px;padding:38px 38px 267px;position:relative}.login-screen{background-color:#1abc9c;min-height:473px;padding:123px 199px 33px 306px}.login-icon{left:200px;position:absolute;top:160px;width:96px}.login-icon>img{display:block;margin-bottom:6px;width:100%}.login-icon>h4{font-size:17px;font-weight:300;line-height:34px;opacity:.95}.login-icon>h4 small{color:inherit;display:block;font-size:inherit;font-weight:700}.login-form{background-color:#edeff1;padding:24px 23px 20px;position:relative;border-radius:6px}.login-form:before{content:'';border-style:solid;border-width:12px 12px 12px 0;border-color:transparent #edeff1 transparent transparent;height:0;position:absolute;left:-12px;top:35px;width:0;-webkit-transform:rotate(360deg)}.login-form .control-group{margin-bottom:6px;position:relative}.login-form .login-field{border-color:transparent;font-size:17px;text-indent:3px}.login-form .login-field:focus{border-color:#1abc9c}.login-form .login-field:focus+.login-field-icon{color:#1abc9c}.login-form .login-field-icon{color:#bfc9ca;font-size:16px;position:absolute;right:15px;top:3px;-webkit-transition:.25s;transition:.25s}.login-link{color:#bfc9ca;display:block;font-size:13px;margin-top:15px;text-align:center}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (-moz-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:3/2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (-moz-min-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:2){.login{background-image:url(../images/login/imac-2x.png)}}footer{background-color:#edeff1;color:#bac1c8;font-size:15px;padding:0}footer a{color:#9aa4af;font-weight:700}footer p{font-size:15px;line-height:20px;margin-bottom:10px}.footer-title{margin:0 0 22px;padding-top:21px;font-size:24px;line-height:40px}.footer-brand{display:block;margin-bottom:26px;width:220px}.footer-brand img{width:216px}.footer-banner{background-color:#1abc9c;color:#d1f2eb;margin-left:42px;min-height:316px;padding:0 30px 30px}.footer-banner .footer-title{color:#fff}.footer-banner a{color:#b7f5e9;text-decoration:underline}.footer-banner a:hover{text-decoration:none}.footer-banner ul{list-style-type:none;margin:0 0 26px;padding:0}.footer-banner ul li{border-top:1px solid #1bc5a3;line-height:19px;padding:6px 0}.footer-banner ul li:first-child{border-top:none;padding-top:1px}.last-col{overflow:hidden}.pan,.ptn,.pvn{padding-top:0}.pax,.ptx,.pvx{padding-top:3px}.pas,.pts,.pvs{padding-top:5px}.pam,.ptm,.pvm{padding-top:10px}.pal,.ptl,.pvl{padding-top:20px}.pan,.phn,.prn{padding-right:0}.pax,.phx,.prx{padding-right:3px}.pas,.phs,.prs{padding-right:5px}.pam,.phm,.prm{padding-right:10px}.pal,.phl,.prl{padding-right:20px}.pan,.pbn,.pvn{padding-bottom:0}.pax,.pbx,.pvx{padding-bottom:3px}.pas,.pbs,.pvs{padding-bottom:5px}.pam,.pbm,.pvm{padding-bottom:10px}.pal,.pbl,.pvl{padding-bottom:20px}.pan,.phn,.pln{padding-left:0}.pax,.phx,.plx{padding-left:3px}.pas,.phs,.pls{padding-left:5px}.pam,.phm,.plm{padding-left:10px}.pal,.phl,.pll{padding-left:20px}.man,.mtn,.mvn{margin-top:0}.max,.mtx,.mvx{margin-top:3px}.mas,.mts,.mvs{margin-top:5px}.mam,.mtm,.mvm{margin-top:10px}.mal,.mtl,.mvl{margin-top:20px}.man,.mhn,.mrn{margin-right:0}.max,.mhx,.mrx{margin-right:3px}.mas,.mhs,.mrs{margin-right:5px}.mam,.mhm,.mrm{margin-right:10px}.mal,.mhl,.mrl{margin-right:20px}.man,.mbn,.mvn{margin-bottom:0}.max,.mbx,.mvx{margin-bottom:3px}.mas,.mbs,.mvs{margin-bottom:5px}.mam,.mbm,.mvm{margin-bottom:10px}.mal,.mbl,.mvl{margin-bottom:20px}.man,.mhn,.mln{margin-left:0}.max,.mhx,.mlx{margin-left:3px}.mas,.mhs,.mls{margin-left:5px}.mam,.mhm,.mlm{margin-left:10px}.mal,.mhl,.mll{margin-left:20px}
table.dataTable{clear:both;margin-top:6px!important;margin-bottom:6px!important;max-width:none!important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap td,table.dataTable.nowrap th{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:400;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:400;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc{padding-right:30px}table.dataTable thead>tr>td:active,table.dataTable thead>tr>th:active{outline:0}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:.5}table.dataTable thead .sorting:after{opacity:.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0!important}div.dataTables_scrollBody table{border-top:none;margin-top:0!important;margin-bottom:0!important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child td,div.dataTables_scrollBody table tbody tr:first-child th{border-top:none}div.dataTables_scrollFoot table{margin-top:0!important;border-top:none}@media screen and (max-width:767px){div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-collapse:separate!important}table.table-bordered.dataTable td,table.table-bordered.dataTable th{border-left-width:0}table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable th:last-child{border-right-width:0}table.table-bordered.dataTable tbody td,table.table-bordered.dataTable tbody th{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}
@@ -18,6 +18,6 @@ table.dataTable{clear:both;margin-top:6px!important;margin-bottom:6px!important;
* https://github.com/Eonasdan/bootstrap-datetimepicker/
*/.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:after,.bootstrap-datetimepicker-widget.dropdown-menu:before{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:700;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action=clear]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action=today]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#eee}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#777}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget table td.new,.bootstrap-datetimepicker-widget table td.old{color:#777}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#337ab7;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget table td span:hover{background:#eee}.bootstrap-datetimepicker-widget table td span.active{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td span.old{color:#777}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget.wider{width:21em}.bootstrap-datetimepicker-widget .datepicker-decades .decade{line-height:1.8em!important}.input-group.date .input-group-addon{cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}
.checkbox{padding-left:24px}.checkbox label{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.checkbox label::before{content:"";display:inline-block;position:absolute;width:24px;height:24px;left:0;margin-top:5px;margin-left:-24px;border:1px solid #ccc;border-radius:3px;background-color:#fff;-webkit-transition:border .15s ease-in-out,color .15s ease-in-out;-o-transition:border .15s ease-in-out,color .15s ease-in-out;transition:border .15s ease-in-out,color .15s ease-in-out}.checkbox label::after{display:inline-block;position:absolute;width:16px;height:16px;left:0;top:0;margin-left:-20px;padding-left:3px;padding-top:5px;font-size:11px;color:#555}.checkbox input[type=checkbox],.checkbox input[type=radio]{opacity:0;z-index:1}.checkbox input[type=checkbox]:focus+label::before,.checkbox input[type=radio]:focus+label::before{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.checkbox input[type=checkbox]:checked+label::after,.checkbox input[type=radio]:checked+label::after{font-family:FontAwesome;content:"\f00c"}.checkbox input[type=checkbox]:disabled+label,.checkbox input[type=radio]:disabled+label{opacity:.65}.checkbox input[type=checkbox]:disabled+label::before,.checkbox input[type=radio]:disabled+label::before{background-color:#eee;cursor:not-allowed}.checkbox.checkbox-circle label::before{border-radius:50%}.checkbox.checkbox-inline{margin-top:0}.checkbox-primary input[type=checkbox]:checked+label::before,.checkbox-primary input[type=radio]:checked+label::before{background-color:#337ab7;border-color:#337ab7}.checkbox-primary input[type=checkbox]:checked+label::after,.checkbox-primary input[type=radio]:checked+label::after{color:#fff}.checkbox-danger input[type=checkbox]:checked+label::before,.checkbox-danger input[type=radio]:checked+label::before{background-color:#d9534f;border-color:#d9534f}.checkbox-danger input[type=checkbox]:checked+label::after,.checkbox-danger input[type=radio]:checked+label::after{color:#fff}.checkbox-info input[type=checkbox]:checked+label::before,.checkbox-info input[type=radio]:checked+label::before{background-color:#5bc0de;border-color:#5bc0de}.checkbox-info input[type=checkbox]:checked+label::after,.checkbox-info input[type=radio]:checked+label::after{color:#fff}.checkbox-warning input[type=checkbox]:checked+label::before,.checkbox-warning input[type=radio]:checked+label::before{background-color:#f0ad4e;border-color:#f0ad4e}.checkbox-warning input[type=checkbox]:checked+label::after,.checkbox-warning input[type=radio]:checked+label::after{color:#fff}.checkbox-success input[type=checkbox]:checked+label::before,.checkbox-success input[type=radio]:checked+label::before{background-color:#5cb85c;border-color:#5cb85c}.checkbox-success input[type=checkbox]:checked+label::after,.checkbox-success input[type=radio]:checked+label::after{color:#fff}.radio{padding-left:20px}.radio label{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.radio label::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #ccc;border-radius:50%;background-color:#fff;-webkit-transition:border .15s ease-in-out;-o-transition:border .15s ease-in-out;transition:border .15s ease-in-out}.radio label::after{display:inline-block;position:absolute;content:" ";width:11px;height:11px;left:3px;top:3px;margin-left:-20px;border-radius:50%;background-color:#555;-webkit-transform:scale(0,0);-ms-transform:scale(0,0);-o-transform:scale(0,0);transform:scale(0,0);-webkit-transition:-webkit-transform .1s cubic-bezier(.8,-.33,.2,1.33);-moz-transition:-moz-transform .1s cubic-bezier(.8,-.33,.2,1.33);-o-transition:-o-transform .1s cubic-bezier(.8,-.33,.2,1.33);transition:transform .1s cubic-bezier(.8,-.33,.2,1.33)}.radio input[type=radio]{opacity:0;z-index:1}.radio input[type=radio]:focus+label::before{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.radio input[type=radio]:checked+label::after{-webkit-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)}.radio input[type=radio]:disabled+label{opacity:.65}.radio input[type=radio]:disabled+label::before{cursor:not-allowed}.radio.radio-inline{margin-top:0}.radio-primary input[type=radio]+label::after{background-color:#337ab7}.radio-primary input[type=radio]:checked+label::before{border-color:#337ab7}.radio-primary input[type=radio]:checked+label::after{background-color:#337ab7}.radio-danger input[type=radio]+label::after{background-color:#d9534f}.radio-danger input[type=radio]:checked+label::before{border-color:#d9534f}.radio-danger input[type=radio]:checked+label::after{background-color:#d9534f}.radio-info input[type=radio]+label::after{background-color:#5bc0de}.radio-info input[type=radio]:checked+label::before{border-color:#5bc0de}.radio-info input[type=radio]:checked+label::after{background-color:#5bc0de}.radio-warning input[type=radio]+label::after{background-color:#f0ad4e}.radio-warning input[type=radio]:checked+label::before{border-color:#f0ad4e}.radio-warning input[type=radio]:checked+label::after{background-color:#f0ad4e}.radio-success input[type=radio]+label::after{background-color:#5cb85c}.radio-success input[type=radio]:checked+label::before{border-color:#5cb85c}.radio-success input[type=radio]:checked+label::after{background-color:#5cb85c}input[type=checkbox].styled:checked+label:after,input[type=radio].styled:checked+label:after{font-family:FontAwesome;content:"\f00c"}input[type=checkbox] .styled:checked+label::before,input[type=radio] .styled:checked+label::before{color:#fff}input[type=checkbox] .styled:checked+label::after,input[type=radio] .styled:checked+label::after{color:#fff}
-.swal2-modal,.swal2-overlay{position:fixed;display:none}.swal2-overlay{background-color:rgba(0,0,0,.4);left:0;right:0;top:0;bottom:0;z-index:1500}.swal2-modal{background-color:#fff;font-family:"Source Sans Pro",Helvetica,Arial,sans-serif,Helvetica,Arial,sans-serif;border-radius:5px;box-sizing:border-box;text-align:center;left:50%;top:50%;margin-top:-200px;max-height:90%;overflow-x:hidden;overflow-y:auto;z-index:2000}.swal2-modal:focus{outline:0}.swal2-modal.loading{overflow-y:hidden}.swal2-modal h2{color:#575757;font-size:30px;text-align:center;font-weight:600;text-transform:none;position:relative;margin:0;padding:0;line-height:60px;display:block}.swal2-modal hr{height:10px;color:transparent;border:0}.swal2-modal button.styled{color:#fff;border:0;box-shadow:none;font-size:17px;font-weight:500;border-radius:5px;padding:10px 32px;margin:0 5px;cursor:pointer}.swal2-content,.swal2-icon{padding:0;position:relative}.swal2-modal button.styled:focus{outline:0}.swal2-modal button.styled:not(.loading)[disabled]{opacity:.4;cursor:no-drop}.swal2-modal button.styled.loading{box-sizing:border-box;border:4px solid transparent;width:40px;height:40px;padding:0;margin:-2px 30px;vertical-align:top;background-color:transparent!important;color:transparent;cursor:default;border-radius:100%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-modal button.styled::-moz-focus-inner{border:0}.swal2-modal button:not(.styled).loading:after{display:inline-block;content:"";margin-left:5px;vertical-align:-1px;height:6px;width:6px;border:3px solid #999;border-right-color:transparent;border-radius:50%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-checkbox input,.swal2-checkbox span,.swal2-radio input,.swal2-radio span{vertical-align:middle}.swal2-modal .swal2-image{margin:20px auto;max-width:100%}.swal2-modal .swal2-close{font-size:36px;line-height:36px;font-family:serif;position:absolute;top:5px;right:13px;cursor:pointer;color:#cfcfcf;-webkit-transition:all .1s ease;transition:all .1s ease}.swal2-modal .swal2-close:hover{color:#d55}.swal2-modal>.swal2-checkbox,.swal2-modal>.swal2-input,.swal2-modal>.swal2-radio,.swal2-modal>.swal2-select,.swal2-modal>.swal2-textarea{display:none}.swal2-content{font-size:18px;text-align:center;font-weight:400;float:none;margin:0;line-height:normal;color:#555}.swal2-icon.swal2-info,.swal2-icon.swal2-question,.swal2-icon.swal2-warning{font-size:60px;line-height:80px;text-align:center}.swal2-icon{width:80px;height:80px;border:4px solid grey;border-radius:50%;margin:20px auto 30px;box-sizing:content-box;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .x-mark{position:relative;display:block}.swal2-icon.swal2-error .line{position:absolute;height:5px;width:47px;background-color:#f27474;display:block;top:37px;border-radius:2px}.swal2-icon.swal2-error .line.left{-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px}.swal2-icon.swal2-error .line.right{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}.swal2-icon.swal2-warning{font-family:"Source Sans Pro",Helvetica,Arial,sans-serif,Helvetica,Arial,sans-serif;color:#f8bb86;border-color:#f8bb86}.swal2-icon.swal2-info{font-family:"Open Sans",sans-serif;color:#3fc3ee;border-color:#3fc3ee}.swal2-icon.swal2-question{font-family:"Source Sans Pro",Helvetica,Arial,sans-serif,Helvetica,Arial,sans-serif;color:#c9dae1;border-color:#c9dae1}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success::after,.swal2-icon.swal2-success::before{content:'';position:absolute;width:60px;height:120px;background:#fff}.swal2-icon.swal2-success::before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}.swal2-icon.swal2-success::after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px}.swal2-icon.swal2-success .placeholder{width:80px;height:80px;border:4px solid rgba(165,220,134,.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.swal2-icon.swal2-success .fix{width:7px;height:90px;background-color:#fff;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-success .line{height:5px;background-color:#a5dc86;display:block;border-radius:2px;position:absolute;z-index:2}.swal2-icon.swal2-success .line.tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success .line.long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-checkbox,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:20px auto}.swal2-input:not([type=file]),.swal2-textarea{width:100%;box-sizing:border-box;border-radius:3px;border:1px solid #d7d7d7;font-size:18px;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);-webkit-transition:all .3s;transition:all .3s}.swal2-input:not([type=file]).error,.swal2-textarea.error{border-color:#f06e57!important}.swal2-input:not([type=file]):focus,.swal2-textarea:focus{outline:0;box-shadow:0 0 3px #c4e6f5;border:1px solid #b4dbed}.swal2-input:not([type=file]):focus::-moz-placeholder,.swal2-textarea:focus::-moz-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus:-ms-input-placeholder,.swal2-textarea:focus:-ms-input-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus::-webkit-input-placeholder,.swal2-textarea:focus::-webkit-input-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file])::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#bdbdbd}.swal2-input:not([type=file]):-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file])::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file]){height:43px;padding:0 12px}.swal2-input[type=file]{font-size:20px}.swal2-textarea{height:108px;padding:12px}.swal2-select{color:#555;font-size:inherit;padding:5px 10px;min-width:40%;max-width:100%}.swal2-radio{border:0}.swal2-radio label:not(:first-child){margin-left:20px}.swal2-radio input{margin:0 3px 0 0}.swal2-checkbox{color:#555}.swal2-validationerror{background-color:#f1f1f1;margin:0 -20px;overflow:hidden;padding:10px;color:#797979;font-size:16px;font-weight:400;display:none}.swal2-validationerror::before{content:"!";display:inline-block;width:24px;height:24px;border-radius:50%;background-color:#ea7d7d;color:#fff;line-height:24px;text-align:center;margin-right:10px}@-webkit-keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}.show-swal2{-webkit-animation:showSweetAlert .3s;animation:showSweetAlert .3s}.show-swal2.no-animation{-webkit-animation:none;animation:none}.hide-swal2{-webkit-animation:hideSweetAlert .15s;animation:hideSweetAlert .15s}.hide-swal2.no-animation{-webkit-animation:none;animation:none}@-webkit-keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@-webkit-keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@-webkit-keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}.animate-success-tip{-webkit-animation:animate-success-tip .75s;animation:animate-success-tip .75s}.animate-success-long{-webkit-animation:animate-success-long .75s;animation:animate-success-long .75s}.swal2-icon.swal2-success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}@-webkit-keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}@keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}.animate-error-icon{-webkit-animation:animate-error-icon .5s;animation:animate-error-icon .5s}@-webkit-keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}@keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}.animate-x-mark{-webkit-animation:animate-x-mark .5s;animation:animate-x-mark .5s}@-webkit-keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}@keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}.pulse-warning{-webkit-animation:pulse-warning .75s infinite alternate;animation:pulse-warning .75s infinite alternate}@-webkit-keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}
+@charset "UTF-8";@-webkit-keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}body.swal2-toast-shown .swal2-container{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-shown{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}body.swal2-toast-column .swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-column .swal2-toast .swal2-actions{flex:1;align-self:stretch;height:2.2em;margin-top:.3125em}body.swal2-toast-column .swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-column .swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-column .swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;overflow-y:hidden;box-shadow:0 0 .625em #d9d9d9}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:static;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon::before{display:flex;align-items:center;font-size:2em;font-weight:700}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-popup.swal2-toast .swal2-icon::before{font-size:.25em}}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{flex-basis:auto!important;width:auto;height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .3125em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 .0625em #fff,0 0 0 .125em rgba(50,100,150,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.8em;left:-.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:swal2-toast-show .5s;animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:swal2-toast-hide .1s forwards;animation:swal2-toast-hide .1s forwards}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-toast-animate-success-line-tip .75s;animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-toast-animate-success-line-long .75s;animation:swal2-toast-animate-success-line-long .75s}@-webkit-keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@-webkit-keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-shown{top:auto;right:auto;bottom:auto;left:auto;max-width:calc(100% - .625em * 2);background-color:transparent}body.swal2-no-backdrop .swal2-shown>.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-shown.swal2-top{top:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-top-left,body.swal2-no-backdrop .swal2-shown.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-top-end,body.swal2-no-backdrop .swal2-shown.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-shown.swal2-center{top:50%;left:50%;transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-left,body.swal2-no-backdrop .swal2-shown.swal2-center-start{top:50%;left:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-end,body.swal2-no-backdrop .swal2-shown.swal2-center-right{top:50%;right:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom{bottom:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom-left,body.swal2-no-backdrop .swal2-shown.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-bottom-end,body.swal2-no-backdrop .swal2-shown.swal2-bottom-right{right:0;bottom:0}.swal2-container{display:flex;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:.625em;overflow-x:hidden;background-color:transparent;-webkit-overflow-scrolling:touch}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-bottom-end>:first-child,.swal2-container.swal2-bottom-left>:first-child,.swal2-container.swal2-bottom-right>:first-child,.swal2-container.swal2-bottom-start>:first-child,.swal2-container.swal2-bottom>:first-child{margin-top:auto}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-container.swal2-fade{transition:background-color .1s}.swal2-container.swal2-shown{background-color:rgba(0,0,0,.4)}.swal2-popup{display:none;position:relative;box-sizing:border-box;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border:none;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-title{position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-actions{display:flex;z-index:1;flex-wrap:wrap;align-items:center;justify-content:center;width:100%;margin:1.25em auto 0}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-actions.swal2-loading .swal2-styled.swal2-confirm{box-sizing:border-box;width:2.5em;height:2.5em;margin:.46875em;padding:0;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{content:"";display:inline-block;width:15px;height:15px;margin-left:5px;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff}.swal2-styled{margin:.3125em;padding:.625em 2em;box-shadow:none;font-weight:500}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-styled:focus{outline:0;box-shadow:0 0 0 2px #fff,0 0 0 4px rgba(50,100,150,.4)}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-image{max-width:100%;margin:1.25em auto}.swal2-close{position:absolute;z-index:2;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;overflow:hidden;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer}.swal2-close:hover{transform:none;background:0 0;color:#f27474}.swal2-content{z-index:1;justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:400;line-height:normal;text-align:center;word-wrap:break-word}.swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:1em auto}.swal2-file,.swal2-input,.swal2-textarea{box-sizing:border-box;width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;background:inherit;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);color:inherit;font-size:1.125em}.swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-file::-webkit-input-placeholder,.swal2-input::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#ccc}.swal2-file:-ms-input-placeholder,.swal2-input:-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-file::-ms-input-placeholder,.swal2-input::-ms-input-placeholder,.swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder{color:#ccc}.swal2-range{margin:1em auto;background:inherit}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}.swal2-input{height:2.625em;padding:0 .75em}.swal2-input[type=number]{max-width:10em}.swal2-file{background:inherit;font-size:1.125em}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:inherit;color:inherit;font-size:1.125em}.swal2-checkbox,.swal2-radio{align-items:center;justify-content:center;background:inherit;color:inherit}.swal2-checkbox label,.swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-checkbox input,.swal2-radio input{margin:0 .4em}.swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}.swal2-validation-message::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;zoom:normal;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;zoom:normal;border:.25em solid transparent;border-radius:50%;font-family:inherit;line-height:5em;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon::before{display:flex;align-items:center;height:92%;font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-warning::before{content:"!"}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-info::before{content:"i"}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-question::before{content:"?"}.swal2-icon.swal2-question.swal2-arabic-question-mark::before{content:"؟"}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-.25em;left:-.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-progress-steps{align-items:center;margin:0 0 1.25em;padding:0;background:inherit;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#3085d6}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;width:2.5em;height:.4em;margin:0 -1px;background:#3085d6}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-show.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-hide.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-animate-success-icon .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-animate-error-icon{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-animate-error-icon .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}@-webkit-keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static!important}}
.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
/*! Select2 Bootstrap Theme v0.1.0-beta.9 | MIT License | github.com/select2/select2-bootstrap-theme */.select2-container--bootstrap{display:block}.select2-container--bootstrap .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);background-color:#fff;border:1px solid #ccc;border-radius:4px;color:#555;font-size:14px;outline:0}.select2-container--bootstrap .select2-selection.form-control{border-radius:4px}.select2-container--bootstrap .select2-search--dropdown .select2-search__field{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);background-color:#fff;border:1px solid #ccc;border-radius:4px;color:#555;font-size:14px}.select2-container--bootstrap .select2-search__field{outline:0}.select2-container--bootstrap .select2-search__field::-webkit-input-placeholder{color:#999}.select2-container--bootstrap .select2-search__field:-moz-placeholder{color:#999}.select2-container--bootstrap .select2-search__field::-moz-placeholder{color:#999;opacity:1}.select2-container--bootstrap .select2-search__field:-ms-input-placeholder{color:#999}.select2-container--bootstrap .select2-results__option{padding:6px 12px}.select2-container--bootstrap .select2-results__option[role=group]{padding:0}.select2-container--bootstrap .select2-results__option[aria-disabled=true]{color:#777;cursor:not-allowed}.select2-container--bootstrap .select2-results__option[aria-selected=true]{background-color:#f5f5f5;color:#262626}.select2-container--bootstrap .select2-results__option--highlighted[aria-selected]{background-color:#337ab7;color:#fff}.select2-container--bootstrap .select2-results__option .select2-results__option{padding:6px 12px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option{margin-left:-12px;padding-left:24px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-24px;padding-left:36px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-36px;padding-left:48px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-48px;padding-left:60px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-60px;padding-left:72px}.select2-container--bootstrap .select2-results__group{color:#777;display:block;padding:6px 12px;font-size:12px;line-height:1.42857143;white-space:nowrap}.select2-container--bootstrap.select2-container--focus .select2-selection,.select2-container--bootstrap.select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;border-color:#66afe9}.select2-container--bootstrap.select2-container--open .select2-selection .select2-selection__arrow b{border-color:transparent transparent #999;border-width:0 4px 4px}.select2-container--bootstrap.select2-container--open.select2-container--below .select2-selection{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom-color:transparent}.select2-container--bootstrap.select2-container--open.select2-container--above .select2-selection{border-top-right-radius:0;border-top-left-radius:0;border-top-color:transparent}.select2-container--bootstrap .select2-selection__clear{color:#999;cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--bootstrap .select2-selection__clear:hover{color:#333}.select2-container--bootstrap.select2-container--disabled .select2-selection{border-color:#ccc;-webkit-box-shadow:none;box-shadow:none}.select2-container--bootstrap.select2-container--disabled .select2-search__field,.select2-container--bootstrap.select2-container--disabled .select2-selection{cursor:not-allowed}.select2-container--bootstrap.select2-container--disabled .select2-selection,.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice{background-color:#eee}.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove,.select2-container--bootstrap.select2-container--disabled .select2-selection__clear{display:none}.select2-container--bootstrap .select2-dropdown{-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);border-color:#66afe9;overflow-x:hidden;margin-top:-1px}.select2-container--bootstrap .select2-dropdown--above{-webkit-box-shadow:0 -6px 12px rgba(0,0,0,.175);box-shadow:0 -6px 12px rgba(0,0,0,.175);margin-top:1px}.select2-container--bootstrap .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--bootstrap .select2-selection--single{height:34px;line-height:1.42857143;padding:6px 24px 6px 12px}.select2-container--bootstrap .select2-selection--single .select2-selection__arrow{position:absolute;bottom:0;right:12px;top:0;width:4px}.select2-container--bootstrap .select2-selection--single .select2-selection__arrow b{border-color:#999 transparent transparent;border-style:solid;border-width:4px 4px 0;height:0;left:0;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--bootstrap .select2-selection--single .select2-selection__rendered{color:#555;padding:0}.select2-container--bootstrap .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--bootstrap .select2-selection--multiple{min-height:34px;padding:0;height:auto}.select2-container--bootstrap .select2-selection--multiple .select2-selection__rendered{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;line-height:1.42857143;list-style:none;margin:0;overflow:hidden;padding:0;width:100%;text-overflow:ellipsis;white-space:nowrap}.select2-container--bootstrap .select2-selection--multiple .select2-selection__placeholder{color:#999;float:left;margin-top:5px}.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice{color:#555;background:#fff;border:1px solid #ccc;border-radius:4px;cursor:default;float:left;margin:5px 0 0 6px;padding:0 6px}.select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field{background:0 0;padding:0 12px;height:32px;line-height:1.42857143;margin-top:0;min-width:5em}.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:3px}.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--bootstrap .select2-selection--multiple .select2-selection__clear{margin-top:6px}.form-group-sm .select2-container--bootstrap .select2-selection--single,.input-group-sm .select2-container--bootstrap .select2-selection--single,.select2-container--bootstrap .select2-selection--single.input-sm{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 22px 5px 10px}.form-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.input-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.select2-container--bootstrap .select2-selection--single.input-sm .select2-selection__arrow b{margin-left:-5px}.form-group-sm .select2-container--bootstrap .select2-selection--multiple,.input-group-sm .select2-container--bootstrap .select2-selection--multiple,.select2-container--bootstrap .select2-selection--multiple.input-sm{min-height:30px;border-radius:3px}.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__choice{font-size:12px;line-height:1.5;margin:4px 0 0 5px;padding:0 5px}.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field{padding:0 10px;font-size:12px;height:28px;line-height:1.5}.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__clear{margin-top:5px}.form-group-lg .select2-container--bootstrap .select2-selection--single,.input-group-lg .select2-container--bootstrap .select2-selection--single,.select2-container--bootstrap .select2-selection--single.input-lg{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 31px 10px 16px}.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow,.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow,.select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow{width:5px}.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow b{border-width:5px 5px 0;margin-left:-10px;margin-top:-2.5px}.form-group-lg .select2-container--bootstrap .select2-selection--multiple,.input-group-lg .select2-container--bootstrap .select2-selection--multiple,.select2-container--bootstrap .select2-selection--multiple.input-lg{min-height:46px;border-radius:6px}.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__choice{font-size:18px;line-height:1.3333333;border-radius:4px;margin:9px 0 0 8px;padding:0 10px}.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field{padding:0 16px;font-size:18px;height:44px;line-height:1.3333333}.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__clear{margin-top:10px}.input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b,.select2-container--bootstrap .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #999;border-width:0 5px 5px}.select2-container--bootstrap[dir=rtl] .select2-selection--single{padding-left:24px;padding-right:12px}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:0;padding-left:0;text-align:right}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__arrow{left:12px;right:auto}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__arrow b{margin-left:0}.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:0;margin-right:6px}.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.has-warning .select2-dropdown,.has-warning .select2-selection{border-color:#8a6d3b}.has-warning .select2-container--focus .select2-selection,.has-warning .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;border-color:#66512c}.has-warning.select2-drop-active{border-color:#66512c}.has-warning.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#66512c}.has-error .select2-dropdown,.has-error .select2-selection{border-color:#a94442}.has-error .select2-container--focus .select2-selection,.has-error .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;border-color:#843534}.has-error.select2-drop-active{border-color:#843534}.has-error.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#843534}.has-success .select2-dropdown,.has-success .select2-selection{border-color:#3c763d}.has-success .select2-container--focus .select2-selection,.has-success .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;border-color:#2b542c}.has-success.select2-drop-active{border-color:#2b542c}.has-success.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#2b542c}.input-group .select2-container--bootstrap{display:table;table-layout:fixed;position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .select2-container--bootstrap.select2-container--focus,.input-group .select2-container--bootstrap.select2-container--open{z-index:3}.input-group.select2-bootstrap-prepend .select2-container--bootstrap .select2-selection{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.select2-bootstrap-append .select2-container--bootstrap .select2-selection{border-bottom-right-radius:0;border-top-right-radius:0}.select2-bootstrap-append .input-group-btn,.select2-bootstrap-append .input-group-btn .btn,.select2-bootstrap-append .select2-container--bootstrap,.select2-bootstrap-prepend .input-group-btn,.select2-bootstrap-prepend .input-group-btn .btn,.select2-bootstrap-prepend .select2-container--bootstrap{vertical-align:top}.form-control.select2-hidden-accessible{position:absolute!important;width:1px!important}.form-inline .select2-container--bootstrap{display:inline-block}
\ No newline at end of file
diff --git a/static/css/main.css b/static/css/main.css
index 2962bdda..61dc0808 100644
--- a/static/css/main.css
+++ b/static/css/main.css
@@ -1,3 +1,7 @@
+.swal2-popup {
+ font-size: 1.6rem !important;
+ }
+
.nav-tabs {
cursor: pointer;
}
@@ -702,6 +706,10 @@ table.dataTable {
background-color: #37485a;
}
+.nav-badge {
+ margin-top: 5px;
+}
+
#resultsMapContainer {
display: none;
}
diff --git a/static/css/sweetalert2.min.css b/static/css/sweetalert2.min.css
index 9b6e2c1a..fdded9a3 100644
--- a/static/css/sweetalert2.min.css
+++ b/static/css/sweetalert2.min.css
@@ -1 +1 @@
-.swal2-modal,.swal2-overlay{position:fixed;display:none}.swal2-overlay{background-color:rgba(0,0,0,.4);left:0;right:0;top:0;bottom:0;z-index:1500}.swal2-modal{background-color:#fff;font-family:"Source Sans Pro", Helvetica, Arial, sans-serif,Helvetica,Arial,sans-serif;border-radius:5px;box-sizing:border-box;text-align:center;left:50%;top:50%;margin-top:-200px;max-height:90%;overflow-x:hidden;overflow-y:auto;z-index:2000}.swal2-modal:focus{outline:0}.swal2-modal.loading{overflow-y:hidden}.swal2-modal h2{color:#575757;font-size:30px;text-align:center;font-weight:600;text-transform:none;position:relative;margin:0;padding:0;line-height:60px;display:block}.swal2-modal hr{height:10px;color:transparent;border:0}.swal2-modal button.styled{color:#fff;border:0;box-shadow:none;font-size:17px;font-weight:500;border-radius:5px;padding:10px 32px;margin:0 5px;cursor:pointer}.swal2-content,.swal2-icon{padding:0;position:relative}.swal2-modal button.styled:focus{outline:0}.swal2-modal button.styled:not(.loading)[disabled]{opacity:.4;cursor:no-drop}.swal2-modal button.styled.loading{box-sizing:border-box;border:4px solid transparent;width:40px;height:40px;padding:0;margin:-2px 30px;vertical-align:top;background-color:transparent!important;color:transparent;cursor:default;border-radius:100%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-modal button.styled::-moz-focus-inner{border:0}.swal2-modal button:not(.styled).loading:after{display:inline-block;content:"";margin-left:5px;vertical-align:-1px;height:6px;width:6px;border:3px solid #999;border-right-color:transparent;border-radius:50%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-checkbox input,.swal2-checkbox span,.swal2-radio input,.swal2-radio span{vertical-align:middle}.swal2-modal .swal2-image{margin:20px auto;max-width:100%}.swal2-modal .swal2-close{font-size:36px;line-height:36px;font-family:serif;position:absolute;top:5px;right:13px;cursor:pointer;color:#cfcfcf;-webkit-transition:all .1s ease;transition:all .1s ease}.swal2-modal .swal2-close:hover{color:#d55}.swal2-modal>.swal2-checkbox,.swal2-modal>.swal2-input,.swal2-modal>.swal2-radio,.swal2-modal>.swal2-select,.swal2-modal>.swal2-textarea{display:none}.swal2-content{font-size:18px;text-align:center;font-weight:400;float:none;margin:0;line-height:normal;color:#555}.swal2-icon.swal2-info,.swal2-icon.swal2-question,.swal2-icon.swal2-warning{font-size:60px;line-height:80px;text-align:center}.swal2-icon{width:80px;height:80px;border:4px solid grey;border-radius:50%;margin:20px auto 30px;box-sizing:content-box;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .x-mark{position:relative;display:block}.swal2-icon.swal2-error .line{position:absolute;height:5px;width:47px;background-color:#f27474;display:block;top:37px;border-radius:2px}.swal2-icon.swal2-error .line.left{-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px}.swal2-icon.swal2-error .line.right{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}.swal2-icon.swal2-warning{font-family:"Source Sans Pro", Helvetica, Arial, sans-serif,Helvetica,Arial,sans-serif;color:#f8bb86;border-color:#f8bb86}.swal2-icon.swal2-info{font-family:"Open Sans",sans-serif;color:#3fc3ee;border-color:#3fc3ee}.swal2-icon.swal2-question{font-family:"Source Sans Pro", Helvetica, Arial, sans-serif,Helvetica,Arial,sans-serif;color:#c9dae1;border-color:#c9dae1}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success::after,.swal2-icon.swal2-success::before{content:'';position:absolute;width:60px;height:120px;background:#fff}.swal2-icon.swal2-success::before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}.swal2-icon.swal2-success::after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px}.swal2-icon.swal2-success .placeholder{width:80px;height:80px;border:4px solid rgba(165,220,134,.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.swal2-icon.swal2-success .fix{width:7px;height:90px;background-color:#fff;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-success .line{height:5px;background-color:#a5dc86;display:block;border-radius:2px;position:absolute;z-index:2}.swal2-icon.swal2-success .line.tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success .line.long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-checkbox,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:20px auto}.swal2-input:not([type=file]),.swal2-textarea{width:100%;box-sizing:border-box;border-radius:3px;border:1px solid #d7d7d7;font-size:18px;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);-webkit-transition:all .3s;transition:all .3s}.swal2-input:not([type=file]).error,.swal2-textarea.error{border-color:#f06e57!important}.swal2-input:not([type=file]):focus,.swal2-textarea:focus{outline:0;box-shadow:0 0 3px #c4e6f5;border:1px solid #b4dbed}.swal2-input:not([type=file]):focus::-moz-placeholder,.swal2-textarea:focus::-moz-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus:-ms-input-placeholder,.swal2-textarea:focus:-ms-input-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus::-webkit-input-placeholder,.swal2-textarea:focus::-webkit-input-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file])::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#bdbdbd}.swal2-input:not([type=file]):-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file])::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file]){height:43px;padding:0 12px}.swal2-input[type=file]{font-size:20px}.swal2-textarea{height:108px;padding:12px}.swal2-select{color:#555;font-size:inherit;padding:5px 10px;min-width:40%;max-width:100%}.swal2-radio{border:0}.swal2-radio label:not(:first-child){margin-left:20px}.swal2-radio input{margin:0 3px 0 0}.swal2-checkbox{color:#555}.swal2-validationerror{background-color:#f1f1f1;margin:0 -20px;overflow:hidden;padding:10px;color:#797979;font-size:16px;font-weight:400;display:none}.swal2-validationerror::before{content:"!";display:inline-block;width:24px;height:24px;border-radius:50%;background-color:#ea7d7d;color:#fff;line-height:24px;text-align:center;margin-right:10px}@-webkit-keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}.show-swal2{-webkit-animation:showSweetAlert .3s;animation:showSweetAlert .3s}.show-swal2.no-animation{-webkit-animation:none;animation:none}.hide-swal2{-webkit-animation:hideSweetAlert .15s;animation:hideSweetAlert .15s}.hide-swal2.no-animation{-webkit-animation:none;animation:none}@-webkit-keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@-webkit-keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@-webkit-keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}.animate-success-tip{-webkit-animation:animate-success-tip .75s;animation:animate-success-tip .75s}.animate-success-long{-webkit-animation:animate-success-long .75s;animation:animate-success-long .75s}.swal2-icon.swal2-success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}@-webkit-keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}@keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}.animate-error-icon{-webkit-animation:animate-error-icon .5s;animation:animate-error-icon .5s}@-webkit-keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}@keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}.animate-x-mark{-webkit-animation:animate-x-mark .5s;animation:animate-x-mark .5s}@-webkit-keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}@keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}.pulse-warning{-webkit-animation:pulse-warning .75s infinite alternate;animation:pulse-warning .75s infinite alternate}@-webkit-keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}
+@charset "UTF-8";@-webkit-keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}body.swal2-toast-shown .swal2-container{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-shown{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}body.swal2-toast-column .swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-column .swal2-toast .swal2-actions{flex:1;align-self:stretch;height:2.2em;margin-top:.3125em}body.swal2-toast-column .swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-column .swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-column .swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;overflow-y:hidden;box-shadow:0 0 .625em #d9d9d9}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:static;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon::before{display:flex;align-items:center;font-size:2em;font-weight:700}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-popup.swal2-toast .swal2-icon::before{font-size:.25em}}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{flex-basis:auto!important;width:auto;height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .3125em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 .0625em #fff,0 0 0 .125em rgba(50,100,150,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.8em;left:-.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:swal2-toast-show .5s;animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:swal2-toast-hide .1s forwards;animation:swal2-toast-hide .1s forwards}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-toast-animate-success-line-tip .75s;animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-toast-animate-success-line-long .75s;animation:swal2-toast-animate-success-line-long .75s}@-webkit-keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@-webkit-keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-shown{top:auto;right:auto;bottom:auto;left:auto;max-width:calc(100% - .625em * 2);background-color:transparent}body.swal2-no-backdrop .swal2-shown>.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-shown.swal2-top{top:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-top-left,body.swal2-no-backdrop .swal2-shown.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-top-end,body.swal2-no-backdrop .swal2-shown.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-shown.swal2-center{top:50%;left:50%;transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-left,body.swal2-no-backdrop .swal2-shown.swal2-center-start{top:50%;left:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-end,body.swal2-no-backdrop .swal2-shown.swal2-center-right{top:50%;right:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom{bottom:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom-left,body.swal2-no-backdrop .swal2-shown.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-bottom-end,body.swal2-no-backdrop .swal2-shown.swal2-bottom-right{right:0;bottom:0}.swal2-container{display:flex;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:.625em;overflow-x:hidden;background-color:transparent;-webkit-overflow-scrolling:touch}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-bottom-end>:first-child,.swal2-container.swal2-bottom-left>:first-child,.swal2-container.swal2-bottom-right>:first-child,.swal2-container.swal2-bottom-start>:first-child,.swal2-container.swal2-bottom>:first-child{margin-top:auto}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-container.swal2-fade{transition:background-color .1s}.swal2-container.swal2-shown{background-color:rgba(0,0,0,.4)}.swal2-popup{display:none;position:relative;box-sizing:border-box;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border:none;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-title{position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-actions{display:flex;z-index:1;flex-wrap:wrap;align-items:center;justify-content:center;width:100%;margin:1.25em auto 0}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-actions.swal2-loading .swal2-styled.swal2-confirm{box-sizing:border-box;width:2.5em;height:2.5em;margin:.46875em;padding:0;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{content:"";display:inline-block;width:15px;height:15px;margin-left:5px;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff}.swal2-styled{margin:.3125em;padding:.625em 2em;box-shadow:none;font-weight:500}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-styled:focus{outline:0;box-shadow:0 0 0 2px #fff,0 0 0 4px rgba(50,100,150,.4)}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-image{max-width:100%;margin:1.25em auto}.swal2-close{position:absolute;z-index:2;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;overflow:hidden;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer}.swal2-close:hover{transform:none;background:0 0;color:#f27474}.swal2-content{z-index:1;justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:400;line-height:normal;text-align:center;word-wrap:break-word}.swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:1em auto}.swal2-file,.swal2-input,.swal2-textarea{box-sizing:border-box;width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;background:inherit;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);color:inherit;font-size:1.125em}.swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-file::-webkit-input-placeholder,.swal2-input::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#ccc}.swal2-file:-ms-input-placeholder,.swal2-input:-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-file::-ms-input-placeholder,.swal2-input::-ms-input-placeholder,.swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder{color:#ccc}.swal2-range{margin:1em auto;background:inherit}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}.swal2-input{height:2.625em;padding:0 .75em}.swal2-input[type=number]{max-width:10em}.swal2-file{background:inherit;font-size:1.125em}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:inherit;color:inherit;font-size:1.125em}.swal2-checkbox,.swal2-radio{align-items:center;justify-content:center;background:inherit;color:inherit}.swal2-checkbox label,.swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-checkbox input,.swal2-radio input{margin:0 .4em}.swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}.swal2-validation-message::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;zoom:normal;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;zoom:normal;border:.25em solid transparent;border-radius:50%;font-family:inherit;line-height:5em;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon::before{display:flex;align-items:center;height:92%;font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-warning::before{content:"!"}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-info::before{content:"i"}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-question::before{content:"?"}.swal2-icon.swal2-question.swal2-arabic-question-mark::before{content:"؟"}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-.25em;left:-.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-progress-steps{align-items:center;margin:0 0 1.25em;padding:0;background:inherit;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#3085d6}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;width:2.5em;height:.4em;margin:0 -1px;background:#3085d6}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-show.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-hide.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-animate-success-icon .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-animate-error-icon{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-animate-error-icon .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}@-webkit-keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static!important}}
\ No newline at end of file
diff --git a/static/js/dist/app/autocomplete.min.js b/static/js/dist/app/autocomplete.min.js
index 09a85ec5..0f6c41b4 100644
--- a/static/js/dist/app/autocomplete.min.js
+++ b/static/js/dist/app/autocomplete.min.js
@@ -1 +1 @@
-var TEMPLATE_TAGS=[{id:1,name:"RId",description:"The unique ID for the recipient."},{id:2,name:"FirstName",description:"The recipient's first name."},{id:3,name:"LastName",description:"The recipient's last name."},{id:4,name:"Position",description:"The recipient's position."},{id:5,name:"From",description:"The address emails are sent from."},{id:6,name:"TrackingURL",description:"The URL to track emails being opened."},{id:7,name:"Tracker",description:"An HTML tag that adds a hidden tracking image (recommended instead of TrackingURL)."},{id:8,name:"URL",description:"The URL to your Gophish listener."},{id:9,name:"BaseURL",description:"The base URL with the path and rid parameter stripped. Useful for making links to static files."}],textTestCallback=function(e){return e.collapsed?CKEDITOR.plugins.textMatch.match(e,matchCallback):null},matchCallback=function(e,t){var i=/\{{2}\.?([A-z]|\})*$/,a=e.slice(0,t).match(i);return a?{start:a.index,end:t}:null},dataCallback=function(e,t){t(TEMPLATE_TAGS.filter(function(t){return 0==("{{."+t.name.toLowerCase()+"}}").indexOf(e.query.toLowerCase())}))},setupAutocomplete=function(e){e.on("instanceReady",function(e){new CKEDITOR.plugins.autocomplete(e.editor,{textTestCallback:textTestCallback,dataCallback:dataCallback,itemTemplate:'
{name}
{description}
',outputTemplate:"[[.{name}]]"}).getHtmlToInsert=function(e){var t=this.outputTemplate.output(e);return t=t.replace("[[","{{").replace("]]","}}")}})};
\ No newline at end of file
+var TEMPLATE_TAGS=[{id:1,name:"RId",description:"The unique ID for the recipient."},{id:2,name:"FirstName",description:"The recipient's first name."},{id:3,name:"LastName",description:"The recipient's last name."},{id:4,name:"Position",description:"The recipient's position."},{id:5,name:"From",description:"The address emails are sent from."},{id:6,name:"TrackingURL",description:"The URL to track emails being opened."},{id:7,name:"Tracker",description:"An HTML tag that adds a hidden tracking image (recommended instead of TrackingURL)."},{id:8,name:"URL",description:"The URL to your Gophish listener."},{id:9,name:"BaseURL",description:"The base URL with the path and rid parameter stripped. Useful for making links to static files."}],textTestCallback=function(e){return e.collapsed?CKEDITOR.plugins.textMatch.match(e,matchCallback):null},matchCallback=function(e,t){var i=e.slice(0,t).match(/\{{2}\.?([A-z]|\})*$/);return i?{start:i.index,end:t}:null},dataCallback=function(t,e){e(TEMPLATE_TAGS.filter(function(e){return 0==("{{."+e.name.toLowerCase()+"}}").indexOf(t.query.toLowerCase())}))},setupAutocomplete=function(e){e.on("instanceReady",function(e){new CKEDITOR.plugins.autocomplete(e.editor,{textTestCallback:textTestCallback,dataCallback:dataCallback,itemTemplate:'
{name}
{description}
',outputTemplate:"[[.{name}]]"}).getHtmlToInsert=function(e){var t=this.outputTemplate.output(e);return t=t.replace("[[","{{").replace("]]","}}")}})};
\ No newline at end of file
diff --git a/static/js/dist/app/campaign_results.min.js b/static/js/dist/app/campaign_results.min.js
index 8c461d9a..0ded2f01 100644
--- a/static/js/dist/app/campaign_results.min.js
+++ b/static/js/dist/app/campaign_results.min.js
@@ -1 +1 @@
-function dismiss(){$("#modal\\.flashes").empty(),$("#modal").modal("hide"),$("#resultsTable").dataTable().DataTable().clear().draw()}function deleteCampaign(){swal({title:"Are you sure?",text:"This will delete the campaign. This can't be undone!",type:"warning",animation:!1,showCancelButton:!0,confirmButtonText:"Delete Campaign",confirmButtonColor:"#428bca",reverseButtons:!0,allowOutsideClick:!1,showLoaderOnConfirm:!0,preConfirm:function(){return new Promise(function(e,t){api.campaignId.delete(campaign.id).success(function(t){e()}).error(function(e){t(e.responseJSON.message)})})}}).then(function(){swal("Campaign Deleted!","This campaign has been deleted!","success"),$('button:contains("OK")').on("click",function(){location.href="/campaigns"})})}function completeCampaign(){swal({title:"Are you sure?",text:"Gophish will stop processing events for this campaign",type:"warning",animation:!1,showCancelButton:!0,confirmButtonText:"Complete Campaign",confirmButtonColor:"#428bca",reverseButtons:!0,allowOutsideClick:!1,showLoaderOnConfirm:!0,preConfirm:function(){return new Promise(function(e,t){api.campaignId.complete(campaign.id).success(function(t){e()}).error(function(e){t(e.responseJSON.message)})})}}).then(function(){swal("Campaign Completed!","This campaign has been completed!","success"),$("#complete_button")[0].disabled=!0,$("#complete_button").text("Completed!"),doPoll=!1})}function exportAsCSV(e){exportHTML=$("#exportButton").html();var t=null,a=campaign.name+" - "+capitalize(e)+".csv";switch(e){case"results":t=campaign.results;break;case"events":t=campaign.timeline}if(t){$("#exportButton").html('');var s=Papa.unparse(t,{}),i=new Blob([s],{type:"text/csv;charset=utf-8;"});if(navigator.msSaveBlob)navigator.msSaveBlob(i,a);else{var l=window.URL.createObjectURL(i),n=document.createElement("a");n.href=l,n.setAttribute("download",a),document.body.appendChild(n),n.click(),document.body.removeChild(n)}$("#exportButton").html(exportHTML)}}function replay(e){function t(){form.attr({action:url}),form.appendTo("body").submit().remove()}request=campaign.timeline[e],details=JSON.parse(request.details),url=null,form=$("