From 4dda6697888dd9ff27ac989466dc90e34978435a Mon Sep 17 00:00:00 2001
From: Jacob Michalskie <hel@lcp.world>
Date: Nov 17 2022 12:57:44 +0000
Subject: [PATCH 1/7] Revamp with bootstrap


---

diff --git a/fedocal/fedocallib/fedora_calendar.py b/fedocal/fedocallib/fedora_calendar.py
index b523f61..7d37a66 100644
--- a/fedocal/fedocallib/fedora_calendar.py
+++ b/fedocal/fedocallib/fedora_calendar.py
@@ -63,7 +63,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
         """
         cur_date = date.today()
         if day == 0:
-            return '<td class="noday">&nbsp;</td>'  # day outside month
+            return '<td>&nbsp;</td>'  # day outside month
         else:
             link_day = day
 
@@ -83,15 +83,15 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
                     day)
 
             if day in self.busy_days:
-                link_day = '<div class="busy_day">%s</div>' % link_day
-
-            if day == cur_date.day \
+                output = '<td class="%s secondary text-right">%s</td>' % (
+                    self.cssclasses[weekday], link_day)
+            elif day == cur_date.day \
                     and self.month == cur_date.month \
                     and self.year == cur_date.year:
-                output = '<td class="%s today">%s</td>' % (
+                output = '<td class="%s primary text-right">%s</td>' % (
                     self.cssclasses[weekday], link_day)
             else:
-                output = '<td class="%s">%s</td>' % (
+                output = '<td class="%s text-right">%s</td>' % (
                     self.cssclasses[weekday], link_day)
 
             return output
@@ -106,7 +106,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
         """
         string = ''.join(self.formatday(d, wd) for (d, wd) in theweek)
         if current:
-            return '<tr class="current_week">%s</tr>' % string
+            return '<tr class="bg-light">%s</tr>' % string
         else:
             return '<tr>%s</tr>' % string
 
@@ -141,7 +141,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
 
         prev_month_lnk = ''
         if self.calendar_name:
-            prev_month_lnk = '<a class="button" href="%s">&lt;</a>' % (
+            prev_month_lnk = '<a class="btn btn-secondary" href="%s">&lt;</a>' % (
                 flask.url_for(
                     'calendar',
                     calendar_name=self.calendar_name,
@@ -149,7 +149,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
                     month=int(prev_month),
                     day=1))
         elif self.loc_name:
-            prev_month_lnk = '<a class="button" href="%s">&lt;</a>' % (
+            prev_month_lnk = '<a class="btn btn-secondary" href="%s">&lt;</a>' % (
                 flask.url_for(
                     'location',
                     loc_name=self.loc_name,
@@ -163,7 +163,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
 
         next_month_lnk = ''
         if self.calendar_name:
-            next_month_lnk = '<a class="button" href="%s">&gt;</a>' % (
+            next_month_lnk = '<a class="btn btn-secondary" href="%s">&gt;</a>' % (
                 flask.url_for(
                     'calendar',
                     calendar_name=self.calendar_name,
@@ -171,7 +171,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
                     month=int(next_month),
                     day=1))
         elif self.loc_name:
-            next_month_lnk = '<a class="button" href="%s">&gt;</a>' % (
+            next_month_lnk = '<a class="btn btn-secondary" href="%s">&gt;</a>' % (
                 flask.url_for(
                     'location',
                     loc_name=self.loc_name,
@@ -179,7 +179,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
                     month=int(next_month),
                     day=1))
 
-        return '<tr><th colspan="7" class="month">%s %s %s</th></tr>' % (
+        return '<tr><th colspan="7"><div class="d-flex align-items-center justify-content-between text-center">%s <span class="mx-auto">%s</span> %s</div></th></tr>' % (
             prev_month_lnk, string, next_month_lnk)
 
     # pylint: disable=W0221
@@ -189,7 +189,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
         """
         values = []
         item = values.append
-        item('<table class="month">')
+        item('<table class="table table-sm month">')
         item('\n')
         item(self.formatmonthname(self.year, self.month, withyear=withyear))
         item('\n')
diff --git a/fedocal/static/default/addon.css b/fedocal/static/default/addon.css
new file mode 100644
index 0000000..8a599de
--- /dev/null
+++ b/fedocal/static/default/addon.css
@@ -0,0 +1,109 @@
+@media all {
+  :root {
+    --fedocal-navbar-bg: #e9ecef;
+    --fedocal-secondary-bg: #6c757d;
+    --fedocal-border: #dee2e6;
+    --fedocal-dropdown-bg: #ffffff;
+    --fedocal-blue-hl: #3c6eb4;
+    --fedocal-blue-bg: #d7e6fa;
+    --fedocal-yellow-hl: #f6d32d;
+    --fedocal-yellow-bg: #fdf6d5;
+   }
+}
+
+.month .primary {
+  background-color: var(--fedocal-blue-hl)
+}
+
+.month .secondary {
+  background-color: var(--fedocal-secondary-bg)
+}
+
+.month .primary a, .month .secondary a {
+  color: white;
+}
+
+table.weekly {
+    border-collapse: collapse;
+    width: 100%;
+}
+
+.event_blue {
+    display: block;
+    padding:.1em .2em;
+    background-color:var(--fedocal-blue-bg);
+    border:1px solid var(--fedocal-blue-hl);
+    text-align: center;
+}
+
+td > .event_blue {
+    min-height: 2em;
+    height: 100%;
+}
+
+td .first_event {
+    border-bottom-color: var(--fedocal-blue-bg);
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+
+td .middle_event {
+    border-top-color: var(--fedocal-blue-bg);
+    border-bottom-color: var(--fedocal-blue-bg);
+}
+
+td .last_event {
+    border-top-color: var(--fedocal-blue-bg);
+    border-bottom-left-radius: 4px;
+    border-bottom-right-radius: 4px;
+}
+
+table.weekly td {
+    min-width: 100px;
+    padding: 0;
+}
+
+table.weekly tr:nth-child(even) td {
+    border-top: 1px solid var(--fedocal-border);
+}
+
+table.weekly tr:not(#full_day):nth-child(even) td:nth-child(even), table.weekly tr:nth-child(odd) td:nth-child(odd), table.weekly tr#full_day td:nth-child(odd) {
+    background-color: var(--light);
+}
+
+table.weekly tr:nth-child(even) td.today {
+    border-top-color: var(--fedocal-yellow-hl);
+}
+
+table.weekly td > .row_height,
+table.weekly th > .row_height
+{
+    min-height: 2em;
+}
+
+table.weekly td.empty {
+    background-color: transparent;
+    border: none;
+}
+
+table.weekly .time {
+    padding-right: 1em;
+    text-align: right;
+    width: 7em;
+}
+
+table.weekly tr td.today {
+    background-color: var(--fedocal-yellow-bg)!important;
+    vertical-align: middle;
+}
+
+#shortmenu {
+    position: relative
+}
+
+#shortmenu div {
+    position: fixed;
+    bottom: 20px;
+    right: 10px;
+    list-style: none;
+}
diff --git a/fedocal/static/default/bootstrap.css b/fedocal/static/default/bootstrap.css
new file mode 100644
index 0000000..eaae8f9
--- /dev/null
+++ b/fedocal/static/default/bootstrap.css
@@ -0,0 +1,7637 @@
+/*!fedora-bootstrap v1.5.0 -- https://pagure.io/fedora-bootstrap */
+/*!
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+:root {
+  --blue: #3c6eb4;
+  --indigo: #6610f2;
+  --purple: #6f42c1;
+  --pink: #e83e8c;
+  --red: #dc3545;
+  --orange: #fd7e14;
+  --yellow: #ffc107;
+  --green: #28a745;
+  --teal: #20c997;
+  --cyan: #17a2b8;
+  --white: #fff;
+  --gray: #6c757d;
+  --gray-dark: #343a40;
+  --primary: #3c6eb4;
+  --secondary: #6c757d;
+  --success: #28a745;
+  --info: #17a2b8;
+  --warning: #ffc107;
+  --danger: #dc3545;
+  --light: #f8f9fa;
+  --dark: #343a40;
+  --breakpoint-xs: 0;
+  --breakpoint-sm: 576px;
+  --breakpoint-md: 768px;
+  --breakpoint-lg: 992px;
+  --breakpoint-xl: 1200px;
+  --font-family-sans-serif: Open Sans;
+  --font-family-monospace: "Hack", monospace; }
+
+*,
+*::before,
+*::after {
+  box-sizing: border-box; }
+
+html {
+  font-family: sans-serif;
+  line-height: 1.15;
+  -webkit-text-size-adjust: 100%;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  height: 100%; }
+
+article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
+  display: block; }
+
+body {
+  margin: 0;
+  font-family: "Open Sans";
+  font-size: 0.875rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #373a3c;
+  text-align: left;
+  background-color: #fff;
+  min-height: 100%; }
+
+[tabindex="-1"]:focus {
+  outline: 0 !important; }
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible; }
+
+h1, h2, h3, h4, h5, h6 {
+  margin-top: 0;
+  margin-bottom: 0.5rem; }
+
+p {
+  margin-top: 0;
+  margin-bottom: 1rem; }
+
+abbr[title],
+abbr[data-original-title] {
+  text-decoration: underline;
+  text-decoration: underline dotted;
+  cursor: help;
+  border-bottom: 0;
+  text-decoration-skip-ink: none; }
+
+address {
+  margin-bottom: 1rem;
+  font-style: normal;
+  line-height: inherit; }
+
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1rem; }
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0; }
+
+dt {
+  font-weight: 700; }
+
+dd {
+  margin-bottom: .5rem;
+  margin-left: 0; }
+
+blockquote {
+  margin: 0 0 1rem; }
+
+b,
+strong {
+  font-weight: bolder; }
+
+small {
+  font-size: 80%; }
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline; }
+
+sub {
+  bottom: -.25em; }
+
+sup {
+  top: -.5em; }
+
+a {
+  color: #3c6eb4;
+  text-decoration: none;
+  background-color: transparent; }
+  a:hover {
+    color: #294b7b;
+    text-decoration: underline; }
+
+a:not([href]):not([tabindex]) {
+  color: inherit;
+  text-decoration: none; }
+  a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
+    color: inherit;
+    text-decoration: none; }
+  a:not([href]):not([tabindex]):focus {
+    outline: 0; }
+
+pre,
+code,
+kbd,
+samp {
+  font-family: "Hack", monospace;
+  font-size: 1em; }
+
+pre {
+  margin-top: 0;
+  margin-bottom: 1rem;
+  overflow: auto; }
+
+figure {
+  margin: 0 0 1rem; }
+
+img {
+  vertical-align: middle;
+  border-style: none; }
+
+svg {
+  overflow: hidden;
+  vertical-align: middle; }
+
+table {
+  border-collapse: collapse; }
+
+caption {
+  padding-top: 0.75rem;
+  padding-bottom: 0.75rem;
+  color: #6c757d;
+  text-align: left;
+  caption-side: bottom; }
+
+th {
+  text-align: inherit; }
+
+label {
+  display: inline-block;
+  margin-bottom: 0.5rem; }
+
+button {
+  border-radius: 0; }
+
+button:focus {
+  outline: 1px dotted;
+  outline: 5px auto -webkit-focus-ring-color; }
+
+input,
+button,
+select,
+optgroup,
+textarea {
+  margin: 0;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit; }
+
+button,
+input {
+  overflow: visible; }
+
+button,
+select {
+  text-transform: none; }
+
+select {
+  word-wrap: normal; }
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button; }
+
+button:not(:disabled),
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
+[type="submit"]:not(:disabled) {
+  cursor: pointer; }
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  padding: 0;
+  border-style: none; }
+
+input[type="radio"],
+input[type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0; }
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+  -webkit-appearance: listbox; }
+
+textarea {
+  overflow: auto;
+  resize: vertical; }
+
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0; }
+
+legend {
+  display: block;
+  width: 100%;
+  max-width: 100%;
+  padding: 0;
+  margin-bottom: .5rem;
+  font-size: 1.5rem;
+  line-height: inherit;
+  color: inherit;
+  white-space: normal; }
+
+progress {
+  vertical-align: baseline; }
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto; }
+
+[type="search"] {
+  outline-offset: -2px;
+  -webkit-appearance: none; }
+
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none; }
+
+::-webkit-file-upload-button {
+  font: inherit;
+  -webkit-appearance: button; }
+
+output {
+  display: inline-block; }
+
+summary {
+  display: list-item;
+  cursor: pointer; }
+
+template {
+  display: none; }
+
+[hidden] {
+  display: none !important; }
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+  margin-bottom: 0.5rem;
+  font-weight: 500;
+  line-height: 1.1; }
+
+h1, .h1 {
+  font-size: 1.75rem; }
+
+h2, .h2 {
+  font-size: 1.53125rem; }
+
+h3, .h3 {
+  font-size: 1.3125rem; }
+
+h4, .h4 {
+  font-size: 1.09375rem; }
+
+h5, .h5 {
+  font-size: 0.875rem; }
+
+h6, .h6 {
+  font-size: 0.875rem; }
+
+.lead {
+  font-size: 1.09375rem;
+  font-weight: 300; }
+
+.display-1 {
+  font-size: 6rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+.display-2 {
+  font-size: 5.5rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+.display-3 {
+  font-size: 4.5rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+.display-4 {
+  font-size: 3.5rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+hr {
+  margin-top: 1rem;
+  margin-bottom: 1rem;
+  border: 0;
+  border-top: 1px solid rgba(0, 0, 0, 0.1); }
+
+small,
+.small {
+  font-size: 80%;
+  font-weight: 400; }
+
+mark,
+.mark {
+  padding: 0.2em;
+  background-color: #fcf8e3; }
+
+.list-unstyled {
+  padding-left: 0;
+  list-style: none; }
+
+.list-inline {
+  padding-left: 0;
+  list-style: none; }
+
+.list-inline-item {
+  display: inline-block; }
+  .list-inline-item:not(:last-child) {
+    margin-right: 0.5rem; }
+
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase; }
+
+.blockquote {
+  margin-bottom: 1rem;
+  font-size: 1.09375rem; }
+
+.blockquote-footer {
+  display: block;
+  font-size: 80%;
+  color: #6c757d; }
+  .blockquote-footer::before {
+    content: "\2014\00A0"; }
+
+.img-fluid {
+  max-width: 100%;
+  height: auto; }
+
+.img-thumbnail {
+  padding: 0.25rem;
+  background-color: #fff;
+  border: 1px solid #dee2e6;
+  border-radius: 0.25rem;
+  max-width: 100%;
+  height: auto; }
+
+.figure {
+  display: inline-block; }
+
+.figure-img {
+  margin-bottom: 0.5rem;
+  line-height: 1; }
+
+.figure-caption {
+  font-size: 90%;
+  color: #6c757d; }
+
+code {
+  font-size: 87.5%;
+  color: #e83e8c;
+  word-break: break-word; }
+  a > code {
+    color: inherit; }
+
+kbd {
+  padding: 0.2rem 0.4rem;
+  font-size: 87.5%;
+  color: #fff;
+  background-color: #212529;
+  border-radius: 0.2rem; }
+  kbd kbd {
+    padding: 0;
+    font-size: 100%;
+    font-weight: 700; }
+
+pre {
+  display: block;
+  font-size: 87.5%;
+  color: #586e75; }
+  pre code {
+    font-size: inherit;
+    color: inherit;
+    word-break: normal; }
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll; }
+
+.container {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto; }
+  @media (min-width: 576px) {
+    .container {
+      max-width: 540px; } }
+  @media (min-width: 768px) {
+    .container {
+      max-width: 720px; } }
+  @media (min-width: 992px) {
+    .container {
+      max-width: 960px; } }
+  @media (min-width: 1200px) {
+    .container {
+      max-width: 1140px; } }
+
+.container-fluid {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto; }
+
+.row {
+  display: flex;
+  flex-wrap: wrap;
+  margin-right: -15px;
+  margin-left: -15px; }
+
+.no-gutters {
+  margin-right: 0;
+  margin-left: 0; }
+  .no-gutters > .col,
+  .no-gutters > [class*="col-"] {
+    padding-right: 0;
+    padding-left: 0; }
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto {
+  position: relative;
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px; }
+
+.col {
+  flex-basis: 0;
+  flex-grow: 1;
+  max-width: 100%; }
+
+.col-auto {
+  flex: 0 0 auto;
+  width: auto;
+  max-width: 100%; }
+
+.col-1 {
+  flex: 0 0 8.33333%;
+  max-width: 8.33333%; }
+
+.col-2 {
+  flex: 0 0 16.66667%;
+  max-width: 16.66667%; }
+
+.col-3 {
+  flex: 0 0 25%;
+  max-width: 25%; }
+
+.col-4 {
+  flex: 0 0 33.33333%;
+  max-width: 33.33333%; }
+
+.col-5 {
+  flex: 0 0 41.66667%;
+  max-width: 41.66667%; }
+
+.col-6 {
+  flex: 0 0 50%;
+  max-width: 50%; }
+
+.col-7 {
+  flex: 0 0 58.33333%;
+  max-width: 58.33333%; }
+
+.col-8 {
+  flex: 0 0 66.66667%;
+  max-width: 66.66667%; }
+
+.col-9 {
+  flex: 0 0 75%;
+  max-width: 75%; }
+
+.col-10 {
+  flex: 0 0 83.33333%;
+  max-width: 83.33333%; }
+
+.col-11 {
+  flex: 0 0 91.66667%;
+  max-width: 91.66667%; }
+
+.col-12 {
+  flex: 0 0 100%;
+  max-width: 100%; }
+
+.order-first {
+  order: -1; }
+
+.order-last {
+  order: 13; }
+
+.order-0 {
+  order: 0; }
+
+.order-1 {
+  order: 1; }
+
+.order-2 {
+  order: 2; }
+
+.order-3 {
+  order: 3; }
+
+.order-4 {
+  order: 4; }
+
+.order-5 {
+  order: 5; }
+
+.order-6 {
+  order: 6; }
+
+.order-7 {
+  order: 7; }
+
+.order-8 {
+  order: 8; }
+
+.order-9 {
+  order: 9; }
+
+.order-10 {
+  order: 10; }
+
+.order-11 {
+  order: 11; }
+
+.order-12 {
+  order: 12; }
+
+.offset-1 {
+  margin-left: 8.33333%; }
+
+.offset-2 {
+  margin-left: 16.66667%; }
+
+.offset-3 {
+  margin-left: 25%; }
+
+.offset-4 {
+  margin-left: 33.33333%; }
+
+.offset-5 {
+  margin-left: 41.66667%; }
+
+.offset-6 {
+  margin-left: 50%; }
+
+.offset-7 {
+  margin-left: 58.33333%; }
+
+.offset-8 {
+  margin-left: 66.66667%; }
+
+.offset-9 {
+  margin-left: 75%; }
+
+.offset-10 {
+  margin-left: 83.33333%; }
+
+.offset-11 {
+  margin-left: 91.66667%; }
+
+@media (min-width: 576px) {
+  .col-sm {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-sm-auto {
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%; }
+  .col-sm-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-sm-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-sm-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-sm-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-sm-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-sm-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-sm-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-sm-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-sm-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-sm-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-sm-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-sm-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .order-sm-first {
+    order: -1; }
+  .order-sm-last {
+    order: 13; }
+  .order-sm-0 {
+    order: 0; }
+  .order-sm-1 {
+    order: 1; }
+  .order-sm-2 {
+    order: 2; }
+  .order-sm-3 {
+    order: 3; }
+  .order-sm-4 {
+    order: 4; }
+  .order-sm-5 {
+    order: 5; }
+  .order-sm-6 {
+    order: 6; }
+  .order-sm-7 {
+    order: 7; }
+  .order-sm-8 {
+    order: 8; }
+  .order-sm-9 {
+    order: 9; }
+  .order-sm-10 {
+    order: 10; }
+  .order-sm-11 {
+    order: 11; }
+  .order-sm-12 {
+    order: 12; }
+  .offset-sm-0 {
+    margin-left: 0; }
+  .offset-sm-1 {
+    margin-left: 8.33333%; }
+  .offset-sm-2 {
+    margin-left: 16.66667%; }
+  .offset-sm-3 {
+    margin-left: 25%; }
+  .offset-sm-4 {
+    margin-left: 33.33333%; }
+  .offset-sm-5 {
+    margin-left: 41.66667%; }
+  .offset-sm-6 {
+    margin-left: 50%; }
+  .offset-sm-7 {
+    margin-left: 58.33333%; }
+  .offset-sm-8 {
+    margin-left: 66.66667%; }
+  .offset-sm-9 {
+    margin-left: 75%; }
+  .offset-sm-10 {
+    margin-left: 83.33333%; }
+  .offset-sm-11 {
+    margin-left: 91.66667%; } }
+
+@media (min-width: 768px) {
+  .col-md {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-md-auto {
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%; }
+  .col-md-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-md-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-md-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-md-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-md-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-md-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-md-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-md-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-md-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-md-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-md-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-md-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .order-md-first {
+    order: -1; }
+  .order-md-last {
+    order: 13; }
+  .order-md-0 {
+    order: 0; }
+  .order-md-1 {
+    order: 1; }
+  .order-md-2 {
+    order: 2; }
+  .order-md-3 {
+    order: 3; }
+  .order-md-4 {
+    order: 4; }
+  .order-md-5 {
+    order: 5; }
+  .order-md-6 {
+    order: 6; }
+  .order-md-7 {
+    order: 7; }
+  .order-md-8 {
+    order: 8; }
+  .order-md-9 {
+    order: 9; }
+  .order-md-10 {
+    order: 10; }
+  .order-md-11 {
+    order: 11; }
+  .order-md-12 {
+    order: 12; }
+  .offset-md-0 {
+    margin-left: 0; }
+  .offset-md-1 {
+    margin-left: 8.33333%; }
+  .offset-md-2 {
+    margin-left: 16.66667%; }
+  .offset-md-3 {
+    margin-left: 25%; }
+  .offset-md-4 {
+    margin-left: 33.33333%; }
+  .offset-md-5 {
+    margin-left: 41.66667%; }
+  .offset-md-6 {
+    margin-left: 50%; }
+  .offset-md-7 {
+    margin-left: 58.33333%; }
+  .offset-md-8 {
+    margin-left: 66.66667%; }
+  .offset-md-9 {
+    margin-left: 75%; }
+  .offset-md-10 {
+    margin-left: 83.33333%; }
+  .offset-md-11 {
+    margin-left: 91.66667%; } }
+
+@media (min-width: 992px) {
+  .col-lg {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-lg-auto {
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%; }
+  .col-lg-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-lg-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-lg-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-lg-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-lg-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-lg-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-lg-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-lg-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-lg-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-lg-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-lg-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-lg-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .order-lg-first {
+    order: -1; }
+  .order-lg-last {
+    order: 13; }
+  .order-lg-0 {
+    order: 0; }
+  .order-lg-1 {
+    order: 1; }
+  .order-lg-2 {
+    order: 2; }
+  .order-lg-3 {
+    order: 3; }
+  .order-lg-4 {
+    order: 4; }
+  .order-lg-5 {
+    order: 5; }
+  .order-lg-6 {
+    order: 6; }
+  .order-lg-7 {
+    order: 7; }
+  .order-lg-8 {
+    order: 8; }
+  .order-lg-9 {
+    order: 9; }
+  .order-lg-10 {
+    order: 10; }
+  .order-lg-11 {
+    order: 11; }
+  .order-lg-12 {
+    order: 12; }
+  .offset-lg-0 {
+    margin-left: 0; }
+  .offset-lg-1 {
+    margin-left: 8.33333%; }
+  .offset-lg-2 {
+    margin-left: 16.66667%; }
+  .offset-lg-3 {
+    margin-left: 25%; }
+  .offset-lg-4 {
+    margin-left: 33.33333%; }
+  .offset-lg-5 {
+    margin-left: 41.66667%; }
+  .offset-lg-6 {
+    margin-left: 50%; }
+  .offset-lg-7 {
+    margin-left: 58.33333%; }
+  .offset-lg-8 {
+    margin-left: 66.66667%; }
+  .offset-lg-9 {
+    margin-left: 75%; }
+  .offset-lg-10 {
+    margin-left: 83.33333%; }
+  .offset-lg-11 {
+    margin-left: 91.66667%; } }
+
+@media (min-width: 1200px) {
+  .col-xl {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-xl-auto {
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%; }
+  .col-xl-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-xl-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-xl-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-xl-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-xl-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-xl-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-xl-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-xl-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-xl-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-xl-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-xl-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-xl-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .order-xl-first {
+    order: -1; }
+  .order-xl-last {
+    order: 13; }
+  .order-xl-0 {
+    order: 0; }
+  .order-xl-1 {
+    order: 1; }
+  .order-xl-2 {
+    order: 2; }
+  .order-xl-3 {
+    order: 3; }
+  .order-xl-4 {
+    order: 4; }
+  .order-xl-5 {
+    order: 5; }
+  .order-xl-6 {
+    order: 6; }
+  .order-xl-7 {
+    order: 7; }
+  .order-xl-8 {
+    order: 8; }
+  .order-xl-9 {
+    order: 9; }
+  .order-xl-10 {
+    order: 10; }
+  .order-xl-11 {
+    order: 11; }
+  .order-xl-12 {
+    order: 12; }
+  .offset-xl-0 {
+    margin-left: 0; }
+  .offset-xl-1 {
+    margin-left: 8.33333%; }
+  .offset-xl-2 {
+    margin-left: 16.66667%; }
+  .offset-xl-3 {
+    margin-left: 25%; }
+  .offset-xl-4 {
+    margin-left: 33.33333%; }
+  .offset-xl-5 {
+    margin-left: 41.66667%; }
+  .offset-xl-6 {
+    margin-left: 50%; }
+  .offset-xl-7 {
+    margin-left: 58.33333%; }
+  .offset-xl-8 {
+    margin-left: 66.66667%; }
+  .offset-xl-9 {
+    margin-left: 75%; }
+  .offset-xl-10 {
+    margin-left: 83.33333%; }
+  .offset-xl-11 {
+    margin-left: 91.66667%; } }
+
+.table {
+  width: 100%;
+  margin-bottom: 1rem;
+  color: #373a3c; }
+  .table th,
+  .table td {
+    padding: 0.75rem;
+    vertical-align: top;
+    border-top: 1px solid #dee2e6; }
+  .table thead th {
+    vertical-align: bottom;
+    border-bottom: 2px solid #dee2e6; }
+  .table tbody + tbody {
+    border-top: 2px solid #dee2e6; }
+
+.table-sm th,
+.table-sm td {
+  padding: 0.3rem; }
+
+.table-bordered {
+  border: 1px solid #dee2e6; }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #dee2e6; }
+  .table-bordered thead th,
+  .table-bordered thead td {
+    border-bottom-width: 2px; }
+
+.table-borderless th,
+.table-borderless td,
+.table-borderless thead th,
+.table-borderless tbody + tbody {
+  border: 0; }
+
+.table-striped tbody tr:nth-of-type(odd) {
+  background-color: rgba(0, 0, 0, 0.05); }
+
+.table-hover tbody tr:hover {
+  color: #373a3c;
+  background-color: rgba(0, 0, 0, 0.075); }
+
+.table-primary,
+.table-primary > th,
+.table-primary > td {
+  background-color: #c8d6ea; }
+
+.table-primary th,
+.table-primary td,
+.table-primary thead th,
+.table-primary tbody + tbody {
+  border-color: #9ab4d8; }
+
+.table-hover .table-primary:hover {
+  background-color: #b6c8e3; }
+  .table-hover .table-primary:hover > td,
+  .table-hover .table-primary:hover > th {
+    background-color: #b6c8e3; }
+
+.table-secondary,
+.table-secondary > th,
+.table-secondary > td {
+  background-color: #d6d8db; }
+
+.table-secondary th,
+.table-secondary td,
+.table-secondary thead th,
+.table-secondary tbody + tbody {
+  border-color: #b3b7bb; }
+
+.table-hover .table-secondary:hover {
+  background-color: #c8cbcf; }
+  .table-hover .table-secondary:hover > td,
+  .table-hover .table-secondary:hover > th {
+    background-color: #c8cbcf; }
+
+.table-success,
+.table-success > th,
+.table-success > td {
+  background-color: #c3e6cb; }
+
+.table-success th,
+.table-success td,
+.table-success thead th,
+.table-success tbody + tbody {
+  border-color: #8fd19e; }
+
+.table-hover .table-success:hover {
+  background-color: #b1dfbb; }
+  .table-hover .table-success:hover > td,
+  .table-hover .table-success:hover > th {
+    background-color: #b1dfbb; }
+
+.table-info,
+.table-info > th,
+.table-info > td {
+  background-color: #bee5eb; }
+
+.table-info th,
+.table-info td,
+.table-info thead th,
+.table-info tbody + tbody {
+  border-color: #86cfda; }
+
+.table-hover .table-info:hover {
+  background-color: #abdde5; }
+  .table-hover .table-info:hover > td,
+  .table-hover .table-info:hover > th {
+    background-color: #abdde5; }
+
+.table-warning,
+.table-warning > th,
+.table-warning > td {
+  background-color: #ffeeba; }
+
+.table-warning th,
+.table-warning td,
+.table-warning thead th,
+.table-warning tbody + tbody {
+  border-color: #ffdf7e; }
+
+.table-hover .table-warning:hover {
+  background-color: #ffe8a1; }
+  .table-hover .table-warning:hover > td,
+  .table-hover .table-warning:hover > th {
+    background-color: #ffe8a1; }
+
+.table-danger,
+.table-danger > th,
+.table-danger > td {
+  background-color: #f5c6cb; }
+
+.table-danger th,
+.table-danger td,
+.table-danger thead th,
+.table-danger tbody + tbody {
+  border-color: #ed969e; }
+
+.table-hover .table-danger:hover {
+  background-color: #f1b0b7; }
+  .table-hover .table-danger:hover > td,
+  .table-hover .table-danger:hover > th {
+    background-color: #f1b0b7; }
+
+.table-light,
+.table-light > th,
+.table-light > td {
+  background-color: #fdfdfe; }
+
+.table-light th,
+.table-light td,
+.table-light thead th,
+.table-light tbody + tbody {
+  border-color: #fbfcfc; }
+
+.table-hover .table-light:hover {
+  background-color: #ececf6; }
+  .table-hover .table-light:hover > td,
+  .table-hover .table-light:hover > th {
+    background-color: #ececf6; }
+
+.table-dark,
+.table-dark > th,
+.table-dark > td {
+  background-color: #c6c8ca; }
+
+.table-dark th,
+.table-dark td,
+.table-dark thead th,
+.table-dark tbody + tbody {
+  border-color: #95999c; }
+
+.table-hover .table-dark:hover {
+  background-color: #b9bbbe; }
+  .table-hover .table-dark:hover > td,
+  .table-hover .table-dark:hover > th {
+    background-color: #b9bbbe; }
+
+.table-active,
+.table-active > th,
+.table-active > td {
+  background-color: rgba(0, 0, 0, 0.075); }
+
+.table-hover .table-active:hover {
+  background-color: rgba(0, 0, 0, 0.075); }
+  .table-hover .table-active:hover > td,
+  .table-hover .table-active:hover > th {
+    background-color: rgba(0, 0, 0, 0.075); }
+
+.table .thead-dark th {
+  color: #fff;
+  background-color: #343a40;
+  border-color: #454d55; }
+
+.table .thead-light th {
+  color: #495057;
+  background-color: #e9ecef;
+  border-color: #dee2e6; }
+
+.table-dark {
+  color: #fff;
+  background-color: #343a40; }
+  .table-dark th,
+  .table-dark td,
+  .table-dark thead th {
+    border-color: #454d55; }
+  .table-dark.table-bordered {
+    border: 0; }
+  .table-dark.table-striped tbody tr:nth-of-type(odd) {
+    background-color: rgba(255, 255, 255, 0.05); }
+  .table-dark.table-hover tbody tr:hover {
+    color: #fff;
+    background-color: rgba(255, 255, 255, 0.075); }
+
+@media (max-width: 575.98px) {
+  .table-responsive-sm {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch; }
+    .table-responsive-sm > .table-bordered {
+      border: 0; } }
+
+@media (max-width: 767.98px) {
+  .table-responsive-md {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch; }
+    .table-responsive-md > .table-bordered {
+      border: 0; } }
+
+@media (max-width: 991.98px) {
+  .table-responsive-lg {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch; }
+    .table-responsive-lg > .table-bordered {
+      border: 0; } }
+
+@media (max-width: 1199.98px) {
+  .table-responsive-xl {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch; }
+    .table-responsive-xl > .table-bordered {
+      border: 0; } }
+
+.table-responsive {
+  display: block;
+  width: 100%;
+  overflow-x: auto;
+  -webkit-overflow-scrolling: touch; }
+  .table-responsive > .table-bordered {
+    border: 0; }
+
+.form-control {
+  display: block;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  padding: 0.375rem 0.75rem;
+  font-size: 0.875rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem;
+  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
+  @media (prefers-reduced-motion: reduce) {
+    .form-control {
+      transition: none; } }
+  .form-control::-ms-expand {
+    background-color: transparent;
+    border: 0; }
+  .form-control:focus {
+    color: #495057;
+    background-color: #fff;
+    border-color: #94b2db;
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+  .form-control::placeholder {
+    color: #6c757d;
+    opacity: 1; }
+  .form-control:disabled, .form-control[readonly] {
+    background-color: #e9ecef;
+    opacity: 1; }
+
+select.form-control:focus::-ms-value {
+  color: #495057;
+  background-color: #fff; }
+
+.form-control-file,
+.form-control-range {
+  display: block;
+  width: 100%; }
+
+.col-form-label {
+  padding-top: calc(0.375rem + 1px);
+  padding-bottom: calc(0.375rem + 1px);
+  margin-bottom: 0;
+  font-size: inherit;
+  line-height: 1.5; }
+
+.col-form-label-lg {
+  padding-top: calc(0.5rem + 1px);
+  padding-bottom: calc(0.5rem + 1px);
+  font-size: 1.09375rem;
+  line-height: 1.5; }
+
+.col-form-label-sm {
+  padding-top: calc(0.25rem + 1px);
+  padding-bottom: calc(0.25rem + 1px);
+  font-size: 0.76562rem;
+  line-height: 1.5; }
+
+.form-control-plaintext {
+  display: block;
+  width: 100%;
+  padding-top: 0.375rem;
+  padding-bottom: 0.375rem;
+  margin-bottom: 0;
+  line-height: 1.5;
+  color: #373a3c;
+  background-color: transparent;
+  border: solid transparent;
+  border-width: 1px 0; }
+  .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
+    padding-right: 0;
+    padding-left: 0; }
+
+.form-control-sm {
+  height: calc(1.5em + 0.5rem + 2px);
+  padding: 0.25rem 0.5rem;
+  font-size: 0.76562rem;
+  line-height: 1.5;
+  border-radius: 0.2rem; }
+
+.form-control-lg {
+  height: calc(1.5em + 1rem + 2px);
+  padding: 0.5rem 1rem;
+  font-size: 1.09375rem;
+  line-height: 1.5;
+  border-radius: 0.3rem; }
+
+select.form-control[size], select.form-control[multiple] {
+  height: auto; }
+
+textarea.form-control {
+  height: auto; }
+
+.form-group {
+  margin-bottom: 1rem; }
+
+.form-text {
+  display: block;
+  margin-top: 0.25rem; }
+
+.form-row {
+  display: flex;
+  flex-wrap: wrap;
+  margin-right: -5px;
+  margin-left: -5px; }
+  .form-row > .col,
+  .form-row > [class*="col-"] {
+    padding-right: 5px;
+    padding-left: 5px; }
+
+.form-check {
+  position: relative;
+  display: block;
+  padding-left: 1.25rem; }
+
+.form-check-input {
+  position: absolute;
+  margin-top: 0.3rem;
+  margin-left: -1.25rem; }
+  .form-check-input:disabled ~ .form-check-label {
+    color: #6c757d; }
+
+.form-check-label {
+  margin-bottom: 0; }
+
+.form-check-inline {
+  display: inline-flex;
+  align-items: center;
+  padding-left: 0;
+  margin-right: 0.75rem; }
+  .form-check-inline .form-check-input {
+    position: static;
+    margin-top: 0;
+    margin-right: 0.3125rem;
+    margin-left: 0; }
+
+.valid-feedback {
+  display: none;
+  width: 100%;
+  margin-top: 0.25rem;
+  font-size: 80%;
+  color: #28a745; }
+
+.valid-tooltip {
+  position: absolute;
+  top: 100%;
+  z-index: 5;
+  display: none;
+  max-width: 100%;
+  padding: 0.25rem 0.5rem;
+  margin-top: .1rem;
+  font-size: 0.76562rem;
+  line-height: 1.5;
+  color: #fff;
+  background-color: rgba(40, 167, 69, 0.9);
+  border-radius: 0.25rem; }
+
+.was-validated .form-control:valid, .form-control.is-valid {
+  border-color: #28a745;
+  padding-right: calc(1.5em + 0.75rem);
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+  background-repeat: no-repeat;
+  background-position: center right calc(0.375em + 0.1875rem);
+  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
+  .was-validated .form-control:valid:focus, .form-control.is-valid:focus {
+    border-color: #28a745;
+    box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
+  .was-validated .form-control:valid ~ .valid-feedback,
+  .was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,
+  .form-control.is-valid ~ .valid-tooltip {
+    display: block; }
+
+.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
+  padding-right: calc(1.5em + 0.75rem);
+  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }
+
+.was-validated .custom-select:valid, .custom-select.is-valid {
+  border-color: #28a745;
+  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
+  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
+  .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
+    border-color: #28a745;
+    box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
+  .was-validated .custom-select:valid ~ .valid-feedback,
+  .was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,
+  .custom-select.is-valid ~ .valid-tooltip {
+    display: block; }
+
+.was-validated .form-control-file:valid ~ .valid-feedback,
+.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
+.form-control-file.is-valid ~ .valid-tooltip {
+  display: block; }
+
+.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
+  color: #28a745; }
+
+.was-validated .form-check-input:valid ~ .valid-feedback,
+.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
+.form-check-input.is-valid ~ .valid-tooltip {
+  display: block; }
+
+.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
+  color: #28a745; }
+  .was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
+    border-color: #28a745; }
+
+.was-validated .custom-control-input:valid ~ .valid-feedback,
+.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
+.custom-control-input.is-valid ~ .valid-tooltip {
+  display: block; }
+
+.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
+  border-color: #34ce57;
+  background-color: #34ce57; }
+
+.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
+
+.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
+  border-color: #28a745; }
+
+.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
+  border-color: #28a745; }
+
+.was-validated .custom-file-input:valid ~ .valid-feedback,
+.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
+.custom-file-input.is-valid ~ .valid-tooltip {
+  display: block; }
+
+.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
+  border-color: #28a745;
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
+
+.invalid-feedback {
+  display: none;
+  width: 100%;
+  margin-top: 0.25rem;
+  font-size: 80%;
+  color: #dc3545; }
+
+.invalid-tooltip {
+  position: absolute;
+  top: 100%;
+  z-index: 5;
+  display: none;
+  max-width: 100%;
+  padding: 0.25rem 0.5rem;
+  margin-top: .1rem;
+  font-size: 0.76562rem;
+  line-height: 1.5;
+  color: #fff;
+  background-color: rgba(220, 53, 69, 0.9);
+  border-radius: 0.25rem; }
+
+.was-validated .form-control:invalid, .form-control.is-invalid {
+  border-color: #dc3545;
+  padding-right: calc(1.5em + 0.75rem);
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");
+  background-repeat: no-repeat;
+  background-position: center right calc(0.375em + 0.1875rem);
+  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
+  .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
+    border-color: #dc3545;
+    box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
+  .was-validated .form-control:invalid ~ .invalid-feedback,
+  .was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
+  .form-control.is-invalid ~ .invalid-tooltip {
+    display: block; }
+
+.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
+  padding-right: calc(1.5em + 0.75rem);
+  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }
+
+.was-validated .custom-select:invalid, .custom-select.is-invalid {
+  border-color: #dc3545;
+  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
+  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
+  .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
+    border-color: #dc3545;
+    box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
+  .was-validated .custom-select:invalid ~ .invalid-feedback,
+  .was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,
+  .custom-select.is-invalid ~ .invalid-tooltip {
+    display: block; }
+
+.was-validated .form-control-file:invalid ~ .invalid-feedback,
+.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
+.form-control-file.is-invalid ~ .invalid-tooltip {
+  display: block; }
+
+.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
+  color: #dc3545; }
+
+.was-validated .form-check-input:invalid ~ .invalid-feedback,
+.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
+.form-check-input.is-invalid ~ .invalid-tooltip {
+  display: block; }
+
+.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
+  color: #dc3545; }
+  .was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
+    border-color: #dc3545; }
+
+.was-validated .custom-control-input:invalid ~ .invalid-feedback,
+.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
+.custom-control-input.is-invalid ~ .invalid-tooltip {
+  display: block; }
+
+.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
+  border-color: #e4606d;
+  background-color: #e4606d; }
+
+.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
+
+.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
+  border-color: #dc3545; }
+
+.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
+  border-color: #dc3545; }
+
+.was-validated .custom-file-input:invalid ~ .invalid-feedback,
+.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
+.custom-file-input.is-invalid ~ .invalid-tooltip {
+  display: block; }
+
+.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
+  border-color: #dc3545;
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
+
+.form-inline {
+  display: flex;
+  flex-flow: row wrap;
+  align-items: center; }
+  .form-inline .form-check {
+    width: 100%; }
+  @media (min-width: 576px) {
+    .form-inline label {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      margin-bottom: 0; }
+    .form-inline .form-group {
+      display: flex;
+      flex: 0 0 auto;
+      flex-flow: row wrap;
+      align-items: center;
+      margin-bottom: 0; }
+    .form-inline .form-control {
+      display: inline-block;
+      width: auto;
+      vertical-align: middle; }
+    .form-inline .form-control-plaintext {
+      display: inline-block; }
+    .form-inline .input-group,
+    .form-inline .custom-select {
+      width: auto; }
+    .form-inline .form-check {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      width: auto;
+      padding-left: 0; }
+    .form-inline .form-check-input {
+      position: relative;
+      flex-shrink: 0;
+      margin-top: 0;
+      margin-right: 0.25rem;
+      margin-left: 0; }
+    .form-inline .custom-control {
+      align-items: center;
+      justify-content: center; }
+    .form-inline .custom-control-label {
+      margin-bottom: 0; } }
+
+.btn {
+  display: inline-block;
+  font-weight: 400;
+  color: #373a3c;
+  text-align: center;
+  vertical-align: middle;
+  user-select: none;
+  background-color: transparent;
+  border: 1px solid transparent;
+  padding: 0.375rem 0.75rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+  border-radius: 0.25rem;
+  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
+  @media (prefers-reduced-motion: reduce) {
+    .btn {
+      transition: none; } }
+  .btn:hover {
+    color: #373a3c;
+    text-decoration: none; }
+  .btn:focus, .btn.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+  .btn.disabled, .btn:disabled {
+    opacity: 0.65; }
+
+a.btn.disabled,
+fieldset:disabled a.btn {
+  pointer-events: none; }
+
+.btn-primary {
+  color: #fff;
+  background-color: #3c6eb4;
+  border-color: #3c6eb4; }
+  .btn-primary:hover {
+    color: #fff;
+    background-color: #325c97;
+    border-color: #2f578e; }
+  .btn-primary:focus, .btn-primary.focus {
+    box-shadow: 0 0 0 0.2rem rgba(89, 132, 191, 0.5); }
+  .btn-primary.disabled, .btn-primary:disabled {
+    color: #fff;
+    background-color: #3c6eb4;
+    border-color: #3c6eb4; }
+  .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,
+  .show > .btn-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #2f578e;
+    border-color: #2c5184; }
+    .btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-primary.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(89, 132, 191, 0.5); }
+
+.btn-secondary {
+  color: #fff;
+  background-color: #6c757d;
+  border-color: #6c757d; }
+  .btn-secondary:hover {
+    color: #fff;
+    background-color: #5a6268;
+    border-color: #545b62; }
+  .btn-secondary:focus, .btn-secondary.focus {
+    box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); }
+  .btn-secondary.disabled, .btn-secondary:disabled {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d; }
+  .btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,
+  .show > .btn-secondary.dropdown-toggle {
+    color: #fff;
+    background-color: #545b62;
+    border-color: #4e555b; }
+    .btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-secondary.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); }
+
+.btn-success {
+  color: #fff;
+  background-color: #28a745;
+  border-color: #28a745; }
+  .btn-success:hover {
+    color: #fff;
+    background-color: #218838;
+    border-color: #1e7e34; }
+  .btn-success:focus, .btn-success.focus {
+    box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); }
+  .btn-success.disabled, .btn-success:disabled {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745; }
+  .btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
+  .show > .btn-success.dropdown-toggle {
+    color: #fff;
+    background-color: #1e7e34;
+    border-color: #1c7430; }
+    .btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-success.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); }
+
+.btn-info {
+  color: #fff;
+  background-color: #17a2b8;
+  border-color: #17a2b8; }
+  .btn-info:hover {
+    color: #fff;
+    background-color: #138496;
+    border-color: #117a8b; }
+  .btn-info:focus, .btn-info.focus {
+    box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); }
+  .btn-info.disabled, .btn-info:disabled {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8; }
+  .btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,
+  .show > .btn-info.dropdown-toggle {
+    color: #fff;
+    background-color: #117a8b;
+    border-color: #10707f; }
+    .btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-info.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); }
+
+.btn-warning {
+  color: #212529;
+  background-color: #ffc107;
+  border-color: #ffc107; }
+  .btn-warning:hover {
+    color: #212529;
+    background-color: #e0a800;
+    border-color: #d39e00; }
+  .btn-warning:focus, .btn-warning.focus {
+    box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); }
+  .btn-warning.disabled, .btn-warning:disabled {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107; }
+  .btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,
+  .show > .btn-warning.dropdown-toggle {
+    color: #212529;
+    background-color: #d39e00;
+    border-color: #c69500; }
+    .btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-warning.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); }
+
+.btn-danger {
+  color: #fff;
+  background-color: #dc3545;
+  border-color: #dc3545; }
+  .btn-danger:hover {
+    color: #fff;
+    background-color: #c82333;
+    border-color: #bd2130; }
+  .btn-danger:focus, .btn-danger.focus {
+    box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); }
+  .btn-danger.disabled, .btn-danger:disabled {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545; }
+  .btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,
+  .show > .btn-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #bd2130;
+    border-color: #b21f2d; }
+    .btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-danger.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); }
+
+.btn-light {
+  color: #212529;
+  background-color: #f8f9fa;
+  border-color: #f8f9fa; }
+  .btn-light:hover {
+    color: #212529;
+    background-color: #e2e6ea;
+    border-color: #dae0e5; }
+  .btn-light:focus, .btn-light.focus {
+    box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); }
+  .btn-light.disabled, .btn-light:disabled {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa; }
+  .btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,
+  .show > .btn-light.dropdown-toggle {
+    color: #212529;
+    background-color: #dae0e5;
+    border-color: #d3d9df; }
+    .btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-light.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); }
+
+.btn-dark {
+  color: #fff;
+  background-color: #343a40;
+  border-color: #343a40; }
+  .btn-dark:hover {
+    color: #fff;
+    background-color: #23272b;
+    border-color: #1d2124; }
+  .btn-dark:focus, .btn-dark.focus {
+    box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); }
+  .btn-dark.disabled, .btn-dark:disabled {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40; }
+  .btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,
+  .show > .btn-dark.dropdown-toggle {
+    color: #fff;
+    background-color: #1d2124;
+    border-color: #171a1d; }
+    .btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-dark.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); }
+
+.btn-outline-primary {
+  color: #3c6eb4;
+  border-color: #3c6eb4; }
+  .btn-outline-primary:hover {
+    color: #fff;
+    background-color: #3c6eb4;
+    border-color: #3c6eb4; }
+  .btn-outline-primary:focus, .btn-outline-primary.focus {
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.5); }
+  .btn-outline-primary.disabled, .btn-outline-primary:disabled {
+    color: #3c6eb4;
+    background-color: transparent; }
+  .btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #3c6eb4;
+    border-color: #3c6eb4; }
+    .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-primary.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.5); }
+
+.btn-outline-secondary {
+  color: #6c757d;
+  border-color: #6c757d; }
+  .btn-outline-secondary:hover {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d; }
+  .btn-outline-secondary:focus, .btn-outline-secondary.focus {
+    box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
+  .btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+    color: #6c757d;
+    background-color: transparent; }
+  .btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-secondary.dropdown-toggle {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d; }
+    .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-secondary.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
+
+.btn-outline-success {
+  color: #28a745;
+  border-color: #28a745; }
+  .btn-outline-success:hover {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745; }
+  .btn-outline-success:focus, .btn-outline-success.focus {
+    box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
+  .btn-outline-success.disabled, .btn-outline-success:disabled {
+    color: #28a745;
+    background-color: transparent; }
+  .btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-success.dropdown-toggle {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745; }
+    .btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-success.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
+
+.btn-outline-info {
+  color: #17a2b8;
+  border-color: #17a2b8; }
+  .btn-outline-info:hover {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8; }
+  .btn-outline-info:focus, .btn-outline-info.focus {
+    box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
+  .btn-outline-info.disabled, .btn-outline-info:disabled {
+    color: #17a2b8;
+    background-color: transparent; }
+  .btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-info.dropdown-toggle {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8; }
+    .btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-info.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
+
+.btn-outline-warning {
+  color: #ffc107;
+  border-color: #ffc107; }
+  .btn-outline-warning:hover {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107; }
+  .btn-outline-warning:focus, .btn-outline-warning.focus {
+    box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
+  .btn-outline-warning.disabled, .btn-outline-warning:disabled {
+    color: #ffc107;
+    background-color: transparent; }
+  .btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-warning.dropdown-toggle {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107; }
+    .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-warning.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
+
+.btn-outline-danger {
+  color: #dc3545;
+  border-color: #dc3545; }
+  .btn-outline-danger:hover {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545; }
+  .btn-outline-danger:focus, .btn-outline-danger.focus {
+    box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
+  .btn-outline-danger.disabled, .btn-outline-danger:disabled {
+    color: #dc3545;
+    background-color: transparent; }
+  .btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545; }
+    .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-danger.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
+
+.btn-outline-light {
+  color: #f8f9fa;
+  border-color: #f8f9fa; }
+  .btn-outline-light:hover {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa; }
+  .btn-outline-light:focus, .btn-outline-light.focus {
+    box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
+  .btn-outline-light.disabled, .btn-outline-light:disabled {
+    color: #f8f9fa;
+    background-color: transparent; }
+  .btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-light.dropdown-toggle {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa; }
+    .btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-light.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
+
+.btn-outline-dark {
+  color: #343a40;
+  border-color: #343a40; }
+  .btn-outline-dark:hover {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40; }
+  .btn-outline-dark:focus, .btn-outline-dark.focus {
+    box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
+  .btn-outline-dark.disabled, .btn-outline-dark:disabled {
+    color: #343a40;
+    background-color: transparent; }
+  .btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
+  .show > .btn-outline-dark.dropdown-toggle {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40; }
+    .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,
+    .show > .btn-outline-dark.dropdown-toggle:focus {
+      box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
+
+.btn-link {
+  font-weight: 400;
+  color: #3c6eb4;
+  text-decoration: none; }
+  .btn-link:hover {
+    color: #294b7b;
+    text-decoration: underline; }
+  .btn-link:focus, .btn-link.focus {
+    text-decoration: underline;
+    box-shadow: none; }
+  .btn-link:disabled, .btn-link.disabled {
+    color: #6c757d;
+    pointer-events: none; }
+
+.btn-lg, .btn-group-lg > .btn {
+  padding: 0.5rem 1rem;
+  font-size: 1.09375rem;
+  line-height: 1.5;
+  border-radius: 0.3rem; }
+
+.btn-sm, .btn-group-sm > .btn {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.76562rem;
+  line-height: 1.5;
+  border-radius: 0.2rem; }
+
+.btn-block {
+  display: block;
+  width: 100%; }
+  .btn-block + .btn-block {
+    margin-top: 0.5rem; }
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%; }
+
+.fade {
+  transition: opacity 0.15s linear; }
+  @media (prefers-reduced-motion: reduce) {
+    .fade {
+      transition: none; } }
+  .fade:not(.show) {
+    opacity: 0; }
+
+.collapse:not(.show) {
+  display: none; }
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  transition: height 0.35s ease; }
+  @media (prefers-reduced-motion: reduce) {
+    .collapsing {
+      transition: none; } }
+
+.dropup,
+.dropright,
+.dropdown,
+.dropleft {
+  position: relative; }
+
+.dropdown-toggle {
+  white-space: nowrap; }
+  .dropdown-toggle::after {
+    display: inline-block;
+    margin-left: 0.255em;
+    vertical-align: 0.255em;
+    content: "";
+    border-top: 0.3em solid;
+    border-right: 0.3em solid transparent;
+    border-bottom: 0;
+    border-left: 0.3em solid transparent; }
+  .dropdown-toggle:empty::after {
+    margin-left: 0; }
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 10rem;
+  padding: 0.5rem 0;
+  margin: 0.125rem 0 0;
+  font-size: 0.875rem;
+  color: #373a3c;
+  text-align: left;
+  list-style: none;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 0.25rem; }
+
+.dropdown-menu-left {
+  right: auto;
+  left: 0; }
+
+.dropdown-menu-right {
+  right: 0;
+  left: auto; }
+
+@media (min-width: 576px) {
+  .dropdown-menu-sm-left {
+    right: auto;
+    left: 0; }
+  .dropdown-menu-sm-right {
+    right: 0;
+    left: auto; } }
+
+@media (min-width: 768px) {
+  .dropdown-menu-md-left {
+    right: auto;
+    left: 0; }
+  .dropdown-menu-md-right {
+    right: 0;
+    left: auto; } }
+
+@media (min-width: 992px) {
+  .dropdown-menu-lg-left {
+    right: auto;
+    left: 0; }
+  .dropdown-menu-lg-right {
+    right: 0;
+    left: auto; } }
+
+@media (min-width: 1200px) {
+  .dropdown-menu-xl-left {
+    right: auto;
+    left: 0; }
+  .dropdown-menu-xl-right {
+    right: 0;
+    left: auto; } }
+
+.dropup .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-top: 0;
+  margin-bottom: 0.125rem; }
+
+.dropup .dropdown-toggle::after {
+  display: inline-block;
+  margin-left: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+  border-top: 0;
+  border-right: 0.3em solid transparent;
+  border-bottom: 0.3em solid;
+  border-left: 0.3em solid transparent; }
+
+.dropup .dropdown-toggle:empty::after {
+  margin-left: 0; }
+
+.dropright .dropdown-menu {
+  top: 0;
+  right: auto;
+  left: 100%;
+  margin-top: 0;
+  margin-left: 0.125rem; }
+
+.dropright .dropdown-toggle::after {
+  display: inline-block;
+  margin-left: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+  border-top: 0.3em solid transparent;
+  border-right: 0;
+  border-bottom: 0.3em solid transparent;
+  border-left: 0.3em solid; }
+
+.dropright .dropdown-toggle:empty::after {
+  margin-left: 0; }
+
+.dropright .dropdown-toggle::after {
+  vertical-align: 0; }
+
+.dropleft .dropdown-menu {
+  top: 0;
+  right: 100%;
+  left: auto;
+  margin-top: 0;
+  margin-right: 0.125rem; }
+
+.dropleft .dropdown-toggle::after {
+  display: inline-block;
+  margin-left: 0.255em;
+  vertical-align: 0.255em;
+  content: ""; }
+
+.dropleft .dropdown-toggle::after {
+  display: none; }
+
+.dropleft .dropdown-toggle::before {
+  display: inline-block;
+  margin-right: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+  border-top: 0.3em solid transparent;
+  border-right: 0.3em solid;
+  border-bottom: 0.3em solid transparent; }
+
+.dropleft .dropdown-toggle:empty::after {
+  margin-left: 0; }
+
+.dropleft .dropdown-toggle::before {
+  vertical-align: 0; }
+
+.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] {
+  right: auto;
+  bottom: auto; }
+
+.dropdown-divider {
+  height: 0;
+  margin: 0.5rem 0;
+  overflow: hidden;
+  border-top: 1px solid #e9ecef; }
+
+.dropdown-item {
+  display: block;
+  width: 100%;
+  padding: 0.25rem 1.5rem;
+  clear: both;
+  font-weight: 400;
+  color: #212529;
+  text-align: inherit;
+  white-space: nowrap;
+  background-color: transparent;
+  border: 0; }
+  .dropdown-item:hover, .dropdown-item:focus {
+    color: #16181b;
+    text-decoration: none;
+    background-color: #f8f9fa; }
+  .dropdown-item.active, .dropdown-item:active {
+    color: #fff;
+    text-decoration: none;
+    background-color: #3c6eb4; }
+  .dropdown-item.disabled, .dropdown-item:disabled {
+    color: #6c757d;
+    pointer-events: none;
+    background-color: transparent; }
+
+.dropdown-menu.show {
+  display: block; }
+
+.dropdown-header {
+  display: block;
+  padding: 0.5rem 1.5rem;
+  margin-bottom: 0;
+  font-size: 0.76562rem;
+  color: #6c757d;
+  white-space: nowrap; }
+
+.dropdown-item-text {
+  display: block;
+  padding: 0.25rem 1.5rem;
+  color: #212529; }
+
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-flex;
+  vertical-align: middle; }
+  .btn-group > .btn,
+  .btn-group-vertical > .btn {
+    position: relative;
+    flex: 1 1 auto; }
+    .btn-group > .btn:hover,
+    .btn-group-vertical > .btn:hover {
+      z-index: 1; }
+    .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+    .btn-group-vertical > .btn:focus,
+    .btn-group-vertical > .btn:active,
+    .btn-group-vertical > .btn.active {
+      z-index: 1; }
+
+.btn-toolbar {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: flex-start; }
+  .btn-toolbar .input-group {
+    width: auto; }
+
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) {
+  margin-left: -1px; }
+
+.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group > .btn-group:not(:last-child) > .btn {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0; }
+
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0; }
+
+.dropdown-toggle-split {
+  padding-right: 0.5625rem;
+  padding-left: 0.5625rem; }
+  .dropdown-toggle-split::after,
+  .dropup .dropdown-toggle-split::after,
+  .dropright .dropdown-toggle-split::after {
+    margin-left: 0; }
+  .dropleft .dropdown-toggle-split::before {
+    margin-right: 0; }
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+  padding-right: 0.375rem;
+  padding-left: 0.375rem; }
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+  padding-right: 0.75rem;
+  padding-left: 0.75rem; }
+
+.btn-group-vertical {
+  flex-direction: column;
+  align-items: flex-start;
+  justify-content: center; }
+  .btn-group-vertical > .btn,
+  .btn-group-vertical > .btn-group {
+    width: 100%; }
+  .btn-group-vertical > .btn:not(:first-child),
+  .btn-group-vertical > .btn-group:not(:first-child) {
+    margin-top: -1px; }
+  .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+  .btn-group-vertical > .btn-group:not(:last-child) > .btn {
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0; }
+  .btn-group-vertical > .btn:not(:first-child),
+  .btn-group-vertical > .btn-group:not(:first-child) > .btn {
+    border-top-left-radius: 0;
+    border-top-right-radius: 0; }
+
+.btn-group-toggle > .btn,
+.btn-group-toggle > .btn-group > .btn {
+  margin-bottom: 0; }
+  .btn-group-toggle > .btn input[type="radio"],
+  .btn-group-toggle > .btn input[type="checkbox"],
+  .btn-group-toggle > .btn-group > .btn input[type="radio"],
+  .btn-group-toggle > .btn-group > .btn input[type="checkbox"] {
+    position: absolute;
+    clip: rect(0, 0, 0, 0);
+    pointer-events: none; }
+
+.input-group {
+  position: relative;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: stretch;
+  width: 100%; }
+  .input-group > .form-control,
+  .input-group > .form-control-plaintext,
+  .input-group > .custom-select,
+  .input-group > .custom-file {
+    position: relative;
+    flex: 1 1 auto;
+    width: 1%;
+    margin-bottom: 0; }
+    .input-group > .form-control + .form-control,
+    .input-group > .form-control + .custom-select,
+    .input-group > .form-control + .custom-file,
+    .input-group > .form-control-plaintext + .form-control,
+    .input-group > .form-control-plaintext + .custom-select,
+    .input-group > .form-control-plaintext + .custom-file,
+    .input-group > .custom-select + .form-control,
+    .input-group > .custom-select + .custom-select,
+    .input-group > .custom-select + .custom-file,
+    .input-group > .custom-file + .form-control,
+    .input-group > .custom-file + .custom-select,
+    .input-group > .custom-file + .custom-file {
+      margin-left: -1px; }
+  .input-group > .form-control:focus,
+  .input-group > .custom-select:focus,
+  .input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
+    z-index: 3; }
+  .input-group > .custom-file .custom-file-input:focus {
+    z-index: 4; }
+  .input-group > .form-control:not(:last-child),
+  .input-group > .custom-select:not(:last-child) {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0; }
+  .input-group > .form-control:not(:first-child),
+  .input-group > .custom-select:not(:first-child) {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0; }
+  .input-group > .custom-file {
+    display: flex;
+    align-items: center; }
+    .input-group > .custom-file:not(:last-child) .custom-file-label,
+    .input-group > .custom-file:not(:last-child) .custom-file-label::after {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0; }
+    .input-group > .custom-file:not(:first-child) .custom-file-label {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0; }
+
+.input-group-prepend,
+.input-group-append {
+  display: flex; }
+  .input-group-prepend .btn,
+  .input-group-append .btn {
+    position: relative;
+    z-index: 2; }
+    .input-group-prepend .btn:focus,
+    .input-group-append .btn:focus {
+      z-index: 3; }
+  .input-group-prepend .btn + .btn,
+  .input-group-prepend .btn + .input-group-text,
+  .input-group-prepend .input-group-text + .input-group-text,
+  .input-group-prepend .input-group-text + .btn,
+  .input-group-append .btn + .btn,
+  .input-group-append .btn + .input-group-text,
+  .input-group-append .input-group-text + .input-group-text,
+  .input-group-append .input-group-text + .btn {
+    margin-left: -1px; }
+
+.input-group-prepend {
+  margin-right: -1px; }
+
+.input-group-append {
+  margin-left: -1px; }
+
+.input-group-text {
+  display: flex;
+  align-items: center;
+  padding: 0.375rem 0.75rem;
+  margin-bottom: 0;
+  font-size: 0.875rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  text-align: center;
+  white-space: nowrap;
+  background-color: #e9ecef;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem; }
+  .input-group-text input[type="radio"],
+  .input-group-text input[type="checkbox"] {
+    margin-top: 0; }
+
+.input-group-lg > .form-control:not(textarea),
+.input-group-lg > .custom-select {
+  height: calc(1.5em + 1rem + 2px); }
+
+.input-group-lg > .form-control,
+.input-group-lg > .custom-select,
+.input-group-lg > .input-group-prepend > .input-group-text,
+.input-group-lg > .input-group-append > .input-group-text,
+.input-group-lg > .input-group-prepend > .btn,
+.input-group-lg > .input-group-append > .btn {
+  padding: 0.5rem 1rem;
+  font-size: 1.09375rem;
+  line-height: 1.5;
+  border-radius: 0.3rem; }
+
+.input-group-sm > .form-control:not(textarea),
+.input-group-sm > .custom-select {
+  height: calc(1.5em + 0.5rem + 2px); }
+
+.input-group-sm > .form-control,
+.input-group-sm > .custom-select,
+.input-group-sm > .input-group-prepend > .input-group-text,
+.input-group-sm > .input-group-append > .input-group-text,
+.input-group-sm > .input-group-prepend > .btn,
+.input-group-sm > .input-group-append > .btn {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.76562rem;
+  line-height: 1.5;
+  border-radius: 0.2rem; }
+
+.input-group-lg > .custom-select,
+.input-group-sm > .custom-select {
+  padding-right: 1.75rem; }
+
+.input-group > .input-group-prepend > .btn,
+.input-group > .input-group-prepend > .input-group-text,
+.input-group > .input-group-append:not(:last-child) > .btn,
+.input-group > .input-group-append:not(:last-child) > .input-group-text,
+.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0; }
+
+.input-group > .input-group-append > .btn,
+.input-group > .input-group-append > .input-group-text,
+.input-group > .input-group-prepend:not(:first-child) > .btn,
+.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
+.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
+.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0; }
+
+.custom-control {
+  position: relative;
+  display: block;
+  min-height: 1.3125rem;
+  padding-left: 1.5rem; }
+
+.custom-control-inline {
+  display: inline-flex;
+  margin-right: 1rem; }
+
+.custom-control-input {
+  position: absolute;
+  z-index: -1;
+  opacity: 0; }
+  .custom-control-input:checked ~ .custom-control-label::before {
+    color: #fff;
+    border-color: #3c6eb4;
+    background-color: #3c6eb4; }
+  .custom-control-input:focus ~ .custom-control-label::before {
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+  .custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
+    border-color: #94b2db; }
+  .custom-control-input:not(:disabled):active ~ .custom-control-label::before {
+    color: #fff;
+    background-color: #bacde8;
+    border-color: #bacde8; }
+  .custom-control-input:disabled ~ .custom-control-label {
+    color: #6c757d; }
+    .custom-control-input:disabled ~ .custom-control-label::before {
+      background-color: #e9ecef; }
+
+.custom-control-label {
+  position: relative;
+  margin-bottom: 0;
+  vertical-align: top; }
+  .custom-control-label::before {
+    position: absolute;
+    top: 0.15625rem;
+    left: -1.5rem;
+    display: block;
+    width: 1rem;
+    height: 1rem;
+    pointer-events: none;
+    content: "";
+    background-color: #fff;
+    border: #adb5bd solid 1px; }
+  .custom-control-label::after {
+    position: absolute;
+    top: 0.15625rem;
+    left: -1.5rem;
+    display: block;
+    width: 1rem;
+    height: 1rem;
+    content: "";
+    background: no-repeat 50% / 50% 50%; }
+
+.custom-checkbox .custom-control-label::before {
+  border-radius: 0.25rem; }
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); }
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
+  border-color: #3c6eb4;
+  background-color: #3c6eb4; }
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); }
+
+.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
+  background-color: rgba(60, 110, 180, 0.5); }
+
+.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
+  background-color: rgba(60, 110, 180, 0.5); }
+
+.custom-radio .custom-control-label::before {
+  border-radius: 50%; }
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); }
+
+.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
+  background-color: rgba(60, 110, 180, 0.5); }
+
+.custom-switch {
+  padding-left: 2.25rem; }
+  .custom-switch .custom-control-label::before {
+    left: -2.25rem;
+    width: 1.75rem;
+    pointer-events: all;
+    border-radius: 0.5rem; }
+  .custom-switch .custom-control-label::after {
+    top: calc(0.15625rem + 2px);
+    left: calc(-2.25rem + 2px);
+    width: calc(1rem - 4px);
+    height: calc(1rem - 4px);
+    background-color: #adb5bd;
+    border-radius: 0.5rem;
+    transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
+    @media (prefers-reduced-motion: reduce) {
+      .custom-switch .custom-control-label::after {
+        transition: none; } }
+  .custom-switch .custom-control-input:checked ~ .custom-control-label::after {
+    background-color: #fff;
+    transform: translateX(0.75rem); }
+  .custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
+    background-color: rgba(60, 110, 180, 0.5); }
+
+.custom-select {
+  display: inline-block;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+  font-size: 0.875rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  vertical-align: middle;
+  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;
+  background-color: #fff;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem;
+  appearance: none; }
+  .custom-select:focus {
+    border-color: #94b2db;
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+    .custom-select:focus::-ms-value {
+      color: #495057;
+      background-color: #fff; }
+  .custom-select[multiple], .custom-select[size]:not([size="1"]) {
+    height: auto;
+    padding-right: 0.75rem;
+    background-image: none; }
+  .custom-select:disabled {
+    color: #6c757d;
+    background-color: #e9ecef; }
+  .custom-select::-ms-expand {
+    display: none; }
+
+.custom-select-sm {
+  height: calc(1.5em + 0.5rem + 2px);
+  padding-top: 0.25rem;
+  padding-bottom: 0.25rem;
+  padding-left: 0.5rem;
+  font-size: 0.76562rem; }
+
+.custom-select-lg {
+  height: calc(1.5em + 1rem + 2px);
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  padding-left: 1rem;
+  font-size: 1.09375rem; }
+
+.custom-file {
+  position: relative;
+  display: inline-block;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  margin-bottom: 0; }
+
+.custom-file-input {
+  position: relative;
+  z-index: 2;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  margin: 0;
+  opacity: 0; }
+  .custom-file-input:focus ~ .custom-file-label {
+    border-color: #94b2db;
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+  .custom-file-input:disabled ~ .custom-file-label {
+    background-color: #e9ecef; }
+  .custom-file-input:lang(en) ~ .custom-file-label::after {
+    content: "Browse"; }
+  .custom-file-input ~ .custom-file-label[data-browse]::after {
+    content: attr(data-browse); }
+
+.custom-file-label {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: 1;
+  height: calc(1.5em + 0.75rem + 2px);
+  padding: 0.375rem 0.75rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  background-color: #fff;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem; }
+  .custom-file-label::after {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 3;
+    display: block;
+    height: calc(1.5em + 0.75rem);
+    padding: 0.375rem 0.75rem;
+    line-height: 1.5;
+    color: #495057;
+    content: "Browse";
+    background-color: #e9ecef;
+    border-left: inherit;
+    border-radius: 0 0.25rem 0.25rem 0; }
+
+.custom-range {
+  width: 100%;
+  height: calc(1rem + 0.4rem);
+  padding: 0;
+  background-color: transparent;
+  appearance: none; }
+  .custom-range:focus {
+    outline: none; }
+    .custom-range:focus::-webkit-slider-thumb {
+      box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+    .custom-range:focus::-moz-range-thumb {
+      box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+    .custom-range:focus::-ms-thumb {
+      box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+  .custom-range::-moz-focus-outer {
+    border: 0; }
+  .custom-range::-webkit-slider-thumb {
+    width: 1rem;
+    height: 1rem;
+    margin-top: -0.25rem;
+    background-color: #3c6eb4;
+    border: 0;
+    border-radius: 1rem;
+    transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+    appearance: none; }
+    @media (prefers-reduced-motion: reduce) {
+      .custom-range::-webkit-slider-thumb {
+        transition: none; } }
+    .custom-range::-webkit-slider-thumb:active {
+      background-color: #bacde8; }
+  .custom-range::-webkit-slider-runnable-track {
+    width: 100%;
+    height: 0.5rem;
+    color: transparent;
+    cursor: pointer;
+    background-color: #dee2e6;
+    border-color: transparent;
+    border-radius: 1rem; }
+  .custom-range::-moz-range-thumb {
+    width: 1rem;
+    height: 1rem;
+    background-color: #3c6eb4;
+    border: 0;
+    border-radius: 1rem;
+    transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+    appearance: none; }
+    @media (prefers-reduced-motion: reduce) {
+      .custom-range::-moz-range-thumb {
+        transition: none; } }
+    .custom-range::-moz-range-thumb:active {
+      background-color: #bacde8; }
+  .custom-range::-moz-range-track {
+    width: 100%;
+    height: 0.5rem;
+    color: transparent;
+    cursor: pointer;
+    background-color: #dee2e6;
+    border-color: transparent;
+    border-radius: 1rem; }
+  .custom-range::-ms-thumb {
+    width: 1rem;
+    height: 1rem;
+    margin-top: 0;
+    margin-right: 0.2rem;
+    margin-left: 0.2rem;
+    background-color: #3c6eb4;
+    border: 0;
+    border-radius: 1rem;
+    transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+    appearance: none; }
+    @media (prefers-reduced-motion: reduce) {
+      .custom-range::-ms-thumb {
+        transition: none; } }
+    .custom-range::-ms-thumb:active {
+      background-color: #bacde8; }
+  .custom-range::-ms-track {
+    width: 100%;
+    height: 0.5rem;
+    color: transparent;
+    cursor: pointer;
+    background-color: transparent;
+    border-color: transparent;
+    border-width: 0.5rem; }
+  .custom-range::-ms-fill-lower {
+    background-color: #dee2e6;
+    border-radius: 1rem; }
+  .custom-range::-ms-fill-upper {
+    margin-right: 15px;
+    background-color: #dee2e6;
+    border-radius: 1rem; }
+  .custom-range:disabled::-webkit-slider-thumb {
+    background-color: #adb5bd; }
+  .custom-range:disabled::-webkit-slider-runnable-track {
+    cursor: default; }
+  .custom-range:disabled::-moz-range-thumb {
+    background-color: #adb5bd; }
+  .custom-range:disabled::-moz-range-track {
+    cursor: default; }
+  .custom-range:disabled::-ms-thumb {
+    background-color: #adb5bd; }
+
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
+  @media (prefers-reduced-motion: reduce) {
+    .custom-control-label::before,
+    .custom-file-label,
+    .custom-select {
+      transition: none; } }
+
+.nav {
+  display: flex;
+  flex-wrap: wrap;
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none; }
+
+.nav-link {
+  display: block;
+  padding: 0.5rem 1rem; }
+  .nav-link:hover, .nav-link:focus {
+    text-decoration: none; }
+  .nav-link.disabled {
+    color: #6c757d;
+    pointer-events: none;
+    cursor: default; }
+
+.nav-tabs {
+  border-bottom: 1px solid #dee2e6; }
+  .nav-tabs .nav-item {
+    margin-bottom: -1px; }
+  .nav-tabs .nav-link {
+    border: 1px solid transparent;
+    border-top-left-radius: 0.25rem;
+    border-top-right-radius: 0.25rem; }
+    .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+      border-color: #e9ecef #e9ecef #dee2e6; }
+    .nav-tabs .nav-link.disabled {
+      color: #6c757d;
+      background-color: transparent;
+      border-color: transparent; }
+  .nav-tabs .nav-link.active,
+  .nav-tabs .nav-item.show .nav-link {
+    color: #495057;
+    background-color: #fff;
+    border-color: #dee2e6 #dee2e6 #fff; }
+  .nav-tabs .dropdown-menu {
+    margin-top: -1px;
+    border-top-left-radius: 0;
+    border-top-right-radius: 0; }
+
+.nav-pills .nav-link {
+  border-radius: 0.25rem; }
+
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+  color: #fff;
+  background-color: #3c6eb4; }
+
+.nav-fill .nav-item {
+  flex: 1 1 auto;
+  text-align: center; }
+
+.nav-justified .nav-item {
+  flex-basis: 0;
+  flex-grow: 1;
+  text-align: center; }
+
+.tab-content > .tab-pane {
+  display: none; }
+
+.tab-content > .active {
+  display: block; }
+
+.navbar {
+  position: relative;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0.5rem 1rem; }
+  .navbar > .container,
+  .navbar > .container-fluid {
+    display: flex;
+    flex-wrap: wrap;
+    align-items: center;
+    justify-content: space-between; }
+
+.navbar-brand {
+  display: inline-block;
+  padding-top: 0.33594rem;
+  padding-bottom: 0.33594rem;
+  margin-right: 1rem;
+  font-size: 1.09375rem;
+  line-height: inherit;
+  white-space: nowrap; }
+  .navbar-brand:hover, .navbar-brand:focus {
+    text-decoration: none; }
+
+.navbar-nav {
+  display: flex;
+  flex-direction: column;
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none; }
+  .navbar-nav .nav-link {
+    padding-right: 0;
+    padding-left: 0; }
+  .navbar-nav .dropdown-menu {
+    position: static;
+    float: none; }
+
+.navbar-text {
+  display: inline-block;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem; }
+
+.navbar-collapse {
+  flex-basis: 100%;
+  flex-grow: 1;
+  align-items: center; }
+
+.navbar-toggler {
+  padding: 0.25rem 0.75rem;
+  font-size: 1.09375rem;
+  line-height: 1;
+  background-color: transparent;
+  border: 1px solid transparent;
+  border-radius: 0.25rem; }
+  .navbar-toggler:hover, .navbar-toggler:focus {
+    text-decoration: none; }
+
+.navbar-toggler-icon {
+  display: inline-block;
+  width: 1.5em;
+  height: 1.5em;
+  vertical-align: middle;
+  content: "";
+  background: no-repeat center center;
+  background-size: 100% 100%; }
+
+@media (max-width: 575.98px) {
+  .navbar-expand-sm > .container,
+  .navbar-expand-sm > .container-fluid {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 576px) {
+  .navbar-expand-sm {
+    flex-flow: row nowrap;
+    justify-content: flex-start; }
+    .navbar-expand-sm .navbar-nav {
+      flex-direction: row; }
+      .navbar-expand-sm .navbar-nav .dropdown-menu {
+        position: absolute; }
+      .navbar-expand-sm .navbar-nav .nav-link {
+        padding-right: 0.5rem;
+        padding-left: 0.5rem; }
+    .navbar-expand-sm > .container,
+    .navbar-expand-sm > .container-fluid {
+      flex-wrap: nowrap; }
+    .navbar-expand-sm .navbar-collapse {
+      display: flex !important;
+      flex-basis: auto; }
+    .navbar-expand-sm .navbar-toggler {
+      display: none; } }
+
+@media (max-width: 767.98px) {
+  .navbar-expand-md > .container,
+  .navbar-expand-md > .container-fluid {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 768px) {
+  .navbar-expand-md {
+    flex-flow: row nowrap;
+    justify-content: flex-start; }
+    .navbar-expand-md .navbar-nav {
+      flex-direction: row; }
+      .navbar-expand-md .navbar-nav .dropdown-menu {
+        position: absolute; }
+      .navbar-expand-md .navbar-nav .nav-link {
+        padding-right: 0.5rem;
+        padding-left: 0.5rem; }
+    .navbar-expand-md > .container,
+    .navbar-expand-md > .container-fluid {
+      flex-wrap: nowrap; }
+    .navbar-expand-md .navbar-collapse {
+      display: flex !important;
+      flex-basis: auto; }
+    .navbar-expand-md .navbar-toggler {
+      display: none; } }
+
+@media (max-width: 991.98px) {
+  .navbar-expand-lg > .container,
+  .navbar-expand-lg > .container-fluid {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 992px) {
+  .navbar-expand-lg {
+    flex-flow: row nowrap;
+    justify-content: flex-start; }
+    .navbar-expand-lg .navbar-nav {
+      flex-direction: row; }
+      .navbar-expand-lg .navbar-nav .dropdown-menu {
+        position: absolute; }
+      .navbar-expand-lg .navbar-nav .nav-link {
+        padding-right: 0.5rem;
+        padding-left: 0.5rem; }
+    .navbar-expand-lg > .container,
+    .navbar-expand-lg > .container-fluid {
+      flex-wrap: nowrap; }
+    .navbar-expand-lg .navbar-collapse {
+      display: flex !important;
+      flex-basis: auto; }
+    .navbar-expand-lg .navbar-toggler {
+      display: none; } }
+
+@media (max-width: 1199.98px) {
+  .navbar-expand-xl > .container,
+  .navbar-expand-xl > .container-fluid {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 1200px) {
+  .navbar-expand-xl {
+    flex-flow: row nowrap;
+    justify-content: flex-start; }
+    .navbar-expand-xl .navbar-nav {
+      flex-direction: row; }
+      .navbar-expand-xl .navbar-nav .dropdown-menu {
+        position: absolute; }
+      .navbar-expand-xl .navbar-nav .nav-link {
+        padding-right: 0.5rem;
+        padding-left: 0.5rem; }
+    .navbar-expand-xl > .container,
+    .navbar-expand-xl > .container-fluid {
+      flex-wrap: nowrap; }
+    .navbar-expand-xl .navbar-collapse {
+      display: flex !important;
+      flex-basis: auto; }
+    .navbar-expand-xl .navbar-toggler {
+      display: none; } }
+
+.navbar-expand {
+  flex-flow: row nowrap;
+  justify-content: flex-start; }
+  .navbar-expand > .container,
+  .navbar-expand > .container-fluid {
+    padding-right: 0;
+    padding-left: 0; }
+  .navbar-expand .navbar-nav {
+    flex-direction: row; }
+    .navbar-expand .navbar-nav .dropdown-menu {
+      position: absolute; }
+    .navbar-expand .navbar-nav .nav-link {
+      padding-right: 0.5rem;
+      padding-left: 0.5rem; }
+  .navbar-expand > .container,
+  .navbar-expand > .container-fluid {
+    flex-wrap: nowrap; }
+  .navbar-expand .navbar-collapse {
+    display: flex !important;
+    flex-basis: auto; }
+  .navbar-expand .navbar-toggler {
+    display: none; }
+
+.navbar-light .navbar-brand {
+  color: rgba(0, 0, 0, 0.9); }
+  .navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
+    color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-nav .nav-link {
+  color: rgba(0, 0, 0, 0.5); }
+  .navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+    color: rgba(0, 0, 0, 0.7); }
+  .navbar-light .navbar-nav .nav-link.disabled {
+    color: rgba(0, 0, 0, 0.3); }
+
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .nav-link.active {
+  color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-toggler {
+  color: rgba(0, 0, 0, 0.5);
+  border-color: rgba(0, 0, 0, 0.1); }
+
+.navbar-light .navbar-toggler-icon {
+  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); }
+
+.navbar-light .navbar-text {
+  color: rgba(0, 0, 0, 0.5); }
+  .navbar-light .navbar-text a {
+    color: rgba(0, 0, 0, 0.9); }
+    .navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
+      color: rgba(0, 0, 0, 0.9); }
+
+.navbar-dark .navbar-brand {
+  color: #fff; }
+  .navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
+    color: #fff; }
+
+.navbar-dark .navbar-nav .nav-link {
+  color: rgba(255, 255, 255, 0.5); }
+  .navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
+    color: rgba(255, 255, 255, 0.75); }
+  .navbar-dark .navbar-nav .nav-link.disabled {
+    color: rgba(255, 255, 255, 0.25); }
+
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .active > .nav-link,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .nav-link.active {
+  color: #fff; }
+
+.navbar-dark .navbar-toggler {
+  color: rgba(255, 255, 255, 0.5);
+  border-color: rgba(255, 255, 255, 0.1); }
+
+.navbar-dark .navbar-toggler-icon {
+  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); }
+
+.navbar-dark .navbar-text {
+  color: rgba(255, 255, 255, 0.5); }
+  .navbar-dark .navbar-text a {
+    color: #fff; }
+    .navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
+      color: #fff; }
+
+.card {
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  min-width: 0;
+  word-wrap: break-word;
+  background-color: #fff;
+  background-clip: border-box;
+  border: 1px solid rgba(0, 0, 0, 0.125);
+  border-radius: 0.25rem; }
+  .card > hr {
+    margin-right: 0;
+    margin-left: 0; }
+  .card > .list-group:first-child .list-group-item:first-child {
+    border-top-left-radius: 0.25rem;
+    border-top-right-radius: 0.25rem; }
+  .card > .list-group:last-child .list-group-item:last-child {
+    border-bottom-right-radius: 0.25rem;
+    border-bottom-left-radius: 0.25rem; }
+
+.card-body {
+  flex: 1 1 auto;
+  padding: 1.25rem; }
+
+.card-title {
+  margin-bottom: 0.75rem; }
+
+.card-subtitle {
+  margin-top: -0.375rem;
+  margin-bottom: 0; }
+
+.card-text:last-child {
+  margin-bottom: 0; }
+
+.card-link:hover {
+  text-decoration: none; }
+
+.card-link + .card-link {
+  margin-left: 1.25rem; }
+
+.card-header {
+  padding: 0.75rem 1.25rem;
+  margin-bottom: 0;
+  background-color: rgba(0, 0, 0, 0.03);
+  border-bottom: 1px solid rgba(0, 0, 0, 0.125); }
+  .card-header:first-child {
+    border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; }
+  .card-header + .list-group .list-group-item:first-child {
+    border-top: 0; }
+
+.card-footer {
+  padding: 0.75rem 1.25rem;
+  background-color: rgba(0, 0, 0, 0.03);
+  border-top: 1px solid rgba(0, 0, 0, 0.125); }
+  .card-footer:last-child {
+    border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); }
+
+.card-header-tabs {
+  margin-right: -0.625rem;
+  margin-bottom: -0.75rem;
+  margin-left: -0.625rem;
+  border-bottom: 0; }
+
+.card-header-pills {
+  margin-right: -0.625rem;
+  margin-left: -0.625rem; }
+
+.card-img-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1.25rem; }
+
+.card-img {
+  width: 100%;
+  border-radius: calc(0.25rem - 1px); }
+
+.card-img-top {
+  width: 100%;
+  border-top-left-radius: calc(0.25rem - 1px);
+  border-top-right-radius: calc(0.25rem - 1px); }
+
+.card-img-bottom {
+  width: 100%;
+  border-bottom-right-radius: calc(0.25rem - 1px);
+  border-bottom-left-radius: calc(0.25rem - 1px); }
+
+.card-deck {
+  display: flex;
+  flex-direction: column; }
+  .card-deck .card {
+    margin-bottom: 15px; }
+  @media (min-width: 576px) {
+    .card-deck {
+      flex-flow: row wrap;
+      margin-right: -15px;
+      margin-left: -15px; }
+      .card-deck .card {
+        display: flex;
+        flex: 1 0 0%;
+        flex-direction: column;
+        margin-right: 15px;
+        margin-bottom: 0;
+        margin-left: 15px; } }
+
+.card-group {
+  display: flex;
+  flex-direction: column; }
+  .card-group > .card {
+    margin-bottom: 15px; }
+  @media (min-width: 576px) {
+    .card-group {
+      flex-flow: row wrap; }
+      .card-group > .card {
+        flex: 1 0 0%;
+        margin-bottom: 0; }
+        .card-group > .card + .card {
+          margin-left: 0;
+          border-left: 0; }
+        .card-group > .card:not(:last-child) {
+          border-top-right-radius: 0;
+          border-bottom-right-radius: 0; }
+          .card-group > .card:not(:last-child) .card-img-top,
+          .card-group > .card:not(:last-child) .card-header {
+            border-top-right-radius: 0; }
+          .card-group > .card:not(:last-child) .card-img-bottom,
+          .card-group > .card:not(:last-child) .card-footer {
+            border-bottom-right-radius: 0; }
+        .card-group > .card:not(:first-child) {
+          border-top-left-radius: 0;
+          border-bottom-left-radius: 0; }
+          .card-group > .card:not(:first-child) .card-img-top,
+          .card-group > .card:not(:first-child) .card-header {
+            border-top-left-radius: 0; }
+          .card-group > .card:not(:first-child) .card-img-bottom,
+          .card-group > .card:not(:first-child) .card-footer {
+            border-bottom-left-radius: 0; } }
+
+.card-columns .card {
+  margin-bottom: 0.75rem; }
+
+@media (min-width: 576px) {
+  .card-columns {
+    column-count: 3;
+    column-gap: 1.25rem;
+    orphans: 1;
+    widows: 1; }
+    .card-columns .card {
+      display: inline-block;
+      width: 100%; } }
+
+.accordion > .card {
+  overflow: hidden; }
+  .accordion > .card:not(:first-of-type) .card-header:first-child {
+    border-radius: 0; }
+  .accordion > .card:not(:first-of-type):not(:last-of-type) {
+    border-bottom: 0;
+    border-radius: 0; }
+  .accordion > .card:first-of-type {
+    border-bottom: 0;
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0; }
+  .accordion > .card:last-of-type {
+    border-top-left-radius: 0;
+    border-top-right-radius: 0; }
+  .accordion > .card .card-header {
+    margin-bottom: -1px; }
+
+.breadcrumb {
+  display: flex;
+  flex-wrap: wrap;
+  padding: 0.75rem 1rem;
+  margin-bottom: 1rem;
+  list-style: none;
+  background-color: #e9ecef;
+  border-radius: 0.25rem; }
+
+.breadcrumb-item + .breadcrumb-item {
+  padding-left: 0.5rem; }
+  .breadcrumb-item + .breadcrumb-item::before {
+    display: inline-block;
+    padding-right: 0.5rem;
+    color: #6c757d;
+    content: "/"; }
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+  text-decoration: underline; }
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+  text-decoration: none; }
+
+.breadcrumb-item.active {
+  color: #6c757d; }
+
+.pagination {
+  display: flex;
+  padding-left: 0;
+  list-style: none;
+  border-radius: 0.25rem; }
+
+.page-link {
+  position: relative;
+  display: block;
+  padding: 0.5rem 0.75rem;
+  margin-left: -1px;
+  line-height: 1.25;
+  color: #3c6eb4;
+  background-color: #fff;
+  border: 1px solid #dee2e6; }
+  .page-link:hover {
+    z-index: 2;
+    color: #294b7b;
+    text-decoration: none;
+    background-color: #e9ecef;
+    border-color: #dee2e6; }
+  .page-link:focus {
+    z-index: 2;
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.25); }
+
+.page-item:first-child .page-link {
+  margin-left: 0;
+  border-top-left-radius: 0.25rem;
+  border-bottom-left-radius: 0.25rem; }
+
+.page-item:last-child .page-link {
+  border-top-right-radius: 0.25rem;
+  border-bottom-right-radius: 0.25rem; }
+
+.page-item.active .page-link {
+  z-index: 1;
+  color: #fff;
+  background-color: #3c6eb4;
+  border-color: #3c6eb4; }
+
+.page-item.disabled .page-link {
+  color: #6c757d;
+  pointer-events: none;
+  cursor: auto;
+  background-color: #fff;
+  border-color: #dee2e6; }
+
+.pagination-lg .page-link {
+  padding: 0.75rem 1.5rem;
+  font-size: 1.09375rem;
+  line-height: 1.5; }
+
+.pagination-lg .page-item:first-child .page-link {
+  border-top-left-radius: 0.3rem;
+  border-bottom-left-radius: 0.3rem; }
+
+.pagination-lg .page-item:last-child .page-link {
+  border-top-right-radius: 0.3rem;
+  border-bottom-right-radius: 0.3rem; }
+
+.pagination-sm .page-link {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.76562rem;
+  line-height: 1.5; }
+
+.pagination-sm .page-item:first-child .page-link {
+  border-top-left-radius: 0.2rem;
+  border-bottom-left-radius: 0.2rem; }
+
+.pagination-sm .page-item:last-child .page-link {
+  border-top-right-radius: 0.2rem;
+  border-bottom-right-radius: 0.2rem; }
+
+.badge {
+  display: inline-block;
+  padding: 0.25em 0.4em;
+  font-size: 75%;
+  font-weight: 700;
+  line-height: 1;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: 0.25rem;
+  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
+  @media (prefers-reduced-motion: reduce) {
+    .badge {
+      transition: none; } }
+  a.badge:hover, a.badge:focus {
+    text-decoration: none; }
+  .badge:empty {
+    display: none; }
+
+.btn .badge {
+  position: relative;
+  top: -1px; }
+
+.badge-pill {
+  padding-right: 0.6em;
+  padding-left: 0.6em;
+  border-radius: 10rem; }
+
+.badge-primary {
+  color: #fff;
+  background-color: #3c6eb4; }
+  a.badge-primary:hover, a.badge-primary:focus {
+    color: #fff;
+    background-color: #2f578e; }
+  a.badge-primary:focus, a.badge-primary.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(60, 110, 180, 0.5); }
+
+.badge-secondary {
+  color: #fff;
+  background-color: #6c757d; }
+  a.badge-secondary:hover, a.badge-secondary:focus {
+    color: #fff;
+    background-color: #545b62; }
+  a.badge-secondary:focus, a.badge-secondary.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
+
+.badge-success {
+  color: #fff;
+  background-color: #28a745; }
+  a.badge-success:hover, a.badge-success:focus {
+    color: #fff;
+    background-color: #1e7e34; }
+  a.badge-success:focus, a.badge-success.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
+
+.badge-info {
+  color: #fff;
+  background-color: #17a2b8; }
+  a.badge-info:hover, a.badge-info:focus {
+    color: #fff;
+    background-color: #117a8b; }
+  a.badge-info:focus, a.badge-info.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
+
+.badge-warning {
+  color: #212529;
+  background-color: #ffc107; }
+  a.badge-warning:hover, a.badge-warning:focus {
+    color: #212529;
+    background-color: #d39e00; }
+  a.badge-warning:focus, a.badge-warning.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
+
+.badge-danger {
+  color: #fff;
+  background-color: #dc3545; }
+  a.badge-danger:hover, a.badge-danger:focus {
+    color: #fff;
+    background-color: #bd2130; }
+  a.badge-danger:focus, a.badge-danger.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
+
+.badge-light {
+  color: #212529;
+  background-color: #f8f9fa; }
+  a.badge-light:hover, a.badge-light:focus {
+    color: #212529;
+    background-color: #dae0e5; }
+  a.badge-light:focus, a.badge-light.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
+
+.badge-dark {
+  color: #fff;
+  background-color: #343a40; }
+  a.badge-dark:hover, a.badge-dark:focus {
+    color: #fff;
+    background-color: #1d2124; }
+  a.badge-dark:focus, a.badge-dark.focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
+
+.jumbotron {
+  padding: 2rem 1rem;
+  margin-bottom: 2rem;
+  background-color: #e9ecef;
+  border-radius: 0.3rem; }
+  @media (min-width: 576px) {
+    .jumbotron {
+      padding: 4rem 2rem; } }
+
+.jumbotron-fluid {
+  padding-right: 0;
+  padding-left: 0;
+  border-radius: 0; }
+
+.alert {
+  position: relative;
+  padding: 0.75rem 1.25rem;
+  margin-bottom: 1rem;
+  border: 1px solid transparent;
+  border-radius: 0.25rem; }
+
+.alert-heading {
+  color: inherit; }
+
+.alert-link {
+  font-weight: 700; }
+
+.alert-dismissible {
+  padding-right: 3.8125rem; }
+  .alert-dismissible .close {
+    position: absolute;
+    top: 0;
+    right: 0;
+    padding: 0.75rem 1.25rem;
+    color: inherit; }
+
+.alert-primary {
+  color: #1f395e;
+  background-color: #d8e2f0;
+  border-color: #c8d6ea; }
+  .alert-primary hr {
+    border-top-color: #b6c8e3; }
+  .alert-primary .alert-link {
+    color: #122238; }
+
+.alert-secondary {
+  color: #383d41;
+  background-color: #e2e3e5;
+  border-color: #d6d8db; }
+  .alert-secondary hr {
+    border-top-color: #c8cbcf; }
+  .alert-secondary .alert-link {
+    color: #202326; }
+
+.alert-success {
+  color: #155724;
+  background-color: #d4edda;
+  border-color: #c3e6cb; }
+  .alert-success hr {
+    border-top-color: #b1dfbb; }
+  .alert-success .alert-link {
+    color: #0b2e13; }
+
+.alert-info {
+  color: #0c5460;
+  background-color: #d1ecf1;
+  border-color: #bee5eb; }
+  .alert-info hr {
+    border-top-color: #abdde5; }
+  .alert-info .alert-link {
+    color: #062c33; }
+
+.alert-warning {
+  color: #856404;
+  background-color: #fff3cd;
+  border-color: #ffeeba; }
+  .alert-warning hr {
+    border-top-color: #ffe8a1; }
+  .alert-warning .alert-link {
+    color: #533f03; }
+
+.alert-danger {
+  color: #721c24;
+  background-color: #f8d7da;
+  border-color: #f5c6cb; }
+  .alert-danger hr {
+    border-top-color: #f1b0b7; }
+  .alert-danger .alert-link {
+    color: #491217; }
+
+.alert-light {
+  color: #818182;
+  background-color: #fefefe;
+  border-color: #fdfdfe; }
+  .alert-light hr {
+    border-top-color: #ececf6; }
+  .alert-light .alert-link {
+    color: #686868; }
+
+.alert-dark {
+  color: #1b1e21;
+  background-color: #d6d8d9;
+  border-color: #c6c8ca; }
+  .alert-dark hr {
+    border-top-color: #b9bbbe; }
+  .alert-dark .alert-link {
+    color: #040505; }
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 1rem 0; }
+  to {
+    background-position: 0 0; } }
+
+.progress {
+  display: flex;
+  height: 1rem;
+  overflow: hidden;
+  font-size: 0.65625rem;
+  background-color: #e9ecef;
+  border-radius: 0.25rem; }
+
+.progress-bar {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  background-color: #3c6eb4;
+  transition: width 0.6s ease; }
+  @media (prefers-reduced-motion: reduce) {
+    .progress-bar {
+      transition: none; } }
+
+.progress-bar-striped {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-size: 1rem 1rem; }
+
+.progress-bar-animated {
+  animation: progress-bar-stripes 1s linear infinite; }
+  @media (prefers-reduced-motion: reduce) {
+    .progress-bar-animated {
+      animation: none; } }
+
+.media {
+  display: flex;
+  align-items: flex-start; }
+
+.media-body {
+  flex: 1; }
+
+.list-group {
+  display: flex;
+  flex-direction: column;
+  padding-left: 0;
+  margin-bottom: 0; }
+
+.list-group-item-action {
+  width: 100%;
+  color: #495057;
+  text-align: inherit; }
+  .list-group-item-action:hover, .list-group-item-action:focus {
+    z-index: 1;
+    color: #495057;
+    text-decoration: none;
+    background-color: #f8f9fa; }
+  .list-group-item-action:active {
+    color: #373a3c;
+    background-color: #e9ecef; }
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 0.75rem 1.25rem;
+  margin-bottom: -1px;
+  background-color: #fff;
+  border: 1px solid rgba(0, 0, 0, 0.125); }
+  .list-group-item:first-child {
+    border-top-left-radius: 0.25rem;
+    border-top-right-radius: 0.25rem; }
+  .list-group-item:last-child {
+    margin-bottom: 0;
+    border-bottom-right-radius: 0.25rem;
+    border-bottom-left-radius: 0.25rem; }
+  .list-group-item.disabled, .list-group-item:disabled {
+    color: #6c757d;
+    pointer-events: none;
+    background-color: #fff; }
+  .list-group-item.active {
+    z-index: 2;
+    color: #fff;
+    background-color: #3c6eb4;
+    border-color: #3c6eb4; }
+
+.list-group-horizontal {
+  flex-direction: row; }
+  .list-group-horizontal .list-group-item {
+    margin-right: -1px;
+    margin-bottom: 0; }
+    .list-group-horizontal .list-group-item:first-child {
+      border-top-left-radius: 0.25rem;
+      border-bottom-left-radius: 0.25rem;
+      border-top-right-radius: 0; }
+    .list-group-horizontal .list-group-item:last-child {
+      margin-right: 0;
+      border-top-right-radius: 0.25rem;
+      border-bottom-right-radius: 0.25rem;
+      border-bottom-left-radius: 0; }
+
+@media (min-width: 576px) {
+  .list-group-horizontal-sm {
+    flex-direction: row; }
+    .list-group-horizontal-sm .list-group-item {
+      margin-right: -1px;
+      margin-bottom: 0; }
+      .list-group-horizontal-sm .list-group-item:first-child {
+        border-top-left-radius: 0.25rem;
+        border-bottom-left-radius: 0.25rem;
+        border-top-right-radius: 0; }
+      .list-group-horizontal-sm .list-group-item:last-child {
+        margin-right: 0;
+        border-top-right-radius: 0.25rem;
+        border-bottom-right-radius: 0.25rem;
+        border-bottom-left-radius: 0; } }
+
+@media (min-width: 768px) {
+  .list-group-horizontal-md {
+    flex-direction: row; }
+    .list-group-horizontal-md .list-group-item {
+      margin-right: -1px;
+      margin-bottom: 0; }
+      .list-group-horizontal-md .list-group-item:first-child {
+        border-top-left-radius: 0.25rem;
+        border-bottom-left-radius: 0.25rem;
+        border-top-right-radius: 0; }
+      .list-group-horizontal-md .list-group-item:last-child {
+        margin-right: 0;
+        border-top-right-radius: 0.25rem;
+        border-bottom-right-radius: 0.25rem;
+        border-bottom-left-radius: 0; } }
+
+@media (min-width: 992px) {
+  .list-group-horizontal-lg {
+    flex-direction: row; }
+    .list-group-horizontal-lg .list-group-item {
+      margin-right: -1px;
+      margin-bottom: 0; }
+      .list-group-horizontal-lg .list-group-item:first-child {
+        border-top-left-radius: 0.25rem;
+        border-bottom-left-radius: 0.25rem;
+        border-top-right-radius: 0; }
+      .list-group-horizontal-lg .list-group-item:last-child {
+        margin-right: 0;
+        border-top-right-radius: 0.25rem;
+        border-bottom-right-radius: 0.25rem;
+        border-bottom-left-radius: 0; } }
+
+@media (min-width: 1200px) {
+  .list-group-horizontal-xl {
+    flex-direction: row; }
+    .list-group-horizontal-xl .list-group-item {
+      margin-right: -1px;
+      margin-bottom: 0; }
+      .list-group-horizontal-xl .list-group-item:first-child {
+        border-top-left-radius: 0.25rem;
+        border-bottom-left-radius: 0.25rem;
+        border-top-right-radius: 0; }
+      .list-group-horizontal-xl .list-group-item:last-child {
+        margin-right: 0;
+        border-top-right-radius: 0.25rem;
+        border-bottom-right-radius: 0.25rem;
+        border-bottom-left-radius: 0; } }
+
+.list-group-flush .list-group-item {
+  border-right: 0;
+  border-left: 0;
+  border-radius: 0; }
+  .list-group-flush .list-group-item:last-child {
+    margin-bottom: -1px; }
+
+.list-group-flush:first-child .list-group-item:first-child {
+  border-top: 0; }
+
+.list-group-flush:last-child .list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom: 0; }
+
+.list-group-item-primary {
+  color: #1f395e;
+  background-color: #c8d6ea; }
+  .list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
+    color: #1f395e;
+    background-color: #b6c8e3; }
+  .list-group-item-primary.list-group-item-action.active {
+    color: #fff;
+    background-color: #1f395e;
+    border-color: #1f395e; }
+
+.list-group-item-secondary {
+  color: #383d41;
+  background-color: #d6d8db; }
+  .list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
+    color: #383d41;
+    background-color: #c8cbcf; }
+  .list-group-item-secondary.list-group-item-action.active {
+    color: #fff;
+    background-color: #383d41;
+    border-color: #383d41; }
+
+.list-group-item-success {
+  color: #155724;
+  background-color: #c3e6cb; }
+  .list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
+    color: #155724;
+    background-color: #b1dfbb; }
+  .list-group-item-success.list-group-item-action.active {
+    color: #fff;
+    background-color: #155724;
+    border-color: #155724; }
+
+.list-group-item-info {
+  color: #0c5460;
+  background-color: #bee5eb; }
+  .list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
+    color: #0c5460;
+    background-color: #abdde5; }
+  .list-group-item-info.list-group-item-action.active {
+    color: #fff;
+    background-color: #0c5460;
+    border-color: #0c5460; }
+
+.list-group-item-warning {
+  color: #856404;
+  background-color: #ffeeba; }
+  .list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
+    color: #856404;
+    background-color: #ffe8a1; }
+  .list-group-item-warning.list-group-item-action.active {
+    color: #fff;
+    background-color: #856404;
+    border-color: #856404; }
+
+.list-group-item-danger {
+  color: #721c24;
+  background-color: #f5c6cb; }
+  .list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
+    color: #721c24;
+    background-color: #f1b0b7; }
+  .list-group-item-danger.list-group-item-action.active {
+    color: #fff;
+    background-color: #721c24;
+    border-color: #721c24; }
+
+.list-group-item-light {
+  color: #818182;
+  background-color: #fdfdfe; }
+  .list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
+    color: #818182;
+    background-color: #ececf6; }
+  .list-group-item-light.list-group-item-action.active {
+    color: #fff;
+    background-color: #818182;
+    border-color: #818182; }
+
+.list-group-item-dark {
+  color: #1b1e21;
+  background-color: #c6c8ca; }
+  .list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
+    color: #1b1e21;
+    background-color: #b9bbbe; }
+  .list-group-item-dark.list-group-item-action.active {
+    color: #fff;
+    background-color: #1b1e21;
+    border-color: #1b1e21; }
+
+.close {
+  float: right;
+  font-size: 1.3125rem;
+  font-weight: 700;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  opacity: .5; }
+  .close:hover {
+    color: #000;
+    text-decoration: none; }
+  .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
+    opacity: .75; }
+
+button.close {
+  padding: 0;
+  background-color: transparent;
+  border: 0;
+  appearance: none; }
+
+a.close.disabled {
+  pointer-events: none; }
+
+.toast {
+  max-width: 350px;
+  overflow: hidden;
+  font-size: 0.875rem;
+  background-color: rgba(255, 255, 255, 0.85);
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
+  backdrop-filter: blur(10px);
+  opacity: 0;
+  border-radius: 0.25rem; }
+  .toast:not(:last-child) {
+    margin-bottom: 0.75rem; }
+  .toast.showing {
+    opacity: 1; }
+  .toast.show {
+    display: block;
+    opacity: 1; }
+  .toast.hide {
+    display: none; }
+
+.toast-header {
+  display: flex;
+  align-items: center;
+  padding: 0.25rem 0.75rem;
+  color: #6c757d;
+  background-color: rgba(255, 255, 255, 0.85);
+  background-clip: padding-box;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.05); }
+
+.toast-body {
+  padding: 0.75rem; }
+
+.modal-open {
+  overflow: hidden; }
+  .modal-open .modal {
+    overflow-x: hidden;
+    overflow-y: auto; }
+
+.modal {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  outline: 0; }
+
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 0.5rem;
+  pointer-events: none; }
+  .modal.fade .modal-dialog {
+    transition: transform 0.3s ease-out;
+    transform: translate(0, -50px); }
+    @media (prefers-reduced-motion: reduce) {
+      .modal.fade .modal-dialog {
+        transition: none; } }
+  .modal.show .modal-dialog {
+    transform: none; }
+
+.modal-dialog-scrollable {
+  display: flex;
+  max-height: calc(100% - 1rem); }
+  .modal-dialog-scrollable .modal-content {
+    max-height: calc(100vh - 1rem);
+    overflow: hidden; }
+  .modal-dialog-scrollable .modal-header,
+  .modal-dialog-scrollable .modal-footer {
+    flex-shrink: 0; }
+  .modal-dialog-scrollable .modal-body {
+    overflow-y: auto; }
+
+.modal-dialog-centered {
+  display: flex;
+  align-items: center;
+  min-height: calc(100% - 1rem); }
+  .modal-dialog-centered::before {
+    display: block;
+    height: calc(100vh - 1rem);
+    content: ""; }
+  .modal-dialog-centered.modal-dialog-scrollable {
+    flex-direction: column;
+    justify-content: center;
+    height: 100%; }
+    .modal-dialog-centered.modal-dialog-scrollable .modal-content {
+      max-height: none; }
+    .modal-dialog-centered.modal-dialog-scrollable::before {
+      content: none; }
+
+.modal-content {
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  pointer-events: auto;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 0.3rem;
+  outline: 0; }
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 1040;
+  width: 100vw;
+  height: 100vh;
+  background-color: #000; }
+  .modal-backdrop.fade {
+    opacity: 0; }
+  .modal-backdrop.show {
+    opacity: 0.5; }
+
+.modal-header {
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-between;
+  padding: 1rem 1rem;
+  border-bottom: 1px solid #dee2e6;
+  border-top-left-radius: 0.3rem;
+  border-top-right-radius: 0.3rem; }
+  .modal-header .close {
+    padding: 1rem 1rem;
+    margin: -1rem -1rem -1rem auto; }
+
+.modal-title {
+  margin-bottom: 0;
+  line-height: 1.5; }
+
+.modal-body {
+  position: relative;
+  flex: 1 1 auto;
+  padding: 1rem; }
+
+.modal-footer {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  padding: 1rem;
+  border-top: 1px solid #dee2e6;
+  border-bottom-right-radius: 0.3rem;
+  border-bottom-left-radius: 0.3rem; }
+  .modal-footer > :not(:first-child) {
+    margin-left: .25rem; }
+  .modal-footer > :not(:last-child) {
+    margin-right: .25rem; }
+
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll; }
+
+@media (min-width: 576px) {
+  .modal-dialog {
+    max-width: 500px;
+    margin: 1.75rem auto; }
+  .modal-dialog-scrollable {
+    max-height: calc(100% - 3.5rem); }
+    .modal-dialog-scrollable .modal-content {
+      max-height: calc(100vh - 3.5rem); }
+  .modal-dialog-centered {
+    min-height: calc(100% - 3.5rem); }
+    .modal-dialog-centered::before {
+      height: calc(100vh - 3.5rem); }
+  .modal-sm {
+    max-width: 300px; } }
+
+@media (min-width: 992px) {
+  .modal-lg,
+  .modal-xl {
+    max-width: 800px; } }
+
+@media (min-width: 1200px) {
+  .modal-xl {
+    max-width: 1140px; } }
+
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  margin: 0;
+  font-family: "Open Sans";
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  white-space: normal;
+  line-break: auto;
+  font-size: 0.76562rem;
+  word-wrap: break-word;
+  opacity: 0; }
+  .tooltip.show {
+    opacity: 0.9; }
+  .tooltip .arrow {
+    position: absolute;
+    display: block;
+    width: 0.8rem;
+    height: 0.4rem; }
+    .tooltip .arrow::before {
+      position: absolute;
+      content: "";
+      border-color: transparent;
+      border-style: solid; }
+
+.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] {
+  padding: 0.4rem 0; }
+  .bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow {
+    bottom: 0; }
+    .bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before {
+      top: 0;
+      border-width: 0.4rem 0.4rem 0;
+      border-top-color: #000; }
+
+.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] {
+  padding: 0 0.4rem; }
+  .bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow {
+    left: 0;
+    width: 0.4rem;
+    height: 0.8rem; }
+    .bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before {
+      right: 0;
+      border-width: 0.4rem 0.4rem 0.4rem 0;
+      border-right-color: #000; }
+
+.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] {
+  padding: 0.4rem 0; }
+  .bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow {
+    top: 0; }
+    .bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
+      bottom: 0;
+      border-width: 0 0.4rem 0.4rem;
+      border-bottom-color: #000; }
+
+.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] {
+  padding: 0 0.4rem; }
+  .bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow {
+    right: 0;
+    width: 0.4rem;
+    height: 0.8rem; }
+    .bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before {
+      left: 0;
+      border-width: 0.4rem 0 0.4rem 0.4rem;
+      border-left-color: #000; }
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 0.25rem 0.5rem;
+  color: #fff;
+  text-align: center;
+  background-color: #000;
+  border-radius: 0.25rem; }
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: block;
+  max-width: 276px;
+  font-family: "Open Sans";
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  white-space: normal;
+  line-break: auto;
+  font-size: 0.76562rem;
+  word-wrap: break-word;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 0.3rem; }
+  .popover .arrow {
+    position: absolute;
+    display: block;
+    width: 1rem;
+    height: 0.5rem;
+    margin: 0 0.3rem; }
+    .popover .arrow::before, .popover .arrow::after {
+      position: absolute;
+      display: block;
+      content: "";
+      border-color: transparent;
+      border-style: solid; }
+
+.bs-popover-top, .bs-popover-auto[x-placement^="top"] {
+  margin-bottom: 0.5rem; }
+  .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
+    bottom: calc((0.5rem + 1px) * -1); }
+    .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
+      bottom: 0;
+      border-width: 0.5rem 0.5rem 0;
+      border-top-color: rgba(0, 0, 0, 0.25); }
+    .bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after {
+      bottom: 1px;
+      border-width: 0.5rem 0.5rem 0;
+      border-top-color: #fff; }
+
+.bs-popover-right, .bs-popover-auto[x-placement^="right"] {
+  margin-left: 0.5rem; }
+  .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
+    left: calc((0.5rem + 1px) * -1);
+    width: 0.5rem;
+    height: 1rem;
+    margin: 0.3rem 0; }
+    .bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before {
+      left: 0;
+      border-width: 0.5rem 0.5rem 0.5rem 0;
+      border-right-color: rgba(0, 0, 0, 0.25); }
+    .bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after {
+      left: 1px;
+      border-width: 0.5rem 0.5rem 0.5rem 0;
+      border-right-color: #fff; }
+
+.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] {
+  margin-top: 0.5rem; }
+  .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
+    top: calc((0.5rem + 1px) * -1); }
+    .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
+      top: 0;
+      border-width: 0 0.5rem 0.5rem 0.5rem;
+      border-bottom-color: rgba(0, 0, 0, 0.25); }
+    .bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after {
+      top: 1px;
+      border-width: 0 0.5rem 0.5rem 0.5rem;
+      border-bottom-color: #fff; }
+  .bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before {
+    position: absolute;
+    top: 0;
+    left: 50%;
+    display: block;
+    width: 1rem;
+    margin-left: -0.5rem;
+    content: "";
+    border-bottom: 1px solid #f7f7f7; }
+
+.bs-popover-left, .bs-popover-auto[x-placement^="left"] {
+  margin-right: 0.5rem; }
+  .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
+    right: calc((0.5rem + 1px) * -1);
+    width: 0.5rem;
+    height: 1rem;
+    margin: 0.3rem 0; }
+    .bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before {
+      right: 0;
+      border-width: 0.5rem 0 0.5rem 0.5rem;
+      border-left-color: rgba(0, 0, 0, 0.25); }
+    .bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after {
+      right: 1px;
+      border-width: 0.5rem 0 0.5rem 0.5rem;
+      border-left-color: #fff; }
+
+.popover-header {
+  padding: 0.5rem 0.75rem;
+  margin-bottom: 0;
+  font-size: 0.875rem;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-top-left-radius: calc(0.3rem - 1px);
+  border-top-right-radius: calc(0.3rem - 1px); }
+  .popover-header:empty {
+    display: none; }
+
+.popover-body {
+  padding: 0.5rem 0.75rem;
+  color: #373a3c; }
+
+.carousel {
+  position: relative; }
+
+.carousel.pointer-event {
+  touch-action: pan-y; }
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden; }
+  .carousel-inner::after {
+    display: block;
+    clear: both;
+    content: ""; }
+
+.carousel-item {
+  position: relative;
+  display: none;
+  float: left;
+  width: 100%;
+  margin-right: -100%;
+  backface-visibility: hidden;
+  transition: transform 0.6s ease-in-out; }
+  @media (prefers-reduced-motion: reduce) {
+    .carousel-item {
+      transition: none; } }
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+  display: block; }
+
+.carousel-item-next:not(.carousel-item-left),
+.active.carousel-item-right {
+  transform: translateX(100%); }
+
+.carousel-item-prev:not(.carousel-item-right),
+.active.carousel-item-left {
+  transform: translateX(-100%); }
+
+.carousel-fade .carousel-item {
+  opacity: 0;
+  transition-property: opacity;
+  transform: none; }
+
+.carousel-fade .carousel-item.active,
+.carousel-fade .carousel-item-next.carousel-item-left,
+.carousel-fade .carousel-item-prev.carousel-item-right {
+  z-index: 1;
+  opacity: 1; }
+
+.carousel-fade .active.carousel-item-left,
+.carousel-fade .active.carousel-item-right {
+  z-index: 0;
+  opacity: 0;
+  transition: 0s 0.6s opacity; }
+  @media (prefers-reduced-motion: reduce) {
+    .carousel-fade .active.carousel-item-left,
+    .carousel-fade .active.carousel-item-right {
+      transition: none; } }
+
+.carousel-control-prev,
+.carousel-control-next {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  z-index: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 15%;
+  color: #fff;
+  text-align: center;
+  opacity: 0.5;
+  transition: opacity 0.15s ease; }
+  @media (prefers-reduced-motion: reduce) {
+    .carousel-control-prev,
+    .carousel-control-next {
+      transition: none; } }
+  .carousel-control-prev:hover, .carousel-control-prev:focus,
+  .carousel-control-next:hover,
+  .carousel-control-next:focus {
+    color: #fff;
+    text-decoration: none;
+    outline: 0;
+    opacity: 0.9; }
+
+.carousel-control-prev {
+  left: 0; }
+
+.carousel-control-next {
+  right: 0; }
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  background: no-repeat 50% / 100% 100%; }
+
+.carousel-control-prev-icon {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); }
+
+.carousel-control-next-icon {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); }
+
+.carousel-indicators {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 15;
+  display: flex;
+  justify-content: center;
+  padding-left: 0;
+  margin-right: 15%;
+  margin-left: 15%;
+  list-style: none; }
+  .carousel-indicators li {
+    box-sizing: content-box;
+    flex: 0 1 auto;
+    width: 30px;
+    height: 3px;
+    margin-right: 3px;
+    margin-left: 3px;
+    text-indent: -999px;
+    cursor: pointer;
+    background-color: #fff;
+    background-clip: padding-box;
+    border-top: 10px solid transparent;
+    border-bottom: 10px solid transparent;
+    opacity: .5;
+    transition: opacity 0.6s ease; }
+    @media (prefers-reduced-motion: reduce) {
+      .carousel-indicators li {
+        transition: none; } }
+  .carousel-indicators .active {
+    opacity: 1; }
+
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center; }
+
+@keyframes spinner-border {
+  to {
+    transform: rotate(360deg); } }
+
+.spinner-border {
+  display: inline-block;
+  width: 2rem;
+  height: 2rem;
+  vertical-align: text-bottom;
+  border: 0.25em solid currentColor;
+  border-right-color: transparent;
+  border-radius: 50%;
+  animation: spinner-border .75s linear infinite; }
+
+.spinner-border-sm {
+  width: 1rem;
+  height: 1rem;
+  border-width: 0.2em; }
+
+@keyframes spinner-grow {
+  0% {
+    transform: scale(0); }
+  50% {
+    opacity: 1; } }
+
+.spinner-grow {
+  display: inline-block;
+  width: 2rem;
+  height: 2rem;
+  vertical-align: text-bottom;
+  background-color: currentColor;
+  border-radius: 50%;
+  opacity: 0;
+  animation: spinner-grow .75s linear infinite; }
+
+.spinner-grow-sm {
+  width: 1rem;
+  height: 1rem; }
+
+.align-baseline {
+  vertical-align: baseline !important; }
+
+.align-top {
+  vertical-align: top !important; }
+
+.align-middle {
+  vertical-align: middle !important; }
+
+.align-bottom {
+  vertical-align: bottom !important; }
+
+.align-text-bottom {
+  vertical-align: text-bottom !important; }
+
+.align-text-top {
+  vertical-align: text-top !important; }
+
+.bg-primary {
+  background-color: #3c6eb4 !important; }
+
+a.bg-primary:hover, a.bg-primary:focus,
+button.bg-primary:hover,
+button.bg-primary:focus {
+  background-color: #2f578e !important; }
+
+.bg-secondary {
+  background-color: #6c757d !important; }
+
+a.bg-secondary:hover, a.bg-secondary:focus,
+button.bg-secondary:hover,
+button.bg-secondary:focus {
+  background-color: #545b62 !important; }
+
+.bg-success {
+  background-color: #28a745 !important; }
+
+a.bg-success:hover, a.bg-success:focus,
+button.bg-success:hover,
+button.bg-success:focus {
+  background-color: #1e7e34 !important; }
+
+.bg-info {
+  background-color: #17a2b8 !important; }
+
+a.bg-info:hover, a.bg-info:focus,
+button.bg-info:hover,
+button.bg-info:focus {
+  background-color: #117a8b !important; }
+
+.bg-warning {
+  background-color: #ffc107 !important; }
+
+a.bg-warning:hover, a.bg-warning:focus,
+button.bg-warning:hover,
+button.bg-warning:focus {
+  background-color: #d39e00 !important; }
+
+.bg-danger {
+  background-color: #dc3545 !important; }
+
+a.bg-danger:hover, a.bg-danger:focus,
+button.bg-danger:hover,
+button.bg-danger:focus {
+  background-color: #bd2130 !important; }
+
+.bg-light {
+  background-color: #f8f9fa !important; }
+
+a.bg-light:hover, a.bg-light:focus,
+button.bg-light:hover,
+button.bg-light:focus {
+  background-color: #dae0e5 !important; }
+
+.bg-dark {
+  background-color: #343a40 !important; }
+
+a.bg-dark:hover, a.bg-dark:focus,
+button.bg-dark:hover,
+button.bg-dark:focus {
+  background-color: #1d2124 !important; }
+
+.bg-white {
+  background-color: #fff !important; }
+
+.bg-transparent {
+  background-color: transparent !important; }
+
+.border {
+  border: 1px solid #dee2e6 !important; }
+
+.border-top {
+  border-top: 1px solid #dee2e6 !important; }
+
+.border-right {
+  border-right: 1px solid #dee2e6 !important; }
+
+.border-bottom {
+  border-bottom: 1px solid #dee2e6 !important; }
+
+.border-left {
+  border-left: 1px solid #dee2e6 !important; }
+
+.border-0 {
+  border: 0 !important; }
+
+.border-top-0 {
+  border-top: 0 !important; }
+
+.border-right-0 {
+  border-right: 0 !important; }
+
+.border-bottom-0 {
+  border-bottom: 0 !important; }
+
+.border-left-0 {
+  border-left: 0 !important; }
+
+.border-primary {
+  border-color: #3c6eb4 !important; }
+
+.border-secondary {
+  border-color: #6c757d !important; }
+
+.border-success {
+  border-color: #28a745 !important; }
+
+.border-info {
+  border-color: #17a2b8 !important; }
+
+.border-warning {
+  border-color: #ffc107 !important; }
+
+.border-danger {
+  border-color: #dc3545 !important; }
+
+.border-light {
+  border-color: #f8f9fa !important; }
+
+.border-dark {
+  border-color: #343a40 !important; }
+
+.border-white {
+  border-color: #fff !important; }
+
+.rounded-sm {
+  border-radius: 0.2rem !important; }
+
+.rounded {
+  border-radius: 0.25rem !important; }
+
+.rounded-top {
+  border-top-left-radius: 0.25rem !important;
+  border-top-right-radius: 0.25rem !important; }
+
+.rounded-right {
+  border-top-right-radius: 0.25rem !important;
+  border-bottom-right-radius: 0.25rem !important; }
+
+.rounded-bottom {
+  border-bottom-right-radius: 0.25rem !important;
+  border-bottom-left-radius: 0.25rem !important; }
+
+.rounded-left {
+  border-top-left-radius: 0.25rem !important;
+  border-bottom-left-radius: 0.25rem !important; }
+
+.rounded-lg {
+  border-radius: 0.3rem !important; }
+
+.rounded-circle {
+  border-radius: 50% !important; }
+
+.rounded-pill {
+  border-radius: 50rem !important; }
+
+.rounded-0 {
+  border-radius: 0 !important; }
+
+.clearfix::after {
+  display: block;
+  clear: both;
+  content: ""; }
+
+.d-none {
+  display: none !important; }
+
+.d-inline {
+  display: inline !important; }
+
+.d-inline-block {
+  display: inline-block !important; }
+
+.d-block {
+  display: block !important; }
+
+.d-table {
+  display: table !important; }
+
+.d-table-row {
+  display: table-row !important; }
+
+.d-table-cell {
+  display: table-cell !important; }
+
+.d-flex {
+  display: flex !important; }
+
+.d-inline-flex {
+  display: inline-flex !important; }
+
+@media (min-width: 576px) {
+  .d-sm-none {
+    display: none !important; }
+  .d-sm-inline {
+    display: inline !important; }
+  .d-sm-inline-block {
+    display: inline-block !important; }
+  .d-sm-block {
+    display: block !important; }
+  .d-sm-table {
+    display: table !important; }
+  .d-sm-table-row {
+    display: table-row !important; }
+  .d-sm-table-cell {
+    display: table-cell !important; }
+  .d-sm-flex {
+    display: flex !important; }
+  .d-sm-inline-flex {
+    display: inline-flex !important; } }
+
+@media (min-width: 768px) {
+  .d-md-none {
+    display: none !important; }
+  .d-md-inline {
+    display: inline !important; }
+  .d-md-inline-block {
+    display: inline-block !important; }
+  .d-md-block {
+    display: block !important; }
+  .d-md-table {
+    display: table !important; }
+  .d-md-table-row {
+    display: table-row !important; }
+  .d-md-table-cell {
+    display: table-cell !important; }
+  .d-md-flex {
+    display: flex !important; }
+  .d-md-inline-flex {
+    display: inline-flex !important; } }
+
+@media (min-width: 992px) {
+  .d-lg-none {
+    display: none !important; }
+  .d-lg-inline {
+    display: inline !important; }
+  .d-lg-inline-block {
+    display: inline-block !important; }
+  .d-lg-block {
+    display: block !important; }
+  .d-lg-table {
+    display: table !important; }
+  .d-lg-table-row {
+    display: table-row !important; }
+  .d-lg-table-cell {
+    display: table-cell !important; }
+  .d-lg-flex {
+    display: flex !important; }
+  .d-lg-inline-flex {
+    display: inline-flex !important; } }
+
+@media (min-width: 1200px) {
+  .d-xl-none {
+    display: none !important; }
+  .d-xl-inline {
+    display: inline !important; }
+  .d-xl-inline-block {
+    display: inline-block !important; }
+  .d-xl-block {
+    display: block !important; }
+  .d-xl-table {
+    display: table !important; }
+  .d-xl-table-row {
+    display: table-row !important; }
+  .d-xl-table-cell {
+    display: table-cell !important; }
+  .d-xl-flex {
+    display: flex !important; }
+  .d-xl-inline-flex {
+    display: inline-flex !important; } }
+
+@media print {
+  .d-print-none {
+    display: none !important; }
+  .d-print-inline {
+    display: inline !important; }
+  .d-print-inline-block {
+    display: inline-block !important; }
+  .d-print-block {
+    display: block !important; }
+  .d-print-table {
+    display: table !important; }
+  .d-print-table-row {
+    display: table-row !important; }
+  .d-print-table-cell {
+    display: table-cell !important; }
+  .d-print-flex {
+    display: flex !important; }
+  .d-print-inline-flex {
+    display: inline-flex !important; } }
+
+.embed-responsive {
+  position: relative;
+  display: block;
+  width: 100%;
+  padding: 0;
+  overflow: hidden; }
+  .embed-responsive::before {
+    display: block;
+    content: ""; }
+  .embed-responsive .embed-responsive-item,
+  .embed-responsive iframe,
+  .embed-responsive embed,
+  .embed-responsive object,
+  .embed-responsive video {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    border: 0; }
+
+.embed-responsive-21by9::before {
+  padding-top: 42.85714%; }
+
+.embed-responsive-16by9::before {
+  padding-top: 56.25%; }
+
+.embed-responsive-4by3::before {
+  padding-top: 75%; }
+
+.embed-responsive-1by1::before {
+  padding-top: 100%; }
+
+.flex-row {
+  flex-direction: row !important; }
+
+.flex-column {
+  flex-direction: column !important; }
+
+.flex-row-reverse {
+  flex-direction: row-reverse !important; }
+
+.flex-column-reverse {
+  flex-direction: column-reverse !important; }
+
+.flex-wrap {
+  flex-wrap: wrap !important; }
+
+.flex-nowrap {
+  flex-wrap: nowrap !important; }
+
+.flex-wrap-reverse {
+  flex-wrap: wrap-reverse !important; }
+
+.flex-fill {
+  flex: 1 1 auto !important; }
+
+.flex-grow-0 {
+  flex-grow: 0 !important; }
+
+.flex-grow-1 {
+  flex-grow: 1 !important; }
+
+.flex-shrink-0 {
+  flex-shrink: 0 !important; }
+
+.flex-shrink-1 {
+  flex-shrink: 1 !important; }
+
+.justify-content-start {
+  justify-content: flex-start !important; }
+
+.justify-content-end {
+  justify-content: flex-end !important; }
+
+.justify-content-center {
+  justify-content: center !important; }
+
+.justify-content-between {
+  justify-content: space-between !important; }
+
+.justify-content-around {
+  justify-content: space-around !important; }
+
+.align-items-start {
+  align-items: flex-start !important; }
+
+.align-items-end {
+  align-items: flex-end !important; }
+
+.align-items-center {
+  align-items: center !important; }
+
+.align-items-baseline {
+  align-items: baseline !important; }
+
+.align-items-stretch {
+  align-items: stretch !important; }
+
+.align-content-start {
+  align-content: flex-start !important; }
+
+.align-content-end {
+  align-content: flex-end !important; }
+
+.align-content-center {
+  align-content: center !important; }
+
+.align-content-between {
+  align-content: space-between !important; }
+
+.align-content-around {
+  align-content: space-around !important; }
+
+.align-content-stretch {
+  align-content: stretch !important; }
+
+.align-self-auto {
+  align-self: auto !important; }
+
+.align-self-start {
+  align-self: flex-start !important; }
+
+.align-self-end {
+  align-self: flex-end !important; }
+
+.align-self-center {
+  align-self: center !important; }
+
+.align-self-baseline {
+  align-self: baseline !important; }
+
+.align-self-stretch {
+  align-self: stretch !important; }
+
+@media (min-width: 576px) {
+  .flex-sm-row {
+    flex-direction: row !important; }
+  .flex-sm-column {
+    flex-direction: column !important; }
+  .flex-sm-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-sm-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-sm-wrap {
+    flex-wrap: wrap !important; }
+  .flex-sm-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-sm-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .flex-sm-fill {
+    flex: 1 1 auto !important; }
+  .flex-sm-grow-0 {
+    flex-grow: 0 !important; }
+  .flex-sm-grow-1 {
+    flex-grow: 1 !important; }
+  .flex-sm-shrink-0 {
+    flex-shrink: 0 !important; }
+  .flex-sm-shrink-1 {
+    flex-shrink: 1 !important; }
+  .justify-content-sm-start {
+    justify-content: flex-start !important; }
+  .justify-content-sm-end {
+    justify-content: flex-end !important; }
+  .justify-content-sm-center {
+    justify-content: center !important; }
+  .justify-content-sm-between {
+    justify-content: space-between !important; }
+  .justify-content-sm-around {
+    justify-content: space-around !important; }
+  .align-items-sm-start {
+    align-items: flex-start !important; }
+  .align-items-sm-end {
+    align-items: flex-end !important; }
+  .align-items-sm-center {
+    align-items: center !important; }
+  .align-items-sm-baseline {
+    align-items: baseline !important; }
+  .align-items-sm-stretch {
+    align-items: stretch !important; }
+  .align-content-sm-start {
+    align-content: flex-start !important; }
+  .align-content-sm-end {
+    align-content: flex-end !important; }
+  .align-content-sm-center {
+    align-content: center !important; }
+  .align-content-sm-between {
+    align-content: space-between !important; }
+  .align-content-sm-around {
+    align-content: space-around !important; }
+  .align-content-sm-stretch {
+    align-content: stretch !important; }
+  .align-self-sm-auto {
+    align-self: auto !important; }
+  .align-self-sm-start {
+    align-self: flex-start !important; }
+  .align-self-sm-end {
+    align-self: flex-end !important; }
+  .align-self-sm-center {
+    align-self: center !important; }
+  .align-self-sm-baseline {
+    align-self: baseline !important; }
+  .align-self-sm-stretch {
+    align-self: stretch !important; } }
+
+@media (min-width: 768px) {
+  .flex-md-row {
+    flex-direction: row !important; }
+  .flex-md-column {
+    flex-direction: column !important; }
+  .flex-md-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-md-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-md-wrap {
+    flex-wrap: wrap !important; }
+  .flex-md-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-md-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .flex-md-fill {
+    flex: 1 1 auto !important; }
+  .flex-md-grow-0 {
+    flex-grow: 0 !important; }
+  .flex-md-grow-1 {
+    flex-grow: 1 !important; }
+  .flex-md-shrink-0 {
+    flex-shrink: 0 !important; }
+  .flex-md-shrink-1 {
+    flex-shrink: 1 !important; }
+  .justify-content-md-start {
+    justify-content: flex-start !important; }
+  .justify-content-md-end {
+    justify-content: flex-end !important; }
+  .justify-content-md-center {
+    justify-content: center !important; }
+  .justify-content-md-between {
+    justify-content: space-between !important; }
+  .justify-content-md-around {
+    justify-content: space-around !important; }
+  .align-items-md-start {
+    align-items: flex-start !important; }
+  .align-items-md-end {
+    align-items: flex-end !important; }
+  .align-items-md-center {
+    align-items: center !important; }
+  .align-items-md-baseline {
+    align-items: baseline !important; }
+  .align-items-md-stretch {
+    align-items: stretch !important; }
+  .align-content-md-start {
+    align-content: flex-start !important; }
+  .align-content-md-end {
+    align-content: flex-end !important; }
+  .align-content-md-center {
+    align-content: center !important; }
+  .align-content-md-between {
+    align-content: space-between !important; }
+  .align-content-md-around {
+    align-content: space-around !important; }
+  .align-content-md-stretch {
+    align-content: stretch !important; }
+  .align-self-md-auto {
+    align-self: auto !important; }
+  .align-self-md-start {
+    align-self: flex-start !important; }
+  .align-self-md-end {
+    align-self: flex-end !important; }
+  .align-self-md-center {
+    align-self: center !important; }
+  .align-self-md-baseline {
+    align-self: baseline !important; }
+  .align-self-md-stretch {
+    align-self: stretch !important; } }
+
+@media (min-width: 992px) {
+  .flex-lg-row {
+    flex-direction: row !important; }
+  .flex-lg-column {
+    flex-direction: column !important; }
+  .flex-lg-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-lg-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-lg-wrap {
+    flex-wrap: wrap !important; }
+  .flex-lg-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-lg-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .flex-lg-fill {
+    flex: 1 1 auto !important; }
+  .flex-lg-grow-0 {
+    flex-grow: 0 !important; }
+  .flex-lg-grow-1 {
+    flex-grow: 1 !important; }
+  .flex-lg-shrink-0 {
+    flex-shrink: 0 !important; }
+  .flex-lg-shrink-1 {
+    flex-shrink: 1 !important; }
+  .justify-content-lg-start {
+    justify-content: flex-start !important; }
+  .justify-content-lg-end {
+    justify-content: flex-end !important; }
+  .justify-content-lg-center {
+    justify-content: center !important; }
+  .justify-content-lg-between {
+    justify-content: space-between !important; }
+  .justify-content-lg-around {
+    justify-content: space-around !important; }
+  .align-items-lg-start {
+    align-items: flex-start !important; }
+  .align-items-lg-end {
+    align-items: flex-end !important; }
+  .align-items-lg-center {
+    align-items: center !important; }
+  .align-items-lg-baseline {
+    align-items: baseline !important; }
+  .align-items-lg-stretch {
+    align-items: stretch !important; }
+  .align-content-lg-start {
+    align-content: flex-start !important; }
+  .align-content-lg-end {
+    align-content: flex-end !important; }
+  .align-content-lg-center {
+    align-content: center !important; }
+  .align-content-lg-between {
+    align-content: space-between !important; }
+  .align-content-lg-around {
+    align-content: space-around !important; }
+  .align-content-lg-stretch {
+    align-content: stretch !important; }
+  .align-self-lg-auto {
+    align-self: auto !important; }
+  .align-self-lg-start {
+    align-self: flex-start !important; }
+  .align-self-lg-end {
+    align-self: flex-end !important; }
+  .align-self-lg-center {
+    align-self: center !important; }
+  .align-self-lg-baseline {
+    align-self: baseline !important; }
+  .align-self-lg-stretch {
+    align-self: stretch !important; } }
+
+@media (min-width: 1200px) {
+  .flex-xl-row {
+    flex-direction: row !important; }
+  .flex-xl-column {
+    flex-direction: column !important; }
+  .flex-xl-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-xl-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-xl-wrap {
+    flex-wrap: wrap !important; }
+  .flex-xl-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-xl-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .flex-xl-fill {
+    flex: 1 1 auto !important; }
+  .flex-xl-grow-0 {
+    flex-grow: 0 !important; }
+  .flex-xl-grow-1 {
+    flex-grow: 1 !important; }
+  .flex-xl-shrink-0 {
+    flex-shrink: 0 !important; }
+  .flex-xl-shrink-1 {
+    flex-shrink: 1 !important; }
+  .justify-content-xl-start {
+    justify-content: flex-start !important; }
+  .justify-content-xl-end {
+    justify-content: flex-end !important; }
+  .justify-content-xl-center {
+    justify-content: center !important; }
+  .justify-content-xl-between {
+    justify-content: space-between !important; }
+  .justify-content-xl-around {
+    justify-content: space-around !important; }
+  .align-items-xl-start {
+    align-items: flex-start !important; }
+  .align-items-xl-end {
+    align-items: flex-end !important; }
+  .align-items-xl-center {
+    align-items: center !important; }
+  .align-items-xl-baseline {
+    align-items: baseline !important; }
+  .align-items-xl-stretch {
+    align-items: stretch !important; }
+  .align-content-xl-start {
+    align-content: flex-start !important; }
+  .align-content-xl-end {
+    align-content: flex-end !important; }
+  .align-content-xl-center {
+    align-content: center !important; }
+  .align-content-xl-between {
+    align-content: space-between !important; }
+  .align-content-xl-around {
+    align-content: space-around !important; }
+  .align-content-xl-stretch {
+    align-content: stretch !important; }
+  .align-self-xl-auto {
+    align-self: auto !important; }
+  .align-self-xl-start {
+    align-self: flex-start !important; }
+  .align-self-xl-end {
+    align-self: flex-end !important; }
+  .align-self-xl-center {
+    align-self: center !important; }
+  .align-self-xl-baseline {
+    align-self: baseline !important; }
+  .align-self-xl-stretch {
+    align-self: stretch !important; } }
+
+.float-left {
+  float: left !important; }
+
+.float-right {
+  float: right !important; }
+
+.float-none {
+  float: none !important; }
+
+@media (min-width: 576px) {
+  .float-sm-left {
+    float: left !important; }
+  .float-sm-right {
+    float: right !important; }
+  .float-sm-none {
+    float: none !important; } }
+
+@media (min-width: 768px) {
+  .float-md-left {
+    float: left !important; }
+  .float-md-right {
+    float: right !important; }
+  .float-md-none {
+    float: none !important; } }
+
+@media (min-width: 992px) {
+  .float-lg-left {
+    float: left !important; }
+  .float-lg-right {
+    float: right !important; }
+  .float-lg-none {
+    float: none !important; } }
+
+@media (min-width: 1200px) {
+  .float-xl-left {
+    float: left !important; }
+  .float-xl-right {
+    float: right !important; }
+  .float-xl-none {
+    float: none !important; } }
+
+.overflow-auto {
+  overflow: auto !important; }
+
+.overflow-hidden {
+  overflow: hidden !important; }
+
+.position-static {
+  position: static !important; }
+
+.position-relative {
+  position: relative !important; }
+
+.position-absolute {
+  position: absolute !important; }
+
+.position-fixed {
+  position: fixed !important; }
+
+.position-sticky {
+  position: sticky !important; }
+
+.fixed-top {
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: 1030; }
+
+.fixed-bottom {
+  position: fixed;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1030; }
+
+@supports (position: sticky) {
+  .sticky-top {
+    position: sticky;
+    top: 0;
+    z-index: 1020; } }
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  overflow: visible;
+  clip: auto;
+  white-space: normal; }
+
+.shadow-sm {
+  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; }
+
+.shadow {
+  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; }
+
+.shadow-lg {
+  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; }
+
+.shadow-none {
+  box-shadow: none !important; }
+
+.w-25 {
+  width: 25% !important; }
+
+.w-50 {
+  width: 50% !important; }
+
+.w-75 {
+  width: 75% !important; }
+
+.w-100 {
+  width: 100% !important; }
+
+.w-auto {
+  width: auto !important; }
+
+.h-25 {
+  height: 25% !important; }
+
+.h-50 {
+  height: 50% !important; }
+
+.h-75 {
+  height: 75% !important; }
+
+.h-100 {
+  height: 100% !important; }
+
+.h-auto {
+  height: auto !important; }
+
+.mw-100 {
+  max-width: 100% !important; }
+
+.mh-100 {
+  max-height: 100% !important; }
+
+.min-vw-100 {
+  min-width: 100vw !important; }
+
+.min-vh-100 {
+  min-height: 100vh !important; }
+
+.vw-100 {
+  width: 100vw !important; }
+
+.vh-100 {
+  height: 100vh !important; }
+
+.stretched-link::after {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1;
+  pointer-events: auto;
+  content: "";
+  background-color: rgba(0, 0, 0, 0); }
+
+.m-0 {
+  margin: 0 !important; }
+
+.mt-0,
+.my-0 {
+  margin-top: 0 !important; }
+
+.mr-0,
+.mx-0 {
+  margin-right: 0 !important; }
+
+.mb-0,
+.my-0 {
+  margin-bottom: 0 !important; }
+
+.ml-0,
+.mx-0 {
+  margin-left: 0 !important; }
+
+.m-1 {
+  margin: 0.25rem !important; }
+
+.mt-1,
+.my-1 {
+  margin-top: 0.25rem !important; }
+
+.mr-1,
+.mx-1 {
+  margin-right: 0.25rem !important; }
+
+.mb-1,
+.my-1 {
+  margin-bottom: 0.25rem !important; }
+
+.ml-1,
+.mx-1 {
+  margin-left: 0.25rem !important; }
+
+.m-2 {
+  margin: 0.5rem !important; }
+
+.mt-2,
+.my-2 {
+  margin-top: 0.5rem !important; }
+
+.mr-2,
+.mx-2 {
+  margin-right: 0.5rem !important; }
+
+.mb-2,
+.my-2 {
+  margin-bottom: 0.5rem !important; }
+
+.ml-2,
+.mx-2 {
+  margin-left: 0.5rem !important; }
+
+.m-3 {
+  margin: 1rem !important; }
+
+.mt-3,
+.my-3 {
+  margin-top: 1rem !important; }
+
+.mr-3,
+.mx-3 {
+  margin-right: 1rem !important; }
+
+.mb-3,
+.my-3 {
+  margin-bottom: 1rem !important; }
+
+.ml-3,
+.mx-3 {
+  margin-left: 1rem !important; }
+
+.m-4 {
+  margin: 1.5rem !important; }
+
+.mt-4,
+.my-4 {
+  margin-top: 1.5rem !important; }
+
+.mr-4,
+.mx-4 {
+  margin-right: 1.5rem !important; }
+
+.mb-4,
+.my-4 {
+  margin-bottom: 1.5rem !important; }
+
+.ml-4,
+.mx-4 {
+  margin-left: 1.5rem !important; }
+
+.m-5 {
+  margin: 3rem !important; }
+
+.mt-5,
+.my-5 {
+  margin-top: 3rem !important; }
+
+.mr-5,
+.mx-5 {
+  margin-right: 3rem !important; }
+
+.mb-5,
+.my-5 {
+  margin-bottom: 3rem !important; }
+
+.ml-5,
+.mx-5 {
+  margin-left: 3rem !important; }
+
+.p-0 {
+  padding: 0 !important; }
+
+.pt-0,
+.py-0 {
+  padding-top: 0 !important; }
+
+.pr-0,
+.px-0 {
+  padding-right: 0 !important; }
+
+.pb-0,
+.py-0 {
+  padding-bottom: 0 !important; }
+
+.pl-0,
+.px-0 {
+  padding-left: 0 !important; }
+
+.p-1 {
+  padding: 0.25rem !important; }
+
+.pt-1,
+.py-1 {
+  padding-top: 0.25rem !important; }
+
+.pr-1,
+.px-1 {
+  padding-right: 0.25rem !important; }
+
+.pb-1,
+.py-1 {
+  padding-bottom: 0.25rem !important; }
+
+.pl-1,
+.px-1 {
+  padding-left: 0.25rem !important; }
+
+.p-2 {
+  padding: 0.5rem !important; }
+
+.pt-2,
+.py-2 {
+  padding-top: 0.5rem !important; }
+
+.pr-2,
+.px-2 {
+  padding-right: 0.5rem !important; }
+
+.pb-2,
+.py-2 {
+  padding-bottom: 0.5rem !important; }
+
+.pl-2,
+.px-2 {
+  padding-left: 0.5rem !important; }
+
+.p-3 {
+  padding: 1rem !important; }
+
+.pt-3,
+.py-3 {
+  padding-top: 1rem !important; }
+
+.pr-3,
+.px-3 {
+  padding-right: 1rem !important; }
+
+.pb-3,
+.py-3 {
+  padding-bottom: 1rem !important; }
+
+.pl-3,
+.px-3 {
+  padding-left: 1rem !important; }
+
+.p-4 {
+  padding: 1.5rem !important; }
+
+.pt-4,
+.py-4 {
+  padding-top: 1.5rem !important; }
+
+.pr-4,
+.px-4 {
+  padding-right: 1.5rem !important; }
+
+.pb-4,
+.py-4 {
+  padding-bottom: 1.5rem !important; }
+
+.pl-4,
+.px-4 {
+  padding-left: 1.5rem !important; }
+
+.p-5 {
+  padding: 3rem !important; }
+
+.pt-5,
+.py-5 {
+  padding-top: 3rem !important; }
+
+.pr-5,
+.px-5 {
+  padding-right: 3rem !important; }
+
+.pb-5,
+.py-5 {
+  padding-bottom: 3rem !important; }
+
+.pl-5,
+.px-5 {
+  padding-left: 3rem !important; }
+
+.m-n1 {
+  margin: -0.25rem !important; }
+
+.mt-n1,
+.my-n1 {
+  margin-top: -0.25rem !important; }
+
+.mr-n1,
+.mx-n1 {
+  margin-right: -0.25rem !important; }
+
+.mb-n1,
+.my-n1 {
+  margin-bottom: -0.25rem !important; }
+
+.ml-n1,
+.mx-n1 {
+  margin-left: -0.25rem !important; }
+
+.m-n2 {
+  margin: -0.5rem !important; }
+
+.mt-n2,
+.my-n2 {
+  margin-top: -0.5rem !important; }
+
+.mr-n2,
+.mx-n2 {
+  margin-right: -0.5rem !important; }
+
+.mb-n2,
+.my-n2 {
+  margin-bottom: -0.5rem !important; }
+
+.ml-n2,
+.mx-n2 {
+  margin-left: -0.5rem !important; }
+
+.m-n3 {
+  margin: -1rem !important; }
+
+.mt-n3,
+.my-n3 {
+  margin-top: -1rem !important; }
+
+.mr-n3,
+.mx-n3 {
+  margin-right: -1rem !important; }
+
+.mb-n3,
+.my-n3 {
+  margin-bottom: -1rem !important; }
+
+.ml-n3,
+.mx-n3 {
+  margin-left: -1rem !important; }
+
+.m-n4 {
+  margin: -1.5rem !important; }
+
+.mt-n4,
+.my-n4 {
+  margin-top: -1.5rem !important; }
+
+.mr-n4,
+.mx-n4 {
+  margin-right: -1.5rem !important; }
+
+.mb-n4,
+.my-n4 {
+  margin-bottom: -1.5rem !important; }
+
+.ml-n4,
+.mx-n4 {
+  margin-left: -1.5rem !important; }
+
+.m-n5 {
+  margin: -3rem !important; }
+
+.mt-n5,
+.my-n5 {
+  margin-top: -3rem !important; }
+
+.mr-n5,
+.mx-n5 {
+  margin-right: -3rem !important; }
+
+.mb-n5,
+.my-n5 {
+  margin-bottom: -3rem !important; }
+
+.ml-n5,
+.mx-n5 {
+  margin-left: -3rem !important; }
+
+.m-auto {
+  margin: auto !important; }
+
+.mt-auto,
+.my-auto {
+  margin-top: auto !important; }
+
+.mr-auto,
+.mx-auto {
+  margin-right: auto !important; }
+
+.mb-auto,
+.my-auto {
+  margin-bottom: auto !important; }
+
+.ml-auto,
+.mx-auto {
+  margin-left: auto !important; }
+
+@media (min-width: 576px) {
+  .m-sm-0 {
+    margin: 0 !important; }
+  .mt-sm-0,
+  .my-sm-0 {
+    margin-top: 0 !important; }
+  .mr-sm-0,
+  .mx-sm-0 {
+    margin-right: 0 !important; }
+  .mb-sm-0,
+  .my-sm-0 {
+    margin-bottom: 0 !important; }
+  .ml-sm-0,
+  .mx-sm-0 {
+    margin-left: 0 !important; }
+  .m-sm-1 {
+    margin: 0.25rem !important; }
+  .mt-sm-1,
+  .my-sm-1 {
+    margin-top: 0.25rem !important; }
+  .mr-sm-1,
+  .mx-sm-1 {
+    margin-right: 0.25rem !important; }
+  .mb-sm-1,
+  .my-sm-1 {
+    margin-bottom: 0.25rem !important; }
+  .ml-sm-1,
+  .mx-sm-1 {
+    margin-left: 0.25rem !important; }
+  .m-sm-2 {
+    margin: 0.5rem !important; }
+  .mt-sm-2,
+  .my-sm-2 {
+    margin-top: 0.5rem !important; }
+  .mr-sm-2,
+  .mx-sm-2 {
+    margin-right: 0.5rem !important; }
+  .mb-sm-2,
+  .my-sm-2 {
+    margin-bottom: 0.5rem !important; }
+  .ml-sm-2,
+  .mx-sm-2 {
+    margin-left: 0.5rem !important; }
+  .m-sm-3 {
+    margin: 1rem !important; }
+  .mt-sm-3,
+  .my-sm-3 {
+    margin-top: 1rem !important; }
+  .mr-sm-3,
+  .mx-sm-3 {
+    margin-right: 1rem !important; }
+  .mb-sm-3,
+  .my-sm-3 {
+    margin-bottom: 1rem !important; }
+  .ml-sm-3,
+  .mx-sm-3 {
+    margin-left: 1rem !important; }
+  .m-sm-4 {
+    margin: 1.5rem !important; }
+  .mt-sm-4,
+  .my-sm-4 {
+    margin-top: 1.5rem !important; }
+  .mr-sm-4,
+  .mx-sm-4 {
+    margin-right: 1.5rem !important; }
+  .mb-sm-4,
+  .my-sm-4 {
+    margin-bottom: 1.5rem !important; }
+  .ml-sm-4,
+  .mx-sm-4 {
+    margin-left: 1.5rem !important; }
+  .m-sm-5 {
+    margin: 3rem !important; }
+  .mt-sm-5,
+  .my-sm-5 {
+    margin-top: 3rem !important; }
+  .mr-sm-5,
+  .mx-sm-5 {
+    margin-right: 3rem !important; }
+  .mb-sm-5,
+  .my-sm-5 {
+    margin-bottom: 3rem !important; }
+  .ml-sm-5,
+  .mx-sm-5 {
+    margin-left: 3rem !important; }
+  .p-sm-0 {
+    padding: 0 !important; }
+  .pt-sm-0,
+  .py-sm-0 {
+    padding-top: 0 !important; }
+  .pr-sm-0,
+  .px-sm-0 {
+    padding-right: 0 !important; }
+  .pb-sm-0,
+  .py-sm-0 {
+    padding-bottom: 0 !important; }
+  .pl-sm-0,
+  .px-sm-0 {
+    padding-left: 0 !important; }
+  .p-sm-1 {
+    padding: 0.25rem !important; }
+  .pt-sm-1,
+  .py-sm-1 {
+    padding-top: 0.25rem !important; }
+  .pr-sm-1,
+  .px-sm-1 {
+    padding-right: 0.25rem !important; }
+  .pb-sm-1,
+  .py-sm-1 {
+    padding-bottom: 0.25rem !important; }
+  .pl-sm-1,
+  .px-sm-1 {
+    padding-left: 0.25rem !important; }
+  .p-sm-2 {
+    padding: 0.5rem !important; }
+  .pt-sm-2,
+  .py-sm-2 {
+    padding-top: 0.5rem !important; }
+  .pr-sm-2,
+  .px-sm-2 {
+    padding-right: 0.5rem !important; }
+  .pb-sm-2,
+  .py-sm-2 {
+    padding-bottom: 0.5rem !important; }
+  .pl-sm-2,
+  .px-sm-2 {
+    padding-left: 0.5rem !important; }
+  .p-sm-3 {
+    padding: 1rem !important; }
+  .pt-sm-3,
+  .py-sm-3 {
+    padding-top: 1rem !important; }
+  .pr-sm-3,
+  .px-sm-3 {
+    padding-right: 1rem !important; }
+  .pb-sm-3,
+  .py-sm-3 {
+    padding-bottom: 1rem !important; }
+  .pl-sm-3,
+  .px-sm-3 {
+    padding-left: 1rem !important; }
+  .p-sm-4 {
+    padding: 1.5rem !important; }
+  .pt-sm-4,
+  .py-sm-4 {
+    padding-top: 1.5rem !important; }
+  .pr-sm-4,
+  .px-sm-4 {
+    padding-right: 1.5rem !important; }
+  .pb-sm-4,
+  .py-sm-4 {
+    padding-bottom: 1.5rem !important; }
+  .pl-sm-4,
+  .px-sm-4 {
+    padding-left: 1.5rem !important; }
+  .p-sm-5 {
+    padding: 3rem !important; }
+  .pt-sm-5,
+  .py-sm-5 {
+    padding-top: 3rem !important; }
+  .pr-sm-5,
+  .px-sm-5 {
+    padding-right: 3rem !important; }
+  .pb-sm-5,
+  .py-sm-5 {
+    padding-bottom: 3rem !important; }
+  .pl-sm-5,
+  .px-sm-5 {
+    padding-left: 3rem !important; }
+  .m-sm-n1 {
+    margin: -0.25rem !important; }
+  .mt-sm-n1,
+  .my-sm-n1 {
+    margin-top: -0.25rem !important; }
+  .mr-sm-n1,
+  .mx-sm-n1 {
+    margin-right: -0.25rem !important; }
+  .mb-sm-n1,
+  .my-sm-n1 {
+    margin-bottom: -0.25rem !important; }
+  .ml-sm-n1,
+  .mx-sm-n1 {
+    margin-left: -0.25rem !important; }
+  .m-sm-n2 {
+    margin: -0.5rem !important; }
+  .mt-sm-n2,
+  .my-sm-n2 {
+    margin-top: -0.5rem !important; }
+  .mr-sm-n2,
+  .mx-sm-n2 {
+    margin-right: -0.5rem !important; }
+  .mb-sm-n2,
+  .my-sm-n2 {
+    margin-bottom: -0.5rem !important; }
+  .ml-sm-n2,
+  .mx-sm-n2 {
+    margin-left: -0.5rem !important; }
+  .m-sm-n3 {
+    margin: -1rem !important; }
+  .mt-sm-n3,
+  .my-sm-n3 {
+    margin-top: -1rem !important; }
+  .mr-sm-n3,
+  .mx-sm-n3 {
+    margin-right: -1rem !important; }
+  .mb-sm-n3,
+  .my-sm-n3 {
+    margin-bottom: -1rem !important; }
+  .ml-sm-n3,
+  .mx-sm-n3 {
+    margin-left: -1rem !important; }
+  .m-sm-n4 {
+    margin: -1.5rem !important; }
+  .mt-sm-n4,
+  .my-sm-n4 {
+    margin-top: -1.5rem !important; }
+  .mr-sm-n4,
+  .mx-sm-n4 {
+    margin-right: -1.5rem !important; }
+  .mb-sm-n4,
+  .my-sm-n4 {
+    margin-bottom: -1.5rem !important; }
+  .ml-sm-n4,
+  .mx-sm-n4 {
+    margin-left: -1.5rem !important; }
+  .m-sm-n5 {
+    margin: -3rem !important; }
+  .mt-sm-n5,
+  .my-sm-n5 {
+    margin-top: -3rem !important; }
+  .mr-sm-n5,
+  .mx-sm-n5 {
+    margin-right: -3rem !important; }
+  .mb-sm-n5,
+  .my-sm-n5 {
+    margin-bottom: -3rem !important; }
+  .ml-sm-n5,
+  .mx-sm-n5 {
+    margin-left: -3rem !important; }
+  .m-sm-auto {
+    margin: auto !important; }
+  .mt-sm-auto,
+  .my-sm-auto {
+    margin-top: auto !important; }
+  .mr-sm-auto,
+  .mx-sm-auto {
+    margin-right: auto !important; }
+  .mb-sm-auto,
+  .my-sm-auto {
+    margin-bottom: auto !important; }
+  .ml-sm-auto,
+  .mx-sm-auto {
+    margin-left: auto !important; } }
+
+@media (min-width: 768px) {
+  .m-md-0 {
+    margin: 0 !important; }
+  .mt-md-0,
+  .my-md-0 {
+    margin-top: 0 !important; }
+  .mr-md-0,
+  .mx-md-0 {
+    margin-right: 0 !important; }
+  .mb-md-0,
+  .my-md-0 {
+    margin-bottom: 0 !important; }
+  .ml-md-0,
+  .mx-md-0 {
+    margin-left: 0 !important; }
+  .m-md-1 {
+    margin: 0.25rem !important; }
+  .mt-md-1,
+  .my-md-1 {
+    margin-top: 0.25rem !important; }
+  .mr-md-1,
+  .mx-md-1 {
+    margin-right: 0.25rem !important; }
+  .mb-md-1,
+  .my-md-1 {
+    margin-bottom: 0.25rem !important; }
+  .ml-md-1,
+  .mx-md-1 {
+    margin-left: 0.25rem !important; }
+  .m-md-2 {
+    margin: 0.5rem !important; }
+  .mt-md-2,
+  .my-md-2 {
+    margin-top: 0.5rem !important; }
+  .mr-md-2,
+  .mx-md-2 {
+    margin-right: 0.5rem !important; }
+  .mb-md-2,
+  .my-md-2 {
+    margin-bottom: 0.5rem !important; }
+  .ml-md-2,
+  .mx-md-2 {
+    margin-left: 0.5rem !important; }
+  .m-md-3 {
+    margin: 1rem !important; }
+  .mt-md-3,
+  .my-md-3 {
+    margin-top: 1rem !important; }
+  .mr-md-3,
+  .mx-md-3 {
+    margin-right: 1rem !important; }
+  .mb-md-3,
+  .my-md-3 {
+    margin-bottom: 1rem !important; }
+  .ml-md-3,
+  .mx-md-3 {
+    margin-left: 1rem !important; }
+  .m-md-4 {
+    margin: 1.5rem !important; }
+  .mt-md-4,
+  .my-md-4 {
+    margin-top: 1.5rem !important; }
+  .mr-md-4,
+  .mx-md-4 {
+    margin-right: 1.5rem !important; }
+  .mb-md-4,
+  .my-md-4 {
+    margin-bottom: 1.5rem !important; }
+  .ml-md-4,
+  .mx-md-4 {
+    margin-left: 1.5rem !important; }
+  .m-md-5 {
+    margin: 3rem !important; }
+  .mt-md-5,
+  .my-md-5 {
+    margin-top: 3rem !important; }
+  .mr-md-5,
+  .mx-md-5 {
+    margin-right: 3rem !important; }
+  .mb-md-5,
+  .my-md-5 {
+    margin-bottom: 3rem !important; }
+  .ml-md-5,
+  .mx-md-5 {
+    margin-left: 3rem !important; }
+  .p-md-0 {
+    padding: 0 !important; }
+  .pt-md-0,
+  .py-md-0 {
+    padding-top: 0 !important; }
+  .pr-md-0,
+  .px-md-0 {
+    padding-right: 0 !important; }
+  .pb-md-0,
+  .py-md-0 {
+    padding-bottom: 0 !important; }
+  .pl-md-0,
+  .px-md-0 {
+    padding-left: 0 !important; }
+  .p-md-1 {
+    padding: 0.25rem !important; }
+  .pt-md-1,
+  .py-md-1 {
+    padding-top: 0.25rem !important; }
+  .pr-md-1,
+  .px-md-1 {
+    padding-right: 0.25rem !important; }
+  .pb-md-1,
+  .py-md-1 {
+    padding-bottom: 0.25rem !important; }
+  .pl-md-1,
+  .px-md-1 {
+    padding-left: 0.25rem !important; }
+  .p-md-2 {
+    padding: 0.5rem !important; }
+  .pt-md-2,
+  .py-md-2 {
+    padding-top: 0.5rem !important; }
+  .pr-md-2,
+  .px-md-2 {
+    padding-right: 0.5rem !important; }
+  .pb-md-2,
+  .py-md-2 {
+    padding-bottom: 0.5rem !important; }
+  .pl-md-2,
+  .px-md-2 {
+    padding-left: 0.5rem !important; }
+  .p-md-3 {
+    padding: 1rem !important; }
+  .pt-md-3,
+  .py-md-3 {
+    padding-top: 1rem !important; }
+  .pr-md-3,
+  .px-md-3 {
+    padding-right: 1rem !important; }
+  .pb-md-3,
+  .py-md-3 {
+    padding-bottom: 1rem !important; }
+  .pl-md-3,
+  .px-md-3 {
+    padding-left: 1rem !important; }
+  .p-md-4 {
+    padding: 1.5rem !important; }
+  .pt-md-4,
+  .py-md-4 {
+    padding-top: 1.5rem !important; }
+  .pr-md-4,
+  .px-md-4 {
+    padding-right: 1.5rem !important; }
+  .pb-md-4,
+  .py-md-4 {
+    padding-bottom: 1.5rem !important; }
+  .pl-md-4,
+  .px-md-4 {
+    padding-left: 1.5rem !important; }
+  .p-md-5 {
+    padding: 3rem !important; }
+  .pt-md-5,
+  .py-md-5 {
+    padding-top: 3rem !important; }
+  .pr-md-5,
+  .px-md-5 {
+    padding-right: 3rem !important; }
+  .pb-md-5,
+  .py-md-5 {
+    padding-bottom: 3rem !important; }
+  .pl-md-5,
+  .px-md-5 {
+    padding-left: 3rem !important; }
+  .m-md-n1 {
+    margin: -0.25rem !important; }
+  .mt-md-n1,
+  .my-md-n1 {
+    margin-top: -0.25rem !important; }
+  .mr-md-n1,
+  .mx-md-n1 {
+    margin-right: -0.25rem !important; }
+  .mb-md-n1,
+  .my-md-n1 {
+    margin-bottom: -0.25rem !important; }
+  .ml-md-n1,
+  .mx-md-n1 {
+    margin-left: -0.25rem !important; }
+  .m-md-n2 {
+    margin: -0.5rem !important; }
+  .mt-md-n2,
+  .my-md-n2 {
+    margin-top: -0.5rem !important; }
+  .mr-md-n2,
+  .mx-md-n2 {
+    margin-right: -0.5rem !important; }
+  .mb-md-n2,
+  .my-md-n2 {
+    margin-bottom: -0.5rem !important; }
+  .ml-md-n2,
+  .mx-md-n2 {
+    margin-left: -0.5rem !important; }
+  .m-md-n3 {
+    margin: -1rem !important; }
+  .mt-md-n3,
+  .my-md-n3 {
+    margin-top: -1rem !important; }
+  .mr-md-n3,
+  .mx-md-n3 {
+    margin-right: -1rem !important; }
+  .mb-md-n3,
+  .my-md-n3 {
+    margin-bottom: -1rem !important; }
+  .ml-md-n3,
+  .mx-md-n3 {
+    margin-left: -1rem !important; }
+  .m-md-n4 {
+    margin: -1.5rem !important; }
+  .mt-md-n4,
+  .my-md-n4 {
+    margin-top: -1.5rem !important; }
+  .mr-md-n4,
+  .mx-md-n4 {
+    margin-right: -1.5rem !important; }
+  .mb-md-n4,
+  .my-md-n4 {
+    margin-bottom: -1.5rem !important; }
+  .ml-md-n4,
+  .mx-md-n4 {
+    margin-left: -1.5rem !important; }
+  .m-md-n5 {
+    margin: -3rem !important; }
+  .mt-md-n5,
+  .my-md-n5 {
+    margin-top: -3rem !important; }
+  .mr-md-n5,
+  .mx-md-n5 {
+    margin-right: -3rem !important; }
+  .mb-md-n5,
+  .my-md-n5 {
+    margin-bottom: -3rem !important; }
+  .ml-md-n5,
+  .mx-md-n5 {
+    margin-left: -3rem !important; }
+  .m-md-auto {
+    margin: auto !important; }
+  .mt-md-auto,
+  .my-md-auto {
+    margin-top: auto !important; }
+  .mr-md-auto,
+  .mx-md-auto {
+    margin-right: auto !important; }
+  .mb-md-auto,
+  .my-md-auto {
+    margin-bottom: auto !important; }
+  .ml-md-auto,
+  .mx-md-auto {
+    margin-left: auto !important; } }
+
+@media (min-width: 992px) {
+  .m-lg-0 {
+    margin: 0 !important; }
+  .mt-lg-0,
+  .my-lg-0 {
+    margin-top: 0 !important; }
+  .mr-lg-0,
+  .mx-lg-0 {
+    margin-right: 0 !important; }
+  .mb-lg-0,
+  .my-lg-0 {
+    margin-bottom: 0 !important; }
+  .ml-lg-0,
+  .mx-lg-0 {
+    margin-left: 0 !important; }
+  .m-lg-1 {
+    margin: 0.25rem !important; }
+  .mt-lg-1,
+  .my-lg-1 {
+    margin-top: 0.25rem !important; }
+  .mr-lg-1,
+  .mx-lg-1 {
+    margin-right: 0.25rem !important; }
+  .mb-lg-1,
+  .my-lg-1 {
+    margin-bottom: 0.25rem !important; }
+  .ml-lg-1,
+  .mx-lg-1 {
+    margin-left: 0.25rem !important; }
+  .m-lg-2 {
+    margin: 0.5rem !important; }
+  .mt-lg-2,
+  .my-lg-2 {
+    margin-top: 0.5rem !important; }
+  .mr-lg-2,
+  .mx-lg-2 {
+    margin-right: 0.5rem !important; }
+  .mb-lg-2,
+  .my-lg-2 {
+    margin-bottom: 0.5rem !important; }
+  .ml-lg-2,
+  .mx-lg-2 {
+    margin-left: 0.5rem !important; }
+  .m-lg-3 {
+    margin: 1rem !important; }
+  .mt-lg-3,
+  .my-lg-3 {
+    margin-top: 1rem !important; }
+  .mr-lg-3,
+  .mx-lg-3 {
+    margin-right: 1rem !important; }
+  .mb-lg-3,
+  .my-lg-3 {
+    margin-bottom: 1rem !important; }
+  .ml-lg-3,
+  .mx-lg-3 {
+    margin-left: 1rem !important; }
+  .m-lg-4 {
+    margin: 1.5rem !important; }
+  .mt-lg-4,
+  .my-lg-4 {
+    margin-top: 1.5rem !important; }
+  .mr-lg-4,
+  .mx-lg-4 {
+    margin-right: 1.5rem !important; }
+  .mb-lg-4,
+  .my-lg-4 {
+    margin-bottom: 1.5rem !important; }
+  .ml-lg-4,
+  .mx-lg-4 {
+    margin-left: 1.5rem !important; }
+  .m-lg-5 {
+    margin: 3rem !important; }
+  .mt-lg-5,
+  .my-lg-5 {
+    margin-top: 3rem !important; }
+  .mr-lg-5,
+  .mx-lg-5 {
+    margin-right: 3rem !important; }
+  .mb-lg-5,
+  .my-lg-5 {
+    margin-bottom: 3rem !important; }
+  .ml-lg-5,
+  .mx-lg-5 {
+    margin-left: 3rem !important; }
+  .p-lg-0 {
+    padding: 0 !important; }
+  .pt-lg-0,
+  .py-lg-0 {
+    padding-top: 0 !important; }
+  .pr-lg-0,
+  .px-lg-0 {
+    padding-right: 0 !important; }
+  .pb-lg-0,
+  .py-lg-0 {
+    padding-bottom: 0 !important; }
+  .pl-lg-0,
+  .px-lg-0 {
+    padding-left: 0 !important; }
+  .p-lg-1 {
+    padding: 0.25rem !important; }
+  .pt-lg-1,
+  .py-lg-1 {
+    padding-top: 0.25rem !important; }
+  .pr-lg-1,
+  .px-lg-1 {
+    padding-right: 0.25rem !important; }
+  .pb-lg-1,
+  .py-lg-1 {
+    padding-bottom: 0.25rem !important; }
+  .pl-lg-1,
+  .px-lg-1 {
+    padding-left: 0.25rem !important; }
+  .p-lg-2 {
+    padding: 0.5rem !important; }
+  .pt-lg-2,
+  .py-lg-2 {
+    padding-top: 0.5rem !important; }
+  .pr-lg-2,
+  .px-lg-2 {
+    padding-right: 0.5rem !important; }
+  .pb-lg-2,
+  .py-lg-2 {
+    padding-bottom: 0.5rem !important; }
+  .pl-lg-2,
+  .px-lg-2 {
+    padding-left: 0.5rem !important; }
+  .p-lg-3 {
+    padding: 1rem !important; }
+  .pt-lg-3,
+  .py-lg-3 {
+    padding-top: 1rem !important; }
+  .pr-lg-3,
+  .px-lg-3 {
+    padding-right: 1rem !important; }
+  .pb-lg-3,
+  .py-lg-3 {
+    padding-bottom: 1rem !important; }
+  .pl-lg-3,
+  .px-lg-3 {
+    padding-left: 1rem !important; }
+  .p-lg-4 {
+    padding: 1.5rem !important; }
+  .pt-lg-4,
+  .py-lg-4 {
+    padding-top: 1.5rem !important; }
+  .pr-lg-4,
+  .px-lg-4 {
+    padding-right: 1.5rem !important; }
+  .pb-lg-4,
+  .py-lg-4 {
+    padding-bottom: 1.5rem !important; }
+  .pl-lg-4,
+  .px-lg-4 {
+    padding-left: 1.5rem !important; }
+  .p-lg-5 {
+    padding: 3rem !important; }
+  .pt-lg-5,
+  .py-lg-5 {
+    padding-top: 3rem !important; }
+  .pr-lg-5,
+  .px-lg-5 {
+    padding-right: 3rem !important; }
+  .pb-lg-5,
+  .py-lg-5 {
+    padding-bottom: 3rem !important; }
+  .pl-lg-5,
+  .px-lg-5 {
+    padding-left: 3rem !important; }
+  .m-lg-n1 {
+    margin: -0.25rem !important; }
+  .mt-lg-n1,
+  .my-lg-n1 {
+    margin-top: -0.25rem !important; }
+  .mr-lg-n1,
+  .mx-lg-n1 {
+    margin-right: -0.25rem !important; }
+  .mb-lg-n1,
+  .my-lg-n1 {
+    margin-bottom: -0.25rem !important; }
+  .ml-lg-n1,
+  .mx-lg-n1 {
+    margin-left: -0.25rem !important; }
+  .m-lg-n2 {
+    margin: -0.5rem !important; }
+  .mt-lg-n2,
+  .my-lg-n2 {
+    margin-top: -0.5rem !important; }
+  .mr-lg-n2,
+  .mx-lg-n2 {
+    margin-right: -0.5rem !important; }
+  .mb-lg-n2,
+  .my-lg-n2 {
+    margin-bottom: -0.5rem !important; }
+  .ml-lg-n2,
+  .mx-lg-n2 {
+    margin-left: -0.5rem !important; }
+  .m-lg-n3 {
+    margin: -1rem !important; }
+  .mt-lg-n3,
+  .my-lg-n3 {
+    margin-top: -1rem !important; }
+  .mr-lg-n3,
+  .mx-lg-n3 {
+    margin-right: -1rem !important; }
+  .mb-lg-n3,
+  .my-lg-n3 {
+    margin-bottom: -1rem !important; }
+  .ml-lg-n3,
+  .mx-lg-n3 {
+    margin-left: -1rem !important; }
+  .m-lg-n4 {
+    margin: -1.5rem !important; }
+  .mt-lg-n4,
+  .my-lg-n4 {
+    margin-top: -1.5rem !important; }
+  .mr-lg-n4,
+  .mx-lg-n4 {
+    margin-right: -1.5rem !important; }
+  .mb-lg-n4,
+  .my-lg-n4 {
+    margin-bottom: -1.5rem !important; }
+  .ml-lg-n4,
+  .mx-lg-n4 {
+    margin-left: -1.5rem !important; }
+  .m-lg-n5 {
+    margin: -3rem !important; }
+  .mt-lg-n5,
+  .my-lg-n5 {
+    margin-top: -3rem !important; }
+  .mr-lg-n5,
+  .mx-lg-n5 {
+    margin-right: -3rem !important; }
+  .mb-lg-n5,
+  .my-lg-n5 {
+    margin-bottom: -3rem !important; }
+  .ml-lg-n5,
+  .mx-lg-n5 {
+    margin-left: -3rem !important; }
+  .m-lg-auto {
+    margin: auto !important; }
+  .mt-lg-auto,
+  .my-lg-auto {
+    margin-top: auto !important; }
+  .mr-lg-auto,
+  .mx-lg-auto {
+    margin-right: auto !important; }
+  .mb-lg-auto,
+  .my-lg-auto {
+    margin-bottom: auto !important; }
+  .ml-lg-auto,
+  .mx-lg-auto {
+    margin-left: auto !important; } }
+
+@media (min-width: 1200px) {
+  .m-xl-0 {
+    margin: 0 !important; }
+  .mt-xl-0,
+  .my-xl-0 {
+    margin-top: 0 !important; }
+  .mr-xl-0,
+  .mx-xl-0 {
+    margin-right: 0 !important; }
+  .mb-xl-0,
+  .my-xl-0 {
+    margin-bottom: 0 !important; }
+  .ml-xl-0,
+  .mx-xl-0 {
+    margin-left: 0 !important; }
+  .m-xl-1 {
+    margin: 0.25rem !important; }
+  .mt-xl-1,
+  .my-xl-1 {
+    margin-top: 0.25rem !important; }
+  .mr-xl-1,
+  .mx-xl-1 {
+    margin-right: 0.25rem !important; }
+  .mb-xl-1,
+  .my-xl-1 {
+    margin-bottom: 0.25rem !important; }
+  .ml-xl-1,
+  .mx-xl-1 {
+    margin-left: 0.25rem !important; }
+  .m-xl-2 {
+    margin: 0.5rem !important; }
+  .mt-xl-2,
+  .my-xl-2 {
+    margin-top: 0.5rem !important; }
+  .mr-xl-2,
+  .mx-xl-2 {
+    margin-right: 0.5rem !important; }
+  .mb-xl-2,
+  .my-xl-2 {
+    margin-bottom: 0.5rem !important; }
+  .ml-xl-2,
+  .mx-xl-2 {
+    margin-left: 0.5rem !important; }
+  .m-xl-3 {
+    margin: 1rem !important; }
+  .mt-xl-3,
+  .my-xl-3 {
+    margin-top: 1rem !important; }
+  .mr-xl-3,
+  .mx-xl-3 {
+    margin-right: 1rem !important; }
+  .mb-xl-3,
+  .my-xl-3 {
+    margin-bottom: 1rem !important; }
+  .ml-xl-3,
+  .mx-xl-3 {
+    margin-left: 1rem !important; }
+  .m-xl-4 {
+    margin: 1.5rem !important; }
+  .mt-xl-4,
+  .my-xl-4 {
+    margin-top: 1.5rem !important; }
+  .mr-xl-4,
+  .mx-xl-4 {
+    margin-right: 1.5rem !important; }
+  .mb-xl-4,
+  .my-xl-4 {
+    margin-bottom: 1.5rem !important; }
+  .ml-xl-4,
+  .mx-xl-4 {
+    margin-left: 1.5rem !important; }
+  .m-xl-5 {
+    margin: 3rem !important; }
+  .mt-xl-5,
+  .my-xl-5 {
+    margin-top: 3rem !important; }
+  .mr-xl-5,
+  .mx-xl-5 {
+    margin-right: 3rem !important; }
+  .mb-xl-5,
+  .my-xl-5 {
+    margin-bottom: 3rem !important; }
+  .ml-xl-5,
+  .mx-xl-5 {
+    margin-left: 3rem !important; }
+  .p-xl-0 {
+    padding: 0 !important; }
+  .pt-xl-0,
+  .py-xl-0 {
+    padding-top: 0 !important; }
+  .pr-xl-0,
+  .px-xl-0 {
+    padding-right: 0 !important; }
+  .pb-xl-0,
+  .py-xl-0 {
+    padding-bottom: 0 !important; }
+  .pl-xl-0,
+  .px-xl-0 {
+    padding-left: 0 !important; }
+  .p-xl-1 {
+    padding: 0.25rem !important; }
+  .pt-xl-1,
+  .py-xl-1 {
+    padding-top: 0.25rem !important; }
+  .pr-xl-1,
+  .px-xl-1 {
+    padding-right: 0.25rem !important; }
+  .pb-xl-1,
+  .py-xl-1 {
+    padding-bottom: 0.25rem !important; }
+  .pl-xl-1,
+  .px-xl-1 {
+    padding-left: 0.25rem !important; }
+  .p-xl-2 {
+    padding: 0.5rem !important; }
+  .pt-xl-2,
+  .py-xl-2 {
+    padding-top: 0.5rem !important; }
+  .pr-xl-2,
+  .px-xl-2 {
+    padding-right: 0.5rem !important; }
+  .pb-xl-2,
+  .py-xl-2 {
+    padding-bottom: 0.5rem !important; }
+  .pl-xl-2,
+  .px-xl-2 {
+    padding-left: 0.5rem !important; }
+  .p-xl-3 {
+    padding: 1rem !important; }
+  .pt-xl-3,
+  .py-xl-3 {
+    padding-top: 1rem !important; }
+  .pr-xl-3,
+  .px-xl-3 {
+    padding-right: 1rem !important; }
+  .pb-xl-3,
+  .py-xl-3 {
+    padding-bottom: 1rem !important; }
+  .pl-xl-3,
+  .px-xl-3 {
+    padding-left: 1rem !important; }
+  .p-xl-4 {
+    padding: 1.5rem !important; }
+  .pt-xl-4,
+  .py-xl-4 {
+    padding-top: 1.5rem !important; }
+  .pr-xl-4,
+  .px-xl-4 {
+    padding-right: 1.5rem !important; }
+  .pb-xl-4,
+  .py-xl-4 {
+    padding-bottom: 1.5rem !important; }
+  .pl-xl-4,
+  .px-xl-4 {
+    padding-left: 1.5rem !important; }
+  .p-xl-5 {
+    padding: 3rem !important; }
+  .pt-xl-5,
+  .py-xl-5 {
+    padding-top: 3rem !important; }
+  .pr-xl-5,
+  .px-xl-5 {
+    padding-right: 3rem !important; }
+  .pb-xl-5,
+  .py-xl-5 {
+    padding-bottom: 3rem !important; }
+  .pl-xl-5,
+  .px-xl-5 {
+    padding-left: 3rem !important; }
+  .m-xl-n1 {
+    margin: -0.25rem !important; }
+  .mt-xl-n1,
+  .my-xl-n1 {
+    margin-top: -0.25rem !important; }
+  .mr-xl-n1,
+  .mx-xl-n1 {
+    margin-right: -0.25rem !important; }
+  .mb-xl-n1,
+  .my-xl-n1 {
+    margin-bottom: -0.25rem !important; }
+  .ml-xl-n1,
+  .mx-xl-n1 {
+    margin-left: -0.25rem !important; }
+  .m-xl-n2 {
+    margin: -0.5rem !important; }
+  .mt-xl-n2,
+  .my-xl-n2 {
+    margin-top: -0.5rem !important; }
+  .mr-xl-n2,
+  .mx-xl-n2 {
+    margin-right: -0.5rem !important; }
+  .mb-xl-n2,
+  .my-xl-n2 {
+    margin-bottom: -0.5rem !important; }
+  .ml-xl-n2,
+  .mx-xl-n2 {
+    margin-left: -0.5rem !important; }
+  .m-xl-n3 {
+    margin: -1rem !important; }
+  .mt-xl-n3,
+  .my-xl-n3 {
+    margin-top: -1rem !important; }
+  .mr-xl-n3,
+  .mx-xl-n3 {
+    margin-right: -1rem !important; }
+  .mb-xl-n3,
+  .my-xl-n3 {
+    margin-bottom: -1rem !important; }
+  .ml-xl-n3,
+  .mx-xl-n3 {
+    margin-left: -1rem !important; }
+  .m-xl-n4 {
+    margin: -1.5rem !important; }
+  .mt-xl-n4,
+  .my-xl-n4 {
+    margin-top: -1.5rem !important; }
+  .mr-xl-n4,
+  .mx-xl-n4 {
+    margin-right: -1.5rem !important; }
+  .mb-xl-n4,
+  .my-xl-n4 {
+    margin-bottom: -1.5rem !important; }
+  .ml-xl-n4,
+  .mx-xl-n4 {
+    margin-left: -1.5rem !important; }
+  .m-xl-n5 {
+    margin: -3rem !important; }
+  .mt-xl-n5,
+  .my-xl-n5 {
+    margin-top: -3rem !important; }
+  .mr-xl-n5,
+  .mx-xl-n5 {
+    margin-right: -3rem !important; }
+  .mb-xl-n5,
+  .my-xl-n5 {
+    margin-bottom: -3rem !important; }
+  .ml-xl-n5,
+  .mx-xl-n5 {
+    margin-left: -3rem !important; }
+  .m-xl-auto {
+    margin: auto !important; }
+  .mt-xl-auto,
+  .my-xl-auto {
+    margin-top: auto !important; }
+  .mr-xl-auto,
+  .mx-xl-auto {
+    margin-right: auto !important; }
+  .mb-xl-auto,
+  .my-xl-auto {
+    margin-bottom: auto !important; }
+  .ml-xl-auto,
+  .mx-xl-auto {
+    margin-left: auto !important; } }
+
+.text-monospace {
+  font-family: "Hack", monospace !important; }
+
+.text-justify {
+  text-align: justify !important; }
+
+.text-wrap {
+  white-space: normal !important; }
+
+.text-nowrap {
+  white-space: nowrap !important; }
+
+.text-truncate {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap; }
+
+.text-left {
+  text-align: left !important; }
+
+.text-right {
+  text-align: right !important; }
+
+.text-center {
+  text-align: center !important; }
+
+@media (min-width: 576px) {
+  .text-sm-left {
+    text-align: left !important; }
+  .text-sm-right {
+    text-align: right !important; }
+  .text-sm-center {
+    text-align: center !important; } }
+
+@media (min-width: 768px) {
+  .text-md-left {
+    text-align: left !important; }
+  .text-md-right {
+    text-align: right !important; }
+  .text-md-center {
+    text-align: center !important; } }
+
+@media (min-width: 992px) {
+  .text-lg-left {
+    text-align: left !important; }
+  .text-lg-right {
+    text-align: right !important; }
+  .text-lg-center {
+    text-align: center !important; } }
+
+@media (min-width: 1200px) {
+  .text-xl-left {
+    text-align: left !important; }
+  .text-xl-right {
+    text-align: right !important; }
+  .text-xl-center {
+    text-align: center !important; } }
+
+.text-lowercase {
+  text-transform: lowercase !important; }
+
+.text-uppercase {
+  text-transform: uppercase !important; }
+
+.text-capitalize {
+  text-transform: capitalize !important; }
+
+.font-weight-light {
+  font-weight: 300 !important; }
+
+.font-weight-lighter {
+  font-weight: lighter !important; }
+
+.font-weight-normal {
+  font-weight: 400 !important; }
+
+.font-weight-bold {
+  font-weight: 700 !important; }
+
+.font-weight-bolder {
+  font-weight: bolder !important; }
+
+.font-italic {
+  font-style: italic !important; }
+
+.text-white {
+  color: #fff !important; }
+
+.text-primary {
+  color: #3c6eb4 !important; }
+
+a.text-primary:hover, a.text-primary:focus {
+  color: #294b7b !important; }
+
+.text-secondary {
+  color: #6c757d !important; }
+
+a.text-secondary:hover, a.text-secondary:focus {
+  color: #494f54 !important; }
+
+.text-success {
+  color: #28a745 !important; }
+
+a.text-success:hover, a.text-success:focus {
+  color: #19692c !important; }
+
+.text-info {
+  color: #17a2b8 !important; }
+
+a.text-info:hover, a.text-info:focus {
+  color: #0f6674 !important; }
+
+.text-warning {
+  color: #ffc107 !important; }
+
+a.text-warning:hover, a.text-warning:focus {
+  color: #ba8b00 !important; }
+
+.text-danger {
+  color: #dc3545 !important; }
+
+a.text-danger:hover, a.text-danger:focus {
+  color: #a71d2a !important; }
+
+.text-light {
+  color: #f8f9fa !important; }
+
+a.text-light:hover, a.text-light:focus {
+  color: #cbd3da !important; }
+
+.text-dark {
+  color: #343a40 !important; }
+
+a.text-dark:hover, a.text-dark:focus {
+  color: #121416 !important; }
+
+.text-body {
+  color: #373a3c !important; }
+
+.text-muted {
+  color: #6c757d !important; }
+
+.text-black-50 {
+  color: rgba(0, 0, 0, 0.5) !important; }
+
+.text-white-50 {
+  color: rgba(255, 255, 255, 0.5) !important; }
+
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0; }
+
+.text-decoration-none {
+  text-decoration: none !important; }
+
+.text-break {
+  word-break: break-word !important;
+  overflow-wrap: break-word !important; }
+
+.text-reset {
+  color: inherit !important; }
+
+.visible {
+  visibility: visible !important; }
+
+.invisible {
+  visibility: hidden !important; }
+
+@media print {
+  *,
+  *::before,
+  *::after {
+    text-shadow: none !important;
+    box-shadow: none !important; }
+  a:not(.btn) {
+    text-decoration: underline; }
+  abbr[title]::after {
+    content: " (" attr(title) ")"; }
+  pre {
+    white-space: pre-wrap !important; }
+  pre,
+  blockquote {
+    border: 1px solid #adb5bd;
+    page-break-inside: avoid; }
+  thead {
+    display: table-header-group; }
+  tr,
+  img {
+    page-break-inside: avoid; }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3; }
+  h2,
+  h3 {
+    page-break-after: avoid; }
+  @page {
+    size: a3; }
+  body {
+    min-width: 992px !important; }
+  .container {
+    min-width: 992px !important; }
+  .navbar {
+    display: none; }
+  .badge {
+    border: 1px solid #000; }
+  .table {
+    border-collapse: collapse !important; }
+    .table td,
+    .table th {
+      background-color: #fff !important; }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #dee2e6 !important; }
+  .table-dark {
+    color: inherit; }
+    .table-dark th,
+    .table-dark td,
+    .table-dark thead th,
+    .table-dark tbody + tbody {
+      border-color: #dee2e6; }
+  .table .thead-dark th {
+    color: inherit;
+    border-color: #dee2e6; } }
+
+.container-narrow {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto; }
+  @media (min-width: 576px) {
+    .container-narrow {
+      max-width: 34rem; } }
+  @media (min-width: 768px) {
+    .container-narrow {
+      max-width: 45rem; } }
+  @media (min-width: 992px) {
+    .container-narrow {
+      max-width: 45rem; } }
+  @media (min-width: 1200px) {
+    .container-narrow {
+      max-width: 45rem; } }
+
+/*------------------------------------*\
+    #LISTS
+\*------------------------------------*/
+/**
+ * Inline list
+ */
+.inline-list li {
+  display: inline-block; }
+
+/**
+ * Social list
+ */
+.social-list li {
+  margin: 0 0.4rem 1em 0; }
+
+.social-list a {
+  font-size: 1.6em; }
+
+/**
+ * Headline list
+ */
+.headline-list {
+  margin-bottom: 1em; }
+  .headline-list.flush {
+    margin: 0; }
+  .headline-list h4 {
+    font-weight: normal; }
+  .headline-list li {
+    padding: 1em/4 0;
+    border-top: 1px solid #d5d5d5; }
+
+/**
+ * Post list
+ */
+.post-list li {
+  margin-bottom: 1em; }
+
+/**
+ * Bullet list
+ */
+.bullet-list {
+  list-style: square;
+  margin: 0 0 1em 1.2em;
+  line-height: 1.3; }
+  .bullet-list li {
+    margin-bottom: 1em; }
+
+/**
+ * Text list
+ */
+.text-list {
+  margin: 0 0 1em;
+  line-height: 1.3; }
+  .text-list li {
+    margin-bottom: 1em; }
+
+/**
+ * Media List
+ */
+.c-media-list__item {
+  margin-bottom: 1.5em; }
+
+/**
+ * Tile list
+ */
+.c-tile-list {
+  display: flex;
+  flex-direction: column; }
+  @media all and (min-width: 55rem) {
+    .c-tile-list {
+      flex-direction: row;
+      flex-wrap: wrap; } }
+
+/**
+ * Tile list item
+ */
+.c-tile-list__item {
+  width: 100%;
+  margin-bottom: 1em;
+  position: relative; }
+  .c-tile-list__item:nth-child(2n) {
+    padding-right: 0; }
+  @media all and (min-width: 55rem) {
+    .c-tile-list__item {
+      width: 50%;
+      margin: 0;
+      padding: 0 1em 1em 0; } }
+
+/** Thumbnail list
+ *
+ */
+.c-thumbnail-list li {
+  margin-bottom: 1.5em; }
+
+.c-thumbnail-list .c-block-media__media {
+  width: 80px; }
+
+.c-thumbnail-list .c-block-media__headline {
+  text-transform: none !important;
+  font-size: 1.5em; }
+
+/**
+ * Color bars list
+ */
+.c-color-bars-list li {
+  max-width: 480px;
+  position: relative;
+  height: 80px;
+  padding-top: 15px;
+  padding-left: 20px;
+  border: 1px solid #d5d5d5;
+  border-top: 0;
+  color: #55595c;
+  font-size: 1.3rem;
+  font-weight: bold; }
+  .c-color-bars-list li:first-child {
+    border-top: 1px solid #d5d5d5; }
+  .c-color-bars-list li.cur {
+    height: 120px; }
+    .c-color-bars-list li.cur:before {
+      position: absolute;
+      height: 100%;
+      width: 10px;
+      bottom: 0px;
+      left: 0px;
+      content: "";
+      background: #3c6eb4; }
+  .c-color-bars-list li.prev:before {
+    position: absolute;
+    height: 100%;
+    width: 10px;
+    bottom: 0px;
+    left: 0px;
+    content: "";
+    background: #79db32; }
+  .c-color-bars-list li.old {
+    color: #d5d5d5; }
+
+/**
+ * Ticket list
+ */
+.c-ticket-list {
+  max-width: 480px; }
+  .c-ticket-list li {
+    border: 1px solid #d5d5d5;
+    border-top: 0;
+    padding: 15px 20px;
+    color: #808080; }
+  .c-ticket-list:first-child {
+    border-top: 1px solid #d5d5d5; }
+  .c-ticket-list .list-item-title, .c-ticket-list .list-item-data {
+    float: left; }
+  .c-ticket-list .list-item-title {
+    border-radius: 20px;
+    padding: 4px 10px;
+    background: #808080;
+    color: white;
+    font-size: 1.2rem;
+    font-weight: bold; }
+  .c-ticket-list .origin {
+    float: right;
+    margin-top: 3px; }
+    .c-ticket-list .origin p {
+      display: inline-block;
+      margin-right: 2px; }
+    .c-ticket-list .origin img {
+      margin-bottom: 5px; }
+  .c-ticket-list .c-widget-action-btn.btn {
+    float: right;
+    padding: 3px 15px; }
+    .c-ticket-list .c-widget-action-btn.btn img {
+      display: block; }
+  .c-ticket-list .list-subheader {
+    font-size: 1.2rem;
+    font-weight: bold; }
+  .c-ticket-list .list-item-info, .c-ticket-list .list-item-data {
+    margin: 0;
+    font-size: 1.2rem; }
+
+.nav-underline .nav-item.active, .nav-underline .nav-item.active:hover {
+  box-shadow: 0px -3px 0 0 #3c6eb4 inset; }
+  .nav-underline .nav-item.active .nav-link, .nav-underline .nav-item.active:hover .nav-link {
+    color: #3c6eb4; }
+
+.nav-underline li:hover {
+  box-shadow: 0px -3px 0 0 #ddd inset; }
+
+.nav-underline li {
+  padding-top: 0.2rem;
+  padding-bottom: 0.2rem; }
+
+.navbar-underline {
+  background-color: #d5d5d5;
+  border-top: 1px solid #c8c8c8; }
+
+pre {
+  background-color: #fdf6e3;
+  padding: 1rem; }
+
+.table-expand-col {
+  min-width: 100%; }
+
+body {
+  background-color: #495057; }
+
+/*.card-success {
+  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
+  .card-header{
+    background-color:darken($alert-success-bg, 5%);
+    border-bottom:1px solid darken($alert-success-bg, 10%)
+  }
+}
+
+.card-info {
+  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
+  .card-header{
+    background-color:darken($alert-info-bg, 5%);
+    border-bottom:1px solid darken($alert-info-bg, 10%)
+  }
+}
+
+.card-primary {
+  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
+  .card-header{
+    background-color:darken($alert-info-bg, 5%);
+    border-bottom:1px solid darken($alert-info-bg, 10%)
+  }
+}
+
+.card-warning {
+  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
+  .card-header{
+    background-color:darken($alert-warning-bg, 5%);
+    border-bottom:1px solid darken($alert-warning-bg, 10%)
+  }
+}
+
+.card-danger {
+  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
+  .card-header{
+    background-color:darken($alert-danger-bg, 5%);
+    border-bottom:1px solid darken($alert-danger-bg, 10%)
+  }
+}*/
+.modal-header {
+  background-color: #eceeef; }
+
+.modal-footer {
+  border-top: 0px !important; }
+
+.modal h4 {
+  text-transform: none !important; }
+
+.modal-card {
+  background-color: #d5d5d5;
+  padding: 15px; }
+
+.modal-body h4 {
+  font-weight: 600 !important; }
+
+/** TODO
+
+* work with inkscape design and get .c-widget-header h5 style overrides matching it better
+* fine-tune positioning of c-widget-header-btns
+
+**/
+/**
+ * Widget header
+ */
+.c-widget-header.card-header {
+  padding: 10px 10px 5px 10px;
+  max-width: 480px;
+  border: 1px solid #d5d5d5;
+  border-radius: 0 !important;
+  background: #f7f7f9; }
+
+.c-widget-header h6 {
+  font-family: "Open Sans";
+  font-size: 1.3rem;
+  font-weight: normal; }
+
+.c-widget-header-btn {
+  margin-top: -29px;
+  float: right; }
+
+/**
+ * Widget action button
+ */
+.c-widget-action-btn.btn {
+  padding: 5px 10px;
+  color: #a07cbc;
+  font-weight: bold; }
+  .c-widget-action-btn.btn:hover, .c-widget-action-btn.btn:focus, .c-widget-action-btn.btn:active, .c-widget-action-btn.btn:active:focus {
+    color: #a07cbc; }
+
+/**
+ * Widget view more button
+ */
+.c-widget-view-more-btn button {
+  padding: 0px;
+  margin-right: 5px;
+  color: #808080;
+  font-size: 1.2rem; }
+  .c-widget-view-more-btn button:hover, .c-widget-view-more-btn button:focus {
+    color: #55595c; }
+
+.c-widget-view-more-btn img {
+  margin-top: 2px; }
+
+/**
+ * Widget meeting event
+ */
+.c-widget-meeting-event {
+  max-width: 480px;
+  border: 1px solid #d5d5d5;
+  padding: 15px 20px; }
+  .c-widget-meeting-event h6, .c-widget-meeting-event h5, .c-widget-meeting-event p {
+    color: #55595c;
+    font-family: "Open Sans"; }
+  .c-widget-meeting-event h5 {
+    font-weight: bold;
+    font-size: 2rem; }
+  .c-widget-meeting-event h6 {
+    margin-top: 2px;
+    margin-bottom: 10px;
+    font-size: 1.1rem; }
+  .c-widget-meeting-event .date, .c-widget-meeting-event .time-ch {
+    font-size: 0.9rem;
+    float: left; }
+  .c-widget-meeting-event button {
+    float: right; }
+  .c-widget-meeting-event .date {
+    margin-right: 20px; }
+  .c-widget-meeting-event .time-ch p, .c-widget-meeting-event .time-ch a {
+    padding: 0;
+    margin: 0; }
+
+/**
+ * Widget meeting request
+ */
+.c-widget-meeting-request {
+  max-width: 480px;
+  border: 1px solid #d5d5d5;
+  padding: 15px 20px; }
+  .c-widget-meeting-request h6, .c-widget-meeting-request h5 {
+    color: #55595c;
+    font-family: "Open Sans"; }
+  .c-widget-meeting-request h5 {
+    float: left;
+    font-weight: bold;
+    font-size: 2rem; }
+  .c-widget-meeting-request h6 {
+    margin-top: 2px;
+    margin-bottom: 10px;
+    font-size: 1.1rem; }
+  .c-widget-meeting-request .meeting-request-btn {
+    float: right; }
+
+.masthead {
+  background-image: linear-gradient(to bottom, #eee 0%, #ddd 100%);
+  background-repeat: repeat-x;
+  padding-top: 10px;
+  padding-bottom: 10px; }
+
+.subheader {
+  background: #f8f9fa;
+  border-bottom: 1px solid #dee2e6; }
+  .subheader .nav-tabs {
+    margin-bottom: -1px; }
+
+.footer {
+  background-color: #495057; }
+
+.bodycontent {
+  background: #fff; }
+
+/*Overrides for content generated by python docutils*/
+.document-docutils > .section {
+  padding-bottom: 1rem; }
+
+.document-docutils pre {
+  /* Comment */
+  /* Error */
+  /* Generic */
+  /* Keyword */
+  /* Literal */
+  /* Name */
+  /* Operator */
+  /* Other */
+  /* Punctuation */
+  /* Comment.Multiline */
+  /* Comment.Preproc */
+  /* Comment.Single */
+  /* Comment.Special */
+  /* Generic.Deleted */
+  /* Generic.Emph */
+  /* Generic.Error */
+  /* Generic.Heading */
+  /* Generic.Inserted */
+  /* Generic.Output */
+  /* Generic.Prompt */
+  /* Generic.Strong */
+  /* Generic.Subheading */
+  /* Generic.Traceback */
+  /* Keyword.Constant */
+  /* Keyword.Declaration */
+  /* Keyword.Namespace */
+  /* Keyword.Pseudo */
+  /* Keyword.Reserved */
+  /* Keyword.Type */
+  /* Literal.Date */
+  /* Literal.Number */
+  /* Literal.String */
+  /* Name.Attribute */
+  /* Name.Builtin */
+  /* Name.Class */
+  /* Name.Constant */
+  /* Name.Decorator */
+  /* Name.Entity */
+  /* Name.Exception */
+  /* Name.Function */
+  /* Name.Label */
+  /* Name.Namespace */
+  /* Name.Other */
+  /* Name.Property */
+  /* Name.Tag */
+  /* Name.Variable */
+  /* Operator.Word */
+  /* Text.Whitespace */
+  /* Literal.Number.Float */
+  /* Literal.Number.Hex */
+  /* Literal.Number.Integer */
+  /* Literal.Number.Oct */
+  /* Literal.String.Backtick */
+  /* Literal.String.Char */
+  /* Literal.String.Doc */
+  /* Literal.String.Double */
+  /* Literal.String.Escape */
+  /* Literal.String.Heredoc */
+  /* Literal.String.Interpol */
+  /* Literal.String.Other */
+  /* Literal.String.Regex */
+  /* Literal.String.Single */
+  /* Literal.String.Symbol */
+  /* Name.Builtin.Pseudo */
+  /* Name.Variable.Class */
+  /* Name.Variable.Global */
+  /* Name.Variable.Instance */
+  /* Literal.Number.Integer.Long */ }
+  .document-docutils pre .comment {
+    color: #586e75; }
+  .document-docutils pre .error {
+    color: #93a1a1; }
+  .document-docutils pre .generic {
+    color: #93a1a1; }
+  .document-docutils pre .keyword {
+    color: #859900; }
+  .document-docutils pre .literal {
+    color: #93a1a1; }
+  .document-docutils pre .name {
+    color: #93a1a1; }
+  .document-docutils pre .operator {
+    color: #859900; }
+  .document-docutils pre .other {
+    color: #cb4b16; }
+  .document-docutils pre .punctuation {
+    color: #93a1a1; }
+  .document-docutils pre .comment.multiline {
+    color: #586e75; }
+  .document-docutils pre .comment.preproc {
+    color: #859900; }
+  .document-docutils pre .comment.single {
+    color: #586e75; }
+  .document-docutils pre .comment.special {
+    color: #859900; }
+  .document-docutils pre .generic.deleted {
+    color: #2aa198; }
+  .document-docutils pre .generic.emph {
+    color: #93a1a1;
+    font-style: italic; }
+  .document-docutils pre .generic.error {
+    color: #dc322f; }
+  .document-docutils pre .generic.heading {
+    color: #cb4b16; }
+  .document-docutils pre .generic.inserted {
+    color: #859900; }
+  .document-docutils pre .generic.output {
+    color: #93a1a1; }
+  .document-docutils pre .generic.prompt {
+    color: #93a1a1; }
+  .document-docutils pre .generic.strong {
+    color: #93a1a1;
+    font-weight: bold; }
+  .document-docutils pre .generic.subheading {
+    color: #cb4b16; }
+  .document-docutils pre .generic.traceback {
+    color: #93a1a1; }
+  .document-docutils pre .keyword.constant {
+    color: #cb4b16; }
+  .document-docutils pre .keyword.declaration {
+    color: #268bd2; }
+  .document-docutils pre .keyword.namespace {
+    color: #859900; }
+  .document-docutils pre .keyword.pseudo {
+    color: #859900; }
+  .document-docutils pre .keyword.reserved {
+    color: #268bd2; }
+  .document-docutils pre .keyword.type {
+    color: #dc322f; }
+  .document-docutils pre .literal.date {
+    color: #93a1a1; }
+  .document-docutils pre .literal.number {
+    color: #2aa198; }
+  .document-docutils pre .literal.string {
+    color: #2aa198; }
+  .document-docutils pre .name.attribute {
+    color: #93a1a1; }
+  .document-docutils pre .name.builtin {
+    color: #B58900; }
+  .document-docutils pre .name.class {
+    color: #268bd2; }
+  .document-docutils pre .name.constant {
+    color: #cb4b16; }
+  .document-docutils pre .name.decorator {
+    color: #268bd2; }
+  .document-docutils pre .name.entity {
+    color: #cb4b16; }
+  .document-docutils pre .name.exception {
+    color: #cb4b16; }
+  .document-docutils pre .name.function {
+    color: #268bd2; }
+  .document-docutils pre .name.label {
+    color: #93a1a1; }
+  .document-docutils pre .name.namespace {
+    color: #93a1a1; }
+  .document-docutils pre .name.other {
+    color: #93a1a1; }
+  .document-docutils pre .name.property {
+    color: #93a1a1; }
+  .document-docutils pre .name.tag {
+    color: #268bd2; }
+  .document-docutils pre .name.variable {
+    color: #268bd2; }
+  .document-docutils pre .operator.word {
+    color: #859900; }
+  .document-docutils pre .text.whitespace {
+    color: #93a1a1; }
+  .document-docutils pre .literal.number.float {
+    color: #2aa198; }
+  .document-docutils pre .literal.number.hex {
+    color: #2aa198; }
+  .document-docutils pre .literal.number.integer {
+    color: #2aa198; }
+  .document-docutils pre .literal.number.oct {
+    color: #2aa198; }
+  .document-docutils pre .literal.string.backtick {
+    color: #586e75; }
+  .document-docutils pre .literal.string.char {
+    color: #2aa198; }
+  .document-docutils pre .literal.string.doc {
+    color: #93a1a1; }
+  .document-docutils pre .literal.string.double {
+    color: #2aa198; }
+  .document-docutils pre .literal.string.escape {
+    color: #cb4b16; }
+  .document-docutils pre .literal.string.heredoc {
+    color: #93a1a1; }
+  .document-docutils pre .literal.string.interpol {
+    color: #2aa198; }
+  .document-docutils pre .literal.string.other {
+    color: #2aa198; }
+  .document-docutils pre .literal.string.regex {
+    color: #dc322f; }
+  .document-docutils pre .literal.string.single {
+    color: #2aa198; }
+  .document-docutils pre .literal.string.symbol {
+    color: #2aa198; }
+  .document-docutils pre .name.builtin.pseudo {
+    color: #268bd2; }
+  .document-docutils pre .name.variable.class {
+    color: #268bd2; }
+  .document-docutils pre .name.variable.global {
+    color: #268bd2; }
+  .document-docutils pre .name.variable.instance {
+    color: #268bd2; }
+  .document-docutils pre .literal.number.integer.long {
+    color: #2aa198; }
+
+.markdown blockquote {
+  margin: 0 1rem;
+  color: #6a737d;
+  border-left: 0.25rem solid #dfe2e5; }
+
diff --git a/fedocal/static/default/bootstrap.js b/fedocal/static/default/bootstrap.js
new file mode 100644
index 0000000..d7f51b6
--- /dev/null
+++ b/fedocal/static/default/bootstrap.js
@@ -0,0 +1,7 @@
+/*!
+  * Bootstrap v4.1.3 (https://getbootstrap.com/)
+  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+  */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t(e.bootstrap={},e.jQuery)}(this,function(e,t){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function s(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}function l(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{},t=Object.keys(o);"function"==typeof Object.getOwnPropertySymbols&&(t=t.concat(Object.getOwnPropertySymbols(o).filter(function(e){return Object.getOwnPropertyDescriptor(o,e).enumerable}))),t.forEach(function(e){var t,n,i;t=r,i=o[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i})}return r}for(var r,n,o,a,c,u,f,h,d,p,m,g,_,v,y,E,b,w,C,T,S,D,A,I,O,N,k,x,P,L,j,H,M,F,W,R,U,B,q,K,Q,Y,V,z,G,J,Z,X,$,ee,te,ne,ie,re,oe,se,ae,le,ce,ue,fe,he,de,pe,me,ge,_e,ve,ye,Ee,be,we=function(i){var t="transitionend";function e(e){var t=this,n=!1;return i(this).one(l.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||l.triggerTransitionEnd(t)},e),this}var l={TRANSITION_END:"bsTransitionEnd",getUID:function(e){for(;e+=~~(1e6*Math.random()),document.getElementById(e););return e},getSelectorFromElement:function(e){var t=e.getAttribute("data-target");t&&"#"!==t||(t=e.getAttribute("href")||"");try{return document.querySelector(t)?t:null}catch(e){return null}},getTransitionDurationFromElement:function(e){if(!e)return 0;var t=i(e).css("transition-duration");return parseFloat(t)?(t=t.split(",")[0],1e3*parseFloat(t)):0},reflow:function(e){return e.offsetHeight},triggerTransitionEnd:function(e){i(e).trigger(t)},supportsTransitionEnd:function(){return Boolean(t)},isElement:function(e){return(e[0]||e).nodeType},typeCheckConfig:function(e,t,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],o=t[i],s=o&&l.isElement(o)?"element":(a=o,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(r).test(s))throw new Error(e.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+r+'".')}var a}};return i.fn.emulateTransitionEnd=e,i.event.special[l.TRANSITION_END]={bindType:t,delegateType:t,handle:function(e){if(i(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}},l}(t=t&&t.hasOwnProperty("default")?t.default:t),Ce=(n="alert",a="."+(o="bs.alert"),c=(r=t).fn[n],u={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",h="fade",d="show",p=function(){function i(e){this._element=e}var e=i.prototype;return e.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},e.dispose=function(){r.removeData(this._element,o),this._element=null},e._getRootElement=function(e){var t=we.getSelectorFromElement(e),n=!1;return t&&(n=document.querySelector(t)),n||(n=r(e).closest("."+f)[0]),n},e._triggerCloseEvent=function(e){var t=r.Event(u.CLOSE);return r(e).trigger(t),t},e._removeElement=function(t){var n=this;if(r(t).removeClass(d),r(t).hasClass(h)){var e=we.getTransitionDurationFromElement(t);r(t).one(we.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(e)}else this._destroyElement(t)},e._destroyElement=function(e){r(e).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var e=r(this),t=e.data(o);t||(t=new i(this),e.data(o,t)),"close"===n&&t[n](this)})},i._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),i}(),r(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),r.fn[n]=p._jQueryInterface,r.fn[n].Constructor=p,r.fn[n].noConflict=function(){return r.fn[n]=c,p._jQueryInterface},p),Te=(g="button",v="."+(_="bs.button"),y=".data-api",E=(m=t).fn[g],b="active",w="btn",T='[data-toggle^="button"]',S='[data-toggle="buttons"]',D="input",A=".active",I=".btn",O={CLICK_DATA_API:"click"+v+y,FOCUS_BLUR_DATA_API:(C="focus")+v+y+" blur"+v+y},N=function(){function n(e){this._element=e}var e=n.prototype;return e.toggle=function(){var e=!0,t=!0,n=m(this._element).closest(S)[0];if(n){var i=this._element.querySelector(D);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(b))e=!1;else{var r=n.querySelector(A);r&&m(r).removeClass(b)}if(e){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(b),m(i).trigger("change")}i.focus(),t=!1}}t&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(b)),e&&m(this._element).toggleClass(b)},e.dispose=function(){m.removeData(this._element,_),this._element=null},n._jQueryInterface=function(t){return this.each(function(){var e=m(this).data(_);e||(e=new n(this),m(this).data(_,e)),"toggle"===t&&e[t]()})},s(n,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),n}(),m(document).on(O.CLICK_DATA_API,T,function(e){e.preventDefault();var t=e.target;m(t).hasClass(w)||(t=m(t).closest(I)),N._jQueryInterface.call(m(t),"toggle")}).on(O.FOCUS_BLUR_DATA_API,T,function(e){var t=m(e.target).closest(I)[0];m(t).toggleClass(C,/^focus(in)?$/.test(e.type))}),m.fn[g]=N._jQueryInterface,m.fn[g].Constructor=N,m.fn[g].noConflict=function(){return m.fn[g]=E,N._jQueryInterface},N),Se=(x="carousel",L="."+(P="bs.carousel"),j=".data-api",H=(k=t).fn[x],M={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},F={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},W="next",R="prev",U="left",B="right",q={SLIDE:"slide"+L,SLID:"slid"+L,KEYDOWN:"keydown"+L,MOUSEENTER:"mouseenter"+L,MOUSELEAVE:"mouseleave"+L,TOUCHEND:"touchend"+L,LOAD_DATA_API:"load"+L+j,CLICK_DATA_API:"click"+L+j},K="carousel",Q="active",Y="slide",V="carousel-item-right",z="carousel-item-left",G="carousel-item-next",J="carousel-item-prev",Z=".active",X=".active.carousel-item",$=".carousel-item",ee=".carousel-item-next, .carousel-item-prev",te=".carousel-indicators",ne="[data-slide], [data-slide-to]",ie='[data-ride="carousel"]',re=function(){function o(e,t){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(t),this._element=k(e)[0],this._indicatorsElement=this._element.querySelector(te),this._addEventListeners()}var e=o.prototype;return e.next=function(){this._isSliding||this._slide(W)},e.nextWhenVisible=function(){!document.hidden&&k(this._element).is(":visible")&&"hidden"!==k(this._element).css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(R)},e.pause=function(e){e||(this._isPaused=!0),this._element.querySelector(ee)&&(we.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(e){var t=this;this._activeElement=this._element.querySelector(X);var n=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)k(this._element).one(q.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n<e?W:R;this._slide(i,this._items[e])}},e.dispose=function(){k(this._element).off(L),k.removeData(this._element,P),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(e){return e=l({},M,e),we.typeCheckConfig(x,e,F),e},e._addEventListeners=function(){var t=this;this._config.keyboard&&k(this._element).on(q.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&(k(this._element).on(q.MOUSEENTER,function(e){return t.pause(e)}).on(q.MOUSELEAVE,function(e){return t.cycle(e)}),"ontouchstart"in document.documentElement&&k(this._element).on(q.TOUCHEND,function(){t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval)}))},e._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case 37:e.preventDefault(),this.prev();break;case 39:e.preventDefault(),this.next()}},e._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll($)):[],this._items.indexOf(e)},e._getItemByDirection=function(e,t){var n=e===W,i=e===R,r=this._getItemIndex(t),o=this._items.length-1;if((i&&0===r||n&&r===o)&&!this._config.wrap)return t;var s=(r+(e===R?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(e,t){var n=this._getItemIndex(e),i=this._getItemIndex(this._element.querySelector(X)),r=k.Event(q.SLIDE,{relatedTarget:e,direction:t,from:i,to:n});return k(this._element).trigger(r),r},e._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var t=[].slice.call(this._indicatorsElement.querySelectorAll(Z));k(t).removeClass(Q);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&k(n).addClass(Q)}},e._slide=function(e,t){var n,i,r,o=this,s=this._element.querySelector(X),a=this._getItemIndex(s),l=t||s&&this._getItemByDirection(e,s),c=this._getItemIndex(l),u=Boolean(this._interval);if(e===W?(n=z,i=G,r=U):(n=V,i=J,r=B),l&&k(l).hasClass(Q))this._isSliding=!1;else if(!this._triggerSlideEvent(l,r).isDefaultPrevented()&&s&&l){this._isSliding=!0,u&&this.pause(),this._setActiveIndicatorElement(l);var f=k.Event(q.SLID,{relatedTarget:l,direction:r,from:a,to:c});if(k(this._element).hasClass(Y)){k(l).addClass(i),we.reflow(l),k(s).addClass(n),k(l).addClass(n);var h=we.getTransitionDurationFromElement(s);k(s).one(we.TRANSITION_END,function(){k(l).removeClass(n+" "+i).addClass(Q),k(s).removeClass(Q+" "+i+" "+n),o._isSliding=!1,setTimeout(function(){return k(o._element).trigger(f)},0)}).emulateTransitionEnd(h)}else k(s).removeClass(Q),k(l).addClass(Q),this._isSliding=!1,k(this._element).trigger(f);u&&this.cycle()}},o._jQueryInterface=function(i){return this.each(function(){var e=k(this).data(P),t=l({},M,k(this).data());"object"==typeof i&&(t=l({},t,i));var n="string"==typeof i?i:t.slide;if(e||(e=new o(this,t),k(this).data(P,e)),"number"==typeof i)e.to(i);else if("string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}else t.interval&&(e.pause(),e.cycle())})},o._dataApiClickHandler=function(e){var t=we.getSelectorFromElement(this);if(t){var n=k(t)[0];if(n&&k(n).hasClass(K)){var i=l({},k(n).data(),k(this).data()),r=this.getAttribute("data-slide-to");r&&(i.interval=!1),o._jQueryInterface.call(k(n),i),r&&k(n).data(P).to(r),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return M}}]),o}(),k(document).on(q.CLICK_DATA_API,ne,re._dataApiClickHandler),k(window).on(q.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(ie)),t=0,n=e.length;t<n;t++){var i=k(e[t]);re._jQueryInterface.call(i,i.data())}}),k.fn[x]=re._jQueryInterface,k.fn[x].Constructor=re,k.fn[x].noConflict=function(){return k.fn[x]=H,re._jQueryInterface},re),De=(se="collapse",le="."+(ae="bs.collapse"),ce=(oe=t).fn[se],ue={toggle:!0,parent:""},fe={toggle:"boolean",parent:"(string|element)"},he={SHOW:"show"+le,SHOWN:"shown"+le,HIDE:"hide"+le,HIDDEN:"hidden"+le,CLICK_DATA_API:"click"+le+".data-api"},de="show",pe="collapse",me="collapsing",ge="collapsed",_e="width",ve="height",ye=".show, .collapsing",Ee='[data-toggle="collapse"]',be=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=oe.makeArray(document.querySelectorAll('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(Ee)),i=0,r=n.length;i<r;i++){var o=n[i],s=we.getSelectorFromElement(o),a=[].slice.call(document.querySelectorAll(s)).filter(function(e){return e===t});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(o))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=a.prototype;return e.toggle=function(){oe(this._element).hasClass(de)?this.hide():this.show()},e.show=function(){var e,t,n=this;if(!this._isTransitioning&&!oe(this._element).hasClass(de)&&(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(ye)).filter(function(e){return e.getAttribute("data-parent")===n._config.parent})).length&&(e=null),!(e&&(t=oe(e).not(this._selector).data(ae))&&t._isTransitioning))){var i=oe.Event(he.SHOW);if(oe(this._element).trigger(i),!i.isDefaultPrevented()){e&&(a._jQueryInterface.call(oe(e).not(this._selector),"hide"),t||oe(e).data(ae,null));var r=this._getDimension();oe(this._element).removeClass(pe).addClass(me),this._element.style[r]=0,this._triggerArray.length&&oe(this._triggerArray).removeClass(ge).attr("aria-expanded",!0),this.setTransitioning(!0);var o="scroll"+(r[0].toUpperCase()+r.slice(1)),s=we.getTransitionDurationFromElement(this._element);oe(this._element).one(we.TRANSITION_END,function(){oe(n._element).removeClass(me).addClass(pe).addClass(de),n._element.style[r]="",n.setTransitioning(!1),oe(n._element).trigger(he.SHOWN)}).emulateTransitionEnd(s),this._element.style[r]=this._element[o]+"px"}}},e.hide=function(){var e=this;if(!this._isTransitioning&&oe(this._element).hasClass(de)){var t=oe.Event(he.HIDE);if(oe(this._element).trigger(t),!t.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",we.reflow(this._element),oe(this._element).addClass(me).removeClass(pe).removeClass(de);var i=this._triggerArray.length;if(0<i)for(var r=0;r<i;r++){var o=this._triggerArray[r],s=we.getSelectorFromElement(o);if(null!==s)oe([].slice.call(document.querySelectorAll(s))).hasClass(de)||oe(o).addClass(ge).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=we.getTransitionDurationFromElement(this._element);oe(this._element).one(we.TRANSITION_END,function(){e.setTransitioning(!1),oe(e._element).removeClass(me).addClass(pe).trigger(he.HIDDEN)}).emulateTransitionEnd(a)}}},e.setTransitioning=function(e){this._isTransitioning=e},e.dispose=function(){oe.removeData(this._element,ae),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},e._getConfig=function(e){return(e=l({},ue,e)).toggle=Boolean(e.toggle),we.typeCheckConfig(se,e,fe),e},e._getDimension=function(){return oe(this._element).hasClass(_e)?_e:ve},e._getParent=function(){var n=this,e=null;we.isElement(this._config.parent)?(e=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(e=this._config.parent[0])):e=document.querySelector(this._config.parent);var t='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(e.querySelectorAll(t));return oe(i).each(function(e,t){n._addAriaAndCollapsedClass(a._getTargetFromElement(t),[t])}),e},e._addAriaAndCollapsedClass=function(e,t){if(e){var n=oe(e).hasClass(de);t.length&&oe(t).toggleClass(ge,!n).attr("aria-expanded",n)}},a._getTargetFromElement=function(e){var t=we.getSelectorFromElement(e);return t?document.querySelector(t):null},a._jQueryInterface=function(i){return this.each(function(){var e=oe(this),t=e.data(ae),n=l({},ue,e.data(),"object"==typeof i&&i?i:{});if(!t&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),t||(t=new a(this,n),e.data(ae,t)),"string"==typeof i){if("undefined"==typeof t[i])throw new TypeError('No method named "'+i+'"');t[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return ue}}]),a}(),oe(document).on(he.CLICK_DATA_API,Ee,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var n=oe(this),t=we.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(t));oe(i).each(function(){var e=oe(this),t=e.data(ae)?"toggle":n.data();be._jQueryInterface.call(e,t)})}),oe.fn[se]=be._jQueryInterface,oe.fn[se].Constructor=be,oe.fn[se].noConflict=function(){return oe.fn[se]=ce,be._jQueryInterface},be),Ae="undefined"!=typeof window&&"undefined"!=typeof document,Ie=["Edge","Trident","Firefox"],Oe=0,Ne=0;Ne<Ie.length;Ne+=1)if(Ae&&0<=navigator.userAgent.indexOf(Ie[Ne])){Oe=1;break}var ke=Ae&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},Oe))}};function xe(e){return e&&"[object Function]"==={}.toString.call(e)}function Pe(e,t){if(1!==e.nodeType)return[];var n=getComputedStyle(e,null);return t?n[t]:n}function Le(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function je(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=Pe(e),n=t.overflow,i=t.overflowX,r=t.overflowY;return/(auto|scroll|overlay)/.test(n+r+i)?e:je(Le(e))}var He=Ae&&!(!window.MSInputMethodContext||!document.documentMode),Me=Ae&&/MSIE 10/.test(navigator.userAgent);function Fe(e){return 11===e?He:10===e?Me:He||Me}function We(e){if(!e)return document.documentElement;for(var t=Fe(10)?document.body:null,n=e.offsetParent;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TD","TABLE"].indexOf(n.nodeName)&&"static"===Pe(n,"position")?We(n):n:e?e.ownerDocument.documentElement:document.documentElement}function Re(e){return null!==e.parentNode?Re(e.parentNode):e}function Ue(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?e:t,r=n?t:e,o=document.createRange();o.setStart(i,0),o.setEnd(r,0);var s,a,l=o.commonAncestorContainer;if(e!==l&&t!==l||i.contains(r))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&We(s.firstElementChild)!==s?We(l):l;var c=Re(e);return c.host?Ue(c.host,t):Ue(e,Re(t).host)}function Be(e){var t="top"===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",n=e.nodeName;if("BODY"===n||"HTML"===n){var i=e.ownerDocument.documentElement;return(e.ownerDocument.scrollingElement||i)[t]}return e[t]}function qe(e,t){var n="x"===t?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"],10)+parseFloat(e["border"+i+"Width"],10)}function Ke(e,t,n,i){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],Fe(10)?n["offset"+e]+i["margin"+("Height"===e?"Top":"Left")]+i["margin"+("Height"===e?"Bottom":"Right")]:0)}function Qe(){var e=document.body,t=document.documentElement,n=Fe(10)&&getComputedStyle(t);return{height:Ke("Height",e,t,n),width:Ke("Width",e,t,n)}}var Ye=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}(),Ve=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},ze=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e};function Ge(e){return ze({},e,{right:e.left+e.width,bottom:e.top+e.height})}function Je(e){var t={};try{if(Fe(10)){t=e.getBoundingClientRect();var n=Be(e,"top"),i=Be(e,"left");t.top+=n,t.left+=i,t.bottom+=n,t.right+=i}else t=e.getBoundingClientRect()}catch(e){}var r={left:t.left,top:t.top,width:t.right-t.left,height:t.bottom-t.top},o="HTML"===e.nodeName?Qe():{},s=o.width||e.clientWidth||r.right-r.left,a=o.height||e.clientHeight||r.bottom-r.top,l=e.offsetWidth-s,c=e.offsetHeight-a;if(l||c){var u=Pe(e);l-=qe(u,"x"),c-=qe(u,"y"),r.width-=l,r.height-=c}return Ge(r)}function Ze(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Fe(10),r="HTML"===t.nodeName,o=Je(e),s=Je(t),a=je(e),l=Pe(t),c=parseFloat(l.borderTopWidth,10),u=parseFloat(l.borderLeftWidth,10);n&&"HTML"===t.nodeName&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var f=Ge({top:o.top-s.top-c,left:o.left-s.left-u,width:o.width,height:o.height});if(f.marginTop=0,f.marginLeft=0,!i&&r){var h=parseFloat(l.marginTop,10),d=parseFloat(l.marginLeft,10);f.top-=c-h,f.bottom-=c-h,f.left-=u-d,f.right-=u-d,f.marginTop=h,f.marginLeft=d}return(i&&!n?t.contains(a):t===a&&"BODY"!==a.nodeName)&&(f=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Be(t,"top"),r=Be(t,"left"),o=n?-1:1;return e.top+=i*o,e.bottom+=i*o,e.left+=r*o,e.right+=r*o,e}(f,t)),f}function Xe(e){if(!e||!e.parentElement||Fe())return document.documentElement;for(var t=e.parentElement;t&&"none"===Pe(t,"transform");)t=t.parentElement;return t||document.documentElement}function $e(e,t,n,i){var r=4<arguments.length&&void 0!==arguments[4]&&arguments[4],o={top:0,left:0},s=r?Xe(e):Ue(e,t);if("viewport"===i)o=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=e.ownerDocument.documentElement,i=Ze(e,n),r=Math.max(n.clientWidth,window.innerWidth||0),o=Math.max(n.clientHeight,window.innerHeight||0),s=t?0:Be(n),a=t?0:Be(n,"left");return Ge({top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:r,height:o})}(s,r);else{var a=void 0;"scrollParent"===i?"BODY"===(a=je(Le(t))).nodeName&&(a=e.ownerDocument.documentElement):a="window"===i?e.ownerDocument.documentElement:i;var l=Ze(a,s,r);if("HTML"!==a.nodeName||function e(t){var n=t.nodeName;return"BODY"!==n&&"HTML"!==n&&("fixed"===Pe(t,"position")||e(Le(t)))}(s))o=l;else{var c=Qe(),u=c.height,f=c.width;o.top+=l.top-l.marginTop,o.bottom=u+l.top,o.left+=l.left-l.marginLeft,o.right=f+l.left}}return o.left+=n,o.top+=n,o.right-=n,o.bottom-=n,o}function et(e,t,i,n,r){var o=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var s=$e(i,n,o,r),a={top:{width:s.width,height:t.top-s.top},right:{width:s.right-t.right,height:s.height},bottom:{width:s.width,height:s.bottom-t.bottom},left:{width:t.left-s.left,height:s.height}},l=Object.keys(a).map(function(e){return ze({key:e},a[e],{area:(t=a[e],t.width*t.height)});var t}).sort(function(e,t){return t.area-e.area}),c=l.filter(function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight}),u=0<c.length?c[0].key:l[0].key,f=e.split("-")[1];return u+(f?"-"+f:"")}function tt(e,t,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return Ze(n,i?Xe(t):Ue(t,n),i)}function nt(e){var t=getComputedStyle(e),n=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight);return{width:e.offsetWidth+i,height:e.offsetHeight+n}}function it(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function rt(e,t,n){n=n.split("-")[0];var i=nt(e),r={width:i.width,height:i.height},o=-1!==["right","left"].indexOf(n),s=o?"top":"left",a=o?"left":"top",l=o?"height":"width",c=o?"width":"height";return r[s]=t[s]+t[l]/2-i[l]/2,r[a]=n===a?t[a]-i[c]:t[it(a)],r}function ot(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function st(e,n,t){return(void 0===t?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===n});var i=ot(e,function(e){return e[t]===n});return e.indexOf(i)}(e,"name",t))).forEach(function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var t=e.function||e.fn;e.enabled&&xe(t)&&(n.offsets.popper=Ge(n.offsets.popper),n.offsets.reference=Ge(n.offsets.reference),n=t(n,e))}),n}function at(e,n){return e.some(function(e){var t=e.name;return e.enabled&&t===n})}function lt(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),i=0;i<t.length;i++){var r=t[i],o=r?""+r+n:e;if("undefined"!=typeof document.body.style[o])return o}return null}function ct(e){var t=e.ownerDocument;return t?t.defaultView:window}function ut(e,t,n,i){n.updateBound=i,ct(e).addEventListener("resize",n.updateBound,{passive:!0});var r=je(e);return function e(t,n,i,r){var o="BODY"===t.nodeName,s=o?t.ownerDocument.defaultView:t;s.addEventListener(n,i,{passive:!0}),o||e(je(s.parentNode),n,i,r),r.push(s)}(r,"scroll",n.updateBound,n.scrollParents),n.scrollElement=r,n.eventsEnabled=!0,n}function ft(){var e,t;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(e=this.reference,t=this.state,ct(e).removeEventListener("resize",t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t))}function ht(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function dt(n,i){Object.keys(i).forEach(function(e){var t="";-1!==["width","height","top","right","bottom","left"].indexOf(e)&&ht(i[e])&&(t="px"),n.style[e]=i[e]+t})}function pt(e,t,n){var i=ot(e,function(e){return e.name===t}),r=!!i&&e.some(function(e){return e.name===n&&e.enabled&&e.order<i.order});if(!r){var o="`"+t+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+o+" modifier in order to work, be sure to include it before "+o+"!")}return r}var mt=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],gt=mt.slice(3);function _t(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=gt.indexOf(e),i=gt.slice(n+1).concat(gt.slice(0,n));return t?i.reverse():i}var vt="flip",yt="clockwise",Et="counterclockwise";function bt(e,r,o,t){var s=[0,0],a=-1!==["right","left"].indexOf(t),n=e.split(/(\+|\-)/).map(function(e){return e.trim()}),i=n.indexOf(ot(n,function(e){return-1!==e.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(e,t){var n=(1===t?!a:a)?"height":"width",i=!1;return e.reduce(function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,i=!0,e):i?(e[e.length-1]+=t,i=!1,e):e.concat(t)},[]).map(function(e){return function(e,t,n,i){var r=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),o=+r[1],s=r[2];if(!o)return e;if(0===s.indexOf("%")){var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Ge(a)[t]/100*o}if("vh"===s||"vw"===s)return("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*o;return o}(e,n,r,o)})})).forEach(function(n,i){n.forEach(function(e,t){ht(e)&&(s[i]+=e*("-"===n[t-1]?-1:1))})}),s}var wt={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],i=t.split("-")[1];if(i){var r=e.offsets,o=r.reference,s=r.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",u={start:Ve({},l,o[l]),end:Ve({},l,o[l]+o[c]-s[c])};e.offsets.popper=ze({},s,u[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,i=e.placement,r=e.offsets,o=r.popper,s=r.reference,a=i.split("-")[0],l=void 0;return l=ht(+n)?[+n,0]:bt(n,o,s,a),"left"===a?(o.top+=l[0],o.left-=l[1]):"right"===a?(o.top+=l[0],o.left+=l[1]):"top"===a?(o.left+=l[0],o.top-=l[1]):"bottom"===a&&(o.left+=l[0],o.top+=l[1]),e.popper=o,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,i){var t=i.boundariesElement||We(e.instance.popper);e.instance.reference===t&&(t=We(t));var n=lt("transform"),r=e.instance.popper.style,o=r.top,s=r.left,a=r[n];r.top="",r.left="",r[n]="";var l=$e(e.instance.popper,e.instance.reference,i.padding,t,e.positionFixed);r.top=o,r.left=s,r[n]=a,i.boundaries=l;var c=i.priority,u=e.offsets.popper,f={primary:function(e){var t=u[e];return u[e]<l[e]&&!i.escapeWithReference&&(t=Math.max(u[e],l[e])),Ve({},e,t)},secondary:function(e){var t="right"===e?"left":"top",n=u[t];return u[e]>l[e]&&!i.escapeWithReference&&(n=Math.min(u[t],l[e]-("right"===e?u.width:u.height))),Ve({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";u=ze({},u,f[t](e))}),e.offsets.popper=u,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,r=e.placement.split("-")[0],o=Math.floor,s=-1!==["top","bottom"].indexOf(r),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<o(i[l])&&(e.offsets.popper[l]=o(i[l])-n[c]),n[l]>o(i[a])&&(e.offsets.popper[l]=o(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!pt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var r=e.placement.split("-")[0],o=e.offsets,s=o.popper,a=o.reference,l=-1!==["left","right"].indexOf(r),c=l?"height":"width",u=l?"Top":"Left",f=u.toLowerCase(),h=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-p<s[f]&&(e.offsets.popper[f]-=s[f]-(a[d]-p)),a[f]+p>s[d]&&(e.offsets.popper[f]+=a[f]+p-s[d]),e.offsets.popper=Ge(e.offsets.popper);var m=a[f]+a[c]/2-p/2,g=Pe(e.instance.popper),_=parseFloat(g["margin"+u],10),v=parseFloat(g["border"+u+"Width"],10),y=m-e.offsets.popper[f]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ve(n={},f,Math.round(y)),Ve(n,h,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(at(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=$e(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=it(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case vt:E=[_,v];break;case yt:E=_t(_);break;case Et:E=_t(_,!0);break;default:E=m.behavior}return E.forEach(function(e,t){if(_!==e||E.length===t+1)return p;_=p.placement.split("-")[0],v=it(_);var n,i=p.offsets.popper,r=p.offsets.reference,o=Math.floor,s="left"===_&&o(i.right)>o(r.left)||"right"===_&&o(i.left)<o(r.right)||"top"===_&&o(i.bottom)>o(r.top)||"bottom"===_&&o(i.top)<o(r.bottom),a=o(i.left)<o(g.left),l=o(i.right)>o(g.right),c=o(i.top)<o(g.top),u=o(i.bottom)>o(g.bottom),f="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&u,h=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(h&&"start"===y&&a||h&&"end"===y&&l||!h&&"start"===y&&c||!h&&"end"===y&&u);(s||f||d)&&(p.flipped=!0,(s||f)&&(_=E[t+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=ze({},p.offsets.popper,rt(p.instance.popper,p.offsets.reference,p.placement)),p=st(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,r=i.popper,o=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return r[s?"left":"top"]=o[n]-(a?r[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Ge(r),e}},hide:{order:800,enabled:!0,fn:function(e){if(!pt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=ot(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottom<n.top||t.left>n.right||t.top>n.bottom||t.right<n.left){if(!0===e.hide)return e;e.hide=!0,e.attributes["x-out-of-boundaries"]=""}else{if(!1===e.hide)return e;e.hide=!1,e.attributes["x-out-of-boundaries"]=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var n=t.x,i=t.y,r=e.offsets.popper,o=ot(e.instance.modifiers,function(e){return"applyStyle"===e.name}).gpuAcceleration;void 0!==o&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s=void 0!==o?o:t.gpuAcceleration,a=Je(We(e.instance.popper)),l={position:r.position},c={left:Math.floor(r.left),top:Math.round(r.top),bottom:Math.round(r.bottom),right:Math.floor(r.right)},u="bottom"===n?"top":"bottom",f="right"===i?"left":"right",h=lt("transform"),d=void 0,p=void 0;if(p="bottom"===u?-a.height+c.bottom:c.top,d="right"===f?-a.width+c.right:c.left,s&&h)l[h]="translate3d("+d+"px, "+p+"px, 0)",l[u]=0,l[f]=0,l.willChange="transform";else{var m="bottom"===u?-1:1,g="right"===f?-1:1;l[u]=p*m,l[f]=d*g,l.willChange=u+", "+f}var _={"x-placement":e.placement};return e.attributes=ze({},_,e.attributes),e.styles=ze({},l,e.styles),e.arrowStyles=ze({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(e){var t,n;return dt(e.instance.popper,e.styles),t=e.instance.popper,n=e.attributes,Object.keys(n).forEach(function(e){!1!==n[e]?t.setAttribute(e,n[e]):t.removeAttribute(e)}),e.arrowElement&&Object.keys(e.arrowStyles).length&&dt(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,n,i,r){var o=tt(r,t,e,n.positionFixed),s=et(n.placement,o,t,e,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return t.setAttribute("x-placement",s),dt(t,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},Ct=function(){function o(e,t){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=ke(this.update.bind(this)),this.options=ze({},o.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=t&&t.jquery?t[0]:t,this.options.modifiers={},Object.keys(ze({},o.Defaults.modifiers,i.modifiers)).forEach(function(e){n.options.modifiers[e]=ze({},o.Defaults.modifiers[e]||{},i.modifiers?i.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return ze({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(e){e.enabled&&xe(e.onLoad)&&e.onLoad(n.reference,n.popper,n.options,e,n.state)}),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return Ye(o,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=tt(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=et(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=rt(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=st(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,at(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[lt("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ut(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return ft.call(this)}}]),o}();Ct.Utils=("undefined"!=typeof window?window:global).PopperUtils,Ct.placements=mt,Ct.Defaults=wt;var Tt,St,Dt,At,It,Ot,Nt,kt,xt,Pt,Lt,jt,Ht,Mt,Ft,Wt,Rt,Ut,Bt,qt,Kt,Qt,Yt,Vt,zt,Gt,Jt,Zt,Xt,$t,en,tn,nn,rn,on,sn,an,ln,cn,un,fn,hn,dn,pn,mn,gn,_n,vn,yn,En,bn,wn,Cn,Tn,Sn,Dn,An,In,On,Nn,kn,xn,Pn,Ln,jn,Hn,Mn,Fn,Wn,Rn,Un,Bn,qn,Kn,Qn,Yn,Vn,zn,Gn,Jn,Zn,Xn,$n,ei,ti,ni,ii,ri,oi,si,ai,li,ci,ui,fi,hi,di,pi,mi,gi,_i,vi,yi,Ei,bi,wi,Ci,Ti,Si,Di,Ai,Ii,Oi,Ni,ki,xi,Pi,Li,ji,Hi,Mi,Fi,Wi,Ri,Ui,Bi=(St="dropdown",At="."+(Dt="bs.dropdown"),It=".data-api",Ot=(Tt=t).fn[St],Nt=new RegExp("38|40|27"),kt={HIDE:"hide"+At,HIDDEN:"hidden"+At,SHOW:"show"+At,SHOWN:"shown"+At,CLICK:"click"+At,CLICK_DATA_API:"click"+At+It,KEYDOWN_DATA_API:"keydown"+At+It,KEYUP_DATA_API:"keyup"+At+It},xt="disabled",Pt="show",Lt="dropup",jt="dropright",Ht="dropleft",Mt="dropdown-menu-right",Ft="position-static",Wt='[data-toggle="dropdown"]',Rt=".dropdown form",Ut=".dropdown-menu",Bt=".navbar-nav",qt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Kt="top-start",Qt="top-end",Yt="bottom-start",Vt="bottom-end",zt="right-start",Gt="left-start",Jt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Zt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Xt=function(){function c(e,t){this._element=e,this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var e=c.prototype;return e.toggle=function(){if(!this._element.disabled&&!Tt(this._element).hasClass(xt)){var e=c._getParentFromElement(this._element),t=Tt(this._menu).hasClass(Pt);if(c._clearMenus(),!t){var n={relatedTarget:this._element},i=Tt.Event(kt.SHOW,n);if(Tt(e).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof Ct)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var r=this._element;"parent"===this._config.reference?r=e:we.isElement(this._config.reference)&&(r=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(r=this._config.reference[0])),"scrollParent"!==this._config.boundary&&Tt(e).addClass(Ft),this._popper=new Ct(r,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===Tt(e).closest(Bt).length&&Tt(document.body).children().on("mouseover",null,Tt.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),Tt(this._menu).toggleClass(Pt),Tt(e).toggleClass(Pt).trigger(Tt.Event(kt.SHOWN,n))}}}},e.dispose=function(){Tt.removeData(this._element,Dt),Tt(this._element).off(At),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var t=this;Tt(this._element).on(kt.CLICK,function(e){e.preventDefault(),e.stopPropagation(),t.toggle()})},e._getConfig=function(e){return e=l({},this.constructor.Default,Tt(this._element).data(),e),we.typeCheckConfig(St,e,this.constructor.DefaultType),e},e._getMenuElement=function(){if(!this._menu){var e=c._getParentFromElement(this._element);e&&(this._menu=e.querySelector(Ut))}return this._menu},e._getPlacement=function(){var e=Tt(this._element.parentNode),t=Yt;return e.hasClass(Lt)?(t=Kt,Tt(this._menu).hasClass(Mt)&&(t=Qt)):e.hasClass(jt)?t=zt:e.hasClass(Ht)?t=Gt:Tt(this._menu).hasClass(Mt)&&(t=Vt),t},e._detectNavbar=function(){return 0<Tt(this._element).closest(".navbar").length},e._getPopperConfig=function(){var t=this,e={};"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset;var n={placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(n.modifiers.applyStyle={enabled:!1}),n},c._jQueryInterface=function(t){return this.each(function(){var e=Tt(this).data(Dt);if(e||(e=new c(this,"object"==typeof t?t:null),Tt(this).data(Dt,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},c._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var t=[].slice.call(document.querySelectorAll(Wt)),n=0,i=t.length;n<i;n++){var r=c._getParentFromElement(t[n]),o=Tt(t[n]).data(Dt),s={relatedTarget:t[n]};if(e&&"click"===e.type&&(s.clickEvent=e),o){var a=o._menu;if(Tt(r).hasClass(Pt)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&Tt.contains(r,e.target))){var l=Tt.Event(kt.HIDE,s);Tt(r).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&Tt(document.body).children().off("mouseover",null,Tt.noop),t[n].setAttribute("aria-expanded","false"),Tt(a).removeClass(Pt),Tt(r).removeClass(Pt).trigger(Tt.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(e){var t,n=we.getSelectorFromElement(e);return n&&(t=document.querySelector(n)),t||e.parentNode},c._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||Tt(e.target).closest(Ut).length)):Nt.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!Tt(this).hasClass(xt))){var t=c._getParentFromElement(this),n=Tt(t).hasClass(Pt);if((n||27===e.which&&32===e.which)&&(!n||27!==e.which&&32!==e.which)){var i=[].slice.call(t.querySelectorAll(qt));if(0!==i.length){var r=i.indexOf(e.target);38===e.which&&0<r&&r--,40===e.which&&r<i.length-1&&r++,r<0&&(r=0),i[r].focus()}}else{if(27===e.which){var o=t.querySelector(Wt);Tt(o).trigger("focus")}Tt(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return Jt}},{key:"DefaultType",get:function(){return Zt}}]),c}(),Tt(document).on(kt.KEYDOWN_DATA_API,Wt,Xt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,Ut,Xt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+" "+kt.KEYUP_DATA_API,Xt._clearMenus).on(kt.CLICK_DATA_API,Wt,function(e){e.preventDefault(),e.stopPropagation(),Xt._jQueryInterface.call(Tt(this),"toggle")}).on(kt.CLICK_DATA_API,Rt,function(e){e.stopPropagation()}),Tt.fn[St]=Xt._jQueryInterface,Tt.fn[St].Constructor=Xt,Tt.fn[St].noConflict=function(){return Tt.fn[St]=Ot,Xt._jQueryInterface},Xt),qi=(en="modal",nn="."+(tn="bs.modal"),rn=($t=t).fn[en],on={backdrop:!0,keyboard:!0,focus:!0,show:!0},sn={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},an={HIDE:"hide"+nn,HIDDEN:"hidden"+nn,SHOW:"show"+nn,SHOWN:"shown"+nn,FOCUSIN:"focusin"+nn,RESIZE:"resize"+nn,CLICK_DISMISS:"click.dismiss"+nn,KEYDOWN_DISMISS:"keydown.dismiss"+nn,MOUSEUP_DISMISS:"mouseup.dismiss"+nn,MOUSEDOWN_DISMISS:"mousedown.dismiss"+nn,CLICK_DATA_API:"click"+nn+".data-api"},ln="modal-scrollbar-measure",cn="modal-backdrop",un="modal-open",fn="fade",hn="show",dn=".modal-dialog",pn='[data-toggle="modal"]',mn='[data-dismiss="modal"]',gn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",_n=".sticky-top",vn=function(){function r(e,t){this._config=this._getConfig(t),this._element=e,this._dialog=e.querySelector(dn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._scrollbarWidth=0}var e=r.prototype;return e.toggle=function(e){return this._isShown?this.hide():this.show(e)},e.show=function(e){var t=this;if(!this._isTransitioning&&!this._isShown){$t(this._element).hasClass(fn)&&(this._isTransitioning=!0);var n=$t.Event(an.SHOW,{relatedTarget:e});$t(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),$t(document.body).addClass(un),this._setEscapeEvent(),this._setResizeEvent(),$t(this._element).on(an.CLICK_DISMISS,mn,function(e){return t.hide(e)}),$t(this._dialog).on(an.MOUSEDOWN_DISMISS,function(){$t(t._element).one(an.MOUSEUP_DISMISS,function(e){$t(e.target).is(t._element)&&(t._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return t._showElement(e)}))}},e.hide=function(e){var t=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var n=$t.Event(an.HIDE);if($t(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=$t(this._element).hasClass(fn);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),$t(document).off(an.FOCUSIN),$t(this._element).removeClass(hn),$t(this._element).off(an.CLICK_DISMISS),$t(this._dialog).off(an.MOUSEDOWN_DISMISS),i){var r=we.getTransitionDurationFromElement(this._element);$t(this._element).one(we.TRANSITION_END,function(e){return t._hideModal(e)}).emulateTransitionEnd(r)}else this._hideModal()}}},e.dispose=function(){$t.removeData(this._element,tn),$t(window,document,this._element,this._backdrop).off(nn),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},e.handleUpdate=function(){this._adjustDialog()},e._getConfig=function(e){return e=l({},on,e),we.typeCheckConfig(en,e,sn),e},e._showElement=function(e){var t=this,n=$t(this._element).hasClass(fn);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,n&&we.reflow(this._element),$t(this._element).addClass(hn),this._config.focus&&this._enforceFocus();var i=$t.Event(an.SHOWN,{relatedTarget:e}),r=function(){t._config.focus&&t._element.focus(),t._isTransitioning=!1,$t(t._element).trigger(i)};if(n){var o=we.getTransitionDurationFromElement(this._element);$t(this._dialog).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r()},e._enforceFocus=function(){var t=this;$t(document).off(an.FOCUSIN).on(an.FOCUSIN,function(e){document!==e.target&&t._element!==e.target&&0===$t(t._element).has(e.target).length&&t._element.focus()})},e._setEscapeEvent=function(){var t=this;this._isShown&&this._config.keyboard?$t(this._element).on(an.KEYDOWN_DISMISS,function(e){27===e.which&&(e.preventDefault(),t.hide())}):this._isShown||$t(this._element).off(an.KEYDOWN_DISMISS)},e._setResizeEvent=function(){var t=this;this._isShown?$t(window).on(an.RESIZE,function(e){return t.handleUpdate(e)}):$t(window).off(an.RESIZE)},e._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){$t(document.body).removeClass(un),e._resetAdjustments(),e._resetScrollbar(),$t(e._element).trigger(an.HIDDEN)})},e._removeBackdrop=function(){this._backdrop&&($t(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(e){var t=this,n=$t(this._element).hasClass(fn)?fn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=cn,n&&this._backdrop.classList.add(n),$t(this._backdrop).appendTo(document.body),$t(this._element).on(an.CLICK_DISMISS,function(e){t._ignoreBackdropClick?t._ignoreBackdropClick=!1:e.target===e.currentTarget&&("static"===t._config.backdrop?t._element.focus():t.hide())}),n&&we.reflow(this._backdrop),$t(this._backdrop).addClass(hn),!e)return;if(!n)return void e();var i=we.getTransitionDurationFromElement(this._backdrop);$t(this._backdrop).one(we.TRANSITION_END,e).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){$t(this._backdrop).removeClass(hn);var r=function(){t._removeBackdrop(),e&&e()};if($t(this._element).hasClass(fn)){var o=we.getTransitionDurationFromElement(this._backdrop);$t(this._backdrop).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r()}else e&&e()},e._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},e._setScrollbar=function(){var r=this;if(this._isBodyOverflowing){var e=[].slice.call(document.querySelectorAll(gn)),t=[].slice.call(document.querySelectorAll(_n));$t(e).each(function(e,t){var n=t.style.paddingRight,i=$t(t).css("padding-right");$t(t).data("padding-right",n).css("padding-right",parseFloat(i)+r._scrollbarWidth+"px")}),$t(t).each(function(e,t){var n=t.style.marginRight,i=$t(t).css("margin-right");$t(t).data("margin-right",n).css("margin-right",parseFloat(i)-r._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=$t(document.body).css("padding-right");$t(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},e._resetScrollbar=function(){var e=[].slice.call(document.querySelectorAll(gn));$t(e).each(function(e,t){var n=$t(t).data("padding-right");$t(t).removeData("padding-right"),t.style.paddingRight=n||""});var t=[].slice.call(document.querySelectorAll(""+_n));$t(t).each(function(e,t){var n=$t(t).data("margin-right");"undefined"!=typeof n&&$t(t).css("margin-right",n).removeData("margin-right")});var n=$t(document.body).data("padding-right");$t(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},e._getScrollbarWidth=function(){var e=document.createElement("div");e.className=ln,document.body.appendChild(e);var t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t},r._jQueryInterface=function(n,i){return this.each(function(){var e=$t(this).data(tn),t=l({},on,$t(this).data(),"object"==typeof n&&n?n:{});if(e||(e=new r(this,t),$t(this).data(tn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](i)}else t.show&&e.show(i)})},s(r,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return on}}]),r}(),$t(document).on(an.CLICK_DATA_API,pn,function(e){var t,n=this,i=we.getSelectorFromElement(this);i&&(t=document.querySelector(i));var r=$t(t).data(tn)?"toggle":l({},$t(t).data(),$t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var o=$t(t).one(an.SHOW,function(e){e.isDefaultPrevented()||o.one(an.HIDDEN,function(){$t(n).is(":visible")&&n.focus()})});vn._jQueryInterface.call($t(t),r,this)}),$t.fn[en]=vn._jQueryInterface,$t.fn[en].Constructor=vn,$t.fn[en].noConflict=function(){return $t.fn[en]=rn,vn._jQueryInterface},vn),Ki=(En="tooltip",wn="."+(bn="bs.tooltip"),Cn=(yn=t).fn[En],Tn="bs-tooltip",Sn=new RegExp("(^|\\s)"+Tn+"\\S+","g"),In={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!(An={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(Dn={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},Nn="out",kn={HIDE:"hide"+wn,HIDDEN:"hidden"+wn,SHOW:(On="show")+wn,SHOWN:"shown"+wn,INSERTED:"inserted"+wn,CLICK:"click"+wn,FOCUSIN:"focusin"+wn,FOCUSOUT:"focusout"+wn,MOUSEENTER:"mouseenter"+wn,MOUSELEAVE:"mouseleave"+wn},xn="fade",Pn="show",Ln=".tooltip-inner",jn=".arrow",Hn="hover",Mn="focus",Fn="click",Wn="manual",Rn=function(){function i(e,t){if("undefined"==typeof Ct)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=yn(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(yn(this.getTipElement()).hasClass(Pn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),yn.removeData(this.element,this.constructor.DATA_KEY),yn(this.element).off(this.constructor.EVENT_KEY),yn(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&yn(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===yn(this.element).css("display"))throw new Error("Please use show on visible elements");var e=yn.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){yn(this.element).trigger(e);var n=yn.contains(this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=we.getUID(this.constructor.NAME);i.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&yn(i).addClass(xn);var o="function"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,s=this._getAttachment(o);this.addAttachmentClass(s);var a=!1===this.config.container?document.body:yn(document).find(this.config.container);yn(i).data(this.constructor.DATA_KEY,this),yn.contains(this.element.ownerDocument.documentElement,this.tip)||yn(i).appendTo(a),yn(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Ct(this.element,i,{placement:s,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:jn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),yn(i).addClass(Pn),"ontouchstart"in document.documentElement&&yn(document.body).children().on("mouseover",null,yn.noop);var l=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,yn(t.element).trigger(t.constructor.Event.SHOWN),e===Nn&&t._leave(null,t)};if(yn(this.tip).hasClass(xn)){var c=we.getTransitionDurationFromElement(this.tip);yn(this.tip).one(we.TRANSITION_END,l).emulateTransitionEnd(c)}else l()}},e.hide=function(e){var t=this,n=this.getTipElement(),i=yn.Event(this.constructor.Event.HIDE),r=function(){t._hoverState!==On&&n.parentNode&&n.parentNode.removeChild(n),t._cleanTipClass(),t.element.removeAttribute("aria-describedby"),yn(t.element).trigger(t.constructor.Event.HIDDEN),null!==t._popper&&t._popper.destroy(),e&&e()};if(yn(this.element).trigger(i),!i.isDefaultPrevented()){if(yn(n).removeClass(Pn),"ontouchstart"in document.documentElement&&yn(document.body).children().off("mouseover",null,yn.noop),this._activeTrigger[Fn]=!1,this._activeTrigger[Mn]=!1,this._activeTrigger[Hn]=!1,yn(this.tip).hasClass(xn)){var o=we.getTransitionDurationFromElement(n);yn(n).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){yn(this.getTipElement()).addClass(Tn+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||yn(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(yn(e.querySelectorAll(Ln)),this.getTitle()),yn(e).removeClass(xn+" "+Pn)},e.setElementContent=function(e,t){var n=this.config.html;"object"==typeof t&&(t.nodeType||t.jquery)?n?yn(t).parent().is(e)||e.empty().append(t):e.text(yn(t).text()):e[n?"html":"text"](t)},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),e},e._getAttachment=function(e){return An[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)yn(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==Wn){var t=e===Hn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Hn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;yn(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}yn(i.element).closest(".modal").on("hide.bs.modal",function(){return i.hide()})}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==e)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||yn(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Mn:Hn]=!0),yn(t.getTipElement()).hasClass(Pn)||t._hoverState===On?t._hoverState=On:(clearTimeout(t._timeout),t._hoverState=On,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===On&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||yn(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Mn:Hn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Nn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Nn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){return"number"==typeof(e=l({},this.constructor.Default,yn(this.element).data(),"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),we.typeCheckConfig(En,e,this.constructor.DefaultType),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=yn(this.getTipElement()),t=e.attr("class").match(Sn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(yn(e).removeClass(xn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=yn(this).data(bn),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),yn(this).data(bn,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return In}},{key:"NAME",get:function(){return En}},{key:"DATA_KEY",get:function(){return bn}},{key:"Event",get:function(){return kn}},{key:"EVENT_KEY",get:function(){return wn}},{key:"DefaultType",get:function(){return Dn}}]),i}(),yn.fn[En]=Rn._jQueryInterface,yn.fn[En].Constructor=Rn,yn.fn[En].noConflict=function(){return yn.fn[En]=Cn,Rn._jQueryInterface},Rn),Qi=(Bn="popover",Kn="."+(qn="bs.popover"),Qn=(Un=t).fn[Bn],Yn="bs-popover",Vn=new RegExp("(^|\\s)"+Yn+"\\S+","g"),zn=l({},Ki.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Gn=l({},Ki.DefaultType,{content:"(string|element|function)"}),Jn="fade",Xn=".popover-header",$n=".popover-body",ei={HIDE:"hide"+Kn,HIDDEN:"hidden"+Kn,SHOW:(Zn="show")+Kn,SHOWN:"shown"+Kn,INSERTED:"inserted"+Kn,CLICK:"click"+Kn,FOCUSIN:"focusin"+Kn,FOCUSOUT:"focusout"+Kn,MOUSEENTER:"mouseenter"+Kn,MOUSELEAVE:"mouseleave"+Kn},ti=function(e){var t,n;function i(){return e.apply(this,arguments)||this}n=e,(t=i).prototype=Object.create(n.prototype),(t.prototype.constructor=t).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(e){Un(this.getTipElement()).addClass(Yn+"-"+e)},r.getTipElement=function(){return this.tip=this.tip||Un(this.config.template)[0],this.tip},r.setContent=function(){var e=Un(this.getTipElement());this.setElementContent(e.find(Xn),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find($n),t),e.removeClass(Jn+" "+Zn)},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var e=Un(this.getTipElement()),t=e.attr("class").match(Vn);null!==t&&0<t.length&&e.removeClass(t.join(""))},i._jQueryInterface=function(n){return this.each(function(){var e=Un(this).data(qn),t="object"==typeof n?n:null;if((e||!/destroy|hide/.test(n))&&(e||(e=new i(this,t),Un(this).data(qn,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return zn}},{key:"NAME",get:function(){return Bn}},{key:"DATA_KEY",get:function(){return qn}},{key:"Event",get:function(){return ei}},{key:"EVENT_KEY",get:function(){return Kn}},{key:"DefaultType",get:function(){return Gn}}]),i}(Ki),Un.fn[Bn]=ti._jQueryInterface,Un.fn[Bn].Constructor=ti,Un.fn[Bn].noConflict=function(){return Un.fn[Bn]=Qn,ti._jQueryInterface},ti),Yi=(ii="scrollspy",oi="."+(ri="bs.scrollspy"),si=(ni=t).fn[ii],ai={offset:10,method:"auto",target:""},li={offset:"number",method:"string",target:"(string|element)"},ci={ACTIVATE:"activate"+oi,SCROLL:"scroll"+oi,LOAD_DATA_API:"load"+oi+".data-api"},ui="dropdown-item",fi="active",hi='[data-spy="scroll"]',di=".active",pi=".nav, .list-group",mi=".nav-link",gi=".nav-item",_i=".list-group-item",vi=".dropdown",yi=".dropdown-item",Ei=".dropdown-toggle",bi="offset",wi="position",Ci=function(){function n(e,t){var n=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(t),this._selector=this._config.target+" "+mi+","+this._config.target+" "+_i+","+this._config.target+" "+yi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,ni(this._scrollElement).on(ci.SCROLL,function(e){return n._process(e)}),this.refresh(),this._process()}var e=n.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?bi:wi,r="auto"===this._config.method?e:this._config.method,o=r===wi?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(e){var t,n=we.getSelectorFromElement(e);if(n&&(t=document.querySelector(n)),t){var i=t.getBoundingClientRect();if(i.width||i.height)return[ni(t)[r]().top+o,n]}return null}).filter(function(e){return e}).sort(function(e,t){return e[0]-t[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},e.dispose=function(){ni.removeData(this._element,ri),ni(this._scrollElement).off(oi),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(e){if("string"!=typeof(e=l({},ai,"object"==typeof e&&e?e:{})).target){var t=ni(e.target).attr("id");t||(t=we.getUID(ii),ni(e.target).attr("id",t)),e.target="#"+t}return we.typeCheckConfig(ii,e,li),e},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),n<=e){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;){this._activeTarget!==this._targets[r]&&e>=this._offsets[r]&&("undefined"==typeof this._offsets[r+1]||e<this._offsets[r+1])&&this._activate(this._targets[r])}}},e._activate=function(t){this._activeTarget=t,this._clear();var e=this._selector.split(",");e=e.map(function(e){return e+'[data-target="'+t+'"],'+e+'[href="'+t+'"]'});var n=ni([].slice.call(document.querySelectorAll(e.join(","))));n.hasClass(ui)?(n.closest(vi).find(Ei).addClass(fi),n.addClass(fi)):(n.addClass(fi),n.parents(pi).prev(mi+", "+_i).addClass(fi),n.parents(pi).prev(gi).children(mi).addClass(fi)),ni(this._scrollElement).trigger(ci.ACTIVATE,{relatedTarget:t})},e._clear=function(){var e=[].slice.call(document.querySelectorAll(this._selector));ni(e).filter(di).removeClass(fi)},n._jQueryInterface=function(t){return this.each(function(){var e=ni(this).data(ri);if(e||(e=new n(this,"object"==typeof t&&t),ni(this).data(ri,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return ai}}]),n}(),ni(window).on(ci.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(hi)),t=e.length;t--;){var n=ni(e[t]);Ci._jQueryInterface.call(n,n.data())}}),ni.fn[ii]=Ci._jQueryInterface,ni.fn[ii].Constructor=Ci,ni.fn[ii].noConflict=function(){return ni.fn[ii]=si,Ci._jQueryInterface},Ci),Vi=(Di="."+(Si="bs.tab"),Ai=(Ti=t).fn.tab,Ii={HIDE:"hide"+Di,HIDDEN:"hidden"+Di,SHOW:"show"+Di,SHOWN:"shown"+Di,CLICK_DATA_API:"click"+Di+".data-api"},Oi="dropdown-menu",Ni="active",ki="disabled",xi="fade",Pi="show",Li=".dropdown",ji=".nav, .list-group",Hi=".active",Mi="> li > .active",Fi='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Wi=".dropdown-toggle",Ri="> .dropdown-menu .active",Ui=function(){function i(e){this._element=e}var e=i.prototype;return e.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&Ti(this._element).hasClass(Ni)||Ti(this._element).hasClass(ki))){var e,i,t=Ti(this._element).closest(ji)[0],r=we.getSelectorFromElement(this._element);if(t){var o="UL"===t.nodeName?Mi:Hi;i=(i=Ti.makeArray(Ti(t).find(o)))[i.length-1]}var s=Ti.Event(Ii.HIDE,{relatedTarget:this._element}),a=Ti.Event(Ii.SHOW,{relatedTarget:i});if(i&&Ti(i).trigger(s),Ti(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,t);var l=function(){var e=Ti.Event(Ii.HIDDEN,{relatedTarget:n._element}),t=Ti.Event(Ii.SHOWN,{relatedTarget:i});Ti(i).trigger(e),Ti(n._element).trigger(t)};e?this._activate(e,e.parentNode,l):l()}}},e.dispose=function(){Ti.removeData(this._element,Si),this._element=null},e._activate=function(e,t,n){var i=this,r=("UL"===t.nodeName?Ti(t).find(Mi):Ti(t).children(Hi))[0],o=n&&r&&Ti(r).hasClass(xi),s=function(){return i._transitionComplete(e,r,n)};if(r&&o){var a=we.getTransitionDurationFromElement(r);Ti(r).one(we.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},e._transitionComplete=function(e,t,n){if(t){Ti(t).removeClass(Pi+" "+Ni);var i=Ti(t.parentNode).find(Ri)[0];i&&Ti(i).removeClass(Ni),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}if(Ti(e).addClass(Ni),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),we.reflow(e),Ti(e).addClass(Pi),e.parentNode&&Ti(e.parentNode).hasClass(Oi)){var r=Ti(e).closest(Li)[0];if(r){var o=[].slice.call(r.querySelectorAll(Wi));Ti(o).addClass(Ni)}e.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var e=Ti(this),t=e.data(Si);if(t||(t=new i(this),e.data(Si,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),i}(),Ti(document).on(Ii.CLICK_DATA_API,Fi,function(e){e.preventDefault(),Ui._jQueryInterface.call(Ti(this),"show")}),Ti.fn.tab=Ui._jQueryInterface,Ti.fn.tab.Constructor=Ui,Ti.fn.tab.noConflict=function(){return Ti.fn.tab=Ai,Ui._jQueryInterface},Ui);!function(e){if("undefined"==typeof e)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(t),e.Util=we,e.Alert=Ce,e.Button=Te,e.Carousel=Se,e.Collapse=De,e.Dropdown=Bi,e.Modal=qi,e.Popover=Qi,e.Scrollspy=Yi,e.Tab=Vi,e.Tooltip=Ki,Object.defineProperty(e,"__esModule",{value:!0})});
+//# sourceMappingURL=bootstrap.bundle.min.js.map
diff --git a/fedocal/static/default/fedocal.css b/fedocal/static/default/fedocal.css
deleted file mode 100644
index 8e842bf..0000000
--- a/fedocal/static/default/fedocal.css
+++ /dev/null
@@ -1,486 +0,0 @@
-body {
-    padding: 0;
-    height: 100%;
-    margin: 0;
-}
-
-h4 {
-    color: #CE5C00;
-    font-size: 16px;
-    margin: 0.8em 0 0.4em;
-}
-
-input {
-    font-size: 100%;
-}
-
-textarea {
-    font-size: 100%;
-}
-
-button {
-    font-size: 100%;
-}
-
-select {
-    font-size: 100%;
-}
-
-.message {
-    color: green;
-}
-
-.errors, .required {
-    color: red;
-}
-
-.required {
-    color: red;
-}
-
-.warnings {
-    color: orange;
-}
-
-.orange {
-    color: #CE5C00;
-}
-
-.blue {
-    color: #0066CC;
-}
-
-.nobutton {
-    background:none!important;
-    border:none;
-    padding:0!important;
-    color: #0066CC;
-    text-decoration: none;
-}
-
-#header input {
-    border-radius: 10px;
-}
-
-header#mainheader{
-    color: white;
-    background: #426ead; /* Old browsers */
-    background: -moz-linear-gradient(top, #426ead 0%, #1e4a88 100%); /* FF3.6+ */
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#426ead), color-stop(100%,#1e4a88)); /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, #426ead 0%,#1e4a88 100%); /* Chrome10+,Safari5.1+ */
-    background: -o-linear-gradient(top, #426ead 0%,#1e4a88 100%); /* Opera 11.10+ */
-    background: -ms-linear-gradient(top, #426ead 0%,#1e4a88 100%); /* IE10+ */
-    background: linear-gradient(to bottom, #426ead 0%,#1e4a88 100%); /* W3C */
-    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#426ead', endColorstr='#1e4a88',GradientType=0 ); /* IE6-9 */
-    padding: .5em;
-    margin-bottom: .5em;
-}
-
-header h1,
-header h2,
-header p {
-    margin:0;
-}
-
-header h1 span {
-    float: right;
-    color: rgba(255, 255, 255, .5);
-    font-size: 0.7em;
-    font-weight: normal;
-}
-
-#goto_date {
-    display: block;
-}
-
-#goto_date input[type=text] {
-    width: 42px;
-}
-
-#tzones {
-    width: 152px;
-}
-
-section header,
-section aside,
-section nav {
-    display: inline-block;
-    vertical-align: middle;
-}
-
-#shortmenu {
-    position: relative
-}
-
-#shortmenu ul {
-    position: fixed;
-    bottom: 20px;
-    right: 10px;
-    list-style: none;
-}
-
-#content section > header {
-    margin-bottom: .5em;
-    background: url(calendar.png) 0 50% no-repeat;
-    padding-left: 40px;
-    color: #666;
-}
-
-#content section > header p {
-    font-style: italic;
-}
-
-#content {
-    position: relative;
-    margin: .5em;
-    min-height: 400px;
-}
-
-#content #agenda, #content #meeting_list{
-    padding-left: 210px;
-}
-
-#agenda, .my_meetings {
-    margin-bottom: 2em;
-}
-
-#agenda table, .my_meetings table {
-    border-collapse:collapse;
-    min-width: 790px;
-    width: 100%;
-}
-
-.event_blue {
-    display: block;
-    padding:.1em .2em;
-    background-color:rgba(175, 221, 233, .8);
-    color: #333;
-    text-decoration: none;
-    border:1px solid #37abc8;
-}
-
-td > .event_blue {
-    min-height: 2em;
-    height: 100%;
-}
-
-
-.first_event {
-    border-bottom:0px;
-}
-
-td .first_event {
-    border-bottom: solid 1px rgba(175, 221, 233, .8);
-}
-
-td .middle_event {
-    border-top: solid 1px rgba(175, 221, 233, .8);
-    border-bottom: solid 1px rgba(175, 221, 233, .8);
-}
-
-.last_event {
-    border-top:0px;
-}
-
-td .last_event {
-    border-top: solid 1px rgba(175, 221, 233, .8);
-}
-
-.my_meetings td {
-    border-bottom: solid 1px grey;
-    border-top: solid 1px grey;
-    border-left: solid 1px grey;
-}
-
-#agenda td {
-    min-width: 100px;
-    border: 1px solid #e6e6e6;
-    background-color: #f9f9f9;
-    padding: 0;
-}
-
-#agenda td > .row_height,
-#agenda th > .row_height
-{
-    min-height: 2em;
-}
-
-#agenda td.empty {
-    background-color: transparent;
-    border: none;
-}
-
-#agenda .time {
-    border: none;
-    padding-right: .2em;
-    text-align: right;
-    width: 7em;
-}
-
-#agenda .today {
-    background-color: #FFF6D5;
-    vertical-align: middle;
-}
-
-.my_meetings .date {
-    border-left: solid 0px;
-    width: 100px;
-}
-
-.my_meetings .time {
-    width: 150px;
-}
-
-.my_meetings .calendar {
-    width: 150px;
-}
-
-.my_meetings .buttons {
-    width: 1%;
-    white-space: nowrap;
-    text-align: center;
-    padding: .1em .2em;
-}
-
-.my_meetings img {
-    width: 24px;
-}
-
-#agenda th {
-    border: none;
-    padding: .1em;
-    color: #999;
-}
-
-#agenda th.today {
-    color: black;
-}
-
-#mainmenu {
-    width: 200px;
-    margin-right: 0;
-    position: absolute;
-    top: 70px;
-    left: 0;
-}
-
-#weeks {
-    float:right;
-}
-
-.ui-button:hover {
-    color: white;
-}
-
-#home_btn > span {
-    text-indent: 50px;
-    width: 20px;
-    overflow: hidden;
-    background: url(home.png) 50% 6px no-repeat;
-}
-
-#home_btn:hover span {
-    background-position: 50% -25px;
-}
-
-/** Menu */
-#mainmenu #accordion > .ui-accordion-content {
-    padding: 0;
-}
-
-#calendars_menu {
-    overflow: visible;
-}
-
-.ui-menu-item ul {
-    margin-left: 2px;
-}
-
-.ui-menu-item {
-    white-space: nowrap;
-}
-
-#accordion .ui-widget-content a
-{
-    display: block;
-    font-weight: normal;
-}
-
-.ui-state-focus .ui-menu-item > a,
-.ui-state-focus .ui-menu-item > a:link,
-.ui-state-focus .ui-menu-item > a:visited,
-.ui-state-active .ui-menu-item > a,
-.ui-state-active .ui-menu-item > a:link,
-.ui-state-active .ui-menu-item > a:visited
-{
-    color: #0066cc;
-    display: block;
-}
-
-.ui-state-focus.ui-menu-item > a,
-.ui-state-focus.ui-menu-item > a:link,
-.ui-state-focus.ui-menu-item > a:visited
-{
-    color: white;
-}
-
-table.month {
-    margin: 0 auto;
-    border-collapse: collapse;
-    margin-bottom: .5em;
-}
-
-table.month td {
-    text-align: center;
-    border: 1px solid #e6e6e6;
-    color: #808080;
-    font-weight: bold;
-    padding: .1em;
-    background-color: #fff;
-}
-
-table.month a{
-    color: #808080;
-    display: block;
-    padding: .1em;
-}
-
-.busy_day {
-    background-color: #3C6EB4;
-    border-radius: 1em 1em 1em 0.3em;
-    color: #FFFFFF !important;
-    padding: 0px;
-    margin: 0px;
-}
-
-.busy_day a{
-    color: #FFFFFF !important;
-    padding: .1em;
-}
-
-table.month .today a{
-    color: #000;
-}
-
-table.month .current_week td {
-    background-color: #ffcc69;
-}
-
-table.month td.noday {
-    background-color: #f9f9f9;
-}
-
-table.month td.today{
-    background-color: #FFF6D5;
-    border-color: #000;
-    border-width: 1px;
-    /* ugly hack to work with table collapsed borders */
-    border-style: double solid solid double;
-    color: #000;
-}
-
-th.month {
-    color: #666;
-    padding-bottom: .4em;
-}
-
-th.month a {
-    color: #4d4d4d;
-    display: inline-block;
-}
-
-th.month a:hover {
-    color: #fff;
-}
-
-th.month .ui-button-text {
-    padding: 0 .5em;
-}
-
-.ui-menu a.ui-state-focus {
-    border: 1px solid #DDDDDD;
-}
-
-li.menu-focus
-{
-    border: 1px solid #3C6EB4;
-}
-
-.ui-menu .ui-state-focus.menu-focus {
-    margin: 0;
-}
-
-.calendar_list {
-    display: table;
-    border-spacing: 1em;
-}
-
-.calendar_link {
-    border: 1px solid #CCCCCC;
-    border-radius: 5px 5px 5px 5px;
-    /*color: black;*/
-    display: table-cell;
-    /*margin: 1em auto;*/
-    overflow: hidden;
-    padding: 2em;
-    width: 15em;
-}
-
-.calendar_link img, .calendar_link span {
-    display: block;
-}
-
-.calendar_name {
-    font-weight: bold;
-    margin: .5em 0;
-}
-
-.calendar_row {
-    display: table-row;
-}
-
-.calendar_row[a] {
-    display: block;
-}
-
-#information {
-    width: 500px;
-    height: 200px;
-}
-
-.ui-autocomplete {
-    width: 100px;
-}
-
-.limit_future td {
-    border-top: 2px solid;
-    border-color: #31a90c;
-    padding-top: 1em;
-    padding-bottom: 1em;
-}
-
-.limit_past td {
-    border-top: 2px solid;
-    border-color: red;
-}
-
-.meeting_normal td {
-    border-top: 1px solid #CCCCCC;
-    padding-top: 1em;
-    padding-bottom: 1em;
-}
-
-.today {
-    background-color: #FFF6D5;
-}
-
-.u_dashed {
-    background-image: linear-gradient(to right, #333 40%, rgba(255, 255, 255, 0) 20%);
-    background-position: bottom;
-    background-size: 3px 1px;
-    background-repeat: repeat-x;
-}
-
-#meeting_description {
-    width: 60%;
-}
diff --git a/fedocal/static/default/koji.css b/fedocal/static/default/koji.css
deleted file mode 100644
index 76c388a..0000000
--- a/fedocal/static/default/koji.css
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
-  Koji styling
-  Copyright (c) 2007,2008, 2009, 2012 Red Hat, Inc.
-
-  Authors:
-    Mike Bonnet <mikeb@redhat.com>
-    Mike McLean <mikem@redhat.com>
-    Dennis Gilmore <dgilmore@redhat.com>
-*/
-
-html {
-    min-width: 800px;
-}
-
-body {
-    margin: 0px;
-    padding: 0px;
-    font-size: small;
-    font-family: Cantarell, sans-serif;
-    color: #666;
-    background: #fff url(header-bg.png) repeat-x;
-}
-
-a, a:visited, a:hover {
-    color: #0066CC;
-    text-decoration: none;
-}
-
-h4
-{
-    font-size:19px;
-    margin-bottom:14px;
-}
-
-#wrap {
-    min-width: 750px;
-    max-width:1100px;
-    margin-left:auto;
-    margin-right:auto;
-    padding: 0;
-    text-align: left;
-}
-
-#innerwrap {
-position:relative;
-}
-
-#header {
-height:87px
-}
-
-#headerSearch {
-    display:inline-block;
-    position:relative;
-    float:right;
-    top: 40px;
-}
-
-#headerSearch input,
-#headerSearch select {
-    font-size: 16px;
-}
-
-#headerSearch input[type="submit"], #pending input[type="submit"],
-.acls input[type="submit"], #options input[type="submit"]
-{
-    background-color: white;
-    box-shadow: 0 6px 10px rgba(0, 0, 0, 0.15) inset;
-    border-radius: 10px 10px 10px 10px;
-    color: #3D69A8;
-    cursor:pointer;
-}
-
-#headerSearch input[type="text"]
-{
-    border: 1px solid white;
-    box-shadow: 0 6px 10px rgba(0, 0, 0, 0.15) inset;
-    -webkit-box-shadow:  0 6px 10px rgba(0, 0, 0, 0.15) inset;
-    -moz-box-shadow: 0 6px 10px rgba(0, 0, 0, 0.15) inset;
-    padding: 3px;
-}
-
-#kojiLogo {
-    /* Used only for the koji logo icon */
-    display:inline-block;
-    padding-top:8px;
-}
-
-#PoweredByKojiLogo {
-    /* Used only for the koji logo icon */
-    float: right;
-    border: 0px;
-    height: 20px;
-}
-
-
-div#content {
-    margin: 0 20px;
-    margin-top:30px;
-    clear: both;
-}
-
-p#footer {
-    padding-top: 40px;
-    margin-left: 15px;
-    line-height: 1.5em;
-    color: #999;
-    font-size: xx-small;
-    clear: both;
-}
-
-p#footer a {
-    text-decoration: none;
-}
-
-.hide {
-    display: none;
-}
-
-.disabled {
-    color: #808080;
-}
-
-#mainNav {
-    font-size:16px;
-    font-weight:bold;
-    height: 30px;
-}
-
-#mainNav ul {
-    padding: 0px;
-    margin: 0px;
-    list-style-type: none;
-}
-
-#mainNav ul li {
-
-    float: left;
-
-}
-
-#mainNav ul li a {
-    display: block;
-    color: rgba(255,255,255,0.8);
-    text-decoration: none;
-    padding: 0.5em 1.5em;
-    font-size: 0.77em;
-    height: 1.5em;
-}
-
-#mainNav ul li:hover {
-    -webkit-border-top-left-radius: 5px;
-    -webkit-border-top-right-radius: 5px;
-    -moz-border-radius-topleft: 5px;
-    -moz-border-radius-topright: 5px;
-    border-top-left-radius: 5px;
-    border-top-right-radius: 5px;
-    background-color:rgba(255,255,255,0.1);
-}
-
-body#home #mainNav li#homeTab a,
-body#locations #mainNav li#locationsTab a,
-body#mymeeting #mainNav li#mymeetingTab a,
-body#admin #mainNav li#adminTab a {
-    background-color: #fff;
-    color: #444;
-    -webkit-border-top-left-radius: 5px;
-    -webkit-border-top-right-radius: 5px;
-    -moz-border-radius-topleft: 5px;
-    -moz-border-radius-topright: 5px;
-    border-top-left-radius: 5px;
-    border-top-right-radius: 5px;
-}
-
-
-img.sort {
-    /* used for up/down sort arrows*/
-    vertical-align: baseline;
-    width: 10px;
-    height: 9px;
-}
-
-td.paginate {
-    text-align: center;
-}
-
-form.pageJump {
-    float: right;
-    margin-left: 20px;
-}
-
-form.pageJump select {
-    font-size: smaller;
-}
-
-div.dataHeader {
-    font-weight: bold;
-    font-size:17px;
-    line-height:28px;
-    padding-bottom:4px;
-}
-
-div.pageHeader {
-    margin-bottom: 10px;
-    font-weight: bold;
-    font-size: 19px;
-}
-
-table.nested {
-    float: left;
-}
-
-td.container {
-    /*padding: 4px 0px;*/
-    width: 100%;
-}
-
-table.nested th,
-table.nested td {
-    padding: 2px 4px;
-}
-
-div.toggle {
-    padding: 6px;
-}
-
-td.tree {
-
-}
-
-.tree span.root {
-    font-weight: bold;
-
-}
-
-.tree ul {
-    padding-left: 2em;
-    list-style: none;
-    margin-top: 0em;
-    margin-bottom: 0em;
-}
-
-.tree span.treeBranch {
-    border-bottom: 1px solid #000;
-    border-left: 1px solid #000;
-    font-size: 1.2em;
-}
-
-.tree li.sibling > span.treeBranch {
-    border-left-width: 0em;
-}
-
-.tree li.sibling {
-    border-left: 1px solid #000;
-}
-
-.tree a {
-    text-decoration: none;
-}
-
-.tree span.treeLabel {
-    position: relative;
-    top: 0.6em;
-    margin-left: 1.2em;
-    padding-left: 0.2em;
-
-    font-size: 0.83em;
-}
-
-.tree > ul {
-    padding-bottom: 0.6em;
-}
-
-.hidden {
-    display: none;
-}
-
-.tree span.treeToggle {
-    font-weight: bold;
-}
-
-.tree span.treeLink {
-    font-size: smaller;
-}
-
-.adminLink {
-    color: #000;
-}
-
-img.stateimg {
-    margin-top: -6px;
-    margin-bottom: -6px;
-}
-
-.charlist {
-    text-align: center;
-}
-
-img.graphrow {
-    background-color: #00f;
-    vertical-align: bottom;
-}
-
-table.data-list {
-    width: 100%;
-}
-
-table.data-list td {
-    vertical-align: text-top;
-    padding-left:3px;
-}
-
-tr.list-header {
-    background-color: #fff;
-}
-
-tr.list-header th {
-    background-color: #eee;
-    box-shadow: 0 -1px 0 #ddd,  0 1px 0 #ddd;
-    text-align:left;
-    padding-left:4px;
-}
-
-tr.list-header th {
-min-width:1px;
-}
-
-table.nested th
-{
-    min-width:1px;
-}
-
-tr.row-even,
-tr.row-odd
-{
-    box-shadow: 0 1px 0 #ddd;
-}
-
-tr.row-even td,
-tr.row-odd td
-{
-padding-left:4px;
-}
-
-tr.row-odd td:first-child,
-tr.row-even td:first-child
- {
-    box-shadow:  -1px 0 0 #ddd;
-}
-
-tr.row-odd td:last-child,
-tr.row-even td:last-child {
-    box-shadow:  1px 0 0 #ddd;
-}
-
-tr.list-header th:first-child
-{
-    box-shadow:  -1px 0 0 #ddd,0 -1px 0 #ddd,  0 1px 0 #ddd;
-}
-
-tr.list-header th:last-child
-{
-    box-shadow:  1px 0 0 #ddd,0 -1px 0 #ddd,  0 1px 0 #ddd;
-}
-
-tr.row-even td.tree {
-
-}
-
-tr.row-even td.tree span.treeLabel {
-
-}
-
-.taskfree, .taskfree:visited, .taskfree:hover {
-    color: #3300CC;
-    background-color:#fff;
-}
-.taskopen, .taskopen:visited, .taskopen:hover {
-    color: #FF6600;
-    background-color:#fff;
-}
-.taskclosed, .taskclosed:visited, .taskclosed:hover {
-    color: #00CC00;
-    background-color:#fff;
-}
-.taskcanceled, .taskcanceled:visited, .taskcanceled:hover {
-    color: #CC9900;
-    background-color:#fff;
-}
-.taskassigned, .taskassigned:visited, .taskassigned:hover {
-    color: #CC00FF;
-    background-color:#fff;
-}
-.taskfailed, .taskfailed:visited, .taskfailed:hover {
-    color: #CC0000;
-    background-color:#fff;
-}
-
-a.help {
-    text-decoration: underline;
-}
-
-abbr {
-    cursor: help;
-}
-
-.changelog {
-    font-family: monospace;
-    font-size: medium;
-    white-space: pre;
-}
-
-#headerHelp {
-    float: right;
-    margin: 15px 10px 0 0;
-}
-
-.filterlist {
-    font-size: smaller;
-}
-
-span#loginInfo {
-    background-color: #ccc;
-    font-weight: bold;
-    padding: 3px 15px;
-    position: absolute;
-    right: 0;
-    top: 0;
-    -webkit-border-bottom-left-radius: 3px;
-    -webkit-border-bottom-right-radius: 3px;
-    -moz-border-radius-bottomleft: 3px;
-    -moz-border-radius-bottomright: 3px;
-    border-bottom-left-radius: 3px;
-    border-bottom-right-radius: 3px;
-    box-shadow: 0 10px 10px rgba(255, 255, 255, 0.5) inset, 0 1px 3px rgba(0, 0, 0, 0.5);
-    -mox-box-shadow: 0 10px 10px rgba(255, 255, 255, 0.5) inset, 0 1px 3px rgba(0, 0, 0, 0.5);
-    -webkit-box-shadow: 0 10px 10px rgba(255, 255, 255, 0.5) inset, 0 1px 3px rgba(0, 0, 0, 0.5);
-}
-
-.smaller {
-    font-size: smaller;
-}
-
-.rpmheader {
-    /*font-family: monospace;
-    font-size: medium;
-    white-space: pre;*/
-}
-
-.error {
-    color: red;
-}
diff --git a/fedocal/templates/default/_formhelpers.html b/fedocal/templates/default/_formhelpers.html
index 4989cfd..353b8e2 100644
--- a/fedocal/templates/default/_formhelpers.html
+++ b/fedocal/templates/default/_formhelpers.html
@@ -1,10 +1,10 @@
 {% macro render_field(field, after="") %}
 <div class="row">
   {{ field.label }}{{ field(**kwargs)|safe }}
-  {% if field.flags.required %}<span class="required">*</span>{% endif %}
+  {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
   {% if after %} {{ after }}{% endif %}
   {% if field.errors %}
-  <ul class="errors">
+  <ul class="text-danger">
     {% for error in field.errors %}
     <li>{{ error }}</li>
     {% endfor %}
@@ -16,10 +16,10 @@
 {% macro render_field_invert(field, after="") %}
 <div class="row">
   {{ field(**kwargs)|safe }}{{ field.label }}
-  {% if field.flags.required %}<span class="required">*</span>{% endif %}
+  {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
   {% if after %} {{ after }}{% endif %}
   {% if field.errors %}
-  <ul class="errors">
+  <ul class="text-danger">
     {% for error in field.errors %}
     <li>{{ error }}</li>
     {% endfor %}
@@ -32,7 +32,7 @@
 <tr>
     <td>
       {{ field.label }}
-      {% if field.flags.required %}<span class="required">*</span>{% endif %}
+      {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
     </td>
     <td>{{ field(**kwargs)|safe }}</td>
     {% if escape_after %}
@@ -42,7 +42,7 @@
     {% endif %}
 </tr>
 {% if field.errors %}
-<tr class="errors">
+<tr class="text-danger">
 {% for error in field.errors %}
 <td>{{ error }}</td>
 {% endfor %}
diff --git a/fedocal/templates/default/add_calendar.html b/fedocal/templates/default/add_calendar.html
index a42420a..71c4a95 100644
--- a/fedocal/templates/default/add_calendar.html
+++ b/fedocal/templates/default/add_calendar.html
@@ -21,9 +21,9 @@
         {{ render_field_in_row(form.calendar_admin_groups) }}
         {{ render_field_in_row(form.calendar_status) }}
         </table>
-        <p class="buttons indent">
-            <input type="submit" class="submit positive button" value="{{ _('Create') }}">
-            <input type="button" value="{{ _('Cancel') }}" class="button" onclick="history.back();">
+        <p class="d-flex justify-content-end">
+            <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
+            <input type="submit" class="btn btn-primary" value="{{ _('Create') }}">
             {{ form.csrf_token }}
         </p>
     </form>
diff --git a/fedocal/templates/default/add_meeting.html b/fedocal/templates/default/add_meeting.html
index c38b1e7..0f1e882 100644
--- a/fedocal/templates/default/add_meeting.html
+++ b/fedocal/templates/default/add_meeting.html
@@ -31,7 +31,7 @@
             {% macro get_after_markdown() %}
                 {{_('Supports the') }} <a href="http://daringfireball.net/projects/markdown/syntax"
                     rel="noopener noreferrer" target="_blank">{{ _('Markdown syntax') }}</a>
-                <input type="button" class="event preview" value="{{ _('Preview')  }}">
+                <input type="button" class="btn btn-secondary preview" value="{{ _('Preview')  }}">
             {% endmacro %}
             {{ render_field_in_row(
                     form.information,
@@ -57,9 +57,9 @@
             {{ render_field_in_row(form.remind_who) }}
         </table>
 
-        <p class="buttons indent">
-            <input type="submit" class="submit positive button" value="{{ _('Add') }}">
-            <input type="button" value="{{ _('Cancel') }}" class="button" onclick="history.back();">
+        <p class="d-flex justify-content-end">
+            <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
+            <input type="submit" class="btn btn-primary" value="{{ _('Add') }}">
             {{ form.csrf_token }}
         </p>
     </form>
diff --git a/fedocal/templates/default/admin.html b/fedocal/templates/default/admin.html
index 8fa899c..30adfd9 100644
--- a/fedocal/templates/default/admin.html
+++ b/fedocal/templates/default/admin.html
@@ -1,12 +1,11 @@
 {% extends "master.html" %}
 
 {% block title %}{{ _('Admin') }}{% endblock %}
-{%block tag %}admin{% endblock %}
 
 {% block content %}
 <h2>{{ _('Admin interface') }}</h2>
 
-<ul>
+<ul class="list-unstyled">
   <li>
     <a href="{{ url_for('add_calendar') }}">
         {{ _('Add calendar') }}
@@ -14,18 +13,22 @@
   </li>
 
   <li>
-    <form action="{{url_for('admin')}}">
-      <select name="calendar">
-        {% for calendar in calendars %}
-        <option value="{{ calendar.calendar_name }}">
-          {{ calendar.calendar_name }}</option>
-        {% endfor %}
-      </select>
-      <select name="action">
-        <option value="edit">{{ _('Edit') }}</option>
-        <option value="delete">{{ _('Delete') }}</option>
-      </select>
-      <input type="submit" value="{{ _('Go') }}" class="nobutton"/>
+    <form class="form-inline" action="{{url_for('admin')}}">
+      <div class="input-group">
+        <select class="custom-select" name="calendar">
+          {% for calendar in calendars %}
+          <option value="{{ calendar.calendar_name }}">
+            {{ calendar.calendar_name }}</option>
+          {% endfor %}
+        </select>
+        <select class="custom-select" name="action">
+          <option value="edit">{{ _('Edit') }}</option>
+          <option value="delete">{{ _('Delete') }}</option>
+        </select>
+        <div class="input-group-append">
+          <input type="submit" value="{{ _('Go') }}" class="btn btn-primary"/>
+        </div>
+      </div>
     </form>
   </li>
 
diff --git a/fedocal/templates/default/agenda.html b/fedocal/templates/default/agenda.html
index d0fc28d..36c0d81 100644
--- a/fedocal/templates/default/agenda.html
+++ b/fedocal/templates/default/agenda.html
@@ -7,148 +7,104 @@ else %}{{ location }}{% endif %}{% endblock %}
 
 {% block content %}
 <section>
-
-      <header>
-          <h2>
-              {% if calendar %}
-              <a href="{{url_for('calendar',
-                  calendar_name=calendar.calendar_name)}}">
-              {{ calendar.calendar_name }}
-              {% else %}
-              <a href="{{url_for('location',
-                  loc_name=location) }}">
-              {{ location }}
-              {% endif %}
-              </a>
-          </h2>
-          {% if calendar %}
-          <p>{{ calendar.calendar_description or '-' }}</p>
-          {% else %}
-          <p> - </p>
-          {% endif %}
-      </header>
-      <nav id="weeks">
-          {% if calendar %}
-          <a href="{{url_for('calendar',
-              calendar_name=calendar.calendar_name, year=prev_week.year,
-              month=prev_week.month, day=prev_week.day)}}" class="button"
-              title="{{ _('Previous week') }}">
-              &lt;
-          </a>
-          {{ weekdays | WeekHeading }}
-          <a href="{{url_for('calendar',
-              calendar_name=calendar.calendar_name, year=next_week.year,
-              month=next_week.month, day=next_week.day)}}" class="button"
-              title="{{ _('Next week') }}">
-              &gt;
-          </a>
-          <a href="{{url_for('calendar',
-              calendar_name=calendar.calendar_name)}}" class="button" id="home_btn" title="{{ _('Today') }}">
-              {{ _('Today') }}
-          </a>
-          {% else %}
-          <a href="{{url_for('location',
-              loc_name=location, year=prev_week.year,
-              month=prev_week.month, day=prev_week.day)}}" class="button"
-              title="{{ _('Previous week') }}">
-              &lt;
-          </a>
-          {{ weekdays | WeekHeading }}
-          <a href="{{url_for('location',
-              loc_name=location, year=next_week.year,
-              month=next_week.month, day=next_week.day)}}" class="button"
-              title="{{ _('Next week') }}">
-              &gt;
-          </a>
-          <a href="{{url_for('location', loc_name=location,)}}"
-              class="button" title="{{ _('Today') }}" id="home_btn">
-            {{ _('Today') }}
-          </a>
-          {% endif %}
-      </nav>
+    <div class="row">
+    <div class="col-md-3">
+    <header>
+        <h2>
+            {% if calendar %}
+            <a href="{{url_for('calendar',
+                calendar_name=calendar.calendar_name)}}">
+            {{ calendar.calendar_name }}
+            {% else %}
+            <a href="{{url_for('location',
+                loc_name=location) }}">
+            {{ location }}
+            {% endif %}
+            </a>
+        </h2>
+        {% if calendar %}
+        <p>{{ calendar.calendar_description or '-' }}</p>
+        {% else %}
+        <p> - </p>
+        {% endif %}
+    </header>
     <aside id="mainmenu">
         {% autoescape off%}{{ curmonth_cal }}{% endautoescape %}
-        <form action="{{url_for('goto')}}" id="goto_date">
+        <form class="form-inline mb-2" action="{{url_for('goto')}}" id="goto_date">
+          <div class="input-group">
           {% if calendar %}
           <input type="hidden" name="calendar" value="{{calendar.calendar_name}}"/>
           {% else %}
           <input type="hidden" name="location" value="{{location}}"/>
           {% endif %}
-	  <input type="text" name="day" placeholder="{{ now.day }}" title="{{ _('Day in decimal') }}"/>
-	  <input type="text" name="month" placeholder="{{ now.month }}" title="{{ _('Month in decimal') }}"/>
-	  <input type="text" name="year" placeholder="{{  now.year }}" title="{{ _('Year in decimal') }}"/>
-          <input type="submit" value="{{ _('Go') }}"/>
+	  <input type="text" class="form-control" name="day" placeholder="{{ now.day }}" title="{{ _('Day in decimal') }}"/>
+	  <input type="text" class="form-control" name="month" placeholder="{{ now.month }}" title="{{ _('Month in decimal') }}"/>
+	  <input type="text" class="form-control" name="year" placeholder="{{  now.year }}" title="{{ _('Year in decimal') }}"/>
+          <div class="input-group-append">
+            <input type="submit" class="btn btn-secondary" value="{{ _('Go') }}"/>
+          </div>
+          </div>
         </form>
-        <form action="{{ url_for('update_tz') }}" id="update_tz">
-            <select name="tzone" id="tzones">
+        <form class="form-inline mb-2" action="{{ url_for('update_tz') }}" id="update_tz">
+          <div class="input-group">
+            <select class="custom-select" name="tzone" id="tzones">
                 {% for tz in tzones %}
                 {% if tz == tzone %}<option value="{{tz}}" selected>{{ tz }}</option>
                 {% else %}<option value="{{tz}}">{{ tz }}</option>{% endif %}
                 {% endfor %}
             </select>
-            <input type="submit" value="Go"/>
+            <div class="input-group-append">
+              <input class="btn btn-secondary" type="submit" value="Go"/>
+            </div>
+          </div>
         </form>
 
-        {% if not calendar %}
-        <p>
-          <a href="{{ url_for('location_list',loc_name=location) }}">
-              {{ _('List view') }}
-          </a>
-        </p>
-        {% endif %}
+        <div>
 
-        <div id="accordion">
-        <h4>{{ _('Calendars') }}</h4>
-        <ul id="calendars_menu" class="checkmark-list">
-            {% for _calendar in calendars %}
-            {% if _calendar.calendar_status == 'Enabled' %}
-            <li {% if calendar and _calendar.calendar_name == calendar.calendar_name%}
-            class="menu-focus"
-            {% endif %}>
-                <a href="{{url_for('calendar',
-                    calendar_name=_calendar.calendar_name)}}">
-                    {{ _calendar.calendar_name }}
-                </a>
-                <ul>
-                    {% if g.fas_user %}
-                    <li>
-                        <a href="{{ url_for('add_meeting',
-                            calendar_name=_calendar.calendar_name) }}">{{ _('Add a meeting') }}</a>
-                    </li>
-                    {% endif %}
-                    <li>
-                        <a href="{{ url_for('calendar_list',
-                            calendar_name=_calendar.calendar_name) }}">
-                            {{ _('List view') }}
-                        </a>
-                    </li>
-                    <li>
-                        <a href="{{url_for('ical_out',
-                                           calendar_name=_calendar.calendar_name)}}"
-                            title="{{ _('Add this calendar to your agenda') }}">{{ _('iCal export') }}</a>
-                    </li>
-                    <li>
-                        <a onclick="CopyToClipboard('{{url_for('ical_out',
-                                           calendar_name=_calendar.calendar_name)}}')"
-                            title="{{ _('Copy the iCal feed URL') }}">{{ _('Copy iCal link') }}</a>
-                    </li>
-                    {% if _calendar.calendar_contact %}
-                    <li>
-                        <a href="mailto:{{_calendar.calendar_contact}}">
-                            {{ _('Contact admin') }}
-                        </a>
-                    </li>
-                    {% endif %}
-                </ul>
-            </li>
-            {% endif %}
-            {% endfor %}
+        <ul class="list-unstyled">
+        {% if calendar %}
+        {% if g.fas_user %}
+        <li>
+            <a href="{{ url_for('add_meeting',
+                                calendar_name=calendar.calendar_name) }}">{{ _('Add a meeting') }}</a>
+        </li>
+        {% endif %}
+        <li>
+            <a href="{{ url_for('calendar_list',
+                                calendar_name=calendar.calendar_name) }}">
+                {{ _('List view') }}
+            </a>
+        </li>
+        <li>
+            <a href="{{url_for('ical_out',
+                               calendar_name=calendar.calendar_name)}}"
+               title="{{ _('Add this calendar to your agenda') }}">{{ _('iCal export') }}</a>
+        </li>
+        <li>
+            <a onclick="CopyToClipboard('{{url_for('ical_out',
+                                                    calendar_name=calendar.calendar_name)}}')"
+               title="{{ _('Copy the iCal feed URL') }}" href="#">{{ _('Copy iCal link') }}</a>
+        </li>
+        {% if calendar.calendar_contact %}
+        <li>
+            <a href="mailto:{{calendar.calendar_contact}}">
+                {{ _('Contact admin') }}
+            </a>
+        </li>
+        {% endif %}
+        {% else %}
+        <li>
+            <a href="{{ url_for('location_list',loc_name=location) }}">
+                {{ _('List view') }}
+            </a>
+        </li>
+        {% endif %}
         </ul>
 
         {% if calendar and (admin or calendar_admin)  %}
         <h4>{{ _('Admin') }}</h4>
         <div>
-        <ul class="checkmark-list">
+        <ul class="list-unstyled">
             {% if admin %}
             <li>
                 <a href="{{ url_for('edit_calendar',
@@ -174,7 +130,7 @@ else %}{{ location }}{% endif %}{% endblock %}
         {% endif %}
       </div>
       {% if calendar %}
-      <ul class="checkmark-list">
+      <ul class="list-unstyled">
         {% if calendar.calendar_admin_group %}
         <li>{{ _('Administrators:') }} {{ calendar.calendar_admin_group }}</li>
         {% endif %}
@@ -187,7 +143,47 @@ else %}{{ location }}{% endif %}{% endblock %}
       {% endif %}
 
     </aside>
-    <div id='agenda'>
+    </div>
+    <div class="col-md-9" id='agenda'>
+    <nav class="text-center">
+        {% if calendar %}
+        <a href="{{url_for('calendar',
+            calendar_name=calendar.calendar_name, year=prev_week.year,
+            month=prev_week.month, day=prev_week.day)}}" class="btn btn-secondary"
+            title="{{ _('Previous week') }}">
+            &lt;
+        </a>
+        {{ weekdays | WeekHeading }}
+        <a href="{{url_for('calendar',
+            calendar_name=calendar.calendar_name, year=next_week.year,
+            month=next_week.month, day=next_week.day)}}" class="btn btn-secondary"
+            title="{{ _('Next week') }}">
+            &gt;
+        </a>
+        <a href="{{url_for('calendar',
+            calendar_name=calendar.calendar_name)}}" class="btn btn-primary" id="home_btn" title="{{ _('Today') }}">
+            {{ _('Today') }}
+        </a>
+        {% else %}
+        <a href="{{url_for('location',
+            loc_name=location, year=prev_week.year,
+            month=prev_week.month, day=prev_week.day)}}" class="btn btn-secondary"
+            title="{{ _('Previous week') }}">
+            &lt;
+        </a>
+        {{ weekdays | WeekHeading }}
+        <a href="{{url_for('location',
+            loc_name=location, year=next_week.year,
+            month=next_week.month, day=next_week.day)}}" class="btn btn-secondary"
+            title="{{ _('Next week') }}">
+            &gt;
+        </a>
+        <a href="{{url_for('location', loc_name=location,)}}"
+            class="btn btn-primary" title="{{ _('Today') }}" id="home_btn">
+          {{ _('Today') }}
+        </a>
+        {% endif %}
+    </nav>
     {% macro render_meetings(meeting_list, loopidx, prev_meetings, next_meetings, time) -%}
       {% if loopidx == day_index %}
           <td class="today" data-date="{{ weekdays[loopidx - 1] }}", data-time="{{ time }}">
@@ -246,7 +242,7 @@ else %}{{ location }}{% endif %}{% endblock %}
       {% endif %}
       </td>
     {%- endmacro %}
-      <table>
+      <table class="weekly table-responsive">
           <tr>
               <th>{{ _('%(timezone)s time', timezone=tzone) }}</th>
               {% for day in weekdays %}
@@ -319,34 +315,29 @@ else %}{{ location }}{% endif %}{% endblock %}
           </tr>
       </table>
     </div>
+    </div>
   </section>
 {% endblock %}
 
 {% block sidebar %}
 {% if calendar %}
   <aside id="shortmenu">
-    <ul>
+    <div class="btn-group">
       {% if calendar_editor %}
-      <li>
-        <a href="{{ url_for('add_meeting',
+        <a class="btn btn-light" href="{{ url_for('add_meeting',
                             calendar_name=calendar.calendar_name) }}">
             <img src="{{ url_for('static', filename='plus.png') }}" title="{{ _('Add meeting') }}" alt="{{ _('Add meeting') }}" />
         </a>
-      </li>
       {% endif %}
-      <li>
-        <a href="{{ url_for('calendar_list',
+        <a class="btn btn-light" href="{{ url_for('calendar_list',
                             calendar_name=calendar.calendar_name) }}">
             <img src="{{ url_for('static', filename='list.png') }}" title="{{ _('List view') }}" alt="{{ _('List view') }}" />
         </a>
-      </li>
-      <li>
-        <a href="{{url_for('ical_out',
+        <a class="btn btn-light" href="{{url_for('ical_out',
                            calendar_name=calendar.calendar_name)}}">
             <img src="{{ url_for('static', filename='ical.png') }}" title="{{ _('iCal Export') }}" alt="{{ _('iCal export') }}" />
         </a>
-      </li>
-    </ul>
+    </div>
   </aside>
 {% endif %}
 {% endblock %}
diff --git a/fedocal/templates/default/clear_calendar.html b/fedocal/templates/default/clear_calendar.html
index 5db9ac9..943b537 100644
--- a/fedocal/templates/default/clear_calendar.html
+++ b/fedocal/templates/default/clear_calendar.html
@@ -20,9 +20,9 @@
 
 <form action="" method="post">
 {{ render_field_invert(form.confirm_delete) }}
-<p class="buttons indent">
-    <input type="submit" class="submit positive button" value="{{ _('Delete') }}">
-    <input type="button" value="{{ _('Cancel') }}" class="button" onclick="history.back();">
+<p class="d-flex justify-content-end">
+    <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
+    <input type="submit" class="btn btn-danger" value="{{ _('Delete') }}">
 </p>
 {{ form.csrf_token }}
 </form>
diff --git a/fedocal/templates/default/delete_calendar.html b/fedocal/templates/default/delete_calendar.html
index 0a4c965..c2b80ce 100644
--- a/fedocal/templates/default/delete_calendar.html
+++ b/fedocal/templates/default/delete_calendar.html
@@ -19,10 +19,10 @@
 
 <form action="" method="post">
 {{ render_field_invert(form.confirm_delete) }}
-<p class="buttons indent">
-    <input id="confirm_button" type="submit" class="submit positive button"
+<p class="d-flex justify-content-end">
+    <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
+    <input id="confirm_button" type="submit" class="btn btn-danger"
         value="{{ _('Delete') }}">
-    <input type="button" value="{{ _('Cancel') }}" class="button" onclick="history.back();">
 </p>
 {{ form.csrf_token }}
 </form>
diff --git a/fedocal/templates/default/delete_meeting.html b/fedocal/templates/default/delete_meeting.html
index 80ad3cd..401e5e2 100644
--- a/fedocal/templates/default/delete_meeting.html
+++ b/fedocal/templates/default/delete_meeting.html
@@ -46,11 +46,11 @@ meetings as well)') }}
 </p>
 {{ render_field_invert(form.confirm_futher_delete) }}
 {% endif %}
-<p class="buttons indent">
-    <input id="confirm_button" type="submit" class="submit positive button"
-        value="{{ _('Delete') }}">
-    <input type="button" value="{{ _('Cancel') }}" class="button"
+<p class="d-flex justify-content-end">
+    <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1"
            onclick="history.back();">
+    <input id="confirm_button" type="submit" class="btn btn-danger"
+        value="{{ _('Delete') }}">
 </p>
 {{ form.csrf_token }}
 </form>
diff --git a/fedocal/templates/default/edit_calendar.html b/fedocal/templates/default/edit_calendar.html
index 0ac0fc9..e3edeb0 100644
--- a/fedocal/templates/default/edit_calendar.html
+++ b/fedocal/templates/default/edit_calendar.html
@@ -20,9 +20,9 @@
         {{ render_field_in_row(form.calendar_admin_groups) }}
         {{ render_field_in_row(form.calendar_status) }}
         </table>
-        <p class="buttons indent">
-            <input type="submit" class="submit positive button" value="{{ _('Edit') }}">
-            <input type="button" value="{{ _('Cancel') }}" class="button" onclick="history.back();">
+        <p class="d-flex justify-content-end">
+            <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
+            <input type="submit" class="btn btn-primary" value="{{ _('Edit') }}">
             {{ form.csrf_token }}
         </p>
     </form>
diff --git a/fedocal/templates/default/edit_meeting.html b/fedocal/templates/default/edit_meeting.html
index 72c35b8..a7ef5cb 100644
--- a/fedocal/templates/default/edit_meeting.html
+++ b/fedocal/templates/default/edit_meeting.html
@@ -26,7 +26,7 @@
             {% macro get_after_markdown() %}
                 {{_('Supports the') }} <a href="http://daringfireball.net/projects/markdown/syntax"
                     rel="noopener noreferrer" target="_blank">{{ _('Markdown syntax') }}</a>
-                <input type="button" class="event preview" value="{{ _('Preview')  }}">
+                <input type="button" class="btn btn-secondary preview" value="{{ _('Preview')  }}">
             {% endmacro %}
             {{ render_field_in_row(
                 form.information,
@@ -54,12 +54,12 @@
 
         {{ form.csrf_token }}
 
-        <p class="buttons indent">
-            <input type="submit" name="action" class="submit positive button" value="{{ _('Save') }}"/>
+        <p class="d-flex justify-content-end">
+            <input type="button" name="action" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();"/>
         {% if meeting.recursion_frequency %}
-            <input type="submit" name="action" class="submit positive button" value="{{ _('Save all') }}"/>
+            <input type="submit" name="action" class="btn btn-primary mr-1" value="{{ _('Save all') }}"/>
         {% endif %}
-            <input type="button" name="action" value="{{ _('Cancel') }}" class="button" onclick="history.back();"/>
+            <input type="submit" name="action" class="btn btn-primary" value="{{ _('Save') }}"/>
         </p>
 
     </form>
diff --git a/fedocal/templates/default/index.html b/fedocal/templates/default/index.html
index 3310a08..1aa425a 100644
--- a/fedocal/templates/default/index.html
+++ b/fedocal/templates/default/index.html
@@ -1,17 +1,20 @@
 {% extends "master.html" %}
 
 {% block title %}{{ _('Home') }}{% endblock %}
-{%block tag %}home{% endblock %}
 
 {% macro render_calendars(calendars) -%}
     {% for calendar_row in calendars %}
-    <div class="calendar_row">
+    <div class="row">
         {% for calendar in calendar_row %}
-            <a class="calendar_link"
+            <a class="col-sm-6 col-md-4 col-lg-3 mb-3"
                 href="{{ url_for('calendar', calendar_name=calendar.calendar_name) }}">
-                <img src='{{ url_for("static", filename="fedocal.png") }}' alt="" />
-                <span class="calendar_name">{{ calendar.calendar_name }}</span>
-                <span class="calendar_desc">{{ calendar.calendar_description }}</span>
+                <div class="d-flex">
+                  <img src='{{ url_for("static", filename="fedocal.png") }}' alt="" class="my-auto mr-2" />
+                  <div>
+                    <strong>{{ calendar.calendar_name }}</strong>
+                    <div>{{ calendar.calendar_description }}</div>
+                  </div>
+                </div>
             </a>
         {% endfor %}
     </div>
@@ -22,12 +25,12 @@
 
 {% block content %}
 <h2>{{ _('Active Calendars') }}</h2>
-<section class="calendar_list">
+<section>
     {{ render_calendars(calendars_table) }}
 </section>
 
 <h3>{{ _('Calendars disabled') }}</h3>
-<section class="calendar_list">
+<section>
     {{ render_calendars(calendars_table2) }}
 </section>
 {% endblock %}
diff --git a/fedocal/templates/default/locations.html b/fedocal/templates/default/locations.html
index 7b44f95..7d12e76 100644
--- a/fedocal/templates/default/locations.html
+++ b/fedocal/templates/default/locations.html
@@ -5,11 +5,11 @@
 
 {% macro render_locations(calendars) -%}
     {% for location_row in locations %}
-    <div class="calendar_row">
+    <div class="row">
         {% for location in location_row %}
-            <a class="calendar_link"
+            <a class="col-md-4"
                 href="{{ url_for('location', loc_name=location) }}">
-                <span class="calendar_name">{{ location }}</span>
+                <span>{{ location }}</span>
             </a>
         {% endfor %}
     </div>
@@ -20,7 +20,7 @@
 
 {% block content %}
 <h2>{{ _('Locations') }}</h2>
-<section class="calendar_list">
+<section>
     {{ render_locations(locations) }}
 </section>
 {% endblock %}
diff --git a/fedocal/templates/default/master.html b/fedocal/templates/default/master.html
index 7ff41b4..2f6affb 100644
--- a/fedocal/templates/default/master.html
+++ b/fedocal/templates/default/master.html
@@ -4,87 +4,119 @@
 <html lang='en'>
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>{% block title %}{% endblock %} - Fedocal</title>
     <link rel="shortcut icon" type="image/vnd.microsoft.icon"
         href="{{ url_for('static', filename='favicon.ico')}}"/>
     <link rel="stylesheet" type="text/css" media="screen"
-        href="{{ url_for('static', filename='koji.css') }}"/>
+        href="{{ url_for('static', filename='bootstrap.css') }}"/>
     <link rel="stylesheet" type="text/css" media="screen"
-        href="{{ url_for('static', filename='fedocal.css') }}"/>
+        href="{{ url_for('static', filename='addon.css') }}"/>
     <link type="text/css" rel="stylesheet"
         href="{{ url_for('static',
             filename='fedocal/jquery-ui-1.11.1.min.css')}}" />
     {% block header %}{% endblock %}
   </head>
-  <body id="{% block tag %}{% endblock %}">
+  <body class="d-flex flex-column">
 
-    <div id="wrap">
-      <div id="innerwrap">
-
-        <!-- HEADER -->
-        <div id="header">
+    <!-- HEADER -->
+    <nav class="navbar navbar-expand-lg {% block navbar_class %}masthead{% endblock %}">
+      <div class="{% block navbar_container %}container{% endblock %}">
+        <a class="navbar-brand" href="/">
+          {% block navbar_brand %}
           <img src="{{ url_for('static', filename='fedocal-logo.png') }}"
-            alt="Fedocal" id="kojiLogo"/>
-          <form action="{{url_for('search')}}" id="headerSearch">
-              <input type="text" name="keyword" title="{{ _("Search for meetings, you may use '*'") }}"/>
-              <input type="submit" value="{{ _('Search') }}"/>
+               alt="Fedocal" id="kojiLogo"/></a>
+          {% endblock %}
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#fedocal-navbar" aria-controls="fedocal-navbar" aria-expanded="false" aria-label="{{ _("Toggle navigation") }}">
+          <span class="navbar-toggler-icon"></span>
+        </button>
+        
+        <div class="collapse navbar-collapse" id="fedocal-navbar">
+          <ul class="navbar-nav mr-auto">
+            <li class="nav-item">
+              <a class="nav-link" href="{{url_for('locations')}}">{{ _('Locations') }}</a>
+            </li>
+            <li class="nav-item">
+              <a class="nav-link" href="{{url_for('api')}}">{{ _('API') }}</a>
+            </li>
+          </ul>
+          <form class="form-inline my-2 my-lg-0" action="{{url_for('search')}}" id="headerSearch">
+            <div class="input-group">
+              <input class="form-control" name="keyword" type="search" placeholder="{{ _("Search for meetings") }}" aria-label="{{ _("Search for meetings") }}" title="{{ _("To match, you may use '*'") }}">
+              <div class="input-group-append">
+                <button class="btn btn-secondary" type="submit" title="{{ _("Search") }}">
+                  <svg class="bi bi-search" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor"
+                       xmlns="http://www.w3.org/2000/svg">
+                    <path fill-rule="evenodd"
+                          d="M10.442 10.442a1 1 0 0 1 1.415 0l3.85 3.85a1 1 0 0 1-1.414 1.415l-3.85-3.85a1 1 0 0 1 0-1.415z">
+                    </path>
+                    <path fill-rule="evenodd"
+                          d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"></path>
+                    </svg>
+                </button>
+              </div>
+            </div>
           </form>
-        </div><!-- end header -->
-
-        <!-- MAIN NAVIGATION -->
-        <div id="mainNav">
-          <h4 class="hide">{{ _('Main Site Links') }}</h4>
-          <ul>
-              <li id="homeTab"><a href="{{url_for('index')}}">{{ _('Home') }}</a></li>
-              <li id="locationsTab"><a href="{{url_for('locations')}}">{{ _('Locations') }}</a></li>
-              <li id="apiTab"><a href="{{url_for('api')}}">{{ _('API') }}</a></li>
+          <div class="navbar-nav">
             {% if g.fas_user %}
-            <li id="mymeetingTab"><a href="{{url_for('my_meetings')}}">{{ _('My meetings') }}</a></li>
-            {% endif %}
-            {% if admin %}
-            <li id="adminTab"><a href="{{url_for('admin')}}">{{ _('Admin') }}</a></li>
+            <div class="nav-item dropdown">
+              <a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-expanded="false">
+                {{ g.fas_user.username }}
+              </a>
+              <ul class="dropdown-menu dropdown-menu-right">
+                <li><a class="dropdown-item" href="{{url_for('my_meetings',)}}">{{ _('My meetings') }}</a></li>
+                {% if admin %}
+                <li><a class="dropdown-item" href="{{url_for('admin')}}">{{ _('Admin') }}</a></li>
+                {% endif %}
+                <li><hr class="dropdown-divider"></li>
+                <li><a class="dropdown-item" href="{{ url_for('auth_logout') }}?next={{request.url}}">{{ _('Log Out') }}</a></li>
+              </ul>
+            </div>
+            {% else %}
+            <a class="btn btn-primary ml-2" href="{{ url_for('auth_login') }}?next={{request.url}}">{{ _('Log In') }}</a>
             {% endif %}
-          </ul>
-        </div><!-- end mainNav -->
+          </div>
+        </div>
+      </div>
+    </nav><!-- end header -->
 
-        <span id="loginInfo">
-          {% if g.fas_user %}
-          <span class="text">{{ _('logged in as') }} </span>
-            <a href="{{url_for('my_meetings',)}}">{{ g.fas_user.username }}</a> |
-            <a href="{{ url_for('auth_logout') }}?next={{request.url}}">{{ _('log out') }}</a>
-          {% else %}
-          <a href="{{ url_for('auth_login') }}?next={{request.url}}">{{ _('login') }}</a>
-          {% endif %}
-        </span>
+    <main class="bodycontent py-2 flex-fill">
+      <div class="container">
 
-        <div id="content">
+        {% with messages = get_flashed_messages(with_categories=true) %}
+            {% if category, messages %}
+            <ul id="flashes">
+                {% for category, message in messages %}
+                <li class="{{ category }}">{{ message }}</li>
+                {% endfor %}
+            </ul>
+            {% endif %}
+        {% endwith %}
 
-            {% with messages = get_flashed_messages(with_categories=true) %}
-                {% if category, messages %}
-                <ul id="flashes">
-                    {% for category, message in messages %}
-                    <li class="{{ category }}">{{ message }}</li>
-                    {% endfor %}
-                </ul>
-                {% endif %}
-            {% endwith %}
+        {% block content %}{% endblock %}
 
-            {% block content %}{% endblock %}
+      </div>
+    </main>
 
+    <footer id="footer" class="footer my-4 {% block footer_class %}text-white{% endblock %}">
+      <div class="container">
+        <div class="d-flex align-items-center justify-content-between">
+          <span>Copyright &copy; 2012-2022 Red Hat</span>
+          <ul class="list-inline m-0">
+            <li class="list-inline-item">
+              <a href="https://pagure.io/fedocal/">fedocal {{version}}</a>
+            </li>
+            <li class="list-inline-item">
+              <a href="http://fedocal.rtfd.org" rel="noopener noreferrer"
+                 target="_blank">{{ _('Documentation') }}</a>
+            </li>
+            <li class="list-inline-item">
+              <a href="http://fedocal.readthedocs.org/en/latest/contributors.html">{{ _('Authors') }}</a>
+            </li>
+          </ul>
         </div>
-
-        <p id="footer">
-          Copyright &copy; 2012-2015 Red Hat
-          <a href="https://pagure.io/fedocal/">fedocal</a>
-          -- {{version}}
-          -- <a href="http://fedocal.rtfd.org" rel="noopener noreferrer"
-              target="_blank">{{ _('Documentation') }}</a>
-          -- <a href="http://fedocal.readthedocs.org/en/latest/contributors.html">{{ _('Authors') }}</a>
-          -- <a href="{{ url_for('api') }}">{{ _('API') }}</a>
-        </p>
-
       </div>
-    </div>
+    </footer>
 
     {% block sidebar %}{% endblock %}
 
@@ -97,6 +129,10 @@
         src="{{ url_for('static',
             filename='jquery-ui.min-1.11.1.js') }}">
     </script>
+    <script type="text/javascript"
+        src="{{ url_for('static',
+            filename='bootstrap.js') }}">
+    </script>
     <script type="text/javascript">
         FEDOCAL = {};
         function CopyToClipboard (text) {
diff --git a/fedocal/templates/default/meeting_list.html b/fedocal/templates/default/meeting_list.html
index 4e627c1..f55fc6f 100644
--- a/fedocal/templates/default/meeting_list.html
+++ b/fedocal/templates/default/meeting_list.html
@@ -7,7 +7,9 @@
 
 {% block content %}
 <section>
-{% if calendar or location %}
+    <div class="row">
+    <div class="col-md-3">
+    {% if calendar or location %}
     <header>
         <h2>
             {% if calendar %}
@@ -23,101 +25,81 @@
         </h2>
         <p>{{ calendar.calendar_description or '-' }}</p>
     </header>
-    <nav id="weeks">
-      <p>
-        {% if meetings %}
-        {{ meetings[0].meeting_date.strftime('%d %b %Y') }} to
-        {{ meetings[-1].meeting_date_end.strftime('%d %b %Y')  }}
-        {% endif %}
-      </p>
-    </nav>
-{% else %}
-<header>
-    <h2>{{ _('Search') }}</h2>
-    <p>{{ _('Result of your search for "%(keyword)s"', keyword=keyword) }}</p>
-</header>
-{% endif %}
+    {% else %}
+    <header>
+        <h2>{{ _('Search') }}</h2>
+        <p>{{ _('Result of your search for "%(keyword)s"', keyword=keyword) }}</p>
+    </header>
+    {% endif %}
     <aside id="mainmenu">
         {% autoescape off%}{{ curmonth_cal }}{% endautoescape %}
         {% if calendar or location %}
-        <form action="{{url_for('goto')}}" id="goto_date">
+        <form class="form-inline mb-2" action="{{url_for('goto')}}" id="goto_date">
+          <div class="input-group">
           {% if calendar %}
           <input type="hidden" name="calendar" value="{{calendar.calendar_name}}"/>
           {% else %}
           <input type="hidden" name="location" value="{{location}}"/>
           {% endif %}
           <input type="hidden" name="type" value="list"/>
-          <input type="text" name="day" placeholder="28" title="{{ _('Day in decimal') }}"/>
-          <input type="text" name="month" placeholder="02" title="{{ _('Month in decimal') }}"/>
-          <input type="text" name="year" placeholder="2014" title="{{ _('Year in decimal') }}"/>
-          <input type="submit" value="{{ _('Go') }}"/>
+          <input type="text" class="form-control" name="day" placeholder="28" title="{{ _('Day in decimal') }}"/>
+          <input type="text" class="form-control" name="month" placeholder="02" title="{{ _('Month in decimal') }}"/>
+          <input type="text" class="form-control" name="year" placeholder="2014" title="{{ _('Year in decimal') }}"/>
+          <div class="input-group-append">
+            <input type="submit" class="btn btn-secondary" value="{{ _('Go') }}"/>
+          </div>
+          </div>
         </form>
         <p class="smaller">
             {{ _('Specify a year to see the yearly report, a month of a year to see
             the monthly report and a complete date to see that specific date.') }}
         </p>
-        <p>
-          {% if calendar %}
-            <a href="{{ url_for('calendar', calendar_name=calendar.calendar_name) }}">
-                {{ _('Calendar view') }}
-            </a>
-          {% else %}
-            <a href="{{ url_for('location',loc_name=location) }}">
-                {{ _('Calendar view') }}
-            </a>
-          {% endif %}
-        </p>
-        {% endif %}
-        <div id="accordion">
-        <h4>{{ _('Calendars') }}</h4>
-        <ul id="calendars_menu" class="checkmark-list">
-            {% for calendar in calendars %}
-            {% if calendar.calendar_status == 'Enabled' %}
+        <ul class="list-unstyled">
+        {% if calendar %}
+            {% if g.fas_user %}
             <li>
-                <a href="{{url_for('calendar',
-                    calendar_name=calendar.calendar_name)}}">
-                    {{ calendar.calendar_name }}
+                <a href="{{ url_for('add_meeting',
+                    calendar_name=calendar.calendar_name) }}">{{ _('Add a meeting') }}</a>
+            </li>
+            {% endif %}
+            <li>
+               <a href="{{ url_for('calendar_list',
+                    calendar_name=calendar.calendar_name) }}">
+                    {{ _('List view') }}
+                </a>
+            </li>
+            <li>
+                <a href="{{url_for('ical_out',
+                                   calendar_name=calendar.calendar_name)}}"
+                    title="{{ _('Add this calendar to your agenda') }}">{{ _('iCal export') }}</a>
+            </li>
+            <li>
+                <a onclick="CopyToClipboard('{{url_for('ical_out',
+                                   calendar_name=calendar.calendar_name)}}');return false;"
+                    title="{{ _('Copy the iCal feed URL') }}" href="#">{{ _('Copy iCal link') }}</a>
+            </li>
+            {% if calendar.calendar_contact %}
+            <li>
+                <a href="mailto:{{calendar.calendar_contact}}">
+                    {{ _('Contact admin') }}
                 </a>
-                <ul>
-                    {% if g.fas_user %}
-                    <li>
-                        <a href="{{ url_for('add_meeting',
-                            calendar_name=calendar.calendar_name) }}">{{ _('Add a meeting') }}</a>
-                    </li>
-                    {% endif %}
-                    <li>
-                        <a href="{{ url_for('calendar_list',
-                            calendar_name=calendar.calendar_name) }}">
-                            {{ _('List view') }}
-                        </a>
-                    </li>
-                    <li>
-                        <a href="{{url_for('ical_out',
-                                           calendar_name=calendar.calendar_name)}}"
-                            title="{{ _('Add this calendar to your agenda') }}">{{ _('iCal export') }}</a>
-                    </li>
-                    <li>
-                        <a onclick="CopyToClipboard('{{url_for('ical_out',
-                                           calendar_name=calendar.calendar_name)}}');return false;"
-                            title="{{ _('Copy the iCal feed URL') }}" href="#">{{ _('Copy iCal link') }}</a>
-                    </li>
-                    {% if calendar.calendar_contact %}
-                    <li>
-                        <a href="mailto:{{calendar.calendar_contact}}">
-                            {{ _('Contact admin') }}
-                        </a>
-                    </li>
-                    {% endif %}
-                </ul>
             </li>
             {% endif %}
-            {% endfor %}
+        {% else %}
+            <li>
+                <a href="{{ url_for('location',loc_name=location) }}">
+                    {{ _('Calendar view') }}
+                </a>
+            </li>
+        {% endif %}
         </ul>
+        {% endif %}
+        <div>
 
         {% if calendar and (admin or calendar_admin)  %}
         <h4>{{ _('Admin') }}</h4>
         <div>
-        <ul class="checkmark-list">
+        <ul class="list-unstyled">
             {% if admin %}
             <li>
                 <a href="{{ url_for('edit_calendar',
@@ -161,12 +143,24 @@
     </aside>
 
     </aside>
+    </div>
+
+    <div class="col-md-9" id='meeting_list'>
+    {% if calendar or location %}
+    <nav id="weeks" class="text-center">
+      <p>
+        {% if meetings %}
+        {{ meetings[0].meeting_date.strftime('%d %b %Y') }} to
+        {{ meetings[-1].meeting_date_end.strftime('%d %b %Y')  }}
+        {% endif %}
+      </p>
+    </nav>
+    {% endif %}
 
-<div id='meeting_list'>
     {% if calendar %}
     <p>{{ _('Time are expressed in the %(timezone)s time zone.', timezone=tzone) }}</p>
     {% endif %}
-    <table>
+    <table class="table table-sm">
         <tr>
             <td>{{ _('Date') }}</td>
             <td>{{ _('Time') }}</td>
@@ -226,33 +220,28 @@
         </tr>
         {% endfor %}
     </table>
-</div>
+    </div>
+    </div>
 </section>
 {% endblock %}
 
 {% block sidebar %}
 {% if calendar %}
   <aside id="shortmenu">
-    <ul>
-      <li>
-        <a href="{{ url_for('add_meeting',
+    <div class="btn-group">
+        <a class="btn btn-light" href="{{ url_for('add_meeting',
                             calendar_name=calendar.calendar_name) }}">
             <img src="{{ url_for('static', filename='plus.png') }}" title="{{ _('Add meeting') }}" alt="{{ _('Add meeting') }}" />
         </a>
-      </li>
-      <li>
-        <a href="{{ url_for('calendar',
+        <a class="btn btn-light" href="{{ url_for('calendar',
                             calendar_name=calendar.calendar_name) }}">
             <img src="{{ url_for('static', filename='table.png') }}" title="{{ _('Calendar view') }}" alt="{{ _('Calendar view') }}" />
         </a>
-      </li>
-      <li>
-        <a href="{{url_for('ical_out',
+        <a class="btn btn-light" href="{{url_for('ical_out',
                            calendar_name=calendar.calendar_name)}}">
             <img src="{{ url_for('static', filename='ical.png') }}" title="{{ _('iCal Export') }}" alt="{{ _('iCal Export') }}" />
         </a>
-      </li>
-    </ul>
+    </div>
   </aside>
 {% endif %}
 {% endblock %}
diff --git a/fedocal/templates/default/my_meeting.html b/fedocal/templates/default/my_meeting.html
index 8073b92..195fe69 100644
--- a/fedocal/templates/default/my_meeting.html
+++ b/fedocal/templates/default/my_meeting.html
@@ -49,16 +49,18 @@
     {% if regular_meetings %}
     <p>{{ _('This is the list of all regular meeting you created') }}</p>
     <div class='my_meetings'>
-        <table>
+        <div class="list-group mb-2">
             {% for meeting in regular_meetings %}
-            <tr>
-                <td class="date">{{ meeting.meeting_date }}</td>
-                <td class="time">
+            <div class="list-group-item d-flex justify-content-between align-content-center">
+                <div>
+                <span class="text-muted">{{ meeting.meeting_date }}</span>
+                <span class="text-muted">
                     {{ _('%(start)s to %(end)s', start=meeting.meeting_time_start, end=meeting.meeting_time_stop) }}
-                </td>
-                <td class="calendar"> {{ meeting.calendar_name }} </td>
-                <td> {{ meeting.meeting_name }} </td>
-                <td class="buttons">
+                </span>
+                <span class="calendar"> {{ meeting.calendar_name }} </span>
+                <span> {{ meeting.meeting_name }} </span>
+                </div>
+                <div>
                     <a class="button" href="{{ url_for('edit_meeting',
                         meeting_id=meeting.meeting_id) }}">
                         <img src="{{ url_for('static', filename='edit.png') }}"
@@ -69,27 +71,27 @@
                         <img src="{{ url_for('static', filename='delete.png') }}"
                         title="{{ _('Delete') }}" alt="{{ _('Delete') }}"/>
                     </a>
-                </td>
-            </tr>
+                </div>
+            </div>
             {% endfor %}
-        </table>
+        </div>
     </div>
     {% endif %}
 
     <h4>{{ _('Past meetings') }}</h4>
     <div class='my_meetings'>
-        <table>
+        <div class="list-group mb-2">
             {% for meeting in pas_meetings %}
-            <tr>
-                <td class="date">{{ meeting.meeting_date }}</td>
-                <td class="time">
+            <div class="list-group-item">
+                <span class="text-muted">{{ meeting.meeting_date }}</span>
+                <span class="text-muted">
                     {{ _('%(start)s to %(end)s', start=meeting.meeting_time_start, end=meeting.meeting_time_stop) }}
-                </td>
-                <td class="calendar"> {{ meeting.calendar_name }} </td>
-                <td> {{ meeting.meeting_name }} </td>
-            </tr>
+                </span>
+                <span class="calendar"> {{ meeting.calendar_name }} </span>
+                <span> {{ meeting.meeting_name }} </span>
+            </div>
             {% endfor %}
-        </table>
+        </div>
     </div>
 </section>
 {% endblock %}
diff --git a/fedocal/templates/default/upload_calendar.html b/fedocal/templates/default/upload_calendar.html
index 27fdfdb..df4e102 100644
--- a/fedocal/templates/default/upload_calendar.html
+++ b/fedocal/templates/default/upload_calendar.html
@@ -22,9 +22,9 @@
         <table>
         {{ render_field_in_row(form.ics_file) }}
         </table>
-        <p class="buttons indent">
-            <input type="submit" class="submit positive button" value="{{ _('Upload') }}">
-            <input type="button" value="{{ _('Cancel') }}" class="button" onclick="history.back();">
+        <p class="d-flex justify-content-end">
+            <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
+            <input type="submit" class="btn btn-primary" value="{{ _('Upload') }}">
             {{ form.csrf_token }}
         </p>
     </form>
diff --git a/fedocal/templates/default/view_meeting.html b/fedocal/templates/default/view_meeting.html
index ccc15c2..70cb5fa 100644
--- a/fedocal/templates/default/view_meeting.html
+++ b/fedocal/templates/default/view_meeting.html
@@ -11,8 +11,8 @@
 
 {% block content %}
 <section>
-        <h2 class="orange">{{ _('Meeting "%(name)s"', name=org_meeting.meeting_name) }}</h2>
-        <p class="blue">(<a href="{{ url_for('calendar', calendar_name=org_meeting.calendar_name) }}">
+        <h2>{{ _('Meeting "%(name)s"', name=org_meeting.meeting_name) }}</h2>
+        <p>(<a href="{{ url_for('calendar', calendar_name=org_meeting.calendar_name) }}">
             {{ org_meeting.calendar_name }}</a>)
         </p>
 

From 6e950a3def7a89e64852df8a4361f2d163150d10 Mon Sep 17 00:00:00 2001
From: Jacob Michalskie <hel@lcp.world>
Date: Nov 18 2022 21:17:40 +0000
Subject: [PATCH 2/7] Remove unused icons and add new ones


The greyscale fedocal.png logo made by Ben Beaver

Co-authored-by: Ben Beaver <ben.beaver2003@protonmail.com>

---

diff --git a/fedocal/static/default/Approved.png b/fedocal/static/default/Approved.png
deleted file mode 100644
index e1d0e81..0000000
Binary files a/fedocal/static/default/Approved.png and /dev/null differ
diff --git a/fedocal/static/default/Denied.png b/fedocal/static/default/Denied.png
deleted file mode 100644
index dbd0c65..0000000
Binary files a/fedocal/static/default/Denied.png and /dev/null differ
diff --git a/fedocal/static/default/calendar-small.png b/fedocal/static/default/calendar-small.png
deleted file mode 100644
index 53abbca..0000000
Binary files a/fedocal/static/default/calendar-small.png and /dev/null differ
diff --git a/fedocal/static/default/calendar.png b/fedocal/static/default/calendar.png
deleted file mode 100644
index c67548a..0000000
Binary files a/fedocal/static/default/calendar.png and /dev/null differ
diff --git a/fedocal/static/default/favicon.ico b/fedocal/static/default/favicon.ico
index e4db2c2..a3b06fd 100644
Binary files a/fedocal/static/default/favicon.ico and b/fedocal/static/default/favicon.ico differ
diff --git a/fedocal/static/default/favicon/android-chrome-192x192.png b/fedocal/static/default/favicon/android-chrome-192x192.png
new file mode 100644
index 0000000..b72f7df
Binary files /dev/null and b/fedocal/static/default/favicon/android-chrome-192x192.png differ
diff --git a/fedocal/static/default/favicon/android-chrome-512x512.png b/fedocal/static/default/favicon/android-chrome-512x512.png
new file mode 100644
index 0000000..38009b6
Binary files /dev/null and b/fedocal/static/default/favicon/android-chrome-512x512.png differ
diff --git a/fedocal/static/default/favicon/apple-touch-icon.png b/fedocal/static/default/favicon/apple-touch-icon.png
new file mode 100644
index 0000000..9f2693a
Binary files /dev/null and b/fedocal/static/default/favicon/apple-touch-icon.png differ
diff --git a/fedocal/static/default/favicon/favicon-16x16.png b/fedocal/static/default/favicon/favicon-16x16.png
new file mode 100644
index 0000000..96e2acb
Binary files /dev/null and b/fedocal/static/default/favicon/favicon-16x16.png differ
diff --git a/fedocal/static/default/favicon/favicon-24x24.png b/fedocal/static/default/favicon/favicon-24x24.png
new file mode 100644
index 0000000..6fe6ded
Binary files /dev/null and b/fedocal/static/default/favicon/favicon-24x24.png differ
diff --git a/fedocal/static/default/favicon/favicon-32x32.png b/fedocal/static/default/favicon/favicon-32x32.png
new file mode 100644
index 0000000..ddf3d33
Binary files /dev/null and b/fedocal/static/default/favicon/favicon-32x32.png differ
diff --git a/fedocal/static/default/favicon/favicon-48x48.png b/fedocal/static/default/favicon/favicon-48x48.png
new file mode 100644
index 0000000..767c7b1
Binary files /dev/null and b/fedocal/static/default/favicon/favicon-48x48.png differ
diff --git a/fedocal/static/default/favicon/safari-pinned-tab.svg b/fedocal/static/default/favicon/safari-pinned-tab.svg
new file mode 100644
index 0000000..3dab55c
--- /dev/null
+++ b/fedocal/static/default/favicon/safari-pinned-tab.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m4.5 3e-5c-0.277 0-0.5 0.223-0.5 0.5v0.5h-2c-0.554 0-1 0.446-1 1v11c0 0.554 0.446 1 1 1h3v-1h-3v-11h2v0.5c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-0.5h4v0.5c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-0.5h2v3.0859c0.3437 0.05827 0.67848 0.1453 1 0.25977v-3.3457c0-0.554-0.446-1-1-1h-2v-0.5c0-0.277-0.223-0.5-0.5-0.5s-0.5 0.223-0.5 0.5v0.5h-4v-0.5c0-0.277-0.223-0.5-0.5-0.5zm5 3h-6.5v9h2v-1.0039a0.99994 0.99994 0 0 0 0.00195-2e-3c4e-3 -3.2987 2.6983-5.9941 5.998-5.9941v-2h-1.5zm1.5 3c-2.7605 0-4.9982 2.2362-5 4.9961v3.8711c2e-3 0.62657 0.50983 1.1328 1.1367 1.1328h3.8653c2.7608-0.0019 4.998-2.2394 4.998-5 0-2.7618-2.2382-5-5-5zm0.6875 2.1211c0.88509 0 1.7207 0.67043 1.7207 1.5957 0 0.08581-0.0013 0.17221-0.01562 0.26953-0.0243 0.24618-0.25058 0.42338-0.49805 0.38867-0.24746-0.03511-0.41491-0.26645-0.36914-0.50977 4e-3 -0.02778 0.0039-0.07349 0.0039-0.14844 0-0.52461-0.43361-0.72656-0.84375-0.72656-0.40988 0-0.77833 0.34059-0.7793 0.72656 8e-3 0.44646 0 0.89037 0 1.3359l0.75977-0.0059c0.5939-0.01218 0.60137 0.87364 0.0078 0.86914l-0.76758 0.0059c-2e-3 0.3591 2e-3 0.29375 0 0.47461 0 0 0.0081 0.4385-0.0059 0.77148-0.0918 0.97794-0.9329 1.7598-1.9434 1.7598-1.071 0-1.9551-0.86692-1.9551-1.9297 0.0323-1.0933 0.91433-1.9516 2.0234-1.9414l0.61719-0.0059v0.86914l-0.61719 0.0059h-0.00385c-0.60958 0.01781-1.1306 0.42608-1.1406 1.0723 0 0.58879 0.4797 1.0605 1.0762 1.0605 0.59546 0 1.0723-0.42833 1.0723-1.0586 7e-3 -1.0452-5e-3 -2.1995-2e-3 -3.2852 3.8e-4 -0.061 0.0042-0.11046 0.01172-0.17774 0.10057-0.80378 0.82646-1.416 1.6484-1.416z"/></svg>
diff --git a/fedocal/static/default/favicon/site.webmanifest b/fedocal/static/default/favicon/site.webmanifest
new file mode 100644
index 0000000..1ae5fde
--- /dev/null
+++ b/fedocal/static/default/favicon/site.webmanifest
@@ -0,0 +1,19 @@
+{
+    "name": "Fedora Calendar",
+    "short_name": "Fedocal",
+    "icons": [
+        {
+            "src": "/static/favicon/android-chrome-192x192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+        },
+        {
+            "src": "/static/favicon/android-chrome-512x512.png",
+            "sizes": "512x512",
+            "type": "image/png"
+        }
+    ],
+    "theme_color": "#ffffff",
+    "background_color": "#ffffff",
+    "display": "standalone"
+}
diff --git a/fedocal/static/default/fedocal-logo.png b/fedocal/static/default/fedocal-logo.png
index 3345eca..eed44e3 100644
Binary files a/fedocal/static/default/fedocal-logo.png and b/fedocal/static/default/fedocal-logo.png differ
diff --git a/fedocal/static/default/fedocal-logo.svg b/fedocal/static/default/fedocal-logo.svg
new file mode 100644
index 0000000..347d17c
--- /dev/null
+++ b/fedocal/static/default/fedocal-logo.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="340" height="80" version="1.1" viewBox="0 0 340 80" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="38" cy="38" r="24" fill="#fff"/>
+ <path d="m38.664 12.001c-14.72 0-26.649 11.925-26.659 26.642h-5e-3v20.636h5e-3c8e-3 3.341 2.7141 6.0454 6.0568 6.0454h20.613c14.721-0.01 26.648-11.939 26.648-26.659 0-14.726-11.932-26.665-26.659-26.665zm5.4034 10.972c4.4772 0 8.7045 3.4306 8.7045 8.1591 0 0.43853-2e-3 0.87761-0.0739 1.375-0.12394 1.2581-1.2709 2.1603-2.5227 1.983-1.2518-0.17945-2.1009-1.3645-1.8693-2.6079 0.0212-0.14194 0.0285-0.36695 0.0285-0.74998 0-2.6809-2.1924-3.7159-4.267-3.7159-2.0734 0-3.9439 1.7435-3.9488 3.7159 0.0358 2.2816 0 4.5468 0 6.8238l3.8466-0.029c3.0043-0.0622 3.038 4.4661 0.0341 4.4432l-3.8807 0.029c-0.01 1.8351 0.015 1.5019 5e-3 2.4261 0 0 0.033 2.2415-0.0341 3.9432-0.46441 4.9976-4.718 8.9942-9.8295 8.9942-5.4178 0-9.8863-4.4325-9.8863-9.8636 0.16276-5.5872 4.6224-9.9783 10.233-9.9261l3.125-0.0233v4.4375l-3.125 0.029h-0.0227c-3.0836 0.0911-5.7222 2.1807-5.7727 5.4829 0 3.0089 2.4316 5.4205 5.4488 5.4205 3.0122 0 5.4204-2.1939 5.4204-5.4148 0.0343-5.3414-0.0238-11.242-5e-3 -16.79 2e-3 -0.31171 0.0169-0.55957 0.0512-0.90339 0.50864-4.1076 4.1828-7.2386 8.3409-7.2386z" fill="#51a2da"/>
+ <path d="m98.098 25.273c-2.3922 0-4.5933 0.39791-6.6016 1.1953-2.0083 0.76787-3.7653 1.8751-5.2715 3.3223-1.5062 1.4176-2.6731 3.1016-3.5 5.0508-0.82693 1.9492-1.2402 4.0753-1.2402 6.3789s0.4133 4.4297 1.2402 6.3789c0.82693 1.9492 1.9784 3.6466 3.4551 5.0938 1.5062 1.4176 3.2632 2.5268 5.2715 3.3242 2.0378 0.76787 4.2389 1.1504 6.6016 1.1504 2.5694 0 4.9031-0.44213 7-1.3281 2.0969-0.886 3.8673-2.1701 5.3145-3.8535l-3.7207-3.5449c-1.1223 1.2404-2.3776 2.1708-3.7656 2.791-1.3881 0.59067-2.8932 0.88672-4.5176 0.88672-1.6243 0-3.1161-0.26723-4.4746-0.79883-1.329-0.5316-2.4959-1.2832-3.5-2.2578-0.9746-0.9746-1.7416-2.128-2.3027-3.457-0.5316-1.329-0.79883-2.79-0.79883-4.3848s0.26723-3.0577 0.79883-4.3867c0.56113-1.329 1.3281-2.4805 2.3027-3.4551 1.0041-0.9746 2.171-1.7262 3.5-2.2578 1.3585-0.5316 2.8503-0.79883 4.4746-0.79883s3.1295 0.31144 4.5176 0.93164c1.3881 0.59067 2.6434 1.4903 3.7656 2.7012l3.7207-3.5c-1.4471-1.7129-3.2176-2.997-5.3145-3.8535-2.0969-0.886-4.4152-1.3281-6.9551-1.3281zm26.713 0.44141-13.955 31.01h5.9355l3.0703-7.1758h15.512l3.082 7.1758h6.0234l-13.998-31.01h-5.6699zm23.611 0v31.01h21.973v-4.8711h-16.215v-26.139h-5.7578zm26.535 0v31.01h23.258v-4.8281h-17.498v-8.5488h14.973v-4.7402h-14.973v-8.0625h16.877v-4.8301h-22.637zm29.682 0v31.01h5.7148v-20.994l17.1 20.994h4.7402v-31.01h-5.7148v20.996l-17.1-20.996zm35.883 0v31.01h13.555c3.3668 0 6.3215-0.6478 8.8613-1.9473 2.5399-1.2995 4.518-3.1027 5.9356-5.4062 1.4176-2.3331 2.127-5.0494 2.127-8.1504 0-3.1305-0.70935-5.8468-2.127-8.1504-1.4176-2.3036-3.3957-4.1068-5.9356-5.4062-2.5399-1.2995-5.4945-1.9492-8.8613-1.9492h-13.555zm45.717 0-13.953 31.01h5.9355l3.0703-7.1758h15.51l3.082 7.1758h6.0254l-14-31.01h-5.6699zm23.611 0v31.01h5.7598v-9.0371h7c0.41496 0 0.80245-0.02928 1.1992-0.04883l6.332 9.0859h6.2012l-7.1133-10.15c0.14166-0.05622 0.28614-0.10943 0.42382-0.16992 1.9787-0.886 3.4993-2.1413 4.5625-3.7656 1.0632-1.6539 1.5957-3.6185 1.5957-5.8926s-0.53251-4.2387-1.5957-5.8926-2.5838-2.9226-4.5625-3.8086c-1.9492-0.886-4.2964-1.3301-7.043-1.3301h-12.76zm-63.57 4.873h7.5313c2.3331 0 4.342 0.44408 6.0254 1.3301 1.7129 0.886 3.0278 2.1259 3.9434 3.7207 0.94506 1.5653 1.416 3.4261 1.416 5.582 0 2.1264-0.47095 3.9872-1.416 5.582-0.91554 1.5948-2.2304 2.8347-3.9434 3.7207-1.6834 0.886-3.6923 1.3301-6.0254 1.3301h-7.5313v-21.266zm69.33 0h6.7344c2.5399 0 4.4449 0.5325 5.7148 1.5957 1.2995 1.0632 1.9492 2.5838 1.9492 4.5625 0 1.9492-0.64975 3.4698-1.9492 4.5625-1.2699 1.0927-3.175 1.6406-5.7148 1.6406h-6.7344v-12.361zm-188.01 0.86914 5.8301 13.574h-11.639l5.8086-13.574zm161.43 2e-3 5.8301 13.572h-11.637l5.8066-13.572z" fill="#294172"/>
+</svg>
diff --git a/fedocal/static/default/fedocal.png b/fedocal/static/default/fedocal.png
index 0408523..bb105d6 100644
Binary files a/fedocal/static/default/fedocal.png and b/fedocal/static/default/fedocal.png differ
diff --git a/fedocal/static/default/fedora-logo.png b/fedocal/static/default/fedora-logo.png
deleted file mode 100644
index 8cb1ded..0000000
Binary files a/fedocal/static/default/fedora-logo.png and /dev/null differ
diff --git a/fedocal/static/default/header-bg.png b/fedocal/static/default/header-bg.png
deleted file mode 100644
index f4c540a..0000000
Binary files a/fedocal/static/default/header-bg.png and /dev/null differ
diff --git a/fedocal/static/default/home.png b/fedocal/static/default/home.png
deleted file mode 100644
index fed2557..0000000
Binary files a/fedocal/static/default/home.png and /dev/null differ
diff --git a/fedocal/static/default/html-bg.png b/fedocal/static/default/html-bg.png
deleted file mode 100644
index b51984e..0000000
Binary files a/fedocal/static/default/html-bg.png and /dev/null differ
diff --git a/fedocal/templates/default/master.html b/fedocal/templates/default/master.html
index 2f6affb..4c35ddf 100644
--- a/fedocal/templates/default/master.html
+++ b/fedocal/templates/default/master.html
@@ -15,6 +15,13 @@
     <link type="text/css" rel="stylesheet"
         href="{{ url_for('static',
             filename='fedocal/jquery-ui-1.11.1.min.css')}}" />
+    <link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='favicon/apple-touch-icon.png') }}">
+    <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon/favicon-32x32.png') }}">
+    <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon/favicon-16x16.png') }}">
+    <link rel="manifest" href="{{ url_for('static', filename='favicon/site.webmanifest') }}">
+    <link rel="mask-icon" href="{{ url_for('static', filename='favicon/safari-pinned-tab.svg') }}" color="#51a2da">
+    <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
+    <meta name="theme-color" content="#ffffff">
     {% block header %}{% endblock %}
   </head>
   <body class="d-flex flex-column">
@@ -25,7 +32,7 @@
         <a class="navbar-brand" href="/">
           {% block navbar_brand %}
           <img src="{{ url_for('static', filename='fedocal-logo.png') }}"
-               alt="Fedocal" id="kojiLogo"/></a>
+               alt="Fedora Calendar" id="kojiLogo" height="40" width="170"/></a>
           {% endblock %}
         <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#fedocal-navbar" aria-controls="fedocal-navbar" aria-expanded="false" aria-label="{{ _("Toggle navigation") }}">
           <span class="navbar-toggler-icon"></span>

From 14ae4f57eb812968d3da8bc20c358f260b223a78 Mon Sep 17 00:00:00 2001
From: Jacob Michalskie <hel@lcp.world>
Date: Nov 18 2022 21:19:38 +0000
Subject: [PATCH 3/7] Tone down the colours


---

diff --git a/fedocal/fedocallib/fedora_calendar.py b/fedocal/fedocallib/fedora_calendar.py
index 7d37a66..19b9b36 100644
--- a/fedocal/fedocallib/fedora_calendar.py
+++ b/fedocal/fedocallib/fedora_calendar.py
@@ -141,7 +141,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
 
         prev_month_lnk = ''
         if self.calendar_name:
-            prev_month_lnk = '<a class="btn btn-secondary" href="%s">&lt;</a>' % (
+            prev_month_lnk = '<a class="btn btn-link" href="%s">&lt;</a>' % (
                 flask.url_for(
                     'calendar',
                     calendar_name=self.calendar_name,
@@ -149,7 +149,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
                     month=int(prev_month),
                     day=1))
         elif self.loc_name:
-            prev_month_lnk = '<a class="btn btn-secondary" href="%s">&lt;</a>' % (
+            prev_month_lnk = '<a class="btn btn-link" href="%s">&lt;</a>' % (
                 flask.url_for(
                     'location',
                     loc_name=self.loc_name,
@@ -163,7 +163,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
 
         next_month_lnk = ''
         if self.calendar_name:
-            next_month_lnk = '<a class="btn btn-secondary" href="%s">&gt;</a>' % (
+            next_month_lnk = '<a class="btn btn-link" href="%s">&gt;</a>' % (
                 flask.url_for(
                     'calendar',
                     calendar_name=self.calendar_name,
@@ -171,7 +171,7 @@ class FedocalCalendar(calendar.LocaleHTMLCalendar):
                     month=int(next_month),
                     day=1))
         elif self.loc_name:
-            next_month_lnk = '<a class="btn btn-secondary" href="%s">&gt;</a>' % (
+            next_month_lnk = '<a class="btn btn-link" href="%s">&gt;</a>' % (
                 flask.url_for(
                     'location',
                     loc_name=self.loc_name,
diff --git a/fedocal/static/default/addon.css b/fedocal/static/default/addon.css
index 8a599de..d9a41c0 100644
--- a/fedocal/static/default/addon.css
+++ b/fedocal/static/default/addon.css
@@ -12,14 +12,14 @@
 }
 
 .month .primary {
-  background-color: var(--fedocal-blue-hl)
+  background-color: var(--fedocal-yellow-hl)
 }
 
 .month .secondary {
-  background-color: var(--fedocal-secondary-bg)
+  background-color: var(--fedocal-blue-hl)
 }
 
-.month .primary a, .month .secondary a {
+.month .secondary a {
   color: white;
 }
 
diff --git a/fedocal/templates/default/agenda.html b/fedocal/templates/default/agenda.html
index 36c0d81..5ab0f5c 100644
--- a/fedocal/templates/default/agenda.html
+++ b/fedocal/templates/default/agenda.html
@@ -149,14 +149,14 @@ else %}{{ location }}{% endif %}{% endblock %}
         {% if calendar %}
         <a href="{{url_for('calendar',
             calendar_name=calendar.calendar_name, year=prev_week.year,
-            month=prev_week.month, day=prev_week.day)}}" class="btn btn-secondary"
+            month=prev_week.month, day=prev_week.day)}}" class="btn btn-link"
             title="{{ _('Previous week') }}">
             &lt;
         </a>
         {{ weekdays | WeekHeading }}
         <a href="{{url_for('calendar',
             calendar_name=calendar.calendar_name, year=next_week.year,
-            month=next_week.month, day=next_week.day)}}" class="btn btn-secondary"
+            month=next_week.month, day=next_week.day)}}" class="btn btn-link"
             title="{{ _('Next week') }}">
             &gt;
         </a>
@@ -167,14 +167,14 @@ else %}{{ location }}{% endif %}{% endblock %}
         {% else %}
         <a href="{{url_for('location',
             loc_name=location, year=prev_week.year,
-            month=prev_week.month, day=prev_week.day)}}" class="btn btn-secondary"
+            month=prev_week.month, day=prev_week.day)}}" class="btn btn-link"
             title="{{ _('Previous week') }}">
             &lt;
         </a>
         {{ weekdays | WeekHeading }}
         <a href="{{url_for('location',
             loc_name=location, year=next_week.year,
-            month=next_week.month, day=next_week.day)}}" class="btn btn-secondary"
+            month=next_week.month, day=next_week.day)}}" class="btn btn-link"
             title="{{ _('Next week') }}">
             &gt;
         </a>

From ee7dc36ccc235f73b03915dcc7b311fbcb025875 Mon Sep 17 00:00:00 2001
From: Jacob Michalskie <hel@lcp.world>
Date: Nov 19 2022 00:21:03 +0000
Subject: [PATCH 4/7] Use bootstrap forms


---

diff --git a/fedocal/templates/default/_formhelpers.html b/fedocal/templates/default/_formhelpers.html
index 353b8e2..0b80c98 100644
--- a/fedocal/templates/default/_formhelpers.html
+++ b/fedocal/templates/default/_formhelpers.html
@@ -1,51 +1,78 @@
 {% macro render_field(field, after="") %}
-<div class="row">
-  {{ field.label }}{{ field(**kwargs)|safe }}
+<div class="form-group">
+  {{ field.label }}
   {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
-  {% if after %} {{ after }}{% endif %}
   {% if field.errors %}
-  <ul class="text-danger">
+  {{ field(class_="form-control is-invalid", **kwargs)|safe }}
+  {% else %}
+  {{ field(class_="form-control", **kwargs)|safe }}
+  {% endif %}
+  {% if after %}<small>{{ after }}</small>{% endif %}
+  {% if field.errors %}
+  <ul class="text-danger list-unstyled">
     {% for error in field.errors %}
-    <li>{{ error }}</li>
+    <li><small>{{ error }}</small></li>
     {% endfor %}
   </ul>
   {% endif %}
 </div>
 {% endmacro %}
 
-{% macro render_field_invert(field, after="") %}
-<div class="row">
-  {{ field(**kwargs)|safe }}{{ field.label }}
-  {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
-  {% if after %} {{ after }}{% endif %}
-  {% if field.errors %}
-  <ul class="text-danger">
-    {% for error in field.errors %}
-    <li>{{ error }}</li>
-    {% endfor %}
-  </ul>
-  {% endif %}
+{% macro render_field_checkbox(field, after="") %}
+<div class="form-group">
+  <div class="custom-control custom-checkbox">
+    {{ field(class_="custom-control-input", **kwargs)|safe }}
+    {{ field.label(class_="custom-control-label") }}
+    {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
+    {% if after %}<small>{{ after }}</small>{% endif %}
+    {% if field.errors %}
+    <ul class="text-danger list-unstyled">
+      {% for error in field.errors %}
+      <li><small>{{ error }}</small></li>
+      {% endfor %}
+    </ul>
+    {% endif %}
+  </div>
+</div>
+{% endmacro %}
+
+{% macro render_field_file(field, after="") %}
+<div class="form-group">
+  <div class="custom-file">
+    {% if field.errors %}
+    {{ field(class_="custom-file-input is-invalid", **kwargs)|safe }}
+    {% else %}
+    {{ field(class_="custom-file-input", **kwargs)|safe }}
+    {% endif %}
+    {{ field.label(class_="custom-file-label") }}
+    {% if after %}<small>{{ after }}</small>{% endif %}
+    {% if field.errors %}
+    <ul class="text-danger list-unstyled">
+      {% for error in field.errors %}
+      <li><small>{{ error }}</small></li>
+      {% endfor %}
+    </ul>
+    {% endif %}
+  </div>
 </div>
 {% endmacro %}
 
 {% macro render_field_in_row(field, after="", escape_after=False) %}
-<tr>
-    <td>
-      {{ field.label }}
-      {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
-    </td>
-    <td>{{ field(**kwargs)|safe }}</td>
+<div class="col">
+    {{ field.label }}
+    {% if field.flags.required %}<span class="text-danger">*</span>{% endif %}
+    {{ field(class_="form-control", **kwargs)|safe }}
     {% if escape_after %}
-    {% autoescape off%} {% if after %} <td>{{ after }}</td>{% endif %} {% endautoescape %}
+    {% autoescape off%} {% if after %} <small>{{ after }}</small>{% endif %} {% endautoescape %}
     {% else %}
-    {% if after %} <td>{{ after }}</td>{% endif %}
+    {% if after %} <small>{{ after }}</small>{% endif %}
     {% endif %}
-</tr>
-{% if field.errors %}
-<tr class="text-danger">
-{% for error in field.errors %}
-<td>{{ error }}</td>
-{% endfor %}
-</tr>
-{% endif %}
+    {% if field.errors %}
+    <tr class="text-danger list-unstyled">
+    {% for error in field.errors %}
+    <td>{{ error }}</td>
+    {% endfor %}
+    </tr>
+    {% endif %}
+</div>
 {% endmacro %}
diff --git a/fedocal/templates/default/add_calendar.html b/fedocal/templates/default/add_calendar.html
index 71c4a95..8d38199 100644
--- a/fedocal/templates/default/add_calendar.html
+++ b/fedocal/templates/default/add_calendar.html
@@ -1,5 +1,4 @@
 {% extends "master.html" %}
-{% from "_formhelpers.html" import render_field_in_row %}
 
 {% block title %}{{ _('Add calendar') }}{% endblock %}
 
@@ -13,14 +12,14 @@
     </header>
 
     <form action="" method="post">
-        <table>
-        {{ render_field_in_row(form.calendar_name) }}
-        {{ render_field_in_row(form.calendar_contact) }}
-        {{ render_field_in_row(form.calendar_description) }}
-        {{ render_field_in_row(form.calendar_editor_groups) }}
-        {{ render_field_in_row(form.calendar_admin_groups) }}
-        {{ render_field_in_row(form.calendar_status) }}
-        </table>
+        <div>
+        {{ render_field(form.calendar_name) }}
+        {{ render_field(form.calendar_contact) }}
+        {{ render_field(form.calendar_description) }}
+        {{ render_field(form.calendar_editor_groups) }}
+        {{ render_field(form.calendar_admin_groups) }}
+        {{ render_field(form.calendar_status) }}
+        </div>
         <p class="d-flex justify-content-end">
             <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
             <input type="submit" class="btn btn-primary" value="{{ _('Create') }}">
diff --git a/fedocal/templates/default/add_meeting.html b/fedocal/templates/default/add_meeting.html
index 0f1e882..7f674ef 100644
--- a/fedocal/templates/default/add_meeting.html
+++ b/fedocal/templates/default/add_meeting.html
@@ -10,7 +10,6 @@
 
 
 {% block content %}
-{% from "_formhelpers.html" import render_field_in_row %}
 
 <section>
     <header>
@@ -20,42 +19,44 @@
 
     <form action="{{ url_for('add_meeting',
                     calendar_name=calendar.calendar_name) }}" method="post">
-        <table>
-            {{ render_field_in_row(form.meeting_name) }}
-            {{ render_field_in_row(form.meeting_date) }}
-            {{ render_field_in_row(form.meeting_date_end) }}
+        <div>
+            {{ render_field(form.meeting_name) }}
+            {{ render_field(form.meeting_date) }}
+            {{ render_field(form.meeting_date_end) }}
+            <div class="form-row">
             {{ render_field_in_row(form.meeting_time_start)}}
             {{ render_field_in_row(form.meeting_time_stop)}}
-            {{ render_field_in_row(form.full_day) }}
-            {{ render_field_in_row(form.meeting_timezone) }}
+            </div>
+            {{ render_field_checkbox(form.full_day) }}
+            {{ render_field(form.meeting_timezone) }}
             {% macro get_after_markdown() %}
                 {{_('Supports the') }} <a href="http://daringfireball.net/projects/markdown/syntax"
                     rel="noopener noreferrer" target="_blank">{{ _('Markdown syntax') }}</a>
-                <input type="button" class="btn btn-secondary preview" value="{{ _('Preview')  }}">
+                <input type="button" class="btn btn-sm btn-secondary preview" value="{{ _('Preview')  }}">
             {% endmacro %}
-            {{ render_field_in_row(
+            {{ render_field(
                     form.information,
                     after=get_after_markdown(),
                     escape_after=True) }}
-            {{ render_field_in_row(form.wiki_link) }}
-            {{ render_field_in_row(form.meeting_location) }}
-        </table>
+            {{ render_field(form.wiki_link) }}
+            {{ render_field(form.meeting_location) }}
+        </div>
 
         <h4>{{ _('Recurring event') }}</h4>
         <p>{{ _('If this is a regular meeting this is where you want to set it as so.') }}</p>
-        <table>
-            {{ render_field_in_row(form.frequency) }}
-            {{ render_field_in_row(form.end_repeats, after=_('Leave empty if there is no end date for the repeat.')) }}
-        </table>
+        <div>
+            {{ render_field(form.frequency) }}
+            {{ render_field(form.end_repeats, after=_('Leave empty if there is no end date for the repeat.')) }}
+        </div>
 
         <h4>{{ _('Reminder') }}</h4>
         <p>{{ _('You may want fedocal to send an email to a mailing list of your choices.') }}</p>
         <p>{{ _('Note that fedocal will send the reminder in your name.') }}</p>
-        <table>
-            {{ render_field_in_row(form.remind_when) }}
-            {{ render_field_in_row(form.reminder_from) }}
-            {{ render_field_in_row(form.remind_who) }}
-        </table>
+        <div>
+            {{ render_field(form.remind_when) }}
+            {{ render_field(form.reminder_from) }}
+            {{ render_field(form.remind_who) }}
+        </div>
 
         <p class="d-flex justify-content-end">
             <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
@@ -217,14 +218,14 @@
       });
 
       var cb = $('#full_day')
-      var tz = $('#meeting_timezone').parent().parent();
+      var tz = $('#meeting_timezone').parent();
       if(cb.prop('checked')) {
         tz.val('UTC');
         tz.hide();
       };
 
       $('#full_day').click(function() {
-        var tz = $('#meeting_timezone').parent().parent();
+        var tz = $('#meeting_timezone').parent();
         if(this.checked == false) {
           tz.show();
         } else {
diff --git a/fedocal/templates/default/api.html b/fedocal/templates/default/api.html
index 3d5a56c..d192cab 100644
--- a/fedocal/templates/default/api.html
+++ b/fedocal/templates/default/api.html
@@ -1,5 +1,4 @@
 {% extends "master.html" %}
-{% from "_formhelpers.html" import render_field %}
 
 {%block tag %}api{% endblock %}
 
diff --git a/fedocal/templates/default/clear_calendar.html b/fedocal/templates/default/clear_calendar.html
index 943b537..3307c6c 100644
--- a/fedocal/templates/default/clear_calendar.html
+++ b/fedocal/templates/default/clear_calendar.html
@@ -19,7 +19,7 @@
 <p>{{ _('Are you positively sure that\'s what you want to do?') }}</p>
 
 <form action="" method="post">
-{{ render_field_invert(form.confirm_delete) }}
+{{ render_field_checkbox(form.confirm_delete) }}
 <p class="d-flex justify-content-end">
     <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
     <input type="submit" class="btn btn-danger" value="{{ _('Delete') }}">
diff --git a/fedocal/templates/default/delete_calendar.html b/fedocal/templates/default/delete_calendar.html
index c2b80ce..9732928 100644
--- a/fedocal/templates/default/delete_calendar.html
+++ b/fedocal/templates/default/delete_calendar.html
@@ -18,7 +18,7 @@
 <p>{{ _("Are you positively sure that's what you want to do?") }}</p>
 
 <form action="" method="post">
-{{ render_field_invert(form.confirm_delete) }}
+{{ render_field_checkbox(form.confirm_delete) }}
 <p class="d-flex justify-content-end">
     <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
     <input id="confirm_button" type="submit" class="btn btn-danger"
diff --git a/fedocal/templates/default/delete_meeting.html b/fedocal/templates/default/delete_meeting.html
index 401e5e2..acca800 100644
--- a/fedocal/templates/default/delete_meeting.html
+++ b/fedocal/templates/default/delete_meeting.html
@@ -35,7 +35,7 @@
 <p>{{ _("Are you positively sure that's what you want to do?") }}</p>
 
 <form action="" method="post">
-{{ render_field_invert(form.confirm_delete) }}
+{{ render_field_checkbox(form.confirm_delete) }}
 {% if meeting.recursion_frequency %}
 <p>{{ _('This meeting is a regular meeting, are you sure you want to delete all
 of them or just this one ? (Check only if you want to delete all future
@@ -44,7 +44,7 @@ meetings as well)') }}
 <p>
     {{ _('This meeting is recurrent, it occurs every %(frequency)s days until %(ends)s', frequency=meeting.recursion_frequency, ends=meeting.recursion_ends) }}
 </p>
-{{ render_field_invert(form.confirm_futher_delete) }}
+{{ render_field_checkbox(form.confirm_futher_delete) }}
 {% endif %}
 <p class="d-flex justify-content-end">
     <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1"
diff --git a/fedocal/templates/default/edit_calendar.html b/fedocal/templates/default/edit_calendar.html
index e3edeb0..47405fd 100644
--- a/fedocal/templates/default/edit_calendar.html
+++ b/fedocal/templates/default/edit_calendar.html
@@ -1,5 +1,4 @@
 {% extends "master.html" %}
-{% from "_formhelpers.html" import render_field_in_row %}
 
 {% block title %}{{ _('Edit calendar') }}{% endblock %}
 {%block tag %}admin{% endblock %}
@@ -13,12 +12,12 @@
 
     <form action="" method="post">
         <table>
-        {{ render_field_in_row(form.calendar_name) }}
-        {{ render_field_in_row(form.calendar_contact) }}
-        {{ render_field_in_row(form.calendar_description) }}
-        {{ render_field_in_row(form.calendar_editor_groups) }}
-        {{ render_field_in_row(form.calendar_admin_groups) }}
-        {{ render_field_in_row(form.calendar_status) }}
+        {{ render_field(form.calendar_name) }}
+        {{ render_field(form.calendar_contact) }}
+        {{ render_field(form.calendar_description) }}
+        {{ render_field(form.calendar_editor_groups) }}
+        {{ render_field(form.calendar_admin_groups) }}
+        {{ render_field(form.calendar_status) }}
         </table>
         <p class="d-flex justify-content-end">
             <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
diff --git a/fedocal/templates/default/edit_meeting.html b/fedocal/templates/default/edit_meeting.html
index a7ef5cb..96a38ec 100644
--- a/fedocal/templates/default/edit_meeting.html
+++ b/fedocal/templates/default/edit_meeting.html
@@ -14,32 +14,34 @@
 
     <form action="" method="post">
         <table>
-            {{ render_field_in_row(form.calendar_name) }}
-            {{ render_field_in_row(form.meeting_name) }}
-            {{ render_field_in_row(form.meeting_date) }}
-            {{ render_field_in_row(form.meeting_date_end) }}
+            {{ render_field(form.calendar_name) }}
+            {{ render_field(form.meeting_name) }}
+            {{ render_field(form.meeting_date) }}
+            {{ render_field(form.meeting_date_end) }}
+            <div class="form-row">
             {{ render_field_in_row(form.meeting_time_start) }}
             {{ render_field_in_row(form.meeting_time_stop) }}
-            {{ render_field_in_row(form.full_day) }}
-            {{ render_field_in_row(form.meeting_timezone) }}
-            {{ render_field_in_row(form.comanager) }}
+            </div>
+            {{ render_field_checkbox(form.full_day) }}
+            {{ render_field(form.meeting_timezone) }}
+            {{ render_field(form.comanager) }}
             {% macro get_after_markdown() %}
                 {{_('Supports the') }} <a href="http://daringfireball.net/projects/markdown/syntax"
                     rel="noopener noreferrer" target="_blank">{{ _('Markdown syntax') }}</a>
-                <input type="button" class="btn btn-secondary preview" value="{{ _('Preview')  }}">
+                <input type="button" class="btn btn-sm btn-secondary preview" value="{{ _('Preview')  }}">
             {% endmacro %}
-            {{ render_field_in_row(
+            {{ render_field(
                 form.information,
                     after=get_after_markdown(),
                     escape_after=True) }}
-            {{ render_field_in_row(form.meeting_location) }}
+            {{ render_field(form.meeting_location) }}
         </table>
 
         <h4>{{ _('Recurring event') }}</h4>
         <p>{{ _('If this is a regular meeting this is where you want to set it as so.') }}</p>
         <table>
-            {{ render_field_in_row(form.frequency) }}
-            {{ render_field_in_row(form.end_repeats,
+            {{ render_field(form.frequency) }}
+            {{ render_field(form.end_repeats,
                 after=_('Leave empty if there is no end date for the repeat.')) }}
         </table>
 
@@ -47,9 +49,9 @@
         <p>{{ _('You may want fedocal to send an email to a mailing list of your choices.') }}</p>
         <p>{{ _('Note that fedocal will send the reminder in your name.') }}</p>
         <table>
-            {{ render_field_in_row(form.remind_when) }}
-            {{ render_field_in_row(form.reminder_from) }}
-            {{ render_field_in_row(form.remind_who) }}
+            {{ render_field(form.remind_when) }}
+            {{ render_field(form.reminder_from) }}
+            {{ render_field(form.remind_who) }}
         </table>
 
         {{ form.csrf_token }}
@@ -213,14 +215,14 @@
     });
 
     var cb = $('#full_day')
-    var tz = $('#meeting_timezone').parent().parent();
+    var tz = $('#meeting_timezone').parent();
     if(cb.prop('checked')) {
       tz.val('UTC');
       tz.hide();
     };
 
     $('#full_day').click(function() {
-      var tz = $('#meeting_timezone').parent().parent();
+      var tz = $('#meeting_timezone').parent();
       if(this.checked == false) {
         tz.show();
       } else {
diff --git a/fedocal/templates/default/master.html b/fedocal/templates/default/master.html
index 4c35ddf..42c9bc1 100644
--- a/fedocal/templates/default/master.html
+++ b/fedocal/templates/default/master.html
@@ -1,4 +1,4 @@
-{% from "_formhelpers.html" import render_field, render_field_invert,
+{% from "_formhelpers.html" import render_field, render_field_checkbox, render_field_file,
     render_field_in_row %}
 <!DOCTYPE html>
 <html lang='en'>
diff --git a/fedocal/templates/default/my_meeting.html b/fedocal/templates/default/my_meeting.html
index 195fe69..1bc6162 100644
--- a/fedocal/templates/default/my_meeting.html
+++ b/fedocal/templates/default/my_meeting.html
@@ -1,5 +1,4 @@
 {% extends "master.html" %}
-{% from "_formhelpers.html" import render_field %}
 
 {% block title %}{{ _('My meetings') }}{% endblock %}
 
diff --git a/fedocal/templates/default/upload_calendar.html b/fedocal/templates/default/upload_calendar.html
index df4e102..eb636c5 100644
--- a/fedocal/templates/default/upload_calendar.html
+++ b/fedocal/templates/default/upload_calendar.html
@@ -1,5 +1,4 @@
 {% extends "master.html" %}
-{% from "_formhelpers.html" import render_field_in_row %}
 
 {% block title %}{{ _('Upload calendar') }}{% endblock %}
 
@@ -19,9 +18,7 @@
     <p>{{ _('Note2: Todo are considered as full day meeting and displayed as such.') }}</p>
 
     <form action="" method="post" enctype="multipart/form-data">
-        <table>
-        {{ render_field_in_row(form.ics_file) }}
-        </table>
+        {{ render_field_file(form.ics_file) }}
         <p class="d-flex justify-content-end">
             <input type="button" value="{{ _('Cancel') }}" class="btn btn-secondary mr-1" onclick="history.back();">
             <input type="submit" class="btn btn-primary" value="{{ _('Upload') }}">

From 46bdca9217cf545e756d8c35b1dcd5d2d4424154 Mon Sep 17 00:00:00 2001
From: Jacob Michalskie <hel@lcp.world>
Date: Nov 19 2022 01:05:36 +0000
Subject: [PATCH 5/7] Use the correct styling for the flashes


---

diff --git a/fedocal/templates/default/add_meeting.html b/fedocal/templates/default/add_meeting.html
index 7f674ef..2c21f35 100644
--- a/fedocal/templates/default/add_meeting.html
+++ b/fedocal/templates/default/add_meeting.html
@@ -10,6 +10,7 @@
 
 
 {% block content %}
+{% from "_formhelpers.html" import render_field, render_field_checkbox, render_field_in_row %}
 
 <section>
     <header>
diff --git a/fedocal/templates/default/master.html b/fedocal/templates/default/master.html
index 42c9bc1..bdecf07 100644
--- a/fedocal/templates/default/master.html
+++ b/fedocal/templates/default/master.html
@@ -92,9 +92,13 @@
 
         {% with messages = get_flashed_messages(with_categories=true) %}
             {% if category, messages %}
-            <ul id="flashes">
+            <ul id="flashes" class="list-unstyled">
                 {% for category, message in messages %}
-                <li class="{{ category }}">{{ message }}</li>
+                <li class="alert
+                  {% if category == 'errors' %}alert-danger
+                  {% elif category == 'warnings' %}alert-warning
+                  {% else %}alert-info
+                  {% endif %}">{{ message }}</li>
                 {% endfor %}
             </ul>
             {% endif %}

From 2d5228bf5a759a600a8cff5e00ed852007d1d705 Mon Sep 17 00:00:00 2001
From: Jacob Michalskie <hel@lcp.world>
Date: Nov 19 2022 04:00:50 +0000
Subject: [PATCH 6/7] Fix up tests


---

diff --git a/fedocal/__init__.py b/fedocal/__init__.py
index bcf1e75..0f33414 100644
--- a/fedocal/__init__.py
+++ b/fedocal/__init__.py
@@ -276,6 +276,7 @@ def set_session():
         flask.g.fas_user = None
 
 
+
 # Local function
 def is_admin():
     """ Return whether the user is admin for this application or not. """
@@ -1203,7 +1204,7 @@ def delete_meeting(meeting_id):
                 SESSION.rollback()
                 LOG.debug('Error in delete_meeting - 2')
                 LOG.exception(err)
-                flask.flash(gettext('Could not delete this meeting.'), 'error')
+                flask.flash(gettext('Could not delete this meeting.'), 'errors')
 
         year = month = day = None
         if date_limit:
@@ -1743,7 +1744,7 @@ def upload_calendar(calendar_name):
                       'file: "%s"',
                       flask.g.fas_user.username, ical_file.filename)
             LOG.exception(err)
-            flask.flash("%s" % err, 'error')
+            flask.flash("%s" % err, 'errors')
             return flask.render_template(
                 'upload_calendar.html', form=form, calendar=calendarobj)
 
@@ -1752,7 +1753,7 @@ def upload_calendar(calendar_name):
                 SESSION, calendarobj, ical_file.read(), flask.g.fas_user, is_admin())
             flask.flash(gettext('Calendar uploaded'))
         except FedocalException as err:  # pragma: no cover
-            flask.flash("%s" % err, 'error')
+            flask.flash("%s" % err, 'errors')
             return flask.render_template(
                 'upload_calendar.html', form=form, calendar=calendarobj)
         except SQLAlchemyError as err:  # pragma: no cover
diff --git a/fedocal/templates/default/master.html b/fedocal/templates/default/master.html
index bdecf07..86650c8 100644
--- a/fedocal/templates/default/master.html
+++ b/fedocal/templates/default/master.html
@@ -94,11 +94,10 @@
             {% if category, messages %}
             <ul id="flashes" class="list-unstyled">
                 {% for category, message in messages %}
-                <li class="alert
-                  {% if category == 'errors' %}alert-danger
-                  {% elif category == 'warnings' %}alert-warning
-                  {% else %}alert-info
-                  {% endif %}">{{ message }}</li>
+                <li class="alert {% if category == 'errors' -%}alert-danger
+                                 {%- elif category == 'warnings' -%}alert-warning
+                                 {%- else -%}alert-info
+                                 {%- endif -%}">{{ message }}</li>
                 {% endfor %}
             </ul>
             {% endif %}
diff --git a/requirements.txt b/requirements.txt
index 982f127..9183a8d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -24,3 +24,4 @@ flask_oidc
 fedora-messaging
 email_validator
 fedocal-messages>=1.5.0
+itsdangerous<2.1.0
diff --git a/tests/test_fedocallib.py b/tests/test_fedocallib.py
index 0cfe7d6..d272d25 100644
--- a/tests/test_fedocallib.py
+++ b/tests/test_fedocallib.py
@@ -782,16 +782,16 @@ class Fedocallibtests(Modeltests):
             today.day, today.month, today.year)
         # Check today css class
         self.assertTrue(
-            'class="%s today">%s' % (
+            'class="%s primary text-right">%s' % (
                 today.strftime('%a').lower(),
                 today.day) in output)
         # Check the month
         self.assertTrue(
-            'class="month"> %s </th>' % (
+            '><div class="d-flex align-items-center justify-content-between text-center"> <span class="mx-auto">%s</span> </div></th>' % (
                 today.strftime('%B %Y')) in output)
         # Check the current_week css class
         self.assertNotEqual(
-            re.match('<tr class="current_week">.*'
+            re.match('<tr class="bg-light">.*'
                      '<td>%s</td>' % (today.day), output), [])
 
     def test_get_week_day_index(self):
diff --git a/tests/test_fedora_calendar.py b/tests/test_fedora_calendar.py
index aa10e5c..fc626cd 100644
--- a/tests/test_fedora_calendar.py
+++ b/tests/test_fedora_calendar.py
@@ -50,10 +50,10 @@ class FedocalCalendartests(Modeltests):
         cal = FedocalCalendar(2013, 1, 6)
         self.assertEqual(
             cal.formatday(6, 1),
-            '<td class="tue">6</td>')
+            '<td class="tue text-right">6</td>')
         self.assertEqual(
             cal.formatday(7, 3),
-            '<td class="thu">7</td>')
+            '<td class="thu text-right">7</td>')
 
     def test_formatweek(self):
         """ Test the formatweek function. """
@@ -62,16 +62,16 @@ class FedocalCalendartests(Modeltests):
         output = cal.formatweek([(1, 1), (2, 2)]).replace(' today', '')
         self.assertEqual(
             output,
-            '<tr><td class="tue">1</td><td class="wed">2</td></tr>')
+            '<tr><td class="tue text-right">1</td><td class="wed text-right">2</td></tr>')
         self.assertEqual(
             cal.formatweek([(0, 1), (1, 2)]).replace(' today', ''),
-            '<tr><td class="noday">&nbsp;</td><td class="wed">1</td></tr>')
+            '<tr><td>&nbsp;</td><td class="wed text-right">1</td></tr>')
         output = cal.formatweek(
             [(1, 1), (2, 2)], True).replace(' today', '')
         self.assertEqual(
             output,
-            '<tr class="current_week"><td class="tue">1</td><td '
-            'class="wed">2</td></tr>')
+            '<tr class="bg-light"><td class="tue text-right">1</td><td '
+            'class="wed text-right">2</td></tr>')
 
     def test_formatmonthname(self):
         """ Test the formatmonthname function. """
@@ -79,42 +79,44 @@ class FedocalCalendartests(Modeltests):
         cal = FedocalCalendar(today.year, today.month, today.day)
         self.assertEqual(
             cal.formatmonthname(2012, 4),
-            '<tr><th colspan="7" class="month"> April 2012 </th></tr>')
+            '<tr><th colspan="7"><div class="d-flex align-items-center justify-content-between text-center"> <span class="mx-auto">April 2012</span> </div></th></tr>')
         self.assertEqual(
             cal.formatmonthname(2012, 4, False),
-            '<tr><th colspan="7" class="month"> April </th></tr>')
+            '<tr><th colspan="7"><div class="d-flex align-items-center justify-content-between text-center"> <span class="mx-auto">April</span> </div></th></tr>')
 
     def test_formatmonth(self):
         """ Test the formatmonth function. """
         cal = FedocalCalendar(2012, 1, 10)
 
         expcal = [
-            '<table class="month">',
-            '<tr><th colspan="7" class="month"> January 2012 </th></tr>',
-            '<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="sun">1</td></tr>',
-            '<tr><td class="mon">2</td><td class="tue">3</td>'
-            '<td class="wed">4</td><td class="thu">5</td>'
-            '<td class="fri">6</td><td class="sat">7</td>'
-            '<td class="sun">8</td></tr>',
-            '<tr class="current_week"><td class="mon">9</td>'
-            '<td class="tue">10</td><td class="wed">11</td>'
-            '<td class="thu">12</td><td class="fri">13</td>'
-            '<td class="sat">14</td><td class="sun">15</td></tr>',
-            '<tr><td class="mon">16</td><td class="tue">17</td>'
-            '<td class="wed">18</td><td class="thu">19</td>'
-            '<td class="fri">20</td><td class="sat">21</td>'
-            '<td class="sun">22</td></tr>',
-            '<tr><td class="mon">23</td><td class="tue">24</td>'
-            '<td class="wed">25</td><td class="thu">26</td>'
-            '<td class="fri">27</td><td class="sat">28</td>'
-            '<td class="sun">29</td></tr>',
-            '<tr><td class="mon">30</td><td class="tue">31</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td></tr>',
+            '<table class="table table-sm month">',
+            '<tr><th colspan="7"><div class="d-flex align-items-center '
+            'justify-content-between text-center"> <span class="mx-auto">'
+            'January 2012</span> </div></th></tr>',
+            '<tr><td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td class="sun text-right">1</td></tr>',
+            '<tr><td class="mon text-right">2</td><td class="tue text-right">3</td>'
+            '<td class="wed text-right">4</td><td class="thu text-right">5</td>'
+            '<td class="fri text-right">6</td><td class="sat text-right">7</td>'
+            '<td class="sun text-right">8</td></tr>',
+            '<tr class="bg-light"><td class="mon text-right">9</td>'
+            '<td class="tue text-right">10</td><td class="wed text-right">11</td>'
+            '<td class="thu text-right">12</td><td class="fri text-right">13</td>'
+            '<td class="sat text-right">14</td><td class="sun text-right">15</td></tr>',
+            '<tr><td class="mon text-right">16</td><td class="tue text-right">17</td>'
+            '<td class="wed text-right">18</td><td class="thu text-right">19</td>'
+            '<td class="fri text-right">20</td><td class="sat text-right">21</td>'
+            '<td class="sun text-right">22</td></tr>',
+            '<tr><td class="mon text-right">23</td><td class="tue text-right">24</td>'
+            '<td class="wed text-right">25</td><td class="thu text-right">26</td>'
+            '<td class="fri text-right">27</td><td class="sat text-right">28</td>'
+            '<td class="sun text-right">29</td></tr>',
+            '<tr><td class="mon text-right">30</td><td class="tue text-right">31</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td></tr>',
             '</table>', '']
         callines = cal.formatmonth().split('\n')
 
@@ -123,32 +125,34 @@ class FedocalCalendartests(Modeltests):
             self.assertEqual(expcal[cnt], callines[cnt])
 
         expcal = [
-            '<table class="month">',
-            '<tr><th colspan="7" class="month"> January </th></tr>',
-            '<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="sun">1</td></tr>',
-            '<tr><td class="mon">2</td><td class="tue">3</td>'
-            '<td class="wed">4</td><td class="thu">5</td>'
-            '<td class="fri">6</td><td class="sat">7</td>'
-            '<td class="sun">8</td></tr>',
-            '<tr class="current_week"><td class="mon">9</td>'
-            '<td class="tue">10</td><td class="wed">11</td>'
-            '<td class="thu">12</td><td class="fri">13</td>'
-            '<td class="sat">14</td><td class="sun">15</td></tr>',
-            '<tr><td class="mon">16</td><td class="tue">17</td>'
-            '<td class="wed">18</td><td class="thu">19</td>'
-            '<td class="fri">20</td><td class="sat">21</td>'
-            '<td class="sun">22</td></tr>',
-            '<tr><td class="mon">23</td><td class="tue">24</td>'
-            '<td class="wed">25</td><td class="thu">26</td>'
-            '<td class="fri">27</td><td class="sat">28</td>'
-            '<td class="sun">29</td></tr>',
-            '<tr><td class="mon">30</td><td class="tue">31</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>'
-            '<td class="noday">&nbsp;</td></tr>',
+            '<table class="table table-sm month">',
+            '<tr><th colspan="7"><div class="d-flex align-items-center '
+            'justify-content-between text-center"> <span class="mx-auto">'
+            'January</span> </div></th></tr>',
+            '<tr><td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td class="sun text-right">1</td></tr>',
+            '<tr><td class="mon text-right">2</td><td class="tue text-right">3</td>'
+            '<td class="wed text-right">4</td><td class="thu text-right">5</td>'
+            '<td class="fri text-right">6</td><td class="sat text-right">7</td>'
+            '<td class="sun text-right">8</td></tr>',
+            '<tr class="bg-light"><td class="mon text-right">9</td>'
+            '<td class="tue text-right">10</td><td class="wed text-right">11</td>'
+            '<td class="thu text-right">12</td><td class="fri text-right">13</td>'
+            '<td class="sat text-right">14</td><td class="sun text-right">15</td></tr>',
+            '<tr><td class="mon text-right">16</td><td class="tue text-right">17</td>'
+            '<td class="wed text-right">18</td><td class="thu text-right">19</td>'
+            '<td class="fri text-right">20</td><td class="sat text-right">21</td>'
+            '<td class="sun text-right">22</td></tr>',
+            '<tr><td class="mon text-right">23</td><td class="tue text-right">24</td>'
+            '<td class="wed text-right">25</td><td class="thu text-right">26</td>'
+            '<td class="fri text-right">27</td><td class="sat text-right">28</td>'
+            '<td class="sun text-right">29</td></tr>',
+            '<tr><td class="mon text-right">30</td><td class="tue text-right">31</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td><td>&nbsp;</td>'
+            '<td>&nbsp;</td></tr>',
             '</table>', '']
         callines = cal.formatmonth(withyear=False).split('\n')
 
diff --git a/tests/test_flask.py b/tests/test_flask.py
index 02105a7..220fbe8 100644
--- a/tests/test_flask.py
+++ b/tests/test_flask.py
@@ -144,24 +144,18 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/test_calendar2/')
         self.assertEqual(output.status_code, 200)
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test_calendar2 - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/foorbar/', follow_redirects=True)
         self.assertEqual(output.status_code, 200)
         output_text = output.get_data(as_text=True)
         self.assertIn(
-            'class="errors">No calendar named foorbar could be found</',
+            'class="alert alert-danger">No calendar named foorbar could be found</',
             output_text)
 
         output = self.app.get('/test_calendar2/?tzone=Europe/Paris',
@@ -183,9 +177,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
     def test_calendar_fullday(self):
         """ Test the calendar_fullday function. """
@@ -199,9 +190,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get(
             '/test_calendar/%s/%s/%s' % (
@@ -214,9 +202,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
     def test_calendar_list(self):
         """ Test the calendar_list function. """
@@ -227,15 +212,12 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/list/foorbar/', follow_redirects=True)
         self.assertEqual(output.status_code, 200)
         output_text = output.get_data(as_text=True)
         self.assertIn(
-            'class="errors">No calendar named foorbar could be found</',
+            'class="alert alert-danger">No calendar named foorbar could be found</',
             output_text)
 
         today = date.today()
@@ -245,9 +227,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/list/test_calendar/%s/%s/%s' % (
             today.year, today.month, today.day))
@@ -259,9 +238,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/list/test_calendar/%s/%s/' % (
             today.year, today.month), follow_redirects=True)
@@ -272,9 +248,6 @@ class Flasktests(Modeltests):
         self.assertTrue(output_text.count('<tr') > 10)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/list/test_calendar/%s/%s/?subject=Another'
             % (today.year, today.month), follow_redirects=True)
@@ -285,9 +258,6 @@ class Flasktests(Modeltests):
         self.assertTrue(output_text.count('<tr') > 10)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/list/test_calendar/%s/%s/?subject=Another past'
             % (today.year, today.month), follow_redirects=True)
@@ -298,9 +268,6 @@ class Flasktests(Modeltests):
         self.assertTrue(output_text.count('<tr') >= 10)
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
 
         output = self.app.get('/list/test_calendar/%s/%s/?delta=10'
             % (today.year, today.month), follow_redirects=True)
@@ -380,9 +347,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title> EMEA  - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
         self.assertEqual(output_text.count('<a class="event event_blue'), 2)
         self.assertEqual(output_text.count('<a class="event'), 4)
 
@@ -390,7 +354,7 @@ class Flasktests(Modeltests):
         self.assertEqual(output.status_code, 200)
         output_text = output.get_data(as_text=True)
         self.assertIn(
-            'class="errors">No location named foorbar could be found</',
+            'class="alert alert-danger">No location named foorbar could be found</',
             output_text)
 
         today = date.today()
@@ -400,9 +364,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title> EMEA  - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
         self.assertIn(
             output_text.count('<a class="event event_blue'), [0, 1])
         self.assertIn(output_text.count('<a class="event'), range(3))
@@ -413,9 +374,6 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn(
             '<title> EMEA  - Fedocal</title>', output_text)
-        self.assertIn(' <a href="/test_calendar/">', output_text)
-        self.assertIn(' <a href="/test_calendar2/">', output_text)
-        self.assertIn(' <a href="/test_calendar4/">', output_text)
         self.assertIn(
             output_text.count('<a class="event event_blue'), [1, 2])
         self.assertIn(output_text.count('<a class="event'), [2, 4])
@@ -530,7 +488,7 @@ class Flasktests(Modeltests):
             '<title>Meeting "test-meeting-st-1" - Fedocal</title>',
             output_text)
         self.assertIn(
-            '<h2 class="orange">Meeting "test-meeting-st-1"</h2>',
+            '<h2>Meeting "test-meeting-st-1"</h2>',
             output_text)
         self.assertIn(
             'This is a test meeting at the same time',
@@ -551,7 +509,7 @@ class Flasktests(Modeltests):
             '<title>Meeting "test-meeting-st-1" - Fedocal</title>',
             output_text)
         self.assertIn(
-            '<h2 class="orange">Meeting "test-meeting-st-1"</h2>',
+            '<h2>Meeting "test-meeting-st-1"</h2>',
             output_text)
         self.assertIn(
             'This is a test meeting at the same time',
@@ -567,7 +525,7 @@ class Flasktests(Modeltests):
             '<title>Meeting "test-meeting-st-1" - Fedocal</title>',
             output_text)
         self.assertIn(
-            '<h2 class="orange">Meeting "test-meeting-st-1"</h2>',
+            '<h2>Meeting "test-meeting-st-1"</h2>',
             output_text)
         self.assertIn(
             'This is a test meeting at the same time',
@@ -584,7 +542,7 @@ class Flasktests(Modeltests):
             '<title>Meeting "test-meeting-st-1" - Fedocal</title>',
             output_text)
         self.assertIn(
-            '<h2 class="orange">Meeting "test-meeting-st-1"</h2>',
+            '<h2>Meeting "test-meeting-st-1"</h2>',
             output_text)
         self.assertIn(
             'This is a test meeting at the same time',
@@ -602,7 +560,7 @@ class Flasktests(Modeltests):
             '<title>Meeting "test-meeting-st-1" - Fedocal</title>',
             output_text)
         self.assertIn(
-            '<h2 class="orange">Meeting "test-meeting-st-1"</h2>',
+            '<h2>Meeting "test-meeting-st-1"</h2>',
             output_text)
         self.assertIn(
             'This is a test meeting at the same time',
@@ -615,7 +573,7 @@ class Flasktests(Modeltests):
         self.assertEqual(output.status_code, 200)
         output_text = output.get_data(as_text=True)
         self.assertIn(
-            'class="errors">No meeting could be found for this identifier</',
+            'class="alert alert-danger">No meeting could be found for this identifier</',
             output_text)
 
     def test_is_admin(self):
@@ -863,10 +821,10 @@ class Flasktests(Modeltests):
         self.assertIn('<h2>Locations</h2>', output_text)
         self.assertIn('href="/location/EMEA/">', output_text)
         self.assertIn(
-            '<span class="calendar_name">EMEA</span>', output_text)
+            '<span>EMEA</span>', output_text)
         self.assertIn('href="/location/NA/">', output_text)
         self.assertIn(
-            '<span class="calendar_name">NA</span>', output_text)
+            '<span>NA</span>', output_text)
 
     def test_location(self):
         """ Test the location function. """
@@ -903,7 +861,7 @@ class Flasktests(Modeltests):
         self.assertEqual(output.status_code, 200)
         output_text = output.get_data(as_text=True)
         self.assertIn(
-            'class="errors">No location named foobar could be found</',
+            'class="alert alert-danger">No location named foobar could be found</',
             output_text)
 
     def test_admin(self):
@@ -921,7 +879,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '"errors">You are not a fedocal admin, you are not allowed '
+                '"alert alert-danger">You are not a fedocal admin, you are not allowed '
                 'to access the admin part.</', output_text)
 
         user = FakeUser(fedocal.APP.config['ADMIN_GROUP'])
@@ -944,7 +902,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 '<title>Home - Fedocal</title>', output_text)
             self.assertIn(
-                '<li class="errors">No calendar named test_calendar could '
+                '<li class="alert alert-danger">No calendar named test_calendar could '
                 'be found</li>', output_text)
 
             self.__setup_db()
@@ -959,7 +917,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 '<h2>Edit calendar "test_calendar"</h2>', output_text)
             self.assertIn(
-                'type="text" value="test_calendar"></td>', output_text)
+                'type="text" value="test_calendar">', output_text)
 
             output = self.app.get(
                 '/admin/?calendar=test_calendar&action=delete',
@@ -986,7 +944,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '"errors">You are not a fedocal admin, you are not allowed '
+                '"alert alert-danger">You are not a fedocal admin, you are not allowed '
                 'to add calendars.</', output_text)
 
         user = FakeUser(fedocal.APP.config['ADMIN_GROUP'])
@@ -1001,7 +959,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 'contact">Contact email', output_text)
             self.assertEqual(
-                output_text.count('<span class="required">*</span>'), 3)
+                output_text.count('<span class="text-danger">*</span>'), 3)
 
             csrf_token = output_text.split(
                 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
@@ -1018,7 +976,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<td>This field is required.</td>', output_text)
+                '<small>This field is required.</small>', output_text)
 
             # Works
             data = {
@@ -1047,7 +1005,7 @@ class Flasktests(Modeltests):
                 self.assertEqual(output.status_code, 200)
                 output_text = output.get_data(as_text=True)
                 self.assertIn(
-                    '<li class="message">Calendar added</li>', output_text)
+                    '<li class="alert alert-info">Calendar added</li>', output_text)
 
             # This calendar already exists
             data = {
@@ -1062,7 +1020,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '="errors">Could not add this calendar to the database</',
+                '="alert alert-danger">Could not add this calendar to the database</',
                 output_text)
 
     def test_delete_calendar(self):
@@ -1075,7 +1033,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertTrue(
-                '<li class="errors">You are not a fedocal admin, you are not'
+                '<li class="alert alert-danger">You are not a fedocal admin, you are not'
                 ' allowed to delete the calendar.</l',
                 output_text)
             self.assertIn('<title>Home - Fedocal</title>', output_text)
@@ -1087,7 +1045,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '"errors">No calendar named 50 could be found</',
+                '"alert alert-danger">No calendar named 50 could be found</',
                 output_text)
             self.assertIn('<title>Home - Fedocal</title>', output_text)
 
@@ -1100,7 +1058,7 @@ class Flasktests(Modeltests):
                 "Are you positively sure that's what you want to do?",
                 output_text)
             self.assertIn(
-                'name="confirm_delete" type="checkbox" value="y"><label',
+                "name=\"confirm_delete\" type=\"checkbox\" value=\"y\">\n    <label",
                 output_text)
 
             # No data
@@ -1116,7 +1074,7 @@ class Flasktests(Modeltests):
                 "Are you positively sure that's what you want to do?",
                 output_text)
             self.assertIn(
-                'name="confirm_delete" type="checkbox" value="y"><label',
+                "name=\"confirm_delete\" type=\"checkbox\" value=\"y\">\n    <label",
                 output_text)
 
             csrf_token = output_text.split(
@@ -1133,7 +1091,7 @@ class Flasktests(Modeltests):
             output_text = output.get_data(as_text=True)
             self.assertIn('<title>Home - Fedocal</title>', output_text)
             self.assertIn(
-                '<span class="calendar_name">test_calendar</span>',
+                '<strong>test_calendar</strong',
                 output_text)
 
             # Delete
@@ -1163,10 +1121,10 @@ class Flasktests(Modeltests):
                 self.assertIn(
                     '<title>Home - Fedocal</title>', output_text)
                 self.assertIn(
-                    '<li class="message">Calendar deleted</li>',
+                    '<li class="alert alert-info">Calendar deleted</li>',
                     output_text)
                 self.assertNotIn(
-                    '<span class="calendar_name">test_calendar</span>',
+                    '<strong>test_calendar</strong>',
                     output_text)
 
     def test_clear_calendar(self):
@@ -1180,7 +1138,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">No calendar named 1 could be found</li',
+                '<li class="alert alert-danger">No calendar named 1 could be found</li',
                 output_text)
 
             output = self.app.get('/calendar/clear/test_calendar/',
@@ -1188,7 +1146,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not an admin of this calendar, '
+                '<li class="alert alert-danger">You are not an admin of this calendar, '
                 'you are not allowed to clear the calendar.</l',
                 output_text)
             self.assertIn(
@@ -1205,7 +1163,7 @@ class Flasktests(Modeltests):
                 "Are you positively sure that's what you want to do?",
                 output_text)
             self.assertIn(
-                'name="confirm_delete" type="checkbox" value="y"><label',
+                "name=\"confirm_delete\" type=\"checkbox\" value=\"y\">\n    <label",
                 output_text)
             self.assertIn(
                 '>Yes I want to clear this calendar</label>', output_text)
@@ -1223,7 +1181,7 @@ class Flasktests(Modeltests):
                 "Are you positively sure that's what you want to do?",
                 output_text)
             self.assertIn(
-                'name="confirm_delete" type="checkbox" value="y"><label',
+                "name=\"confirm_delete\" type=\"checkbox\" value=\"y\">\n    <label",
                 output_text)
 
             csrf_token = output_text.split(
@@ -1241,7 +1199,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 '<title>test_calendar - Fedocal</title>', output_text)
             self.assertNotIn(
-                '<li class="message">Calendar cleared</li>', output_text)
+                '<li class="alert alert-info">Calendar cleared</li>', output_text)
 
             # Delete
             data = {
@@ -1272,7 +1230,7 @@ class Flasktests(Modeltests):
                 self.assertIn(
                     '<title>test_calendar - Fedocal</title>', output_text)
                 self.assertIn(
-                    '<li class="message">Calendar cleared</li>',
+                    '<li class="alert alert-info">Calendar cleared</li>',
                     output_text)
 
     def test_edit_calendar(self):
@@ -1286,7 +1244,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not a fedocal admin, you are '
+                '<li class="alert alert-danger">You are not a fedocal admin, you are '
                 'not allowed to edit the calendar.</li>', output_text)
             self.assertIn(
                 '<title>Home - Fedocal</title>', output_text)
@@ -1298,7 +1256,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">No calendar named 1 could be found</li',
+                '<li class="alert alert-danger">No calendar named 1 could be found</li',
                 output_text)
 
             output = self.app.get('/calendar/edit/test_calendar/')
@@ -1309,7 +1267,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 '<h2>Edit calendar "test_calendar"</h2>', output_text)
             self.assertIn(
-                'class="submit positive button" value="Edit">',
+                'class="btn btn-primary" value="Edit">',
                 output_text)
 
             # No data
@@ -1324,7 +1282,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 '<h2>Edit calendar "test_calendar"</h2>', output_text)
             self.assertIn(
-                'class="submit positive button" value="Edit">',
+                'class="btn btn-primary" value="Edit">',
                 output_text)
 
             csrf_token = output_text.split(
@@ -1340,12 +1298,12 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertEqual(
-                output_text.count('<td>This field is required.</td>'), 3)
+                output_text.count('<small>This field is required.</small>'), 3)
             self.assertIn(
                 '<h2>Edit calendar "test_calendar"</h2>',
                 output_text)
             self.assertIn(
-                'class="submit positive button" value="Edit">',
+                'class="btn btn-primary" value="Edit">',
                 output_text)
 
             # Edit
@@ -1377,13 +1335,13 @@ class Flasktests(Modeltests):
                 self.assertIn(
                     '<title>Election1 - Fedocal</title>', output_text)
                 self.assertIn(
-                    '<li class="message">Calendar updated</li>',
+                    '<li class="alert alert-info">Calendar updated</li>',
                     output_text)
                 self.assertNotIn(
-                    '<span class="calendar_name">test_calendar</span>',
+                    '<span>test_calendar</span>',
                     output_text)
                 self.assertNotIn(
-                    '<span class="calendar_name">election1</span>',
+                    '<span>election1</span>',
                     output_text)
 
     def test_auth_logout(self):
@@ -1395,7 +1353,7 @@ class Flasktests(Modeltests):
             output_text = output.get_data(as_text=True)
             self.assertIn('<title>Home - Fedocal</title>', output_text)
             self.assertIn(
-                '<li class="message">You have been logged out</li>',
+                '<li class="alert alert-info">You have been logged out</li>',
                 output_text)
 
         user = None
@@ -1405,7 +1363,7 @@ class Flasktests(Modeltests):
             output_text = output.get_data(as_text=True)
             self.assertIn('<title>Home - Fedocal</title>', output_text)
             self.assertNotIn(
-                '<li class="message">You have been logged out</li>',
+                '<li class="alert alert-info">You have been logged out</li>',
                 output_text)
 
     def test_my_meetings(self):
@@ -1417,7 +1375,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '"errors">You must be in one more group than the CLA</li>',
+                '"alert alert-danger">You must be in one more group than the CLA</li>',
                 output_text)
 
         user = FakeUser()
@@ -1451,14 +1409,14 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '"errors">No calendar named calendar_test could be found</',
+                '"alert alert-danger">No calendar named calendar_test could be found</',
                 output_text)
 
             output = self.app.get('/test_calendar/add/', follow_redirects=True)
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not one of the editors of this '
+                '<li class="alert alert-danger">You are not one of the editors of this '
                 'calendar, or one of its admins, you are not allowed to add'
                 ' new meetings.</li>', output_text)
             self.assertIn(
@@ -1476,7 +1434,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 'for="meeting_date">Date</label>', output_text)
             self.assertEqual(
-                output_text.count('<span class="required">*</span>'), 5)
+                output_text.count('<span class="text-danger">*</span>'), 5)
 
             csrf_token = output_text.split(
                 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
@@ -1496,7 +1454,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<td>This field is required.</td>', output_text)
+                '<small>This field is required.</small>', output_text)
 
             # Format of the start time wrong
             data = {
@@ -1557,7 +1515,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="warnings">The start date of your meeting is '
+                '<li class="alert alert-warning">The start date of your meeting is '
                 'later than the stop date.</li>', output_text)
             self.assertIn(
                 '<title>Add meeting - Fedocal</title>', output_text)
@@ -1579,7 +1537,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<td>Please use channel@server format!</td>', output_text)
+                '<small>Please use channel@server format!</small>', output_text)
             self.assertIn(
                 '<title>Add meeting - Fedocal</title>', output_text)
 
@@ -1626,7 +1584,7 @@ class Flasktests(Modeltests):
                 self.assertEqual(output.status_code, 200)
                 output_text = output.get_data(as_text=True)
                 self.assertIn(
-                    '<li class="message">Meeting added</li>', output_text)
+                    '<li class="alert alert-info">Meeting added</li>', output_text)
                 self.assertIn(
                     'href="/meeting/16/?from_date=', output_text)
                 self.assertNotIn(
@@ -1650,7 +1608,7 @@ class Flasktests(Modeltests):
                 self.assertEqual(output.status_code, 200)
                 output_text = output.get_data(as_text=True)
                 self.assertIn(
-                    '<li class="message">Meeting added</li>', output_text)
+                    '<li class="alert alert-info">Meeting added</li>', output_text)
                 self.assertIn(
                     'href="/meeting/17/?from_date=', output_text)
                 self.assertNotIn(
@@ -1675,7 +1633,7 @@ class Flasktests(Modeltests):
                 '<title>test_calendar_disabled - Fedocal</title>'
                , output_text)
             self.assertIn(
-                '<li class="errors">This calendar is &#34;Disabled&#34;, '
+                '<li class="alert alert-danger">This calendar is &#34;Disabled&#34;, '
                 'you are not allowed to add meetings anymore.</li>'
                , output_text)
 
@@ -1700,7 +1658,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 '<h2>New meeting</h2>', output_text)
             self.assertIn(
-                '<td>Invalid email address.</td>', output_text)
+                '<small>Invalid email address.</small>', output_text)
 
             # Fails - one of the two email specified as recipient of the
             # reminder is invalid
@@ -1724,7 +1682,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 '<h2>New meeting</h2>', output_text)
             self.assertIn(
-                '<td>The domain name fp is not valid. It should have a period.</td>',
+                '<small>The domain name fp is not valid. It should have a period.</small>',
                 output_text)
 
             # Works - with one email as recipient of the reminder
@@ -1747,7 +1705,7 @@ class Flasktests(Modeltests):
                 self.assertEqual(output.status_code, 200)
                 output_text = output.get_data(as_text=True)
                 self.assertIn(
-                    '<li class="message">Meeting added</li>', output_text)
+                    '<li class="alert alert-info">Meeting added</li>', output_text)
                 self.assertIn(
                     'href="/meeting/17/?from_date=', output_text)
                 self.assertIn(
@@ -1777,7 +1735,7 @@ class Flasktests(Modeltests):
                 self.assertEqual(output.status_code, 200)
                 output_text = output.get_data(as_text=True)
                 self.assertIn(
-                    '<li class="message">Meeting added</li>', output_text)
+                    '<li class="alert alert-info">Meeting added</li>', output_text)
                 self.assertIn(
                     'href="/meeting/18/?from_date=', output_text)
                 self.assertIn(
@@ -1796,7 +1754,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                'class="errors">The meeting #50 could not be found</li>',
+                'class="alert alert-danger">The meeting #50 could not be found</li>',
                 output_text)
             self.assertIn('<title>Home - Fedocal</title>', output_text)
 
@@ -1804,7 +1762,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not one of the manager of this '
+                '<li class="alert alert-danger">You are not one of the manager of this '
                 'meeting, or an admin, you are not allowed to edit it.</li>',
                 output_text)
             self.assertIn(
@@ -1817,7 +1775,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not one of the manager of this '
+                '<li class="alert alert-danger">You are not one of the manager of this '
                 'meeting, or an admin, you are not allowed to edit it.</li>',
                 output_text)
             self.assertIn(
@@ -1836,7 +1794,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 'for="meeting_date">Date</label>', output_text)
             self.assertEqual(
-                output_text.count('<span class="required">*</span>'), 6)
+                output_text.count('<span class="text-danger">*</span>'), 6)
 
             csrf_token = output_text.split(
                 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
@@ -1856,7 +1814,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<td>This field is required.</td>', output_text)
+                '<small>This field is required.</small>', output_text)
 
             # No calendar provided
             data = {
@@ -1875,7 +1833,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<td>This field is required.</td>', output_text)
+                '<small>This field is required.</small>', output_text)
             self.assertIn(
                 '<title>Edit meeting - Fedocal</title>', output_text)
 
@@ -1897,7 +1855,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="warnings">The start date of your meeting is '
+                '<li class="alert alert-warning">The start date of your meeting is '
                 'later than the stop date.</li>', output_text)
             self.assertIn(
                 '<title>Edit meeting - Fedocal</title>', output_text)
@@ -1946,7 +1904,7 @@ class Flasktests(Modeltests):
                 self.assertEqual(output.status_code, 200)
                 output_text = output.get_data(as_text=True)
                 self.assertIn(
-                    '<li class="message">Meeting updated</li>', output_text)
+                    '<li class="alert alert-info">Meeting updated</li>', output_text)
                 self.assertIn(
                     '<title>Meeting "guess what?" - Fedocal</title>', output_text)
 
@@ -1970,7 +1928,7 @@ class Flasktests(Modeltests):
                 '<title>test_calendar_disabled - Fedocal</title>',
                 output_text)
             self.assertIn(
-                '<li class="errors">This calendar is &#34;Disabled&#34;, '
+                '<li class="alert alert-danger">This calendar is &#34;Disabled&#34;, '
                 'you are not allowed to add meetings to it anymore.</li>',
                 output_text)
 
@@ -2013,7 +1971,7 @@ class Flasktests(Modeltests):
                 '<title>test_calendar_disabled - Fedocal</title>',
                 output_text)
             self.assertIn(
-                '<li class="errors">This calendar is &#34;Disabled&#34;, '
+                '<li class="alert alert-danger">This calendar is &#34;Disabled&#34;, '
                 'you are not allowed to edit its meetings anymore.</li>',
                 output_text)
 
@@ -2034,7 +1992,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 'for="meeting_date">Date</label>', output_text)
             self.assertEqual(
-                output_text.count('<span class="required">*</span>'), 6)
+                output_text.count('<span class="text-danger">*</span>'), 6)
 
             output = self.app.get(
                 '/meeting/edit/12/?from_date=%s' % TODAY.strftime('%Y-%m-%d'),
@@ -2051,7 +2009,7 @@ class Flasktests(Modeltests):
             self.assertIn(
                 'for="meeting_date">Date</label>', output_text)
             self.assertEqual(
-                output_text.count('<span class="required">*</span>'), 6)
+                output_text.count('<span class="text-danger">*</span>'), 6)
 
     def test_delete_meeting(self):
         """ Test the delete_meeting function. """
@@ -2062,7 +2020,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '"errors">No meeting with this identifier could be found.</',
+                '"alert alert-danger">No meeting with this identifier could be found.</',
                 output_text)
             self.assertIn('<title>Home - Fedocal</title>', output_text)
 
@@ -2070,7 +2028,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not one of the manager of this '
+                '<li class="alert alert-danger">You are not one of the manager of this '
                 'meeting, or an admin, you are not allowed to delete it.</l',
                 output_text)
             self.assertIn(
@@ -2083,7 +2041,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not one of the manager of this '
+                '<li class="alert alert-danger">You are not one of the manager of this '
                 'meeting, or an admin, you are not allowed to delete it.</l',
                 output_text)
             self.assertIn(
@@ -2104,10 +2062,10 @@ class Flasktests(Modeltests):
                 "positively sure that's what you want to do?",
                 output_text)
             self.assertIn(
-                'name="confirm_delete" type="checkbox" value="y"><label',
+                "name=\"confirm_delete\" type=\"checkbox\" value=\"y\">\n    <label",
                 output_text)
             self.assertIn(
-                '<input id="confirm_button" type="submit" class="submit positi',
+                '<input id="confirm_button" type="submit" class="btn btn-danger',
                 output_text)
 
             csrf_token = output_text.split(
@@ -2127,7 +2085,7 @@ class Flasktests(Modeltests):
                 "positively sure that's what you want to do?",
                 output_text)
             self.assertIn(
-                'name="confirm_delete" type="checkbox" value="y"><label',
+                "name=\"confirm_delete\" type=\"checkbox\" value=\"y\">\n    <label",
                 output_text)
 
             # Do not delete
@@ -2183,7 +2141,7 @@ class Flasktests(Modeltests):
                 self.assertIn(
                     '<title>test_calendar - Fedocal</title>', output_text)
                 self.assertIn(
-                    '<li class="message">Meeting deleted</li>', output_text)
+                    '<li class="alert alert-info">Meeting deleted</li>', output_text)
 
             # Delete all
             data = {
@@ -2200,7 +2158,7 @@ class Flasktests(Modeltests):
                 self.assertIn(
                     '<title>test_calendar - Fedocal</title>', output_text)
                 self.assertIn(
-                    '<li class="message">Meeting deleted</li>', output_text)
+                    '<li class="alert alert-info">Meeting deleted</li>', output_text)
 
         # Add a meeting to the test_calendar_disabled calendar
         obj = model.Meeting(  # id:16
@@ -2236,7 +2194,7 @@ class Flasktests(Modeltests):
                 '<title>test_calendar_disabled - Fedocal</title>',
                 output_text)
             self.assertTrue(
-                '<li class="errors">This calendar is &#34;Disabled&#34;, '
+                '<li class="alert alert-danger">This calendar is &#34;Disabled&#34;, '
                 'you are not allowed to delete its meetings anymore.</li>',
                 output_text)
 
@@ -2250,13 +2208,13 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn('<title>Home - Fedocal</title>', output_text)
         self.assertIn(
-            '<li class="warnings">Invalid referred url</li>', output_text)
+            '<li class="alert alert-warning">Invalid referred url</li>', output_text)
 
         output = self.app.get('/updatetz/',
                               follow_redirects=True)
         self.assertIn('<title>Home - Fedocal</title>', output_text)
         self.assertIn(
-            '<li class="warnings">Invalid referred url</li>',
+            '<li class="alert alert-warning">Invalid referred url</li>',
             output_text)
 
     def test_search(self):
@@ -2297,7 +2255,7 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn('<title>Home - Fedocal</title>', output_text)
         self.assertIn(
-            'class="errors">No keyword provided for the search</',
+            'class="alert alert-danger">No keyword provided for the search</',
             output_text)
 
     def test_goto(self):
@@ -2317,7 +2275,7 @@ class Flasktests(Modeltests):
         output_text = output.get_data(as_text=True)
         self.assertIn('<title>Home - Fedocal</title>', output_text)
         self.assertIn(
-            '<li class="errors">No calendar specified</li>', output_text)
+            '<li class="alert alert-danger">No calendar specified</li>', output_text)
 
         output = self.app.get('/goto/?calendar=test_calendar',
                               follow_redirects=True)
@@ -2364,7 +2322,7 @@ class Flasktests(Modeltests):
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
         self.assertIn(
-            '<li class="errors">Invalid date specified</li>', output_text)
+            '<li class="alert alert-danger">Invalid date specified</li>', output_text)
         self.assertIn(
             '<p>This is a test calendar</p>', output_text)
 
@@ -2376,7 +2334,7 @@ class Flasktests(Modeltests):
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
         self.assertIn(
-            '<li class="errors">Invalid date specified</li>', output_text)
+            '<li class="alert alert-danger">Invalid date specified</li>', output_text)
         self.assertIn(
             '<p>This is a test calendar</p>', output_text)
 
@@ -2387,7 +2345,7 @@ class Flasktests(Modeltests):
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
         self.assertIn(
-            '<li class="errors">Invalid date specified</li>', output_text)
+            '<li class="alert alert-danger">Invalid date specified</li>', output_text)
         self.assertIn(
             '<p>This is a test calendar</p>', output_text)
 
@@ -2398,7 +2356,7 @@ class Flasktests(Modeltests):
         self.assertIn(
             '<title>test_calendar - Fedocal</title>', output_text)
         self.assertIn(
-            '="warnings">Dates before 1900 are not allowed</li',
+            '="alert alert-warning">Dates before 1900 are not allowed</li',
             output_text)
         self.assertIn(
             '<p>This is a test calendar</p>', output_text)
@@ -2432,7 +2390,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">No calendar named 1 could be found</li',
+                '<li class="alert alert-danger">No calendar named 1 could be found</li',
                 output_text)
 
             output = self.app.get('/calendar/upload/test_calendar/',
@@ -2440,7 +2398,7 @@ class Flasktests(Modeltests):
             self.assertEqual(output.status_code, 200)
             output_text = output.get_data(as_text=True)
             self.assertIn(
-                '<li class="errors">You are not an admin for this calendar, '
+                '<li class="alert alert-danger">You are not an admin for this calendar, '
                 'you are not allowed to upload a iCalendar file to it.</l',
                 output_text)
             self.assertIn(
@@ -2483,18 +2441,18 @@ class Flasktests(Modeltests):
                                            follow_redirects=True, data=data)
                     self.assertEqual(output.status_code, 200)
                     output_text = output.get_data(as_text=True)
-                    if '<li class="error">' not in output_text:
+                    if '<li class="alert alert-danger">' not in output_text:
                         self.assertIn(
                             '<title>test_calendar - Fedocal</title>',
                             output_text)
                         self.assertIn(
                             '<p>This is a test calendar</p>', output_text)
                         self.assertIn(
-                            'li class="message">Calendar uploaded</li>',
+                            'li class="alert alert-info">Calendar uploaded</li>',
                             output_text)
                     else:
                         self.assertIn(
-                            '<li class="error">The submitted candidate has the '
+                            '<li class="alert alert-danger">The submitted candidate has the '
                             'MIME type &#34;application/octet-stream&#34; which '
                             'is not an allowed MIME type</li>', output_text)
 
@@ -2512,7 +2470,7 @@ class Flasktests(Modeltests):
                     '<title>Upload calendar - Fedocal</title>',
                     output_text)
                 self.assertIn(
-                    '<li class="error">The submitted candidate has the file '
+                    '<li class="alert alert-danger">The submitted candidate has the file '
                     'extension &#34;txt&#34; which is not an allowed '
                     'format</li>', output_text)
 
diff --git a/tests/test_flask_extras.py b/tests/test_flask_extras.py
index 81501da..6244d4a 100644
--- a/tests/test_flask_extras.py
+++ b/tests/test_flask_extras.py
@@ -111,8 +111,8 @@ class ExtrasFlasktests(Modeltests):
 
             # If no date is specified, it returns the next occurence
             self.assertIn(
-                '<input id="meeting_date" name="meeting_date" required type="date" '
-                'value="%s">' % (next_date), output_text
+                '<input class="form-control" id="meeting_date" name="meeting_date" '
+                'required type="date" value="%s">' % (next_date), output_text
             )
 
             # If a date in the future is specified, return the next occurence
@@ -124,8 +124,8 @@ class ExtrasFlasktests(Modeltests):
             output2_text = output2.get_data(as_text=True)
 
             self.assertIn(
-                '<input id="meeting_date" name="meeting_date" required type="date" '
-                'value="%s">' % (TODAY + timedelta(days=28)), output2_text
+                '<input class="form-control" id="meeting_date" name="meeting_date" '
+                'required type="date" value="%s">' % (TODAY + timedelta(days=28)), output2_text
             )
 
             # If an exact date in the future is specified, return that date
@@ -136,8 +136,8 @@ class ExtrasFlasktests(Modeltests):
             output2_text = output2.get_data(as_text=True)
 
             self.assertIn(
-                '<input id="meeting_date" name="meeting_date" required type="date" '
-                'value="%s">' % (TODAY + timedelta(days=14)), output2_text
+                '<input class="form-control" id="meeting_date" name="meeting_date" '
+                'required type="date" value="%s">' % (TODAY + timedelta(days=14)), output2_text
             )
 
             # If an old date in the future is specified, return the first date
@@ -146,8 +146,8 @@ class ExtrasFlasktests(Modeltests):
             output2_text = output2.get_data(as_text=True)
 
             self.assertIn(
-                '<input id="meeting_date" name="meeting_date" required type="date" '
-                'value="%s">' % (TODAY), output2_text
+                '<input class="form-control" id="meeting_date" name="meeting_date" '
+                'required type="date" value="%s">' % (TODAY), output2_text
             )
 
     def test_start_date_delete_meeting_form(self):

From 414d24b9148196654cc6caa6697fd651cffae0d5 Mon Sep 17 00:00:00 2001
From: Jacob Michalskie <hel@lcp.world>
Date: Nov 23 2022 22:26:35 +0000
Subject: [PATCH 7/7] Remove chunks


---

diff --git a/fedocal/__init__.py b/fedocal/__init__.py
index 0f33414..d0d712a 100644
--- a/fedocal/__init__.py
+++ b/fedocal/__init__.py
@@ -355,13 +355,6 @@ def get_timezone():
     return tzone
 
 
-def chunks(item_list, chunks_size):
-    """ Yield successive n-sized chunks from item_list.
-    """
-    for i in six.moves.range(0, len(item_list), chunks_size):
-        yield item_list[i: i + chunks_size]
-
-
 def is_safe_url(target):
     """ Checks that the target url is safe and sending to the current
     website not some other malicious one.
@@ -417,8 +410,8 @@ def index():
     return flask.render_template(
         'index.html',
         calendars=calendars_enabled,
-        calendars_table=chunks(calendars_enabled, 3),
-        calendars_table2=chunks(calendars_disabled, 3))
+        calendars_enabled=calendars_enabled,
+        calendars_disabled=calendars_disabled)
 
 
 # pylint: disable=R0914
@@ -1512,7 +1505,7 @@ def locations():
     list_locations = fedocallib.get_locations(SESSION)
     return flask.render_template(
         'locations.html',
-        locations=chunks(list_locations, 3))
+        locations=list_locations)
 
 
 # pylint: disable=R0914
diff --git a/fedocal/templates/default/index.html b/fedocal/templates/default/index.html
index 1aa425a..3404d77 100644
--- a/fedocal/templates/default/index.html
+++ b/fedocal/templates/default/index.html
@@ -3,34 +3,32 @@
 {% block title %}{{ _('Home') }}{% endblock %}
 
 {% macro render_calendars(calendars) -%}
-    {% for calendar_row in calendars %}
     <div class="row">
-        {% for calendar in calendar_row %}
-            <a class="col-sm-6 col-md-4 col-lg-3 mb-3"
-                href="{{ url_for('calendar', calendar_name=calendar.calendar_name) }}">
-                <div class="d-flex">
-                  <img src='{{ url_for("static", filename="fedocal.png") }}' alt="" class="my-auto mr-2" />
-                  <div>
-                    <strong>{{ calendar.calendar_name }}</strong>
-                    <div>{{ calendar.calendar_description }}</div>
-                  </div>
-                </div>
-            </a>
-        {% endfor %}
-    </div>
+    {% for calendar in calendars %}
+        <a class="col-sm-6 col-md-4 col-lg-3 mb-3"
+            href="{{ url_for('calendar', calendar_name=calendar.calendar_name) }}">
+            <div class="d-flex">
+              <img src='{{ url_for("static", filename="fedocal.png") }}' alt="" class="my-auto mr-2" />
+              <div>
+                <strong>{{ calendar.calendar_name }}</strong>
+                <div>{{ calendar.calendar_description }}</div>
+              </div>
+            </div>
+        </a>
     {% else %}
-    <p>{{ _('No calendar found') }}</p>
+    <p class="col">{{ _('No calendar found') }}</p>
     {% endfor %}
+    </div>
 {%- endmacro %}
 
 {% block content %}
 <h2>{{ _('Active Calendars') }}</h2>
 <section>
-    {{ render_calendars(calendars_table) }}
+    {{ render_calendars(calendars_enabled) }}
 </section>
 
 <h3>{{ _('Calendars disabled') }}</h3>
 <section>
-    {{ render_calendars(calendars_table2) }}
+    {{ render_calendars(calendars_disabled) }}
 </section>
 {% endblock %}
diff --git a/fedocal/templates/default/locations.html b/fedocal/templates/default/locations.html
index 7d12e76..53a39e5 100644
--- a/fedocal/templates/default/locations.html
+++ b/fedocal/templates/default/locations.html
@@ -4,18 +4,16 @@
 {%block tag %}locations{% endblock %}
 
 {% macro render_locations(calendars) -%}
-    {% for location_row in locations %}
     <div class="row">
-        {% for location in location_row %}
-            <a class="col-md-4"
-                href="{{ url_for('location', loc_name=location) }}">
-                <span>{{ location }}</span>
-            </a>
-        {% endfor %}
-    </div>
+    {% for location in locations %}
+        <a class="col-md-4"
+            href="{{ url_for('location', loc_name=location) }}">
+            <span>{{ location }}</span>
+        </a>
     {% else %}
-    <p>{{ _('No locations found') }}</p>
+    <p class="col">{{ _('No locations found') }}</p>
     {% endfor %}
+    </div>
 {%- endmacro %}
 
 {% block content %}

