diff --git a/examples/complete/screenshots/dashboard.png b/examples/complete/screenshots/dashboard.png deleted file mode 100644 index 841d75c6..00000000 Binary files a/examples/complete/screenshots/dashboard.png and /dev/null differ diff --git a/examples/complete/screenshots/login.png b/examples/complete/screenshots/login.png deleted file mode 100644 index 21f51675..00000000 Binary files a/examples/complete/screenshots/login.png and /dev/null differ diff --git a/examples/complete/screenshots/logs.png b/examples/complete/screenshots/logs.png deleted file mode 100644 index 3ed6b2f8..00000000 Binary files a/examples/complete/screenshots/logs.png and /dev/null differ diff --git a/examples/dashboard/Makefile b/examples/dashboard/Makefile deleted file mode 100644 index 2a081f02..00000000 --- a/examples/dashboard/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -PROG ?= example - -all: $(PROG) - $(DEBUGGER) ./$(PROG) - -$(PROG): - $(CC) ../../mongoose.c -I../.. $(CFLAGS) $(EXTRA) -o $(PROG) main.c mjson.c - -clean: - rm -rf $(PROG) *.o *.dSYM *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb log.txt diff --git a/examples/dashboard/main.c b/examples/dashboard/main.c deleted file mode 100644 index b85ca07e..00000000 --- a/examples/dashboard/main.c +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2020 Cesanta Software Limited -// All rights reserved - -#include "mjson.h" // JSON parsing and printing -#include "mongoose.h" - -// This is a configuration structure we're going to show on a dashboard -static struct config { - int value1; - char *value2; -} s_config = {123, NULL}; - -// Stringifies the config. A caller must free() it. -static char *stringify_config(struct config *cfg) { - char *s = NULL; - mjson_printf(mjson_print_dynamic_buf, &s, "{%Q:%d,%Q:%Q}", "value1", - cfg->value1, "value2", cfg->value2); - return s; -} - -// Update config structure. Return true if changed, false otherwise -static bool update_config(struct mg_http_message *hm, struct config *cfg) { - bool changed = false; - char buf[256]; - double dv; - if (mjson_get_number(hm->body.ptr, hm->body.len, "$.value1", &dv)) { - s_config.value1 = dv; - changed = true; - } - if (mjson_get_string(hm->body.ptr, hm->body.len, "$.value2", buf, - sizeof(buf)) > 0) { - free(s_config.value2); - s_config.value2 = strdup(buf); - changed = true; - } - return changed; -} - -// Notify all config watchers about the config change -static void notify_config_change(struct mg_mgr *mgr) { - struct mg_connection *c; - char *s = stringify_config(&s_config); - for (c = mgr->conns; c != NULL; c = c->next) { - if (c->label[0] == 'W') mg_http_printf_chunk(c, "%s\n", s); - } - free(s); -} - -// HTTP request handler function. It implements the following endpoints: -// /api/config/get - returns current config -// /api/config/set - updates current config -// /api/config/watch - does not return. Sends config as it changes in -// chunks all other URI - serves web_root/ directory -static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { - if (ev == MG_EV_HTTP_MSG) { - struct mg_http_message *hm = (struct mg_http_message *) ev_data; - if (mg_http_match_uri(hm, "/api/config/get")) { - char *s = stringify_config(&s_config); - mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s\n", - (int) strlen(s) + 1, s); - free(s); - } else if (mg_http_match_uri(hm, "/api/config/set")) { - if (update_config(hm, &s_config)) notify_config_change(fn_data); - mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); - } else if (mg_http_match_uri(hm, "/api/config/watch")) { - c->label[0] = 'W'; // Mark ourselves as a config watcher - mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); - } else { - struct mg_http_serve_opts opts = {.root_dir = "web_root"}; - mg_http_serve_dir(c, ev_data, &opts); - } - } -} - -int main(void) { - struct mg_mgr mgr; - mg_mgr_init(&mgr); - mg_http_listen(&mgr, "http://localhost:8000", cb, &mgr); - for (;;) mg_mgr_poll(&mgr, 1000); - mg_mgr_free(&mgr); - return 0; -} diff --git a/examples/dashboard/mjson.c b/examples/dashboard/mjson.c deleted file mode 100644 index a0377eb6..00000000 --- a/examples/dashboard/mjson.c +++ /dev/null @@ -1,981 +0,0 @@ -// Copyright (c) 2018-2020 Cesanta Software Limited -// All rights reserved -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#include "mjson.h" - -#if !defined(_MSC_VER) || _MSC_VER >= 1700 -#else -#define va_copy(x, y) (x) = (y) -#define snprintf _snprintf -#define alloca _alloca -#endif - -static int mjson_esc(int c, int esc) { - const char *p, *esc1 = "\b\f\n\r\t\\\"", *esc2 = "bfnrt\\\""; - for (p = esc ? esc1 : esc2; *p != '\0'; p++) { - if (*p == c) return esc ? esc2[p - esc1] : esc1[p - esc2]; - } - return 0; -} - -static int mjson_pass_string(const char *s, int len) { - int i; - for (i = 0; i < len; i++) { - if (s[i] == '\\' && i + 1 < len && mjson_esc(s[i + 1], 1)) { - i++; - } else if (s[i] == '\0') { - return MJSON_ERROR_INVALID_INPUT; - } else if (s[i] == '"') { - return i; - } - } - return MJSON_ERROR_INVALID_INPUT; -} - -int mjson(const char *s, int len, mjson_cb_t cb, void *ud) { - enum { S_VALUE, S_KEY, S_COLON, S_COMMA_OR_EOO } expecting = S_VALUE; - unsigned char nesting[MJSON_MAX_DEPTH]; - int i, depth = 0; -#define MJSONCALL(ev) \ - if (cb != NULL && cb(ev, s, start, i - start + 1, ud)) return i + 1; - -// In the ascii table, the distance between `[` and `]` is 2. -// Ditto for `{` and `}`. Hence +2 in the code below. -#define MJSONEOO() \ - do { \ - if (c != nesting[depth - 1] + 2) return MJSON_ERROR_INVALID_INPUT; \ - depth--; \ - if (depth == 0) { \ - MJSONCALL(tok); \ - return i + 1; \ - } \ - } while (0) - - for (i = 0; i < len; i++) { - int start = i; - unsigned char c = ((unsigned char *) s)[i]; - int tok = c; - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') continue; - // printf("- %c [%.*s] %d %d\n", c, i, s, depth, expecting); - switch (expecting) { - case S_VALUE: - if (c == '{') { - if (depth >= (int) sizeof(nesting)) return MJSON_ERROR_TOO_DEEP; - nesting[depth++] = c; - expecting = S_KEY; - break; - } else if (c == '[') { - if (depth >= (int) sizeof(nesting)) return MJSON_ERROR_TOO_DEEP; - nesting[depth++] = c; - break; - } else if (c == ']' && depth > 0) { // Empty array - MJSONEOO(); - } else if (c == 't' && i + 3 < len && memcmp(&s[i], "true", 4) == 0) { - i += 3; - tok = MJSON_TOK_TRUE; - } else if (c == 'n' && i + 3 < len && memcmp(&s[i], "null", 4) == 0) { - i += 3; - tok = MJSON_TOK_NULL; - } else if (c == 'f' && i + 4 < len && memcmp(&s[i], "false", 5) == 0) { - i += 4; - tok = MJSON_TOK_FALSE; - } else if (c == '-' || ((c >= '0' && c <= '9'))) { - char *end = NULL; - strtod(&s[i], &end); - if (end != NULL) i += end - &s[i] - 1; - tok = MJSON_TOK_NUMBER; - } else if (c == '"') { - int n = mjson_pass_string(&s[i + 1], len - i - 1); - if (n < 0) return n; - i += n + 1; - tok = MJSON_TOK_STRING; - } else { - return MJSON_ERROR_INVALID_INPUT; - } - if (depth == 0) { - MJSONCALL(tok); - return i + 1; - } - expecting = S_COMMA_OR_EOO; - break; - - case S_KEY: - if (c == '"') { - int n = mjson_pass_string(&s[i + 1], len - i - 1); - if (n < 0) return n; - i += n + 1; - tok = MJSON_TOK_KEY; - expecting = S_COLON; - } else if (c == '}') { // Empty object - MJSONEOO(); - expecting = S_COMMA_OR_EOO; - } else { - return MJSON_ERROR_INVALID_INPUT; - } - break; - - case S_COLON: - if (c == ':') { - expecting = S_VALUE; - } else { - return MJSON_ERROR_INVALID_INPUT; - } - break; - - case S_COMMA_OR_EOO: - if (depth <= 0) return MJSON_ERROR_INVALID_INPUT; - if (c == ',') { - expecting = (nesting[depth - 1] == '{') ? S_KEY : S_VALUE; - } else if (c == ']' || c == '}') { - MJSONEOO(); - } else { - return MJSON_ERROR_INVALID_INPUT; - } - break; - } - MJSONCALL(tok); - } - return MJSON_ERROR_INVALID_INPUT; -} - -struct msjon_get_data { - const char *path; // Lookup json path - int pos; // Current path index - int d1; // Current depth of traversal - int d2; // Expected depth of traversal - int i1; // Index in an array - int i2; // Expected index in an array - int obj; // If the value is array/object, offset where it starts - const char **tokptr; // Destination - int *toklen; // Destination length - int tok; // Returned token -}; - -static int mjson_plen(const char *s) { - int i = 0; - while (s[i] != '\0' && s[i] != '.' && s[i] != '[') i++; - return i; -} - -static int mjson_get_cb(int tok, const char *s, int off, int len, void *ud) { - struct msjon_get_data *data = (struct msjon_get_data *) ud; - // printf("--> %2x %2d %2d %2d %2d\t'%s'\t'%.*s'\t\t'%.*s'\n", tok, data->d1, - // data->d2, data->i1, data->i2, data->path + data->pos, off, s, len, - // s + off); - if (data->tok != MJSON_TOK_INVALID) return 1; // Found - - if (tok == '{') { - if (!data->path[data->pos] && data->d1 == data->d2) data->obj = off; - data->d1++; - } else if (tok == '[') { - if (data->d1 == data->d2 && data->path[data->pos] == '[') { - data->i1 = 0; - data->i2 = (int) strtod(&data->path[data->pos + 1], NULL); - if (data->i1 == data->i2) { - data->d2++; - data->pos += 3; - } - } - if (!data->path[data->pos] && data->d1 == data->d2) data->obj = off; - data->d1++; - } else if (tok == ',') { - if (data->d1 == data->d2 + 1) { - data->i1++; - if (data->i1 == data->i2) { - while (data->path[data->pos] != ']') data->pos++; - data->pos++; - data->d2++; - } - } - } else if (tok == MJSON_TOK_KEY && data->d1 == data->d2 + 1 && - data->path[data->pos] == '.' && s[off] == '"' && - s[off + len - 1] == '"' && - mjson_plen(&data->path[data->pos + 1]) == len - 2 && - !memcmp(s + off + 1, &data->path[data->pos + 1], len - 2)) { - data->d2++; - data->pos += len - 1; - } else if (tok == MJSON_TOK_KEY && data->d1 == data->d2) { - return 1; // Exhausted path, not found - } else if (tok == '}' || tok == ']') { - data->d1--; - // data->d2--; - if (!data->path[data->pos] && data->d1 == data->d2 && data->obj != -1) { - data->tok = tok - 2; - if (data->tokptr) *data->tokptr = s + data->obj; - if (data->toklen) *data->toklen = off - data->obj + 1; - return 1; - } - } else if (MJSON_TOK_IS_VALUE(tok)) { - // printf("TOK --> %d\n", tok); - if (data->d1 == data->d2 && !data->path[data->pos]) { - data->tok = tok; - if (data->tokptr) *data->tokptr = s + off; - if (data->toklen) *data->toklen = len; - return 1; - } - } - return 0; -} - -enum mjson_tok mjson_find(const char *s, int len, const char *jp, - const char **tokptr, int *toklen) { - struct msjon_get_data data = {jp, 1, 0, 0, 0, - 0, -1, tokptr, toklen, MJSON_TOK_INVALID}; - if (jp[0] != '$') return MJSON_TOK_INVALID; - if (mjson(s, len, mjson_get_cb, &data) < 0) return MJSON_TOK_INVALID; - return (enum mjson_tok) data.tok; -} - -int mjson_get_number(const char *s, int len, const char *path, double *v) { - const char *p; - int tok, n; - if ((tok = mjson_find(s, len, path, &p, &n)) == MJSON_TOK_NUMBER) { - if (v != NULL) *v = strtod(p, NULL); - } - return tok == MJSON_TOK_NUMBER ? 1 : 0; -} - -int mjson_get_bool(const char *s, int len, const char *path, int *v) { - int tok = mjson_find(s, len, path, NULL, NULL); - if (tok == MJSON_TOK_TRUE && v != NULL) *v = 1; - if (tok == MJSON_TOK_FALSE && v != NULL) *v = 0; - return tok == MJSON_TOK_TRUE || tok == MJSON_TOK_FALSE ? 1 : 0; -} - -static int mjson_unescape(const char *s, int len, char *to, int n) { - int i, j; - for (i = 0, j = 0; i < len && j < n; i++, j++) { - if (s[i] == '\\' && i + 1 < len) { - int c = mjson_esc(s[i + 1], 0); - if (c == 0) return -1; - to[j] = c; - i++; - } else { - to[j] = s[i]; - } - } - if (j >= n) return -1; - if (n > 0) to[j] = '\0'; - return j; -} - -int mjson_get_string(const char *s, int len, const char *path, char *to, - int n) { - const char *p; - int sz; - if (mjson_find(s, len, path, &p, &sz) != MJSON_TOK_STRING) return -1; - return mjson_unescape(p + 1, sz - 2, to, n); -} - -int mjson_get_hex(const char *s, int len, const char *x, char *to, int n) { - const char *p; - int i, j, sz; - if (mjson_find(s, len, x, &p, &sz) != MJSON_TOK_STRING) return -1; - for (i = j = 0; i < sz - 3 && j < n; i += 2, j++) { -#define HEXTOI(x) (x >= '0' && x <= '9' ? x - '0' : x - 'W') - unsigned char a = *(const unsigned char *) (p + i + 1); - unsigned char b = *(const unsigned char *) (p + i + 2); - ((unsigned char *) to)[j] = (HEXTOI(a) << 4) | HEXTOI(b); - } - if (j < n) to[j] = '\0'; - return j; -} - -#if MJSON_ENABLE_BASE64 -static int mjson_base64rev(int c) { - if (c >= 'A' && c <= 'Z') { - return c - 'A'; - } else if (c >= 'a' && c <= 'z') { - return c + 26 - 'a'; - } else if (c >= '0' && c <= '9') { - return c + 52 - '0'; - } else if (c == '+') { - return 62; - } else if (c == '/') { - return 63; - } else { - return 64; - } -} - -int mjson_base64_dec(const char *src, int n, char *dst, int dlen) { - const char *end = src + n; - int len = 0; - while (src + 3 < end && len < dlen) { - int a = mjson_base64rev(src[0]), b = mjson_base64rev(src[1]), - c = mjson_base64rev(src[2]), d = mjson_base64rev(src[3]); - dst[len++] = (a << 2) | (b >> 4); - if (src[2] != '=' && len < dlen) { - dst[len++] = (b << 4) | (c >> 2); - if (src[3] != '=' && len < dlen) { - dst[len++] = (c << 6) | d; - } - } - src += 4; - } - if (len < dlen) dst[len] = '\0'; - return len; -} - -int mjson_get_base64(const char *s, int len, const char *path, char *to, - int n) { - const char *p; - int sz; - if (mjson_find(s, len, path, &p, &sz) != MJSON_TOK_STRING) return 0; - return mjson_base64_dec(p + 1, sz - 2, to, n); -} -#endif // MJSON_ENABLE_BASE64 - -#if MJSON_ENABLE_NEXT -struct nextdata { - int off, len, depth, t, vo, arrayindex; - int *koff, *klen, *voff, *vlen, *vtype; -}; - -static int next_cb(int tok, const char *s, int off, int len, void *ud) { - struct nextdata *d = (struct nextdata *) ud; - // int i; - switch (tok) { - case '{': - case '[': - if (d->depth == 0 && tok == '[') d->arrayindex = 0; - if (d->depth == 1 && off > d->off) { - d->vo = off; - d->t = tok == '{' ? MJSON_TOK_OBJECT : MJSON_TOK_ARRAY; - if (d->voff) *d->voff = off; - if (d->vtype) *d->vtype = d->t; - } - d->depth++; - break; - case '}': - case ']': - d->depth--; - if (d->depth == 1 && d->vo) { - d->len = off + len; - if (d->vlen) *d->vlen = d->len - d->vo; - if (d->arrayindex >= 0) { - if (d->koff) *d->koff = d->arrayindex; // koff holds array index - if (d->klen) *d->klen = 0; // klen holds 0 - } - return 1; - } - if (d->depth == 1 && d->arrayindex >= 0) d->arrayindex++; - break; - case ',': - case ':': - break; - case MJSON_TOK_KEY: - if (d->depth == 1 && d->off < off) { - if (d->koff) *d->koff = off; // And report back to the user - if (d->klen) *d->klen = len; // If we have to - } - break; - default: - if (d->depth != 1) break; - // If we're iterating over the array - if (off > d->off) { - d->len = off + len; - if (d->vlen) *d->vlen = len; // value length - if (d->voff) *d->voff = off; // value offset - if (d->vtype) *d->vtype = tok; // value type - if (d->arrayindex >= 0) { - if (d->koff) *d->koff = d->arrayindex; // koff holds array index - if (d->klen) *d->klen = 0; // klen holds 0 - } - return 1; - } - if (d->arrayindex >= 0) d->arrayindex++; - break; - } - (void) s; - return 0; -} - -int mjson_next(const char *s, int n, int off, int *koff, int *klen, int *voff, - int *vlen, int *vtype) { - struct nextdata d = {off, 0, 0, 0, 0, -1, koff, klen, voff, vlen, vtype}; - mjson(s, n, next_cb, &d); - return d.len; -} -#endif - -#if MJSON_ENABLE_PRINT -int mjson_print_fixed_buf(const char *ptr, int len, void *fndata) { - struct mjson_fixedbuf *fb = (struct mjson_fixedbuf *) fndata; - int i, left = fb->size - 1 - fb->len; - if (left < len) len = left; - for (i = 0; i < len; i++) fb->ptr[fb->len + i] = ptr[i]; - fb->len += len; - fb->ptr[fb->len] = '\0'; - return len; -} - -int mjson_print_dynamic_buf(const char *ptr, int len, void *fndata) { - char *s, *buf = *(char **) fndata; - int curlen = buf == NULL ? 0 : strlen(buf); - if ((s = (char *) realloc(buf, curlen + len + 1)) == NULL) { - return 0; - } else { - memcpy(s + curlen, ptr, len); - s[curlen + len] = '\0'; - *(char **) fndata = s; - return len; - } -} - -int mjson_print_null(const char *ptr, int len, void *userdata) { - (void) ptr; - (void) userdata; - return len; -} - -int mjson_print_file(const char *ptr, int len, void *userdata) { - return fwrite(ptr, 1, len, (FILE *) userdata); -} - -int mjson_print_buf(mjson_print_fn_t fn, void *fndata, const char *buf, - int len) { - return fn(buf, len, fndata); -} - -int mjson_print_int(mjson_print_fn_t fn, void *fndata, int value, - int is_signed) { - char buf[20]; - int len = snprintf(buf, sizeof(buf), is_signed ? "%d" : "%u", value); - return fn(buf, len, fndata); -} - -int mjson_print_long(mjson_print_fn_t fn, void *fndata, long value, - int is_signed) { - char buf[20]; - const char *fmt = (is_signed ? "%ld" : "%lu"); - int len = snprintf(buf, sizeof(buf), fmt, value); - return fn(buf, len, fndata); -} - -int mjson_print_dbl(mjson_print_fn_t fn, void *fndata, double d, - const char *fmt) { - char buf[40]; - int n = snprintf(buf, sizeof(buf), fmt, d); - return fn(buf, n, fndata); -} - -int mjson_print_str(mjson_print_fn_t fn, void *fndata, const char *s, int len) { - int i, n = fn("\"", 1, fndata); - for (i = 0; i < len; i++) { - char c = mjson_esc(s[i], 1); - if (c) { - n += fn("\\", 1, fndata); - n += fn(&c, 1, fndata); - } else { - n += fn(&s[i], 1, fndata); - } - } - return n + fn("\"", 1, fndata); -} - -#if MJSON_ENABLE_BASE64 -int mjson_print_b64(mjson_print_fn_t fn, void *fndata, const unsigned char *s, - int n) { - const char *t = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - int i, len = fn("\"", 1, fndata); - for (i = 0; i < n; i += 3) { - int a = s[i], b = i + 1 < n ? s[i + 1] : 0, c = i + 2 < n ? s[i + 2] : 0; - char buf[4] = {t[a >> 2], t[(a & 3) << 4 | (b >> 4)], '=', '='}; - if (i + 1 < n) buf[2] = t[(b & 15) << 2 | (c >> 6)]; - if (i + 2 < n) buf[3] = t[c & 63]; - len += fn(buf, sizeof(buf), fndata); - } - return len + fn("\"", 1, fndata); -} -#endif /* MJSON_ENABLE_BASE64 */ - -int mjson_vprintf(mjson_print_fn_t fn, void *fndata, const char *fmt, - va_list xap) { - int i = 0, n = 0; - va_list ap; - va_copy(ap, xap); - while (fmt[i] != '\0') { - if (fmt[i] == '%') { - char fc = fmt[++i]; - int is_long = 0; - if (fc == 'l') { - is_long = 1; - fc = fmt[i + 1]; - } - if (fc == 'Q') { - char *buf = va_arg(ap, char *); - n += mjson_print_str(fn, fndata, buf ? buf : "", buf ? strlen(buf) : 0); - } else if (strncmp(&fmt[i], ".*Q", 3) == 0) { - int len = va_arg(ap, int); - char *buf = va_arg(ap, char *); - n += mjson_print_str(fn, fndata, buf, len); - i += 2; - } else if (fc == 'd' || fc == 'u') { - int is_signed = (fc == 'd'); - if (is_long) { - long val = va_arg(ap, long); - n += mjson_print_long(fn, fndata, val, is_signed); - i++; - } else { - int val = va_arg(ap, int); - n += mjson_print_int(fn, fndata, val, is_signed); - } - } else if (fc == 'B') { - const char *s = va_arg(ap, int) ? "true" : "false"; - n += mjson_print_buf(fn, fndata, s, strlen(s)); - } else if (fc == 's') { - char *buf = va_arg(ap, char *); - n += mjson_print_buf(fn, fndata, buf, strlen(buf)); - } else if (strncmp(&fmt[i], ".*s", 3) == 0) { - int len = va_arg(ap, int); - char *buf = va_arg(ap, char *); - n += mjson_print_buf(fn, fndata, buf, len); - i += 2; - } else if (fc == 'g') { - n += mjson_print_dbl(fn, fndata, va_arg(ap, double), "%g"); - } else if (fc == 'f') { - n += mjson_print_dbl(fn, fndata, va_arg(ap, double), "%f"); -#if MJSON_ENABLE_BASE64 - } else if (fc == 'V') { - int len = va_arg(ap, int); - const char *buf = va_arg(ap, const char *); - n += mjson_print_b64(fn, fndata, (unsigned char *) buf, len); -#endif - } else if (fc == 'H') { - const char *hex = "0123456789abcdef"; - int i, len = va_arg(ap, int); - const unsigned char *p = va_arg(ap, const unsigned char *); - n += fn("\"", 1, fndata); - for (i = 0; i < len; i++) { - n += fn(&hex[(p[i] >> 4) & 15], 1, fndata); - n += fn(&hex[p[i] & 15], 1, fndata); - } - n += fn("\"", 1, fndata); - } else if (fc == 'M') { - mjson_vprint_fn_t vfn = va_arg(ap, mjson_vprint_fn_t); - n += vfn(fn, fndata, &ap); - } - i++; - } else { - n += mjson_print_buf(fn, fndata, &fmt[i++], 1); - } - } - va_end(xap); - va_end(ap); - return n; -} - -int mjson_printf(mjson_print_fn_t fn, void *fndata, const char *fmt, ...) { - va_list ap; - int len; - va_start(ap, fmt); - len = mjson_vprintf(fn, fndata, fmt, ap); - va_end(ap); - return len; -} -#endif /* MJSON_ENABLE_PRINT */ - -#if MJSON_IMPLEMENT_STRTOD -static inline int is_digit(int c) { - return c >= '0' && c <= '9'; -} - -/* NOTE: strtod() implementation by Yasuhiro Matsumoto. */ -double strtod(const char *str, char **end) { - double d = 0.0; - int sign = 1, n = 0; - const char *p = str, *a = str; - - /* decimal part */ - if (*p == '-') { - sign = -1; - ++p; - } else if (*p == '+') - ++p; - if (is_digit(*p)) { - d = (double) (*p++ - '0'); - while (*p && is_digit(*p)) { - d = d * 10.0 + (double) (*p - '0'); - ++p; - ++n; - } - a = p; - } else if (*p != '.') - goto done; - d *= sign; - - /* fraction part */ - if (*p == '.') { - double f = 0.0; - double base = 0.1; - ++p; - - if (is_digit(*p)) { - while (*p && is_digit(*p)) { - f += base * (*p - '0'); - base /= 10.0; - ++p; - ++n; - } - } - d += f * sign; - a = p; - } - - /* exponential part */ - if ((*p == 'E') || (*p == 'e')) { - int e = 0; - ++p; - - sign = 1; - if (*p == '-') { - sign = -1; - ++p; - } else if (*p == '+') - ++p; - - if (is_digit(*p)) { - while (*p == '0') ++p; - e = (int) (*p++ - '0'); - while (*p && is_digit(*p)) { - e = e * 10 + (int) (*p - '0'); - ++p; - } - e *= sign; - } else if (!is_digit(*(a - 1))) { - a = str; - goto done; - } else if (*p == 0) - goto done; - - if (d == 2.2250738585072011 && e == -308) { - d = 0.0; - a = p; - goto done; - } - if (d == 2.2250738585072012 && e <= -308) { - d *= 1.0e-308; - a = p; - goto done; - } - { - int i; - for (i = 0; i < 10; i++) d *= 10; - } - a = p; - } else if (p > str && !is_digit(*(p - 1))) { - a = str; - goto done; - } - -done: - if (end) *end = (char *) a; - return d; -} -#endif - -#if MJSON_ENABLE_MERGE -int mjson_merge(const char *s, int n, const char *s2, int n2, - mjson_print_fn_t fn, void *userdata) { - int koff, klen, voff, vlen, t, t2, k, off = 0, len = 0, comma = 0; - if (n < 2) return len; - len += fn("{", 1, userdata); - while ((off = mjson_next(s, n, off, &koff, &klen, &voff, &vlen, &t)) != 0) { -#if !defined(_MSC_VER) || _MSC_VER >= 1700 - char path[klen + 1]; -#else - char *path = (char *) alloca(klen + 1); -#endif - const char *val; - memcpy(path, "$.", 2); - memcpy(path + 2, s + koff + 1, klen - 2); - path[klen] = '\0'; - if ((t2 = mjson_find(s2, n2, path, &val, &k)) != MJSON_TOK_INVALID) { - if (t2 == MJSON_TOK_NULL) continue; // null deletes the key - } else { - val = s + voff; // Key is not found in the update. Copy the old value. - } - if (comma) len += fn(",", 1, userdata); - len += fn(s + koff, klen, userdata); - len += fn(":", 1, userdata); - if (t == MJSON_TOK_OBJECT && t2 == MJSON_TOK_OBJECT) { - len += mjson_merge(s + voff, vlen, val, k, fn, userdata); - } else { - if (t2 != MJSON_TOK_INVALID) vlen = k; - len += fn(val, vlen, userdata); - } - comma = 1; - } - // Add missing keys - off = 0; - while ((off = mjson_next(s2, n2, off, &koff, &klen, &voff, &vlen, &t)) != 0) { -#if !defined(_MSC_VER) || _MSC_VER >= 1700 - char path[klen + 1]; -#else - char *path = (char *) alloca(klen + 1); -#endif - const char *val; - if (t == MJSON_TOK_NULL) continue; - memcpy(path, "$.", 2); - memcpy(path + 2, s2 + koff + 1, klen - 2); - path[klen] = '\0'; - if (mjson_find(s, n, path, &val, &vlen) != MJSON_TOK_INVALID) continue; - if (comma) len += fn(",", 1, userdata); - len += fn(s2 + koff, klen, userdata); - len += fn(":", 1, userdata); - len += fn(s2 + voff, vlen, userdata); - comma = 1; - } - len += fn("}", 1, userdata); - return len; -} -#endif // MJSON_ENABLE_MERGE - -#if MJSON_ENABLE_PRETTY -struct prettydata { - int level; - int len; - int prev; - const char *pad; - int padlen; - mjson_print_fn_t fn; - void *userdata; -}; - -static int pretty_cb(int ev, const char *s, int off, int len, void *ud) { - struct prettydata *d = (struct prettydata *) ud; - int i; - switch (ev) { - case '{': - case '[': - d->level++; - d->len += d->fn(s + off, len, d->userdata); - break; - case '}': - case ']': - d->level--; - if (d->prev != '[' && d->prev != '{' && d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - d->len += d->fn(s + off, len, d->userdata); - break; - case ',': - d->len += d->fn(s + off, len, d->userdata); - if (d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - break; - case ':': - d->len += d->fn(s + off, len, d->userdata); - if (d->padlen > 0) d->len += d->fn(" ", 1, d->userdata); - break; - case MJSON_TOK_KEY: - if (d->prev == '{' && d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - d->len += d->fn(s + off, len, d->userdata); - break; - default: - if (d->prev == '[' && d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - d->len += d->fn(s + off, len, d->userdata); - break; - } - d->prev = ev; - return 0; -} - -int mjson_pretty(const char *s, int n, const char *pad, mjson_print_fn_t fn, - void *userdata) { - struct prettydata d = {0, 0, 0, pad, strlen(pad), fn, userdata}; - if (mjson(s, n, pretty_cb, &d) < 0) return -1; - return d.len; -} -#endif // MJSON_ENABLE_PRETTY - -#if MJSON_ENABLE_RPC -struct jsonrpc_ctx jsonrpc_default_context; -struct jsonrpc_userdata { - mjson_print_fn_t fn; - void *fndata; -}; - -int mjson_globmatch(const char *s1, int n1, const char *s2, int n2) { - int i = 0, j = 0, ni = 0, nj = 0; - while (i < n1 || j < n2) { - if (i < n1 && j < n2 && (s1[i] == '?' || s2[j] == s1[i])) { - i++, j++; - } else if (i < n1 && (s1[i] == '*' || s1[i] == '#')) { - ni = i, nj = j + 1, i++; - } else if (nj > 0 && nj <= n2 && (s1[i - 1] == '#' || s2[j] != '/')) { - i = ni, j = nj; - } else { - return 0; - } - } - return 1; -} - -static int jsonrpc_printer(const char *buf, int len, void *userdata) { - struct jsonrpc_userdata *u = (struct jsonrpc_userdata *) userdata; - return u->fn(buf, len, u->fndata); -} - -void jsonrpc_return_errorv(struct jsonrpc_request *r, int code, - const char *message, const char *data_fmt, - va_list ap) { - if (r->id_len == 0) return; - mjson_printf(r->fn, r->fndata, - "{\"id\":%.*s,\"error\":{\"code\":%d,\"message\":%Q", r->id_len, - r->id, code, message == NULL ? "" : message); - if (data_fmt != NULL) { - mjson_printf(r->fn, r->fndata, ",\"data\":"); - mjson_vprintf(r->fn, r->fndata, data_fmt, ap); - } - mjson_printf(r->fn, r->fndata, "}}\n"); -} - -void jsonrpc_return_error(struct jsonrpc_request *r, int code, - const char *message, const char *data_fmt, ...) { - va_list ap; - va_start(ap, data_fmt); - jsonrpc_return_errorv(r, code, message, data_fmt, ap); - va_end(ap); -} - -void jsonrpc_return_successv(struct jsonrpc_request *r, const char *result_fmt, - va_list ap) { - if (r->id_len == 0) return; - mjson_printf(r->fn, r->fndata, "{\"id\":%.*s,\"result\":", r->id_len, r->id); - if (result_fmt != NULL) { - mjson_vprintf(r->fn, r->fndata, result_fmt, ap); - } else { - mjson_printf(r->fn, r->fndata, "%s", "null"); - } - mjson_printf(r->fn, r->fndata, "}\n"); -} - -void jsonrpc_return_success(struct jsonrpc_request *r, const char *result_fmt, - ...) { - va_list ap; - va_start(ap, result_fmt); - jsonrpc_return_successv(r, result_fmt, ap); - va_end(ap); -} - -void jsonrpc_ctx_process(struct jsonrpc_ctx *ctx, const char *req, int req_sz, - mjson_print_fn_t fn, void *fndata) { - const char *result = NULL, *error = NULL; - int result_sz = 0, error_sz = 0; - struct jsonrpc_method *m = NULL; - struct jsonrpc_userdata d; - struct jsonrpc_request r = {req, req_sz, 0, 0, 0, 0, 0, - 0, &jsonrpc_printer, NULL, NULL}; - - d.fn = fn; - d.fndata = fndata; - r.fndata = &d; - - // Is is a response frame? - mjson_find(req, req_sz, "$.result", &result, &result_sz); - if (result == NULL) mjson_find(req, req_sz, "$.error", &error, &error_sz); - if (result_sz > 0 || error_sz > 0) { - if (ctx->response_cb != NULL) ctx->response_cb(req, req_sz, ctx->userdata); - return; - } - - // Method must exist and must be a string - if (mjson_find(req, req_sz, "$.method", &r.method, &r.method_len) != - MJSON_TOK_STRING) { - mjson_printf(fn, fndata, "{\"error\":{\"code\":-32700,\"message\":%.*Q}}\n", - req_sz, req); - ctx->in_len = 0; - return; - } - - // id and params are optional - mjson_find(req, req_sz, "$.id", &r.id, &r.id_len); - mjson_find(req, req_sz, "$.params", &r.params, &r.params_len); - - for (m = ctx->methods; m != NULL; m = m->next) { - if (mjson_globmatch(m->method, m->method_sz, r.method + 1, - r.method_len - 2) > 0) { - if (r.params == NULL) r.params = ""; - r.userdata = m->cbdata; - m->cb(&r); - break; - } - } - if (m == NULL) { - jsonrpc_return_error(&r, JSONRPC_ERROR_NOT_FOUND, "method not found", NULL); - } -} - -static int jsonrpc_print_methods(mjson_print_fn_t fn, void *fndata, - va_list *ap) { - struct jsonrpc_ctx *ctx = va_arg(*ap, struct jsonrpc_ctx *); - struct jsonrpc_method *m; - int len = 0; - for (m = ctx->methods; m != NULL; m = m->next) { - if (m != ctx->methods) len += mjson_print_buf(fn, fndata, ",", 1); - len += mjson_print_str(fn, fndata, m->method, strlen(m->method)); - } - return len; -} - -static void rpclist(struct jsonrpc_request *r) { - jsonrpc_return_success(r, "[%M]", jsonrpc_print_methods, r->userdata); -} - -void jsonrpc_ctx_init(struct jsonrpc_ctx *ctx, mjson_print_fn_t response_cb, - void *userdata) { - ctx->response_cb = response_cb; - ctx->userdata = userdata; - jsonrpc_ctx_export(ctx, MJSON_RPC_LIST_NAME, rpclist, ctx); -} - -void jsonrpc_ctx_process_byte(struct jsonrpc_ctx *ctx, unsigned char ch, - mjson_print_fn_t fn, void *p) { - if (ctx->in_len >= (int) sizeof(ctx->in)) ctx->in_len = 0; // Overflow - if (ch == '\n') { // If new line, parse frame - if (ctx->in_len > 1) jsonrpc_ctx_process(ctx, ctx->in, ctx->in_len, fn, p); - ctx->in_len = 0; - } else { - ctx->in[ctx->in_len] = ch; // Append to the buffer - ctx->in_len++; - } -} - -void jsonrpc_init(mjson_print_fn_t response_cb, void *userdata) { - jsonrpc_ctx_init(&jsonrpc_default_context, response_cb, userdata); -} -#endif // MJSON_ENABLE_RPC diff --git a/examples/dashboard/mjson.h b/examples/dashboard/mjson.h deleted file mode 100644 index 93788ac0..00000000 --- a/examples/dashboard/mjson.h +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2018-2020 Cesanta Software Limited -// All rights reserved -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#ifndef MJSON_H -#define MJSON_H - -#include -#include -#include -#include - -#ifndef MJSON_ENABLE_PRINT -#define MJSON_ENABLE_PRINT 1 -#endif - -#ifndef MJSON_ENABLE_RPC -#define MJSON_ENABLE_RPC 1 -#endif - -#ifndef MJSON_ENABLE_BASE64 -#define MJSON_ENABLE_BASE64 1 -#endif - -#ifndef MJSON_ENABLE_MERGE -#define MJSON_ENABLE_MERGE 0 -#elif MJSON_ENABLE_MERGE -#define MJSON_ENABLE_NEXT 1 -#endif - -#ifndef MJSON_ENABLE_PRETTY -#define MJSON_ENABLE_PRETTY 0 -#elif MJSON_ENABLE_PRETTY -#define MJSON_ENABLE_NEXT 1 -#endif - -#ifndef MJSON_ENABLE_NEXT -#define MJSON_ENABLE_NEXT 0 -#endif - - -#ifndef MJSON_RPC_IN_BUF_SIZE -#define MJSON_RPC_IN_BUF_SIZE 256 -#endif - -#ifndef MJSON_RPC_LIST_NAME -#define MJSON_RPC_LIST_NAME "rpc.list" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - MJSON_ERROR_INVALID_INPUT = -1, - MJSON_ERROR_TOO_DEEP = -2, -}; - -enum mjson_tok { - MJSON_TOK_INVALID = 0, - MJSON_TOK_KEY = 1, - MJSON_TOK_STRING = 11, - MJSON_TOK_NUMBER = 12, - MJSON_TOK_TRUE = 13, - MJSON_TOK_FALSE = 14, - MJSON_TOK_NULL = 15, - MJSON_TOK_ARRAY = 91, - MJSON_TOK_OBJECT = 123, -}; -#define MJSON_TOK_IS_VALUE(t) ((t) > 10 && (t) < 20) - -typedef int (*mjson_cb_t)(int ev, const char *s, int off, int len, void *ud); - -#ifndef MJSON_MAX_DEPTH -#define MJSON_MAX_DEPTH 20 -#endif - -int mjson(const char *s, int len, mjson_cb_t cb, void *ud); -enum mjson_tok mjson_find(const char *s, int len, const char *jp, - const char **tokptr, int *toklen); -int mjson_get_number(const char *s, int len, const char *path, double *v); -int mjson_get_bool(const char *s, int len, const char *path, int *v); -int mjson_get_string(const char *s, int len, const char *path, char *to, int n); -int mjson_get_hex(const char *s, int len, const char *path, char *to, int n); - -#if MJSON_ENABLE_NEXT -int mjson_next(const char *s, int n, int off, int *koff, int *klen, int *voff, - int *vlen, int *vtype); -#endif - -#if MJSON_ENABLE_BASE64 -int mjson_get_base64(const char *s, int len, const char *path, char *to, int n); -int mjson_base64_dec(const char *src, int n, char *dst, int dlen); -#endif - -#if MJSON_ENABLE_PRINT -typedef int (*mjson_print_fn_t)(const char *buf, int len, void *userdata); -typedef int (*mjson_vprint_fn_t)(mjson_print_fn_t, void *, va_list *); - -struct mjson_fixedbuf { - char *ptr; - int size, len; -}; - -int mjson_printf(mjson_print_fn_t, void *, const char *fmt, ...); -int mjson_vprintf(mjson_print_fn_t, void *, const char *fmt, va_list ap); -int mjson_print_str(mjson_print_fn_t, void *, const char *s, int len); -int mjson_print_int(mjson_print_fn_t, void *, int value, int is_signed); -int mjson_print_long(mjson_print_fn_t, void *, long value, int is_signed); -int mjson_print_buf(mjson_print_fn_t fn, void *, const char *buf, int len); - -int mjson_print_null(const char *ptr, int len, void *userdata); -int mjson_print_file(const char *ptr, int len, void *userdata); -int mjson_print_fixed_buf(const char *ptr, int len, void *userdata); -int mjson_print_dynamic_buf(const char *ptr, int len, void *userdata); - -#if MJSON_ENABLE_PRETTY -int mjson_pretty(const char *, int, const char *, mjson_print_fn_t, void *); -#endif - -#if MJSON_ENABLE_MERGE -int mjson_merge(const char *, int, const char *, int, mjson_print_fn_t, void *); -#endif - -#endif // MJSON_ENABLE_PRINT - -#if MJSON_ENABLE_RPC - -void jsonrpc_init(mjson_print_fn_t, void *userdata); -int mjson_globmatch(const char *s1, int n1, const char *s2, int n2); - -struct jsonrpc_request { - const char *frame; // Points to the whole frame - int frame_len; // Frame length - const char *params; // Points to the "params" in the request frame - int params_len; // Length of the "params" - const char *id; // Points to the "id" in the request frame - int id_len; // Length of the "id" - const char *method; // Points to the "method" in the request frame - int method_len; // Length of the "method" - mjson_print_fn_t fn; // Printer function - void *fndata; // Printer function data - void *userdata; // Callback's user data as specified at export time -}; - -struct jsonrpc_method { - const char *method; - int method_sz; - void (*cb)(struct jsonrpc_request *); - void *cbdata; - struct jsonrpc_method *next; -}; - -// Main RPC context, stores current request information and a list of -// exported RPC methods. -struct jsonrpc_ctx { - struct jsonrpc_method *methods; - void *userdata; - mjson_print_fn_t response_cb; - int in_len; - char in[MJSON_RPC_IN_BUF_SIZE]; -}; - -// Registers function fn under the given name within the given RPC context -#define jsonrpc_ctx_export(ctx, name, fn, ud) \ - do { \ - static struct jsonrpc_method m = {(name), sizeof(name) - 1, (fn), 0, 0}; \ - m.cbdata = (ud); \ - m.next = (ctx)->methods; \ - (ctx)->methods = &m; \ - } while (0) - -void jsonrpc_ctx_init(struct jsonrpc_ctx *ctx, mjson_print_fn_t, void *); -void jsonrpc_return_error(struct jsonrpc_request *r, int code, - const char *message, const char *data_fmt, ...); -void jsonrpc_return_success(struct jsonrpc_request *r, const char *result_fmt, - ...); -void jsonrpc_ctx_process(struct jsonrpc_ctx *ctx, const char *req, int req_sz, - mjson_print_fn_t fn, void *fndata); -void jsonrpc_ctx_process_byte(struct jsonrpc_ctx *ctx, unsigned char ch, - mjson_print_fn_t fn, void *fndata); - -extern struct jsonrpc_ctx jsonrpc_default_context; - -#define jsonrpc_export(name, fn, ud) \ - jsonrpc_ctx_export(&jsonrpc_default_context, (name), (fn), (ud)) - -#define jsonrpc_process(buf, len, fn, data) \ - jsonrpc_ctx_process(&jsonrpc_default_context, (buf), (len), (fn), (data)) - -#define jsonrpc_process_byte(x, fn, data) \ - jsonrpc_ctx_process_byte(&jsonrpc_default_context, (x), (fn), (data)) - -#define JSONRPC_ERROR_INVALID -32700 /* Invalid JSON was received */ -#define JSONRPC_ERROR_NOT_FOUND -32601 /* The method does not exist */ -#define JSONRPC_ERROR_BAD_PARAMS -32602 /* Invalid params passed */ -#define JSONRPC_ERROR_INTERNAL -32603 /* Internal JSON-RPC error */ - -#endif // MJSON_ENABLE_RPC -#ifdef __cplusplus -} -#endif -#endif // MJSON_H diff --git a/examples/dashboard/web_root/app.js b/examples/dashboard/web_root/app.js deleted file mode 100644 index 26e79f0a..00000000 --- a/examples/dashboard/web_root/app.js +++ /dev/null @@ -1,76 +0,0 @@ -const {h, render, Component} = preact; -const html = htm.bind(h); - -const Info = () => html`
- This dashboard shows values kept in server memory. Many clients - can open this page. As soon as any client changes any value, - all clients update automatically. -

- The JS code that watches state changes, reconnects on network failures. - That means if server restarts, dashboard on all connected clients - refresh automatically. -

- - You can use curl command-line utility: -
curl localhost:8000/api/config/get -
curl localhost:8000/api/config/watch -
curl localhost:8000/api/config/set -d '{"a":123}' -
`; - -class Dashboard extends Component { - state = {value1: null, value2: null}; - componentDidMount() { - axios.get('/api/config/get') - .then(r => this.setState(r.data)) - .catch(e => console.log(e)); - var self = this; - var f = function(reader) { - return reader.read().then(function(result) { - var data = String.fromCharCode.apply(null, result.value); - self.setState(JSON.parse(data)); - // console.log(JSON.parse(data)); - if (!result.done) return f(reader); - }); - }; - fetch('/api/config/watch') - .then(r => r.body.getReader()) - .then(f) - .catch(e => setTimeout(x => self.componentDidMount(), 1000)); - } - render(props, state) { - return html - `
-
Value 1 (number): -
${state.value1}
-
Value 2 (string): -
${state.value2}
-
` - } -}; - -class Form extends Component { - render(props, state) { - const onclick = ev => axios.post( - '/api/config/set', {value1: +state.value1, value2: state.value2}); - // alert(JSON.stringify(state)); - return html`
-
Change values
- - - - - -
Value 1 (number):
Value 2 (string):
-
` - } -}; - -const App = () => html`
- <${Info} /> - <${Dashboard} /> - <${Form} /> -
`; - -window.onload = () => render(h(App), document.body); diff --git a/examples/dashboard/web_root/axios.min.js b/examples/dashboard/web_root/axios.min.js deleted file mode 100644 index fc6c8b61..00000000 --- a/examples/dashboard/web_root/axios.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/* axios v0.21.1 | (c) 2020 by Matt Zabriskie */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new i(e),n=s(i.prototype.request,t);return o.extend(n,i.prototype,t),o.extend(n,t),n}var o=n(2),s=n(3),i=n(4),a=n(22),u=n(10),c=r(u);c.Axios=i,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),c.isAxiosError=n(26),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function s(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function i(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},s.forEach(["delete","get","head"],function(e){u.headers[e]={}}),s.forEach(["post","put","patch"],function(e){u.headers[e]=s.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),s=n(16),i=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,s=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:s,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,i),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?s.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,s){var i=new Error(e);return r(i,t,n,o,s)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,s,i){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(s)&&a.push("domain="+s),i===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,s,i={};return e?(r.forEach(e.split("\n"),function(e){if(s=e.indexOf(":"),t=r.trim(e.substr(0,s)).toLowerCase(),n=r.trim(e.substr(s+1)),t){if(i[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?i[t]=(i[t]?i[t]:[]).concat([n]):i[t]=i[t]?i[t]+", "+n:n}}),i):i}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(e[o],t[o])}t=t||{};var s={},i=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(i,function(e){r.isUndefined(t[e])||(s[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?s[r]=n(e[r],t[r]):r in e&&(s[r]=n(void 0,e[r]))});var f=i.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),s}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t){"use strict";e.exports=function(e){return"object"==typeof e&&e.isAxiosError===!0}}])}); -//# sourceMappingURL=axios.min.map \ No newline at end of file diff --git a/examples/dashboard/web_root/htm.min.js b/examples/dashboard/web_root/htm.min.js deleted file mode 100644 index 4fdd0fee..00000000 --- a/examples/dashboard/web_root/htm.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){function n(n){var t=e.get(this);return t||(t=new Map,e.set(this,t)),1<(t=a(this,t.get(n)||(t.set(n,t=function(n){function t(n){1===u&&(n||(r=r.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?p.push(0,n,r):3===u&&(n||r)?(p.push(3,n,r),u=2):2===u&&"..."===r&&n?p.push(4,n,0):2===u&&r&&!n?p.push(5,0,!0,r):5<=u&&((r||!n&&5===u)&&(p.push(u,0,r,s),u=6),n&&(p.push(u,n,0,s),u=6)),r=""}for(var e,s,u=1,r="",h="",p=[0],a=0;a"===e?(u=1,""):e+r[0]:h?e===h?h="":r+=e:'"'===e||"'"===e?h=e:">"===e?(t(),u=1):u&&("="===e?(u=5,s=r,r=""):"/"===e&&(u<5||">"===n[a][o+1])?(t(),3===u&&(p=p[0]),(p=(u=p)[0]).push(2,0,u),u=0):" "===e||"\t"===e||"\n"===e||"\r"===e?(t(),u=2):r+=e),3===u&&"!--"===r&&(u=4,p=p[0])}return t(),p}(n)),t),arguments,[])).length?t:t[0]}var a=function(n,t,e,s){var u;t[0]=0;for(var r=1;r - - - example - - - - - - - - - - - - diff --git a/examples/dashboard/web_root/linkstate.min.js b/examples/dashboard/web_root/linkstate.min.js deleted file mode 100644 index d2289dc9..00000000 --- a/examples/dashboard/web_root/linkstate.min.js +++ /dev/null @@ -1,18 +0,0 @@ -function linkState(component, key, eventPath) { - let path = key.split('.'), cache = component.__lsc || (component.__lsc = {}); - - return cache[key + eventPath] || (cache[key + eventPath] = function(e) { - let t = e && e.target || this, state = {}, obj = state, - v = typeof eventPath === 'string' ? - delve(e, eventPath) : - t.nodeName ? (t.type.match(/^che|rad/) ? t.checked : t.value) : - e, - i = 0; - for (; i < path.length - 1; i++) { - obj = obj[path[i]] || - (obj[path[i]] = !i && component.state[path[i]] || {}); - } - obj[path[i]] = v; - component.setState(state); - }); -} diff --git a/examples/dashboard/web_root/preact.min.js b/examples/dashboard/web_root/preact.min.js deleted file mode 100644 index b706d3c9..00000000 --- a/examples/dashboard/web_root/preact.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){var n,l,u,t,i,o,r,e,f={},c=[],a=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function v(n){var l=n.parentNode;l&&l.removeChild(n)}function h(n,l,u){var t,i=arguments,o={};for(t in l)"key"!==t&&"ref"!==t&&(o[t]=l[t]);if(arguments.length>3)for(u=[u],t=3;t1&&E(i,l,u),l=b(u,i,i,n.__k,null,i.__e,l),"function"==typeof n.type&&(n.__d=l)))}function N(l,u,t,i,o,r,e,f,c){var a,v,h,y,_,m,k,w,b,x,C,A=u.type;if(void 0!==u.constructor)return null;(a=n.__b)&&a(u);try{n:if("function"==typeof A){if(w=u.props,b=(a=A.contextType)&&i[a.__c],x=a?b?b.props.value:a.__:i,t.__c?k=(v=u.__c=t.__c).__=v.__E:("prototype"in A&&A.prototype.render?u.__c=v=new A(w,x):(u.__c=v=new d(w,x),v.constructor=A,v.render=F),b&&b.sub(v),v.props=w,v.state||(v.state={}),v.context=x,v.__n=i,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=A.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=s({},v.__s)),s(v.__s,A.getDerivedStateFromProps(w,v.__s))),y=v.props,_=v.state,h)null==A.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else{if(null==A.getDerivedStateFromProps&&w!==y&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(w,x),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(w,v.__s,x)||u.__v===t.__v){v.props=w,v.state=v.__s,u.__v!==t.__v&&(v.__d=!1),v.__v=u,u.__e=t.__e,u.__k=t.__k,v.__h.length&&e.push(v),E(u,f,l);break n}null!=v.componentWillUpdate&&v.componentWillUpdate(w,v.__s,x),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(y,_,m)})}v.context=x,v.props=w,v.state=v.__s,(a=n.__r)&&a(u),v.__d=!1,v.__v=u,v.__P=l,a=v.render(v.props,v.state,v.context),v.state=v.__s,null!=v.getChildContext&&(i=s(s({},i),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(m=v.getSnapshotBeforeUpdate(y,_)),C=null!=a&&a.type==p&&null==a.key?a.props.children:a,g(l,Array.isArray(C)?C:[C],u,t,i,o,r,e,f,c),v.base=u.__e,v.__h.length&&e.push(v),k&&(v.__E=v.__=null),v.__e=!1}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=T(t.__e,u,t,i,o,r,e,c);(a=n.diffed)&&a(u)}catch(l){u.__v=null,n.__e(l,u,t)}return u.__e}function z(l,u){n.__c&&n.__c(u,l),l.some(function(u){try{l=u.__h,u.__h=[],l.some(function(n){n.call(u)})}catch(l){n.__e(l,u.__v)}})}function T(n,l,u,t,i,o,r,e){var a,s,v,h,y,p=u.props,d=l.props;if(i="svg"===l.type||i,null!=o)for(a=0;a2&&(l.children=c.slice.call(arguments,2)),u={},l)"key"!==t&&"ref"!==t&&(u[t]=l[t]);return y(n.type,u,l.key||n.key,l.ref||n.ref,null)},createContext:function(n){var l={},u={__c:"__cC"+r++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var t,i=this;return this.getChildContext||(t=[],this.getChildContext=function(){return l[u.__c]=i,l},this.shouldComponentUpdate=function(n){i.props.value!==n.value&&t.some(function(l){l.context=n.value,k(l)})},this.sub=function(n){t.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){t.splice(t.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Consumer.contextType=u,u.Provider.__=u,u},toChildArray:function n(l){return null==l||"boolean"==typeof l?[]:Array.isArray(l)?c.concat.apply([],l.map(n)):[l]},__u:j,options:n},typeof module<"u"?module.exports=e:self.preact=e}(); -//# sourceMappingURL=preact.min.js.map diff --git a/examples/dashboard/web_root/style.css b/examples/dashboard/web_root/style.css deleted file mode 100644 index 687806a0..00000000 --- a/examples/dashboard/web_root/style.css +++ /dev/null @@ -1,6 +0,0 @@ -#container { margin-right: auto; margin-left: auto; max-width: 480px; } -#info { background: #d0f0f0; border-radius: .5em; padding: 2em; } -#dashboard { background: #f0f0f0; border-radius: .5em; padding: 0.5em; max-height: 10em; overflow: auto; height: 100%; margin-top: 1em; } -#form { background: #d0c0f0; border-radius: .5em; padding: 0.5em; max-height: 10em; overflow: auto; height: 100%; margin-top: 1em; } -button { width: 100%; } -button, select, input, label::before, textarea { outline: none; box-shadow:none !important; border: 1px solid #ccc !important; } diff --git a/examples/complete/Makefile b/examples/device-dashboard/Makefile similarity index 100% rename from examples/complete/Makefile rename to examples/device-dashboard/Makefile diff --git a/examples/complete/README.md b/examples/device-dashboard/README.md similarity index 67% rename from examples/complete/README.md rename to examples/device-dashboard/README.md index 313f96d1..a45fa423 100644 --- a/examples/complete/README.md +++ b/examples/device-dashboard/README.md @@ -4,16 +4,14 @@ This example is a demonstration of how Mongoose Library could be integrated into an embedded device and provide a complete device dashboard with the following features: +- Authentication: login-protected dashboard - Multiple logins with different permissions (admin and user) -- Login screen for non-authenticated connections -- A [preact](https://preactjs.com/)-based dashboard with multiple pages - Web UI is fully embedded into the server/firmware binary, and does not - need a filesystem to serve it + need a filesystem to serve it. UI is resilient to FS problems - View and change server settings - All changes are propagates to all connected clients - Live interactive chat that demonstrates bi-directional data exchange - # Screenshots This is a login screen that prompts for user/password @@ -22,10 +20,6 @@ This is a login screen that prompts for user/password # Main dashboard -A main dashboard page shows internal data, live video stream, and a form +A main dashboard page shows device settings form, and live chat ![](screenshots/dashboard.png) - -A live log page shows live log stream coming from device - -![](screenshots/logs.png) diff --git a/examples/complete/main.c b/examples/device-dashboard/main.c similarity index 100% rename from examples/complete/main.c rename to examples/device-dashboard/main.c diff --git a/examples/complete/packed_fs.c b/examples/device-dashboard/packed_fs.c similarity index 82% rename from examples/complete/packed_fs.c rename to examples/device-dashboard/packed_fs.c index c88c17de..749db3cc 100644 --- a/examples/complete/packed_fs.c +++ b/examples/device-dashboard/packed_fs.c @@ -334,446 +334,455 @@ static const unsigned char v2[] = { 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 32, 32, 125, 41, 46, 99, 97, 116, 99, 104, 40, 101, // }).catch(e 114, 114, 32, 61, 62, 32, 101, 114, 114, 41, 59, 10, // rr => err);. - 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // return htm - 108, 96, 10, 60, 100, 105, 118, 32, 115, 116, 121, 108, // l`.
. - 60, 104, 51, 32, 115, 116, 121, 108, 101, 61, 34, 98, //

. Chang - 101, 32, 99, 111, 110, 102, 105, 103, 117, 114, 97, 116, // e configurat - 105, 111, 110, 60, 47, 104, 51, 62, 10, 32, 32, 60, // ion

. < - 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 109, // div style="m - 97, 114, 103, 105, 110, 58, 32, 48, 46, 53, 101, 109, // argin: 0.5em - 32, 48, 59, 34, 62, 10, 32, 32, 32, 32, 60, 115, // 0;">. value1 - 58, 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, // :. - 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, // setValue1( - 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, // ev.target.va - 108, 117, 101, 41, 125, 32, 47, 62, 10, 32, 32, 32, // lue)} />. - 32, 60, 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, // . - 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, //
. . value2: - 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, // . - 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // - 32, 115, 101, 116, 86, 97, 108, 117, 101, 50, 40, 101, // setValue2(e - 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, // v.target.val - 117, 101, 41, 125, 32, 47, 62, 10, 32, 32, 32, 32, // ue)} />. - 60, 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, // . - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, // . . As so - 111, 110, 32, 97, 115, 32, 97, 100, 109, 105, 110, 105, // on as admini - 115, 116, 114, 97, 116, 111, 114, 32, 117, 112, 100, 97, // strator upda - 116, 101, 115, 32, 99, 111, 110, 102, 105, 103, 117, 114, // tes configur - 97, 116, 105, 111, 110, 44, 32, 10, 32, 32, 32, 32, // ation, . - 115, 101, 114, 118, 101, 114, 32, 105, 116, 101, 114, 97, // server itera - 116, 101, 115, 32, 111, 118, 101, 114, 32, 97, 108, 108, // tes over all - 32, 99, 111, 110, 110, 101, 99, 116, 101, 100, 32, 99, // connected c - 108, 105, 101, 110, 116, 115, 32, 97, 110, 100, 32, 115, // lients and s - 101, 110, 100, 115, 32, 117, 112, 100, 97, 116, 101, 10, // ends update. - 32, 32, 32, 32, 110, 111, 116, 105, 102, 105, 99, 97, // notifica - 116, 105, 111, 110, 115, 32, 116, 111, 32, 97, 108, 108, // tions to all - 32, 111, 102, 32, 116, 104, 101, 109, 32, 45, 32, 115, // of them - s - 111, 32, 116, 104, 101, 121, 32, 117, 112, 100, 97, 116, // o they updat - 101, 32, 97, 117, 116, 111, 109, 97, 116, 105, 99, 97, // e automatica - 108, 108, 121, 46, 10, 32, 32, 60, 47, 100, 105, 118, // lly.. .`;.} - 59, 10, 10, 99, 111, 110, 115, 116, 32, 76, 111, 103, // ;..const Log - 105, 110, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // in = functio - 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. - 32, 99, 111, 110, 115, 116, 32, 91, 117, 115, 101, 114, // const [user - 44, 32, 115, 101, 116, 85, 115, 101, 114, 93, 32, 61, // , setUser] = - 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' - 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // );. const [ - 112, 97, 115, 115, 44, 32, 115, 101, 116, 80, 97, 115, // pass, setPas - 115, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, // s] = useStat - 101, 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, // e('');. con - 115, 116, 32, 108, 111, 103, 105, 110, 32, 61, 32, 101, // st login = e - 118, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, 102, // v =>. f - 101, 116, 99, 104, 40, 10, 32, 32, 32, 32, 32, 32, // etch(. - 32, 32, 32, 32, 39, 47, 97, 112, 105, 47, 108, 111, // '/api/lo - 103, 105, 110, 39, 44, 10, 32, 32, 32, 32, 32, 32, // gin',. - 32, 32, 32, 32, 123, 104, 101, 97, 100, 101, 114, 115, // {headers - 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, 122, 97, // : {Authoriza - 116, 105, 111, 110, 58, 32, 39, 66, 97, 115, 105, 99, // tion: 'Basic - 32, 39, 32, 43, 32, 98, 116, 111, 97, 40, 117, 115, // ' + btoa(us - 101, 114, 32, 43, 32, 39, 58, 39, 32, 43, 32, 112, // er + ':' + p - 97, 115, 115, 41, 125, 125, 41, 10, 32, 32, 32, 32, // ass)}}). - 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, // .then( - 114, 32, 61, 62, 32, 114, 46, 106, 115, 111, 110, 40, // r => r.json( - 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // )). - 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, // .then(r => - 114, 32, 38, 38, 32, 112, 114, 111, 112, 115, 46, 108, // r && props.l - 111, 103, 105, 110, 40, 114, 41, 41, 10, 32, 32, 32, // ogin(r)). - 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, // .catc - 104, 40, 101, 114, 114, 32, 61, 62, 32, 101, 114, 114, // h(err => err - 41, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, // );. return - 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, 99, // html`.
.
. - 32, 32, 32, 32, 60, 104, 49, 32, 115, 116, 121, 108, //

Device - 68, 97, 115, 104, 98, 111, 97, 114, 100, 32, 76, 111, // Dashboard Lo - 103, 105, 110, 32, 60, 47, 104, 49, 62, 10, 32, 32, // gin

. - 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
. - 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, // setUser(ev - 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, // .target.valu - 101, 41, 125, 32, 118, 97, 108, 117, 101, 61, 36, 123, // e)} value=${ - 117, 115, 101, 114, 125, 32, 47, 62, 10, 32, 32, 32, // user} />. - 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, //
. - 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. - 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, // setP - 97, 115, 115, 40, 101, 118, 46, 116, 97, 114, 103, 101, // ass(ev.targe - 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 118, 97, // t.value)} va - 108, 117, 101, 61, 36, 123, 112, 97, 115, 115, 125, 10, // lue=${pass}. - 32, 32, 32, 32, 32, 32, 32, 32, 111, 110, 99, 104, // onch - 97, 110, 103, 101, 61, 36, 123, 108, 111, 103, 105, 110, // ange=${login - 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, 47, 100, // } />. .
- 10, 32, 32, 32, 32, 32, 32, 60, 98, 117, 116, 116, // . L - 111, 103, 105, 110, 32, 60, 47, 98, 117, 116, 116, 111, // ogin .
.
. Vali - 100, 32, 108, 111, 103, 105, 110, 115, 58, 32, 97, 100, // d logins: ad - 109, 105, 110, 58, 112, 97, 115, 115, 48, 44, 32, 117, // min:pass0, u - 115, 101, 114, 49, 58, 112, 97, 115, 115, 49, 44, 32, // ser1:pass1, - 117, 115, 101, 114, 50, 58, 112, 97, 115, 115, 50, 10, // user2:pass2. - 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, //
. - 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, //
.`;.};..con - 115, 116, 32, 77, 101, 115, 115, 97, 103, 101, 32, 61, // st Message = - 32, 116, 101, 120, 116, 32, 61, 62, 32, 104, 116, 109, // text => htm - 108, 96, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, // l`
${te - 120, 116, 125, 60, 47, 100, 105, 118, 62, 96, 59, 10, // xt}
`;. - 10, 99, 111, 110, 115, 116, 32, 67, 104, 97, 116, 32, // .const Chat - 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, // = function(p - 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, // rops) {. co - 110, 115, 116, 32, 91, 109, 101, 115, 115, 97, 103, 101, // nst [message - 44, 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, 101, // , setMessage - 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, // ] = useState - 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, 115, // ('');. cons - 116, 32, 115, 101, 110, 100, 109, 101, 115, 115, 97, 103, // t sendmessag - 101, 32, 61, 32, 101, 118, 32, 61, 62, 32, 102, 101, // e = ev => fe - 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 109, 101, // tch('/api/me - 115, 115, 97, 103, 101, 47, 115, 101, 110, 100, 39, 44, // ssage/send', - 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 109, 101, 116, // met - 104, 111, 100, 58, 32, 39, 112, 111, 115, 116, 39, 44, // hod: 'post', - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // . - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, // body: - 32, 96, 109, 101, 115, 115, 97, 103, 101, 61, 36, 123, // `message=${ - 101, 110, 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, // encodeURICom - 112, 111, 110, 101, 110, 116, 40, 109, 101, 115, 115, 97, // ponent(messa - 103, 101, 41, 125, 96, 10, 32, 32, 32, 32, 32, 32, // ge)}`. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, // }) - 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 115, // .then(r => s - 101, 116, 77, 101, 115, 115, 97, 103, 101, 40, 39, 39, // etMessage('' - 41, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, // ));.. const - 32, 109, 101, 115, 115, 97, 103, 101, 115, 32, 61, 32, // messages = - 112, 114, 111, 112, 115, 46, 109, 101, 115, 115, 97, 103, // props.messag - 101, 115, 46, 109, 97, 112, 40, 10, 32, 32, 32, 32, // es.map(. - 32, 32, 116, 101, 120, 116, 32, 61, 62, 32, 104, 116, // text => ht - 109, 108, 96, 60, 100, 105, 118, 32, 115, 116, 121, 108, // ml`
${t - 101, 120, 116, 125, 60, 47, 100, 105, 118, 62, 96, 41, // ext}
`) + 32, 32, 99, 111, 110, 115, 116, 32, 117, 112, 100, 97, // const upda + 116, 101, 118, 97, 108, 117, 101, 49, 32, 61, 32, 101, // tevalue1 = e + 118, 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, 40, // v => update( + 39, 118, 97, 108, 117, 101, 49, 39, 44, 32, 118, 97, // 'value1', va + 108, 117, 101, 49, 41, 59, 10, 32, 32, 99, 111, 110, // lue1);. con + 115, 116, 32, 117, 112, 100, 97, 116, 101, 118, 97, 108, // st updateval + 117, 101, 50, 32, 61, 32, 101, 118, 32, 61, 62, 32, // ue2 = ev => + 117, 112, 100, 97, 116, 101, 40, 39, 118, 97, 108, 117, // update('valu + 101, 50, 39, 44, 32, 118, 97, 108, 117, 101, 50, 41, // e2', value2) 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, // ;. return h 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, 115, 116, // tml`.
. 32, 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, 61, //

User cha - 116, 60, 47, 104, 51, 62, 10, 32, 32, 60, 100, 105, // t

. - 10, 32, 32, 32, 32, 36, 123, 109, 101, 115, 115, 97, // . ${messa - 103, 101, 115, 125, 10, 32, 32, 60, 47, 100, 105, 118, // ges}.
.
. Cha + 110, 103, 101, 32, 99, 111, 110, 102, 105, 103, 117, 114, // nge configur + 97, 116, 105, 111, 110, 60, 47, 104, 51, 62, 10, 32, // ation. + 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
. + 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, // valu + 101, 49, 58, 60, 47, 115, 112, 97, 110, 62, 10, 32, // e1:. + 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, // setValu + 101, 49, 40, 101, 118, 46, 116, 97, 114, 103, 101, 116, // e1(ev.target + 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, 10, // .value)} />. + 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, // .
. + 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
. + 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, // valu + 101, 50, 58, 60, 47, 115, 112, 97, 110, 62, 10, 32, // e2:. + 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, // setValu + 101, 50, 40, 101, 118, 46, 116, 97, 114, 103, 101, 116, // e2(ev.target + 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, 10, // .value)} />. + 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, // .
. + 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
. A + 115, 32, 115, 111, 111, 110, 32, 97, 115, 32, 97, 100, // s soon as ad + 109, 105, 110, 105, 115, 116, 114, 97, 116, 111, 114, 32, // ministrator + 117, 112, 100, 97, 116, 101, 115, 32, 99, 111, 110, 102, // updates conf + 105, 103, 117, 114, 97, 116, 105, 111, 110, 44, 32, 10, // iguration, . + 32, 32, 32, 32, 115, 101, 114, 118, 101, 114, 32, 105, // server i + 116, 101, 114, 97, 116, 101, 115, 32, 111, 118, 101, 114, // terates over + 32, 97, 108, 108, 32, 99, 111, 110, 110, 101, 99, 116, // all connect + 101, 100, 32, 99, 108, 105, 101, 110, 116, 115, 32, 97, // ed clients a + 110, 100, 32, 115, 101, 110, 100, 115, 32, 117, 112, 100, // nd sends upd + 97, 116, 101, 10, 32, 32, 32, 32, 110, 111, 116, 105, // ate. noti + 102, 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 111, // fications to + 32, 97, 108, 108, 32, 111, 102, 32, 116, 104, 101, 109, // all of them + 32, 45, 32, 115, 111, 32, 116, 104, 101, 121, 32, 117, // - so they u + 112, 100, 97, 116, 101, 32, 97, 117, 116, 111, 109, 97, // pdate automa + 116, 105, 99, 97, 108, 108, 121, 46, 10, 32, 32, 60, // tically.. < + 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, 118, 62, // /div>.
+ 96, 59, 10, 125, 59, 10, 10, 99, 111, 110, 115, 116, // `;.};..const + 32, 76, 111, 103, 105, 110, 32, 61, 32, 102, 117, 110, // Login = fun + 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, 41, // ction(props) + 32, 123, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // {. const [ + 117, 115, 101, 114, 44, 32, 115, 101, 116, 85, 115, 101, // user, setUse + 114, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, // r] = useStat + 101, 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, // e('');. con + 115, 116, 32, 91, 112, 97, 115, 115, 44, 32, 115, 101, // st [pass, se + 116, 80, 97, 115, 115, 93, 32, 61, 32, 117, 115, 101, // tPass] = use + 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, // State('');. + 32, 99, 111, 110, 115, 116, 32, 108, 111, 103, 105, 110, // const login + 32, 61, 32, 101, 118, 32, 61, 62, 10, 32, 32, 32, // = ev =>. + 32, 32, 32, 102, 101, 116, 99, 104, 40, 10, 32, 32, // fetch(. + 32, 32, 32, 32, 32, 32, 32, 32, 39, 47, 97, 112, // '/ap + 105, 47, 108, 111, 103, 105, 110, 39, 44, 10, 32, 32, // i/login',. + 32, 32, 32, 32, 32, 32, 32, 32, 123, 104, 101, 97, // {hea + 100, 101, 114, 115, 58, 32, 123, 65, 117, 116, 104, 111, // ders: {Autho + 114, 105, 122, 97, 116, 105, 111, 110, 58, 32, 39, 66, // rization: 'B + 97, 115, 105, 99, 32, 39, 32, 43, 32, 98, 116, 111, // asic ' + bto + 97, 40, 117, 115, 101, 114, 32, 43, 32, 39, 58, 39, // a(user + ':' + 32, 43, 32, 112, 97, 115, 115, 41, 125, 125, 41, 10, // + pass)}}). + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, // .t + 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, 46, 106, // hen(r => r.j + 115, 111, 110, 40, 41, 41, 10, 32, 32, 32, 32, 32, // son()). + 32, 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, // .then(r + 32, 61, 62, 32, 114, 32, 38, 38, 32, 112, 114, 111, // => r && pro + 112, 115, 46, 108, 111, 103, 105, 110, 40, 114, 41, 41, // ps.login(r)) + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, // . . + 99, 97, 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, // catch(err => + 32, 101, 114, 114, 41, 59, 10, 32, 32, 114, 101, 116, // err);. ret + 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, 100, // urn html`.. < + 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 112, // div style="p + 97, 100, 100, 105, 110, 103, 58, 32, 50, 101, 109, 59, // adding: 2em; + 32, 34, 62, 10, 32, 32, 32, 32, 60, 104, 49, 32, // ">.

Dev + 105, 99, 101, 32, 68, 97, 115, 104, 98, 111, 97, 114, // ice Dashboar + 100, 32, 76, 111, 103, 105, 110, 32, 60, 47, 104, 49, // d Login

.
+ 10, 32, 32, 32, 32, 32, 32, 60, 105, 110, 112, 117, // . setUse + 114, 40, 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, // r(ev.target. + 118, 97, 108, 117, 101, 41, 125, 32, 118, 97, 108, 117, // value)} valu + 101, 61, 36, 123, 117, 115, 101, 114, 125, 32, 47, 62, // e=${user} /> + 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, // .
. + 32, 32, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, //
. - 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, 112, 108, // set - 77, 101, 115, 115, 97, 103, 101, 40, 101, 118, 46, 116, // Message(ev.t + 32, 32, 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, // + 115, 101, 116, 80, 97, 115, 115, 40, 101, 118, 46, 116, // setPass(ev.t 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, // arget.value) - 125, 32, 47, 62, 10, 32, 32, 60, 47, 100, 105, 118, // } />.
.
. - 32, 32, 67, 104, 97, 116, 32, 100, 101, 109, 111, 110, // Chat demon - 115, 114, 97, 116, 101, 115, 10, 32, 32, 32, 32, 114, // srates. r - 101, 97, 108, 45, 116, 105, 109, 101, 32, 98, 105, 100, // eal-time bid - 105, 114, 101, 99, 116, 105, 111, 110, 97, 108, 32, 100, // irectional d - 97, 116, 97, 32, 101, 120, 99, 104, 97, 110, 103, 101, // ata exchange - 32, 98, 101, 116, 119, 101, 101, 110, 32, 109, 97, 110, // between man - 121, 32, 99, 108, 105, 101, 110, 116, 115, 32, 97, 110, // y clients an - 100, 32, 97, 32, 115, 101, 114, 118, 101, 114, 46, 10, // d a server.. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, //
.
`;.};..co - 110, 115, 116, 32, 65, 112, 112, 32, 61, 32, 102, 117, // nst App = fu - 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, // nction(props - 41, 32, 123, 10, 32, 32, 99, 111, 110, 115, 116, 32, // ) {. const - 91, 109, 101, 115, 115, 97, 103, 101, 115, 44, 32, 115, // [messages, s - 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, 93, 32, // etMessages] - 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 91, // = useState([ - 93, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // ]);. const - 91, 117, 115, 101, 114, 44, 32, 115, 101, 116, 85, 115, // [user, setUs - 101, 114, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // er] = useSta - 116, 101, 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, // te('');. co - 110, 115, 116, 32, 91, 99, 111, 110, 102, 105, 103, 44, // nst [config, - 32, 115, 101, 116, 67, 111, 110, 102, 105, 103, 93, 32, // setConfig] - 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 123, // = useState({ - 125, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, // });.. const - 32, 114, 101, 102, 114, 101, 115, 104, 32, 61, 32, 40, // refresh = ( - 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, 102, // ) =>. f - 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 99, // etch('/api/c - 111, 110, 102, 105, 103, 47, 103, 101, 116, 39, 41, 46, // onfig/get'). - 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, 46, // then(r => r. - 106, 115, 111, 110, 40, 41, 41, 46, 116, 104, 101, 110, // json()).then - 40, 114, 32, 61, 62, 32, 115, 101, 116, 67, 111, 110, // (r => setCon - 102, 105, 103, 40, 114, 41, 41, 59, 10, 10, 32, 32, // fig(r));.. - 99, 111, 110, 115, 116, 32, 108, 111, 103, 105, 110, 32, // const login - 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 117, // = function(u - 41, 32, 123, 10, 32, 32, 32, 32, 100, 111, 99, 117, // ) {. docu - 109, 101, 110, 116, 46, 99, 111, 111, 107, 105, 101, 32, // ment.cookie - 61, 32, 96, 97, 99, 99, 101, 115, 115, 95, 116, 111, // = `access_to - 107, 101, 110, 61, 36, 123, 117, 46, 116, 111, 107, 101, // ken=${u.toke - 110, 125, 59, 112, 97, 116, 104, 61, 47, 59, 109, 97, // n};path=/;ma - 120, 45, 97, 103, 101, 61, 51, 54, 48, 48, 96, 59, // x-age=3600`; - 10, 32, 32, 32, 32, 115, 101, 116, 85, 115, 101, 114, // . setUser - 40, 117, 46, 117, 115, 101, 114, 41, 59, 10, 32, 32, // (u.user);. - 32, 32, 114, 101, 102, 114, 101, 115, 104, 40, 41, 59, // refresh(); - 10, 32, 32, 125, 59, 10, 10, 32, 32, 99, 111, 110, // . };.. con - 115, 116, 32, 108, 111, 103, 111, 117, 116, 32, 61, 32, // st logout = - 101, 118, 32, 61, 62, 32, 123, 10, 32, 32, 32, 32, // ev => {. + 125, 32, 118, 97, 108, 117, 101, 61, 36, 123, 112, 97, // } value=${pa + 115, 115, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ss}. + 111, 110, 99, 104, 97, 110, 103, 101, 61, 36, 123, 108, // onchange=${l + 111, 103, 105, 110, 125, 32, 47, 62, 10, 32, 32, 32, // ogin} />. + 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, //
. + 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. < + 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, 115, // button class + 61, 34, 98, 116, 110, 34, 32, 115, 116, 121, 108, 101, // ="btn" style + 61, 34, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // ="width: 100 + 37, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // %; backgroun + 100, 58, 32, 35, 56, 97, 97, 59, 34, 10, 32, 32, // d: #8aa;". + 32, 32, 32, 32, 32, 32, 100, 105, 115, 97, 98, 108, // disabl + 101, 100, 61, 36, 123, 33, 117, 115, 101, 114, 32, 124, // ed=${!user | + 124, 32, 33, 112, 97, 115, 115, 125, 32, 111, 110, 99, // | !pass} onc + 108, 105, 99, 107, 61, 36, 123, 108, 111, 103, 105, 110, // lick=${login + 125, 62, 32, 76, 111, 103, 105, 110, 32, 60, 47, 98, // }> Login . < + 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, // /div>. . + 86, 97, 108, 105, 100, 32, 108, 111, 103, 105, 110, 115, // Valid logins + 58, 32, 97, 100, 109, 105, 110, 58, 112, 97, 115, 115, // : admin:pass + 48, 44, 32, 117, 115, 101, 114, 49, 58, 112, 97, 115, // 0, user1:pas + 115, 49, 44, 32, 117, 115, 101, 114, 50, 58, 112, 97, // s1, user2:pa + 115, 115, 50, 10, 32, 32, 32, 32, 60, 47, 100, 105, // ss2. .
. + 60, 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, 10, //
`;.};. + 10, 99, 111, 110, 115, 116, 32, 77, 101, 115, 115, 97, // .const Messa + 103, 101, 32, 61, 32, 116, 101, 120, 116, 32, 61, 62, // ge = text => + 32, 104, 116, 109, 108, 96, 60, 100, 105, 118, 32, 115, // html`
+ 36, 123, 116, 101, 120, 116, 125, 60, 47, 100, 105, 118, // ${text}
`;..const C + 104, 97, 116, 32, 61, 32, 102, 117, 110, 99, 116, 105, // hat = functi + 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, // on(props) {. + 32, 32, 99, 111, 110, 115, 116, 32, 91, 109, 101, 115, // const [mes + 115, 97, 103, 101, 44, 32, 115, 101, 116, 77, 101, 115, // sage, setMes + 115, 97, 103, 101, 93, 32, 61, 32, 117, 115, 101, 83, // sage] = useS + 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, 32, // tate('');. + 99, 111, 110, 115, 116, 32, 115, 101, 110, 100, 109, 101, // const sendme + 115, 115, 97, 103, 101, 32, 61, 32, 101, 118, 32, 61, // ssage = ev = + 62, 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, // > fetch('/ap + 105, 47, 109, 101, 115, 115, 97, 103, 101, 47, 115, 101, // i/message/se + 110, 100, 39, 44, 32, 123, 10, 32, 32, 32, 32, 32, // nd', {. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 109, 101, 116, 104, 111, 100, 58, 32, 39, 112, 111, // method: 'po + 115, 116, 39, 44, 10, 32, 32, 32, 32, 32, 32, 32, // st',. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 98, // b + 111, 100, 121, 58, 32, 96, 109, 101, 115, 115, 97, 103, // ody: `messag + 101, 61, 36, 123, 101, 110, 99, 111, 100, 101, 85, 82, // e=${encodeUR + 73, 67, 111, 109, 112, 111, 110, 101, 110, 116, 40, 109, // IComponent(m + 101, 115, 115, 97, 103, 101, 41, 125, 96, 10, 32, 32, // essage)}`. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 125, 41, 46, 116, 104, 101, 110, 40, 114, 32, // }).then(r + 61, 62, 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, // => setMessag + 101, 40, 39, 39, 41, 41, 59, 10, 10, 32, 32, 99, // e(''));.. c + 111, 110, 115, 116, 32, 109, 101, 115, 115, 97, 103, 101, // onst message + 115, 32, 61, 32, 112, 114, 111, 112, 115, 46, 109, 101, // s = props.me + 115, 115, 97, 103, 101, 115, 46, 109, 97, 112, 40, 10, // ssages.map(. + 32, 32, 32, 32, 32, 32, 116, 101, 120, 116, 32, 61, // text = + 62, 32, 104, 116, 109, 108, 96, 60, 100, 105, 118, 32, // > html`
${text}`);. retu + 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, // rn html`..

User + 32, 99, 104, 97, 116, 60, 47, 104, 51, 62, 10, 32, // chat

. + 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
. ${m + 101, 115, 115, 97, 103, 101, 115, 125, 10, 32, 32, 60, // essages}. < + 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, 118, // /div>.
. + 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, 101, 40, // setMessage( + 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, // ev.target.va + 108, 117, 101, 41, 125, 32, 47, 62, 10, 32, 32, 60, // lue)} />. < + 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, 118, // /div>.
. Chat d + 101, 109, 111, 110, 115, 114, 97, 116, 101, 115, 10, 32, // emonsrates. + 32, 32, 32, 114, 101, 97, 108, 45, 116, 105, 109, 101, // real-time + 32, 98, 105, 100, 105, 114, 101, 99, 116, 105, 111, 110, // bidirection + 97, 108, 32, 100, 97, 116, 97, 32, 101, 120, 99, 104, // al data exch + 97, 110, 103, 101, 32, 98, 101, 116, 119, 101, 101, 110, // ange between + 32, 109, 97, 110, 121, 32, 99, 108, 105, 101, 110, 116, // many client + 115, 32, 97, 110, 100, 32, 97, 32, 115, 101, 114, 118, // s and a serv + 101, 114, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, // er..
+ 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, // .
`;.}; + 10, 10, 99, 111, 110, 115, 116, 32, 65, 112, 112, 32, // ..const App + 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, // = function(p + 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, // rops) {. co + 110, 115, 116, 32, 91, 109, 101, 115, 115, 97, 103, 101, // nst [message + 115, 44, 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, // s, setMessag + 101, 115, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // es] = useSta + 116, 101, 40, 91, 93, 41, 59, 10, 32, 32, 99, 111, // te([]);. co + 110, 115, 116, 32, 91, 117, 115, 101, 114, 44, 32, 115, // nst [user, s + 101, 116, 85, 115, 101, 114, 93, 32, 61, 32, 117, 115, // etUser] = us + 101, 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, // eState('');. + 32, 32, 99, 111, 110, 115, 116, 32, 91, 99, 111, 110, // const [con + 102, 105, 103, 44, 32, 115, 101, 116, 67, 111, 110, 102, // fig, setConf + 105, 103, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // ig] = useSta + 116, 101, 40, 123, 125, 41, 59, 10, 10, 32, 32, 99, // te({});.. c + 111, 110, 115, 116, 32, 114, 101, 102, 114, 101, 115, 104, // onst refresh + 32, 61, 32, 40, 41, 32, 61, 62, 10, 32, 32, 32, // = () =>. + 32, 32, 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, // fetch('/a + 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, 103, 101, // pi/config/ge + 116, 39, 41, 46, 116, 104, 101, 110, 40, 114, 32, 61, // t').then(r = + 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 46, // > r.json()). + 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 115, 101, // then(r => se + 116, 67, 111, 110, 102, 105, 103, 40, 114, 41, 41, 59, // tConfig(r)); + 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, 111, // .. const lo + 103, 105, 110, 32, 61, 32, 102, 117, 110, 99, 116, 105, // gin = functi + 111, 110, 40, 117, 41, 32, 123, 10, 32, 32, 32, 32, // on(u) {. 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, 111, // document.coo 107, 105, 101, 32, 61, 32, 96, 97, 99, 99, 101, 115, // kie = `acces - 115, 95, 116, 111, 107, 101, 110, 61, 59, 112, 97, 116, // s_token=;pat - 104, 61, 47, 59, 109, 97, 120, 45, 97, 103, 101, 61, // h=/;max-age= - 48, 96, 59, 10, 32, 32, 32, 32, 115, 101, 116, 85, // 0`;. setU - 115, 101, 114, 40, 39, 39, 41, 59, 10, 32, 32, 125, // ser('');. } - 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 119, // ;.. const w - 97, 116, 99, 104, 32, 61, 32, 102, 117, 110, 99, 116, // atch = funct - 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, 32, 32, // ion() {. - 118, 97, 114, 32, 102, 32, 61, 32, 102, 117, 110, 99, // var f = func - 116, 105, 111, 110, 40, 114, 101, 97, 100, 101, 114, 41, // tion(reader) - 32, 123, 10, 32, 32, 32, 32, 32, 32, 114, 101, 116, // {. ret - 117, 114, 110, 32, 114, 101, 97, 100, 101, 114, 46, 114, // urn reader.r - 101, 97, 100, 40, 41, 46, 116, 104, 101, 110, 40, 102, // ead().then(f - 117, 110, 99, 116, 105, 111, 110, 40, 114, 101, 115, 117, // unction(resu - 108, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, // lt) {. - 32, 32, 118, 97, 114, 32, 100, 97, 116, 97, 32, 61, // var data = - 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, // String.from - 67, 104, 97, 114, 67, 111, 100, 101, 46, 97, 112, 112, // CharCode.app - 108, 121, 40, 110, 117, 108, 108, 44, 32, 114, 101, 115, // ly(null, res - 117, 108, 116, 46, 118, 97, 108, 117, 101, 41, 59, 10, // ult.value);. - 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // var + 115, 95, 116, 111, 107, 101, 110, 61, 36, 123, 117, 46, // s_token=${u. + 116, 111, 107, 101, 110, 125, 59, 112, 97, 116, 104, 61, // token};path= + 47, 59, 109, 97, 120, 45, 97, 103, 101, 61, 51, 54, // /;max-age=36 + 48, 48, 96, 59, 10, 32, 32, 32, 32, 115, 101, 116, // 00`;. set + 85, 115, 101, 114, 40, 117, 46, 117, 115, 101, 114, 41, // User(u.user) + 59, 10, 32, 32, 32, 32, 114, 101, 102, 114, 101, 115, // ;. refres + 104, 40, 41, 59, 10, 32, 32, 125, 59, 10, 10, 32, // h();. };.. + 32, 99, 111, 110, 115, 116, 32, 108, 111, 103, 111, 117, // const logou + 116, 32, 61, 32, 101, 118, 32, 61, 62, 32, 123, 10, // t = ev => {. + 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, // document + 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, 96, 97, // .cookie = `a + 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, 110, 61, // ccess_token= + 59, 112, 97, 116, 104, 61, 47, 59, 109, 97, 120, 45, // ;path=/;max- + 97, 103, 101, 61, 48, 96, 59, 10, 32, 32, 32, 32, // age=0`;. + 115, 101, 116, 85, 115, 101, 114, 40, 39, 39, 41, 59, // setUser(''); + 10, 32, 32, 125, 59, 10, 10, 32, 32, 99, 111, 110, // . };.. con + 115, 116, 32, 119, 97, 116, 99, 104, 32, 61, 32, 102, // st watch = f + 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, // unction() {. + 32, 32, 32, 32, 118, 97, 114, 32, 102, 32, 61, 32, // var f = + 102, 117, 110, 99, 116, 105, 111, 110, 40, 114, 101, 97, // function(rea + 100, 101, 114, 41, 32, 123, 10, 32, 32, 32, 32, 32, // der) {. + 32, 114, 101, 116, 117, 114, 110, 32, 114, 101, 97, 100, // return read + 101, 114, 46, 114, 101, 97, 100, 40, 41, 46, 116, 104, // er.read().th + 101, 110, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, // en(function( + 114, 101, 115, 117, 108, 116, 41, 32, 123, 10, 32, 32, // result) {. + 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 100, 97, // var da + 116, 97, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, // ta = String. + 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, // fromCharCode + 46, 97, 112, 112, 108, 121, 40, 110, 117, 108, 108, 44, // .apply(null, + 32, 114, 101, 115, 117, 108, 116, 46, 118, 97, 108, 117, // result.valu + 101, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // e);. + 118, 97, 114, 32, 110, 111, 116, 105, 102, 105, 99, 97, // var notifica + 116, 105, 111, 110, 32, 61, 32, 74, 83, 79, 78, 46, // tion = JSON. + 112, 97, 114, 115, 101, 40, 100, 97, 116, 97, 41, 59, // parse(data); + 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, // . if + 40, 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, // (notificatio + 110, 46, 110, 97, 109, 101, 32, 61, 61, 32, 39, 99, // n.name == 'c + 111, 110, 102, 105, 103, 39, 41, 32, 114, 101, 102, 114, // onfig') refr + 101, 115, 104, 40, 41, 59, 10, 32, 32, 32, 32, 32, // esh();. + 32, 32, 32, 105, 102, 32, 40, 110, 111, 116, 105, 102, // if (notif + 105, 99, 97, 116, 105, 111, 110, 46, 110, 97, 109, 101, // ication.name + 32, 61, 61, 32, 39, 109, 101, 115, 115, 97, 103, 101, // == 'message + 39, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // ') {. + 32, 32, 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, // setMessag + 101, 115, 40, 109, 32, 61, 62, 32, 109, 46, 99, 111, // es(m => m.co + 110, 99, 97, 116, 40, 91, 110, 111, 116, 105, 102, 105, // ncat([notifi + 99, 97, 116, 105, 111, 110, 46, 100, 97, 116, 97, 93, // cation.data] + 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, // )). } + 10, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, // . // + 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, // console.log( 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, // notification - 32, 61, 32, 74, 83, 79, 78, 46, 112, 97, 114, 115, // = JSON.pars - 101, 40, 100, 97, 116, 97, 41, 59, 10, 32, 32, 32, // e(data);. - 32, 32, 32, 32, 32, 105, 102, 32, 40, 110, 111, 116, // if (not - 105, 102, 105, 99, 97, 116, 105, 111, 110, 46, 110, 97, // ification.na - 109, 101, 32, 61, 61, 32, 39, 99, 111, 110, 102, 105, // me == 'confi - 103, 39, 41, 32, 114, 101, 102, 114, 101, 115, 104, 40, // g') refresh( 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, // );. i - 102, 32, 40, 110, 111, 116, 105, 102, 105, 99, 97, 116, // f (notificat - 105, 111, 110, 46, 110, 97, 109, 101, 32, 61, 61, 32, // ion.name == - 39, 109, 101, 115, 115, 97, 103, 101, 39, 41, 32, 123, // 'message') { - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, // . s - 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, 40, 109, // etMessages(m - 32, 61, 62, 32, 109, 46, 99, 111, 110, 99, 97, 116, // => m.concat - 40, 91, 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, // ([notificati - 111, 110, 46, 100, 97, 116, 97, 93, 41, 41, 10, 32, // on.data])). - 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, // }. - 32, 32, 32, 32, 32, 47, 47, 32, 99, 111, 110, 115, // // cons - 111, 108, 101, 46, 108, 111, 103, 40, 110, 111, 116, 105, // ole.log(noti - 102, 105, 99, 97, 116, 105, 111, 110, 41, 59, 10, 32, // fication);. - 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, // if (! - 114, 101, 115, 117, 108, 116, 46, 100, 111, 110, 101, 41, // result.done) - 32, 114, 101, 116, 117, 114, 110, 32, 102, 40, 114, 101, // return f(re - 97, 100, 101, 114, 41, 59, 10, 32, 32, 32, 32, 32, // ader);. - 32, 125, 41, 59, 10, 32, 32, 32, 32, 125, 59, 10, // });. };. + 102, 32, 40, 33, 114, 101, 115, 117, 108, 116, 46, 100, // f (!result.d + 111, 110, 101, 41, 32, 114, 101, 116, 117, 114, 110, 32, // one) return + 102, 40, 114, 101, 97, 100, 101, 114, 41, 59, 10, 32, // f(reader);. + 32, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, // });. + 32, 125, 59, 10, 32, 32, 32, 32, 102, 101, 116, 99, // };. fetc + 104, 40, 39, 47, 97, 112, 105, 47, 119, 97, 116, 99, // h('/api/watc + 104, 39, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, // h'). + 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, // .then(r => r + 46, 98, 111, 100, 121, 46, 103, 101, 116, 82, 101, 97, // .body.getRea + 100, 101, 114, 40, 41, 41, 10, 32, 32, 32, 32, 32, // der()). + 32, 32, 32, 46, 116, 104, 101, 110, 40, 102, 41, 10, // .then(f). + 32, 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, 116, // .cat + 99, 104, 40, 101, 32, 61, 62, 32, 115, 101, 116, 84, // ch(e => setT + 105, 109, 101, 111, 117, 116, 40, 119, 97, 116, 99, 104, // imeout(watch + 44, 32, 49, 48, 48, 48, 41, 41, 59, 10, 32, 32, // , 1000));. + 125, 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, 102, // };.. useEff + 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, 10, // ect(() => {. 32, 32, 32, 32, 102, 101, 116, 99, 104, 40, 39, 47, // fetch('/ - 97, 112, 105, 47, 119, 97, 116, 99, 104, 39, 41, 10, // api/watch'). + 97, 112, 105, 47, 108, 111, 103, 105, 110, 39, 41, 10, // api/login'). 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, // .the - 110, 40, 114, 32, 61, 62, 32, 114, 46, 98, 111, 100, // n(r => r.bod - 121, 46, 103, 101, 116, 82, 101, 97, 100, 101, 114, 40, // y.getReader( - 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, // )). . - 116, 104, 101, 110, 40, 102, 41, 10, 32, 32, 32, 32, // then(f). - 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, // .catch(e - 32, 61, 62, 32, 115, 101, 116, 84, 105, 109, 101, 111, // => setTimeo - 117, 116, 40, 119, 97, 116, 99, 104, 44, 32, 49, 48, // ut(watch, 10 - 48, 48, 41, 41, 59, 10, 32, 32, 125, 59, 10, 10, // 00));. };.. - 32, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 40, // useEffect( - 40, 41, 32, 61, 62, 32, 123, 10, 32, 32, 32, 32, // () => {. - 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, // fetch('/api/ - 108, 111, 103, 105, 110, 39, 41, 10, 32, 32, 32, 32, // login'). - 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, // .then(r - 61, 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, // => r.json()) - 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, // . .th - 101, 110, 40, 114, 32, 61, 62, 32, 108, 111, 103, 105, // en(r => logi - 110, 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, 32, // n(r)). - 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, 114, 114, // .catch(err - 32, 61, 62, 32, 115, 101, 116, 85, 115, 101, 114, 40, // => setUser( - 39, 39, 41, 41, 59, 10, 32, 32, 32, 32, 114, 101, // ''));. re - 102, 114, 101, 115, 104, 40, 41, 59, 10, 32, 32, 32, // fresh();. - 32, 119, 97, 116, 99, 104, 40, 41, 59, 10, 32, 32, // watch();. - 125, 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, 105, // }, []);.. i - 102, 32, 40, 33, 117, 115, 101, 114, 41, 32, 114, 101, // f (!user) re - 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, 60, 36, // turn html`<$ - 123, 76, 111, 103, 105, 110, 125, 32, 108, 111, 103, 105, // {Login} logi - 110, 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, // n=${login} / - 62, 96, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // >`;. const - 97, 100, 109, 105, 110, 32, 61, 32, 117, 115, 101, 114, // admin = user - 32, 61, 61, 32, 39, 97, 100, 109, 105, 110, 39, 59, // == 'admin'; - 10, 32, 32, 99, 111, 110, 115, 116, 32, 99, 111, 108, // . const col - 115, 105, 122, 101, 32, 61, 32, 97, 100, 109, 105, 110, // size = admin - 32, 63, 32, 39, 99, 52, 39, 32, 58, 32, 39, 99, // ? 'c4' : 'c - 54, 39, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // 6';. const - 99, 115, 32, 61, 32, 97, 100, 109, 105, 110, 32, 63, // cs = admin ? - 32, 104, 116, 109, 108, 96, 60, 36, 123, 67, 104, 97, // html`<${Cha - 110, 103, 101, 83, 101, 116, 116, 105, 110, 103, 115, 125, // ngeSettings} - 32, 99, 111, 110, 102, 105, 103, 61, 36, 123, 99, 111, // config=${co - 110, 102, 105, 103, 125, 32, 47, 62, 96, 32, 58, 32, // nfig} />` : - 39, 39, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // '';. return - 32, 104, 116, 109, 108, 96, 10, 60, 36, 123, 78, 97, // html`.<${Na - 118, 125, 32, 117, 115, 101, 114, 61, 36, 123, 117, 115, // v} user=${us - 101, 114, 125, 32, 108, 111, 103, 111, 117, 116, 61, 36, // er} logout=$ - 123, 108, 111, 103, 111, 117, 116, 125, 32, 47, 62, 10, // {logout} />. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. - 32, 32, 60, 36, 123, 72, 101, 114, 111, 125, 32, 47, // <${Hero} / - 62, 10, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, // >.
. - 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, //
<${Sho - 119, 83, 101, 116, 116, 105, 110, 103, 115, 125, 32, 99, // wSettings} c - 111, 110, 102, 105, 103, 61, 36, 123, 99, 111, 110, 102, // onfig=${conf - 105, 103, 125, 32, 47, 62, 60, 47, 100, 105, 118, 62, // ig} />
+ 110, 40, 114, 32, 61, 62, 32, 114, 46, 106, 115, 111, // n(r => r.jso + 110, 40, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, // n()). + 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, // .then(r => + 108, 111, 103, 105, 110, 40, 114, 41, 41, 10, 32, 32, // login(r)). + 32, 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, // .catch + 40, 101, 114, 114, 32, 61, 62, 32, 115, 101, 116, 85, // (err => setU + 115, 101, 114, 40, 39, 39, 41, 41, 59, 10, 32, 32, // ser(''));. + 32, 32, 114, 101, 102, 114, 101, 115, 104, 40, 41, 59, // refresh(); + 10, 32, 32, 32, 32, 119, 97, 116, 99, 104, 40, 41, // . watch() + 59, 10, 32, 32, 125, 44, 32, 91, 93, 41, 59, 10, // ;. }, []);. + 10, 32, 32, 105, 102, 32, 40, 33, 117, 115, 101, 114, // . if (!user + 41, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // ) return htm + 108, 96, 60, 36, 123, 76, 111, 103, 105, 110, 125, 32, // l`<${Login} + 108, 111, 103, 105, 110, 61, 36, 123, 108, 111, 103, 105, // login=${logi + 110, 125, 32, 47, 62, 96, 59, 10, 32, 32, 99, 111, // n} />`;. co + 110, 115, 116, 32, 97, 100, 109, 105, 110, 32, 61, 32, // nst admin = + 117, 115, 101, 114, 32, 61, 61, 32, 39, 97, 100, 109, // user == 'adm + 105, 110, 39, 59, 10, 32, 32, 99, 111, 110, 115, 116, // in';. const + 32, 99, 111, 108, 115, 105, 122, 101, 32, 61, 32, 97, // colsize = a + 100, 109, 105, 110, 32, 63, 32, 39, 99, 52, 39, 32, // dmin ? 'c4' + 58, 32, 39, 99, 54, 39, 59, 10, 32, 32, 99, 111, // : 'c6';. co + 110, 115, 116, 32, 99, 115, 32, 61, 32, 97, 100, 109, // nst cs = adm + 105, 110, 32, 63, 32, 104, 116, 109, 108, 96, 60, 36, // in ? html`<$ + 123, 67, 104, 97, 110, 103, 101, 83, 101, 116, 116, 105, // {ChangeSetti + 110, 103, 115, 125, 32, 99, 111, 110, 102, 105, 103, 61, // ngs} config= + 36, 123, 99, 111, 110, 102, 105, 103, 125, 32, 47, 62, // ${config} /> + 96, 32, 58, 32, 39, 39, 59, 10, 32, 32, 114, 101, // ` : '';. re + 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, // turn html`.< + 36, 123, 78, 97, 118, 125, 32, 117, 115, 101, 114, 61, // ${Nav} user= + 36, 123, 117, 115, 101, 114, 125, 32, 108, 111, 103, 111, // ${user} logo + 117, 116, 61, 36, 123, 108, 111, 103, 111, 117, 116, 125, // ut=${logout} + 32, 47, 62, 10, 60, 100, 105, 118, 32, 99, 108, 97, // />.
. <${Her + 111, 125, 32, 47, 62, 10, 32, 32, 60, 100, 105, 118, // o} />.
.
<$ + 123, 83, 104, 111, 119, 83, 101, 116, 116, 105, 110, 103, // {ShowSetting + 115, 125, 32, 99, 111, 110, 102, 105, 103, 61, 36, 123, // s} config=${ + 99, 111, 110, 102, 105, 103, 125, 32, 47, 62, 60, 47, // config} />. ${cs}
10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, // .
${c - 115, 125, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, // s}
. - 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
<${Chat - 125, 32, 109, 101, 115, 115, 97, 103, 101, 115, 61, 36, // } messages=$ - 123, 109, 101, 115, 115, 97, 103, 101, 115, 125, 32, 47, // {messages} / - 62, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, // >
. . <${Fo - 111, 116, 101, 114, 125, 32, 47, 62, 10, 60, 47, 100, // oter} />.`;.};..wi - 110, 100, 111, 119, 46, 111, 110, 108, 111, 97, 100, 32, // ndow.onload - 61, 32, 40, 41, 32, 61, 62, 32, 114, 101, 110, 100, // = () => rend - 101, 114, 40, 104, 40, 65, 112, 112, 41, 44, 32, 100, // er(h(App), d - 111, 99, 117, 109, 101, 110, 116, 46, 98, 111, 100, 121, // ocument.body - 41, 59, 10, 0 // );. + 111, 108, 115, 105, 122, 101, 125, 34, 62, 60, 36, 123, // olsize}"><${ + 67, 104, 97, 116, 125, 32, 109, 101, 115, 115, 97, 103, // Chat} messag + 101, 115, 61, 36, 123, 109, 101, 115, 115, 97, 103, 101, // es=${message + 115, 125, 32, 47, 62, 60, 47, 100, 105, 118, 62, 10, // s} />
. + 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < + 36, 123, 70, 111, 111, 116, 101, 114, 125, 32, 47, 62, // ${Footer} /> + 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, // .
`;.}; + 10, 10, 119, 105, 110, 100, 111, 119, 46, 111, 110, 108, // ..window.onl + 111, 97, 100, 32, 61, 32, 40, 41, 32, 61, 62, 32, // oad = () => + 114, 101, 110, 100, 101, 114, 40, 104, 40, 65, 112, 112, // render(h(App + 41, 44, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, // ), document. + 98, 111, 100, 121, 41, 59, 10, 0 // body);. }; static const unsigned char v3[] = { 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t, @@ -2336,7 +2345,7 @@ static const struct packed_file { time_t mtime; } packed_files[] = { {"/web_root/index.html", v1, sizeof(v1), 1652432837}, - {"/web_root/main.js", v2, sizeof(v2), 1652468289}, + {"/web_root/main.js", v2, sizeof(v2), 1652514584}, {"/web_root/preact.min.js", v3, sizeof(v3), 1652374364}, {"/web_root/style.css", v4, sizeof(v4), 1652467860}, {"/web_root/user.png", v5, sizeof(v5), 1626172939}, diff --git a/examples/device-dashboard/screenshots/dashboard.png b/examples/device-dashboard/screenshots/dashboard.png new file mode 100644 index 00000000..bec552fa Binary files /dev/null and b/examples/device-dashboard/screenshots/dashboard.png differ diff --git a/examples/device-dashboard/screenshots/login.png b/examples/device-dashboard/screenshots/login.png new file mode 100644 index 00000000..03d2db13 Binary files /dev/null and b/examples/device-dashboard/screenshots/login.png differ diff --git a/examples/complete/web.c b/examples/device-dashboard/web.c similarity index 100% rename from examples/complete/web.c rename to examples/device-dashboard/web.c diff --git a/examples/complete/web_root/index.html b/examples/device-dashboard/web_root/index.html similarity index 100% rename from examples/complete/web_root/index.html rename to examples/device-dashboard/web_root/index.html diff --git a/examples/complete/web_root/main.js b/examples/device-dashboard/web_root/main.js similarity index 95% rename from examples/complete/web_root/main.js rename to examples/device-dashboard/web_root/main.js index 0560f041..d3ed93bd 100644 --- a/examples/complete/web_root/main.js +++ b/examples/device-dashboard/web_root/main.js @@ -91,24 +91,24 @@ const ChangeSettings = function(props) { method: 'post', body: `${name}=${encodeURIComponent(val)}` }).catch(err => err); + const updatevalue1 = ev => update('value1', value1); + const updatevalue2 = ev => update('value2', value2); return html`

Change configuration

value1: - setValue1(ev.target.value)} /> -
value2: - setValue2(ev.target.value)} /> -
diff --git a/examples/complete/web_root/preact.min.js b/examples/device-dashboard/web_root/preact.min.js similarity index 100% rename from examples/complete/web_root/preact.min.js rename to examples/device-dashboard/web_root/preact.min.js diff --git a/examples/complete/web_root/style.css b/examples/device-dashboard/web_root/style.css similarity index 100% rename from examples/complete/web_root/style.css rename to examples/device-dashboard/web_root/style.css diff --git a/examples/complete/web_root/user.png b/examples/device-dashboard/web_root/user.png similarity index 100% rename from examples/complete/web_root/user.png rename to examples/device-dashboard/web_root/user.png diff --git a/examples/multiple-logins/Makefile b/examples/multiple-logins/Makefile deleted file mode 100644 index e9036054..00000000 --- a/examples/multiple-logins/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -PROG ?= example - -all: $(PROG) - $(DEBUGGER) ./$(PROG) - -$(PROG): - $(CC) ../../mongoose.c -I../.. $(CFLAGS) $(EXTRA) -o $(PROG) main.c - -clean: - rm -rf $(PROG) *.o *.dSYM *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb diff --git a/examples/multiple-logins/main.c b/examples/multiple-logins/main.c deleted file mode 100644 index b93afb98..00000000 --- a/examples/multiple-logins/main.c +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2020 Cesanta Software Limited -// All rights reserved - -#include "mongoose.h" - -// Authenticated user. -// A user can be authenticated by: -// - a name:pass pair -// - a token -// When a user is shown a login screen, she enters a user:pass. If successful, -// a server returns user info which includes token. From that point on, -// client can use token for authentication. Tokens could be refreshed/changed -// on a server side, forcing clients to re-login. -struct user { - const char *name, *pass, *token; -}; - -// Parse HTTP requests, return authenticated user or NULL -static struct user *getuser(struct mg_http_message *hm) { - // In production, make passwords strong and tokens randomly generated - // In this example, user list is kept in RAM. In production, it can - // be backed by file, database, or some other method. - static struct user users[] = { - {"admin", "admin", "admin_token"}, - {"user1", "pass1", "user1_token"}, - {"user2", "pass2", "user2_token"}, - {NULL, NULL, NULL}, - }; - char user[256], pass[256]; - struct user *u; - mg_http_creds(hm, user, sizeof(user), pass, sizeof(pass)); - if (user[0] != '\0' && pass[0] != '\0') { - // Both user and password is set, search by user/password - for (u = users; u->name != NULL; u++) - if (strcmp(user, u->name) == 0 && strcmp(pass, u->pass) == 0) return u; - } else if (user[0] == '\0') { - // Only password is set, search by token - for (u = users; u->name != NULL; u++) - if (strcmp(pass, u->token) == 0) return u; - } - return NULL; -} - -// HTTP request handler function -static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { - if (ev == MG_EV_HTTP_MSG) { - struct mg_http_message *hm = (struct mg_http_message *) ev_data; - struct user *u = getuser(hm); - // MG_INFO(("[%.*s] auth %s", (int) hm->uri.len, hm->uri.ptr, - // u ? u->name : "NULL")); - if (u == NULL && mg_http_match_uri(hm, "/api/#")) { - // All URIs starting with /api/ must be authenticated - mg_printf(c, "%s", "HTTP/1.1 403 Denied\r\nContent-Length: 0\r\n\r\n"); - } else if (mg_http_match_uri(hm, "/api/user/data")) { - // Data visible to both users and administrators - mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); - mg_http_printf_chunk(c, "{\"data\":\"%s\"}\n", "this is user data"); - mg_http_printf_chunk(c, ""); - } else if (mg_http_match_uri(hm, "/api/admin/data")) { - // Data visible only to administrators - if (strcmp(u->name, "admin") == 0) { - mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); - mg_http_printf_chunk(c, "{\"data\":\"%s\"}\n", "this is admin data"); - mg_http_printf_chunk(c, ""); - } else { - mg_printf(c, "%s", "HTTP/1.1 403 Denied\r\nContent-Length: 0\r\n\r\n"); - } - } else if (mg_http_match_uri(hm, "/api/login")) { - mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); - mg_http_printf_chunk(c, "{\"user\":\"%s\",\"token\":\"%s\"}\n", u->name, - u->token); - mg_http_printf_chunk(c, ""); - } else { - struct mg_http_serve_opts opts = {.root_dir = "web_root"}; - mg_http_serve_dir(c, ev_data, &opts); - } - } -} - -int main(void) { - struct mg_mgr mgr; - - mg_mgr_init(&mgr); - mg_http_listen(&mgr, "http://localhost:8000", cb, NULL); - - for (;;) mg_mgr_poll(&mgr, 1000); - mg_mgr_free(&mgr); - - return 0; -} diff --git a/examples/multiple-logins/web_root/app.js b/examples/multiple-logins/web_root/app.js deleted file mode 100644 index ef195641..00000000 --- a/examples/multiple-logins/web_root/app.js +++ /dev/null @@ -1,178 +0,0 @@ -const {h, render, Component} = preact; -const html = htm.bind(h); - -class Login extends Component { - state = {user: '', pass: ''}; - onclick = (app) => { - const authhdr = 'Basic ' + btoa(this.state.user + ':' + this.state.pass); - const headers = {Authorization: authhdr}; - return axios.get('/api/login', {headers}) - .then(res => app.setUser(res.data.token)) - .catch(err => alert('Login failed')); - }; - onpassinput = (ev) => this.setState({pass: ev.target.value}); - onuserinput = (ev) => this.setState({user: ev.target.value}); - render({app}, {user, pass, signup}) { - return html` -
-
-

Login

- - this.onclick(app)} /> -
- -
-
- Valid logins: admin:admin, user1:pass1, user2:pass2 -
-
-
- ` - } -}; - -class Dropdown extends Component { - state = {show: false}; - render(props, state) { - const onclick = x => this.setState({show: x}); - const show = state.show ? 'show' : ''; - return html` - `; - } -}; - -const NavLink = ({href, title, url}) => html`${title}`; - -class Header extends Component { - state = {expanded: false}; - ontoggle = () => this.setState({expanded: !this.state.expanded}); - render(props, state) { - const u = props.app.state.user || {}; - return html` - - ` - } -}; - - -class AdminDashboard extends Component { - state = {udata: '', adata: ''}; - componentDidMount() { - axios.get('/api/user/data').then(r => this.setState({udata: r.data})); - axios.get('/api/admin/data').then(r => this.setState({adata: r.data})); - } - render(props, state) { - console.log('-->', state); - return html`
- this is admin page -
admin data, returned by server: - ${JSON.stringify(state.adata)}
-
user data, returned by server: - ${JSON.stringify(state.udata)}
-
` - } -} - -class UserDashboard extends Component { - state = {udata: ''}; - componentDidMount() { - axios.get('/api/user/data').then(r => this.setState({udata: r.data})); - axios.get('/api/admin/data').then(r => this.setState({adata: r.data})); - } - render(props, state) { - return html`
-
admin data, returned by server (must be empty and dev tools should show 403): - ${JSON.stringify(state.adata)}
-
user data, returned by server: - ${JSON.stringify(state.udata)}
-
` - } -} - -class Settings extends Component { - state = {}; - render(props, state) { - return html`
settings page
` - } -} - -class App extends Component { - state = {user: null, url: '/'}; - setUser(token) { - const maxAge = token ? 86400 : 0; - document.cookie = `access_token=${token};path=/;max-age=${maxAge}`; - // this.setState({token}); - return axios.get('/api/login') - .then(res => this.setState({user: res.data})) - .catch(err => this.setState({user: {}})); - } - componentDidMount() { - const getCookie = name => { - var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); - return v ? v[2] : ''; - }; - this.setUser(getCookie('access_token')); // Move from state1 to 2 or 3 - } - render(props, state) { - // We have three states: - // 1. Beginning. We don't know if we have a valid auth token or not - // 2. We sent an /api/login request, and failed to login - // 3. We sent an /api/login request, and succeeded to login - - if (!state.user) return ''; // State 1 - if (!state.user.user) return h(Login, {app: this}); // State 2 - return h( // State 3 - 'div', {}, h(Header, {url: state.url, app: this}), - h(preactRouter.Router, { - history: History.createHashHistory(), - onChange: ev => this.setState({url: ev.url}), - }, - h(state.user.user == 'admin' ? AdminDashboard : UserDashboard, - {default: true, app: this}), - h(Settings, {path: 'settings', app: this}))); - } -}; - -window.onload = () => render(h(App), document.body); diff --git a/examples/multiple-logins/web_root/axios.min.js b/examples/multiple-logins/web_root/axios.min.js deleted file mode 100644 index fc6c8b61..00000000 --- a/examples/multiple-logins/web_root/axios.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/* axios v0.21.1 | (c) 2020 by Matt Zabriskie */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new i(e),n=s(i.prototype.request,t);return o.extend(n,i.prototype,t),o.extend(n,t),n}var o=n(2),s=n(3),i=n(4),a=n(22),u=n(10),c=r(u);c.Axios=i,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),c.isAxiosError=n(26),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function s(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function i(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},s.forEach(["delete","get","head"],function(e){u.headers[e]={}}),s.forEach(["post","put","patch"],function(e){u.headers[e]=s.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),s=n(16),i=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,s=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:s,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,i),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?s.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,s){var i=new Error(e);return r(i,t,n,o,s)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,s,i){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(s)&&a.push("domain="+s),i===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,s,i={};return e?(r.forEach(e.split("\n"),function(e){if(s=e.indexOf(":"),t=r.trim(e.substr(0,s)).toLowerCase(),n=r.trim(e.substr(s+1)),t){if(i[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?i[t]=(i[t]?i[t]:[]).concat([n]):i[t]=i[t]?i[t]+", "+n:n}}),i):i}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(e[o],t[o])}t=t||{};var s={},i=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(i,function(e){r.isUndefined(t[e])||(s[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?s[r]=n(e[r],t[r]):r in e&&(s[r]=n(void 0,e[r]))});var f=i.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),s}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t){"use strict";e.exports=function(e){return"object"==typeof e&&e.isAxiosError===!0}}])}); -//# sourceMappingURL=axios.min.map \ No newline at end of file diff --git a/examples/multiple-logins/web_root/bootstrap.min.css b/examples/multiple-logins/web_root/bootstrap.min.css deleted file mode 100644 index 92e3fe87..00000000 --- a/examples/multiple-logins/web_root/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--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:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right: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:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;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,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.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 td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{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>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{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>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{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>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{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>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{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>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{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>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{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>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .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:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.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(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='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(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='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 .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(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='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(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='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 .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(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.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 .2rem rgba(130,138,145,.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 .2rem rgba(130,138,145,.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 .2rem rgba(72,180,97,.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 .2rem rgba(72,180,97,.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 .2rem rgba(58,176,195,.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 .2rem rgba(58,176,195,.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 .2rem rgba(222,170,12,.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 .2rem rgba(222,170,12,.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 .2rem rgba(225,83,97,.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 .2rem rgba(225,83,97,.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 .2rem rgba(216,217,219,.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 .2rem rgba(216,217,219,.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 .2rem rgba(82,88,93,.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 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;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:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.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 .2rem rgba(108,117,125,.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 .2rem rgba(108,117,125,.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 .2rem rgba(40,167,69,.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 .2rem rgba(40,167,69,.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 .2rem rgba(23,162,184,.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 .2rem rgba(23,162,184,.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 .2rem rgba(255,193,7,.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 .2rem rgba(255,193,7,.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 .2rem rgba(220,53,69,.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 .2rem rgba(220,53,69,.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 .2rem rgba(248,249,250,.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 .2rem rgba(248,249,250,.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 .2rem rgba(52,58,64,.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 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .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 .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;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:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;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:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='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:#007bff;background-color:#007bff}.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(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='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(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='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 .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"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 + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";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{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;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{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;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{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;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{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='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,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='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,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.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:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.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}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{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:focus,.list-group-item-success.list-group-item-action:hover{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:focus,.list-group-item-info.list-group-item-action:hover{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:focus,.list-group-item-warning.list-group-item-action:hover{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:focus,.list-group-item-danger.list-group-item-action:hover{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:focus,.list-group-item-light.list-group-item-action:hover{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:focus,.list-group-item-dark.list-group-item-action:hover{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.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;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{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.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:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.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:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;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%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='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:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;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 .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}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{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:#007bff!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:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.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:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;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 embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/examples/multiple-logins/web_root/history.min.js b/examples/multiple-logins/web_root/history.min.js deleted file mode 100644 index 5781be51..00000000 --- a/examples/multiple-logins/web_root/history.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.History=n():t.History=n()}(this,function(){return function(t){function n(o){if(e[o])return e[o].exports;var r=e[o]={exports:{},id:o,loaded:!1};return t[o].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}var e={};return n.m=t,n.c=e,n.p="",n(0)}([function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0,n.createPath=n.parsePath=n.locationsAreEqual=n.createLocation=n.createMemoryHistory=n.createHashHistory=n.createBrowserHistory=void 0;var r=e(2);Object.defineProperty(n,"createLocation",{enumerable:!0,get:function(){return r.createLocation}}),Object.defineProperty(n,"locationsAreEqual",{enumerable:!0,get:function(){return r.locationsAreEqual}});var i=e(1);Object.defineProperty(n,"parsePath",{enumerable:!0,get:function(){return i.parsePath}}),Object.defineProperty(n,"createPath",{enumerable:!0,get:function(){return i.createPath}});var a=e(7),c=o(a),u=e(8),s=o(u),f=e(9),l=o(f);n.createBrowserHistory=c.default,n.createHashHistory=s.default,n.createMemoryHistory=l.default},function(t,n){"use strict";n.__esModule=!0;n.addLeadingSlash=function(t){return"/"===t.charAt(0)?t:"/"+t},n.stripLeadingSlash=function(t){return"/"===t.charAt(0)?t.substr(1):t},n.stripPrefix=function(t,n){return 0===t.indexOf(n)?t.substr(n.length):t},n.stripTrailingSlash=function(t){return"/"===t.charAt(t.length-1)?t.slice(0,-1):t},n.parsePath=function(t){var n=t||"/",e="",o="",r=n.indexOf("#");r!==-1&&(o=n.substr(r),n=n.substr(0,r));var i=n.indexOf("?");return i!==-1&&(e=n.substr(i),n=n.substr(0,i)),n=decodeURI(n),{pathname:n,search:"?"===e?"":e,hash:"#"===o?"":o}},n.createPath=function(t){var n=t.pathname,e=t.search,o=t.hash,r=encodeURI(n||"/");return e&&"?"!==e&&(r+="?"===e.charAt(0)?e:"?"+e),o&&"#"!==o&&(r+="#"===o.charAt(0)?o:"#"+o),r}},function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0,n.locationsAreEqual=n.createLocation=void 0;var r=Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};d.canUseDOM?void 0:(0,c.default)(!1);var n=window.history,e=(0,d.supportsHistory)(),o=!(0,d.supportsPopStateOnHashChange)(),i=t.forceRefresh,a=void 0!==i&&i,f=t.getUserConfirmation,y=void 0===f?d.getConfirmation:f,g=t.keyLength,m=void 0===g?6:g,w=t.basename?(0,s.stripTrailingSlash)((0,s.addLeadingSlash)(t.basename)):"",P=function(t){var n=t||{},e=n.key,o=n.state,i=window.location,a=i.pathname,c=i.search,u=i.hash,f=a+c+u;return w&&(f=(0,s.stripPrefix)(f,w)),r({},(0,s.parsePath)(f),{state:o,key:e})},b=function(){return Math.random().toString(36).substr(2,m)},O=(0,l.default)(),x=function(t){r(G,t),G.length=n.length,O.notifyListeners(G.location,G.action)},L=function(t){(0,d.isExtraneousPopstateEvent)(t)||A(P(t.state))},S=function(){A(P(p()))},E=!1,A=function(t){if(E)E=!1,x();else{var n="POP";O.confirmTransitionTo(t,n,y,function(e){e?x({action:n,location:t}):_(t)})}},_=function(t){var n=G.location,e=M.indexOf(n.key);e===-1&&(e=0);var o=M.indexOf(t.key);o===-1&&(o=0);var r=e-o;r&&(E=!0,C(r))},k=P(p()),M=[k.key],T=function(t){return w+(0,s.createPath)(t)},H=function(t,o){var r="PUSH",i=(0,u.createLocation)(t,o,b(),G.location);O.confirmTransitionTo(i,r,y,function(t){if(t){var o=T(i),c=i.key,u=i.state;if(e)if(n.pushState({key:c,state:u},null,o),a)window.location.href=o;else{var s=M.indexOf(G.location.key),f=M.slice(0,s===-1?0:s+1);f.push(i.key),M=f,x({action:r,location:i})}else window.location.href=o}})},j=function(t,o){var r="REPLACE",i=(0,u.createLocation)(t,o,b(),G.location);O.confirmTransitionTo(i,r,y,function(t){if(t){var o=T(i),c=i.key,u=i.state;if(e)if(n.replaceState({key:c,state:u},null,o),a)window.location.replace(o);else{var s=M.indexOf(G.location.key);s!==-1&&(M[s]=i.key),x({action:r,location:i})}else window.location.replace(o)}})},C=function(t){n.go(t)},U=function(){return C(-1)},R=function(){return C(1)},I=0,q=function(t){I+=t,1===I?((0,d.addEventListener)(window,h,L),o&&(0,d.addEventListener)(window,v,S)):0===I&&((0,d.removeEventListener)(window,h,L),o&&(0,d.removeEventListener)(window,v,S))},B=!1,F=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=O.setPrompt(t);return B||(q(1),B=!0),function(){return B&&(B=!1,q(-1)),n()}},D=function(t){var n=O.appendListener(t);return q(1),function(){q(-1),n()}},G={length:n.length,action:"POP",location:k,createHref:T,push:H,replace:j,go:C,goBack:U,goForward:R,block:F,listen:D};return G};n.default=y},function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=Object.assign||function(t){for(var n=1;n=0?n:0)+"#"+t)},m=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};d.canUseDOM?void 0:(0,c.default)(!1);var n=window.history,e=((0,d.supportsGoWithoutReloadUsingHash)(),t.getUserConfirmation),o=void 0===e?d.getConfirmation:e,i=t.hashType,a=void 0===i?"slash":i,f=t.basename?(0,s.stripTrailingSlash)((0,s.addLeadingSlash)(t.basename)):"",m=v[a],w=m.encodePath,P=m.decodePath,b=function(){var t=P(p());return f&&(t=(0,s.stripPrefix)(t,f)),(0,s.parsePath)(t)},O=(0,l.default)(),x=function(t){r(V,t),V.length=n.length,O.notifyListeners(V.location,V.action)},L=!1,S=null,E=function(){var t=p(),n=w(t);if(t!==n)g(n);else{var e=b(),o=V.location;if(!L&&(0,u.locationsAreEqual)(o,e))return;if(S===(0,s.createPath)(e))return;S=null,A(e)}},A=function(t){if(L)L=!1,x();else{var n="POP";O.confirmTransitionTo(t,n,o,function(e){e?x({action:n,location:t}):_(t)})}},_=function(t){var n=V.location,e=H.lastIndexOf((0,s.createPath)(n));e===-1&&(e=0);var o=H.lastIndexOf((0,s.createPath)(t));o===-1&&(o=0);var r=e-o;r&&(L=!0,R(r))},k=p(),M=w(k);k!==M&&g(M);var T=b(),H=[(0,s.createPath)(T)],j=function(t){return"#"+w(f+(0,s.createPath)(t))},C=function(t,n){var e="PUSH",r=(0,u.createLocation)(t,void 0,void 0,V.location);O.confirmTransitionTo(r,e,o,function(t){if(t){var n=(0,s.createPath)(r),o=w(f+n),i=p()!==o;if(i){S=n,y(o);var a=H.lastIndexOf((0,s.createPath)(V.location)),c=H.slice(0,a===-1?0:a+1);c.push(n),H=c,x({action:e,location:r})}else x()}})},U=function(t,n){var e="REPLACE",r=(0,u.createLocation)(t,void 0,void 0,V.location);O.confirmTransitionTo(r,e,o,function(t){if(t){var n=(0,s.createPath)(r),o=w(f+n),i=p()!==o;i&&(S=n,g(o));var a=H.indexOf((0,s.createPath)(V.location));a!==-1&&(H[a]=n),x({action:e,location:r})}})},R=function(t){n.go(t)},I=function(){return R(-1)},q=function(){return R(1)},B=0,F=function(t){B+=t,1===B?(0,d.addEventListener)(window,h,E):0===B&&(0,d.removeEventListener)(window,h,E)},D=!1,G=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=O.setPrompt(t);return D||(F(1),D=!0),function(){return D&&(D=!1,F(-1)),n()}},W=function(t){var n=O.appendListener(t);return F(1),function(){F(-1),n()}},V={length:n.length,action:"POP",location:T,createHref:j,push:C,replace:U,go:R,goBack:I,goForward:q,block:G,listen:W};return V};n.default=m},function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{},n=t.getUserConfirmation,e=t.initialEntries,o=void 0===e?["/"]:e,i=t.initialIndex,u=void 0===i?0:i,l=t.keyLength,d=void 0===l?6:l,h=(0,s.default)(),v=function(t){r(A,t),A.length=A.entries.length,h.notifyListeners(A.location,A.action)},p=function(){return Math.random().toString(36).substr(2,d)},y=f(u,0,o.length-1),g=o.map(function(t){return"string"==typeof t?(0,c.createLocation)(t,void 0,p()):(0,c.createLocation)(t,void 0,t.key||p())}),m=a.createPath,w=function(t,e){var o="PUSH",r=(0,c.createLocation)(t,e,p(),A.location);h.confirmTransitionTo(r,o,n,function(t){if(t){var n=A.index,e=n+1,i=A.entries.slice(0);i.length>e?i.splice(e,i.length-e,r):i.push(r),v({action:o,location:r,index:e,entries:i})}})},P=function(t,e){var o="REPLACE",r=(0,c.createLocation)(t,e,p(),A.location);h.confirmTransitionTo(r,o,n,function(t){t&&(A.entries[A.index]=r,v({action:o,location:r}))})},b=function(t){var e=f(A.index+t,0,A.entries.length-1),o="POP",r=A.entries[e];h.confirmTransitionTo(r,o,n,function(t){t?v({action:o,location:r,index:e}):v()})},O=function(){return b(-1)},x=function(){return b(1)},L=function(t){var n=A.index+t;return n>=0&&n0&&void 0!==arguments[0]&&arguments[0];return h.setPrompt(t)},E=function(t){return h.appendListener(t)},A={length:g.length,action:"POP",location:g[y],index:y,entries:g,createHref:m,push:w,replace:P,go:b,goBack:O,goForward:x,canGo:L,block:S,listen:E};return A};n.default=l},function(t,n){"use strict";var e=function(t){return"/"===t.charAt(0)},o=function(t,n){for(var e=n,o=e+1,r=t.length;o=0;d--){var h=i[d];"."===h?o(i,d):".."===h?(o(i,d),l++):l&&(o(i,d),l--)}if(!u)for(;l--;l)i.unshift("..");!u||""===i[0]||i[0]&&e(i[0])||i.unshift("");var v=i.join("/");return s&&"/"!==v.substr(-1)&&(v+="/"),v};t.exports=r},function(t,n){"use strict";n.__esModule=!0;var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function t(n,o){if(n===o)return!0;if(null==n||null==o)return!1;if(Array.isArray(n))return!(!Array.isArray(o)||n.length!==o.length)&&n.every(function(n,e){return t(n,o[e])});var r="undefined"==typeof n?"undefined":e(n),i="undefined"==typeof o?"undefined":e(o);if(r!==i)return!1;if("object"===r){var a=n.valueOf(),c=o.valueOf();if(a!==n||c!==o)return t(a,c);var u=Object.keys(n),s=Object.keys(o);return u.length===s.length&&u.every(function(e){return t(n[e],o[e])})}return!1};n.default=o}])}); \ No newline at end of file diff --git a/examples/multiple-logins/web_root/htm.min.js b/examples/multiple-logins/web_root/htm.min.js deleted file mode 100644 index 4fdd0fee..00000000 --- a/examples/multiple-logins/web_root/htm.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){function n(n){var t=e.get(this);return t||(t=new Map,e.set(this,t)),1<(t=a(this,t.get(n)||(t.set(n,t=function(n){function t(n){1===u&&(n||(r=r.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?p.push(0,n,r):3===u&&(n||r)?(p.push(3,n,r),u=2):2===u&&"..."===r&&n?p.push(4,n,0):2===u&&r&&!n?p.push(5,0,!0,r):5<=u&&((r||!n&&5===u)&&(p.push(u,0,r,s),u=6),n&&(p.push(u,n,0,s),u=6)),r=""}for(var e,s,u=1,r="",h="",p=[0],a=0;a"===e?(u=1,""):e+r[0]:h?e===h?h="":r+=e:'"'===e||"'"===e?h=e:">"===e?(t(),u=1):u&&("="===e?(u=5,s=r,r=""):"/"===e&&(u<5||">"===n[a][o+1])?(t(),3===u&&(p=p[0]),(p=(u=p)[0]).push(2,0,u),u=0):" "===e||"\t"===e||"\n"===e||"\r"===e?(t(),u=2):r+=e),3===u&&"!--"===r&&(u=4,p=p[0])}return t(),p}(n)),t),arguments,[])).length?t:t[0]}var a=function(n,t,e,s){var u;t[0]=0;for(var r=1;r - - - example - - - - - - - - - - - - - - diff --git a/examples/multiple-logins/web_root/preact-router.min.js b/examples/multiple-logins/web_root/preact-router.min.js deleted file mode 100644 index 789fb64c..00000000 --- a/examples/multiple-logins/web_root/preact-router.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("preact")):"function"==typeof define&&define.amd?define(["preact"],e):t.preactRouter=e(t.preact)}(this,function(p){function i(t,e){for(var n in e)t[n]=e[n];return t}function u(t,e,n){var r,o=/(?:\?([^#]*))?(#.*)?$/,i=t.match(o),u={};if(i&&i[1])for(var a=i[1].split("&"),p=0;pe.rank?-1:t.index-e.index}function n(t,e){return t.index=e,t.rank=(n=t).props.default?0:function(t){return y(t).map(r).join("")}(n.props.path),t.props;var n}function y(t){return t.replace(/(^\/+|\/+$)/g,"").split("/")}function r(t){return":"==t.charAt(0)?1+"*+?".indexOf(t.charAt(t.length-1))||4:5}function o(){var t;return""+((t=g&&g.location?g.location:g&&g.getCurrentLocation?g.getCurrentLocation():"undefined"!=typeof location?location:b).pathname||"")+(t.search||"")}function a(t,e){return void 0===e&&(e=!1),"string"!=typeof t&&t.url&&(e=t.replace,t=t.url),function(t){for(var e=m.length;e--;)if(m[e].canRoute(t))return 1;return}(t)&&(n=t,void 0===(r=e?"replace":"push")&&(r="push"),g&&g[r]?g[r](n):"undefined"!=typeof history&&history[r+"State"]&&history[r+"State"](null,null,n)),c(t);var n,r}function c(t){for(var e=!1,n=0;n3)for(u=[u],t=3;t1&&E(i,l,u),l=b(u,i,i,n.__k,null,i.__e,l),"function"==typeof n.type&&(n.__d=l)))}function N(l,u,t,i,o,r,e,f,c){var a,v,h,y,_,m,k,w,b,x,C,A=u.type;if(void 0!==u.constructor)return null;(a=n.__b)&&a(u);try{n:if("function"==typeof A){if(w=u.props,b=(a=A.contextType)&&i[a.__c],x=a?b?b.props.value:a.__:i,t.__c?k=(v=u.__c=t.__c).__=v.__E:("prototype"in A&&A.prototype.render?u.__c=v=new A(w,x):(u.__c=v=new d(w,x),v.constructor=A,v.render=F),b&&b.sub(v),v.props=w,v.state||(v.state={}),v.context=x,v.__n=i,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=A.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=s({},v.__s)),s(v.__s,A.getDerivedStateFromProps(w,v.__s))),y=v.props,_=v.state,h)null==A.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else{if(null==A.getDerivedStateFromProps&&w!==y&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(w,x),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(w,v.__s,x)||u.__v===t.__v){v.props=w,v.state=v.__s,u.__v!==t.__v&&(v.__d=!1),v.__v=u,u.__e=t.__e,u.__k=t.__k,v.__h.length&&e.push(v),E(u,f,l);break n}null!=v.componentWillUpdate&&v.componentWillUpdate(w,v.__s,x),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(y,_,m)})}v.context=x,v.props=w,v.state=v.__s,(a=n.__r)&&a(u),v.__d=!1,v.__v=u,v.__P=l,a=v.render(v.props,v.state,v.context),v.state=v.__s,null!=v.getChildContext&&(i=s(s({},i),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(m=v.getSnapshotBeforeUpdate(y,_)),C=null!=a&&a.type==p&&null==a.key?a.props.children:a,g(l,Array.isArray(C)?C:[C],u,t,i,o,r,e,f,c),v.base=u.__e,v.__h.length&&e.push(v),k&&(v.__E=v.__=null),v.__e=!1}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=T(t.__e,u,t,i,o,r,e,c);(a=n.diffed)&&a(u)}catch(l){u.__v=null,n.__e(l,u,t)}return u.__e}function z(l,u){n.__c&&n.__c(u,l),l.some(function(u){try{l=u.__h,u.__h=[],l.some(function(n){n.call(u)})}catch(l){n.__e(l,u.__v)}})}function T(n,l,u,t,i,o,r,e){var a,s,v,h,y,p=u.props,d=l.props;if(i="svg"===l.type||i,null!=o)for(a=0;a2&&(l.children=c.slice.call(arguments,2)),u={},l)"key"!==t&&"ref"!==t&&(u[t]=l[t]);return y(n.type,u,l.key||n.key,l.ref||n.ref,null)},createContext:function(n){var l={},u={__c:"__cC"+r++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var t,i=this;return this.getChildContext||(t=[],this.getChildContext=function(){return l[u.__c]=i,l},this.shouldComponentUpdate=function(n){i.props.value!==n.value&&t.some(function(l){l.context=n.value,k(l)})},this.sub=function(n){t.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){t.splice(t.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Consumer.contextType=u,u.Provider.__=u,u},toChildArray:function n(l){return null==l||"boolean"==typeof l?[]:Array.isArray(l)?c.concat.apply([],l.map(n)):[l]},__u:j,options:n},typeof module<"u"?module.exports=e:self.preact=e}(); -//# sourceMappingURL=preact.min.js.map diff --git a/examples/multiple-logins/web_root/style.css b/examples/multiple-logins/web_root/style.css deleted file mode 100644 index a167257c..00000000 --- a/examples/multiple-logins/web_root/style.css +++ /dev/null @@ -1,6 +0,0 @@ -html, body { margin: 0; padding: 0; height: 100%; } -select, input, label::before, textarea { outline: none; box-shadow:none !important; border: 1px solid #ccc !important; } -.btn:focus,.btn:active:focus,.btn.active:focus, -.btn.focus,.btn:active.focus,.btn.active.focus { outline: none; box-shadow:none !important; } -.dropdown.autoexpand:hover>.dropdown-menu { display: block; } -.pointer { cursor: pointer; }