diff --git a/examples/zephyr/device-dashboard/Makefile b/examples/zephyr/device-dashboard/Makefile
index 1c329a82..59d4f872 100644
--- a/examples/zephyr/device-dashboard/Makefile
+++ b/examples/zephyr/device-dashboard/Makefile
@@ -24,7 +24,9 @@ example:
true
build:
- cp $(MONGOOSE_ROOT)/mongoose.[c,h] src/
+ cp $(MONGOOSE_ROOT)/mongoose.[ch] src/
+ cp $(MONGOOSE_ROOT)/examples/device-dashboard/net.c src/
+ cp $(MONGOOSE_ROOT)/examples/device-dashboard/packed_fs.c src/
$(DOCKER) $(REPO) /bin/sh -c 'cd $(DOCKER_ZEPHYR_PATH)/zephyr && \
west build -b $(BOARD) -p auto $(DOCKER_PROJECT_PATH) $(OVERLAY) --build-dir $(DOCKER_PROJECT_PATH)/build'
diff --git a/examples/zephyr/device-dashboard/src/mongoose.c b/examples/zephyr/device-dashboard/src/mongoose.c
index ee00a90c..3d2306b9 100644
--- a/examples/zephyr/device-dashboard/src/mongoose.c
+++ b/examples/zephyr/device-dashboard/src/mongoose.c
@@ -1349,6 +1349,7 @@ struct mg_fs mg_fs_posix = {p_stat, p_list, p_open, p_close, p_read,
+
// Chunk deletion marker is the MSB in the "processed" counter
#define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1))
@@ -1694,7 +1695,9 @@ static void static_cb(struct mg_connection *c, int ev, void *ev_data,
if (ev == MG_EV_WRITE || ev == MG_EV_POLL) {
struct mg_fd *fd = (struct mg_fd *) fn_data;
// Read to send IO buffer directly, avoid extra on-stack buffer
- size_t n, max = MG_IO_SIZE, space, *cl = (size_t *) c->label;
+ size_t n, max = MG_IO_SIZE, space;
+ size_t *cl = (size_t *) &c->label[(sizeof(c->label) - sizeof(size_t)) /
+ sizeof(size_t) * sizeof(size_t)];
if (c->send.size < max) mg_iobuf_resize(&c->send, max);
if (c->send.len >= c->send.size) return; // Rate limit
if ((space = c->send.size - c->send.len) > *cl) space = *cl;
@@ -1865,9 +1868,12 @@ void mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm,
c->is_resp = 0;
mg_fs_close(fd);
} else {
+ // Track to-be-sent content length at the end of c->label, aligned
+ size_t *clp = (size_t *) &c->label[(sizeof(c->label) - sizeof(size_t)) /
+ sizeof(size_t) * sizeof(size_t)];
c->pfn = static_cb;
c->pfn_data = fd;
- *(size_t *) c->label = (size_t) cl; // Track to-be-sent content length
+ *clp = (size_t) cl;
}
}
}
@@ -2237,7 +2243,7 @@ static void deliver_chunked_chunks(struct mg_connection *c, size_t hlen,
ofs += pl + dl + 2, del += pl + 2; // 2 is for \r\n suffix
processed += dl;
if (c->recv.len != saved) processed -= dl, buf -= dl;
- mg_hexdump(c->recv.buf, hlen + processed);
+ // mg_hexdump(c->recv.buf, hlen + processed);
last = (dl == 0);
}
mg_iobuf_del(&c->recv, hlen + processed, del);
@@ -2310,6 +2316,34 @@ static void http_cb(struct mg_connection *c, int ev, void *evd, void *fnd) {
(void) evd, (void) fnd;
}
+static void mg_hfn(struct mg_connection *c, int ev, void *ev_data, void *fnd) {
+ if (ev == MG_EV_HTTP_MSG) {
+ struct mg_http_message *hm = (struct mg_http_message *) ev_data;
+ if (mg_http_match_uri(hm, "/quit")) {
+ mg_http_reply(c, 200, "", "ok\n");
+ c->is_draining = 1;
+ c->label[0] = 'X';
+ } else if (mg_http_match_uri(hm, "/debug")) {
+ int level = (int) mg_json_get_long(hm->body, "$.level", MG_LL_DEBUG);
+ mg_log_set(level);
+ mg_http_reply(c, 200, "", "Debug level set to %d\n", level);
+ } else {
+ mg_http_reply(c, 200, "", "hi\n");
+ }
+ } else if (ev == MG_EV_CLOSE) {
+ if (c->label[0] == 'X') *(bool *) fnd = true;
+ }
+}
+
+void mg_hello(const char *url) {
+ struct mg_mgr mgr;
+ bool done = false;
+ mg_mgr_init(&mgr);
+ if (mg_http_listen(&mgr, url, mg_hfn, &done) == NULL) done = true;
+ while (done == false) mg_mgr_poll(&mgr, 100);
+ mg_mgr_free(&mgr);
+}
+
struct mg_connection *mg_http_connect(struct mg_mgr *mgr, const char *url,
mg_event_handler_t fn, void *fn_data) {
struct mg_connection *c = mg_connect(mgr, url, fn, fn_data);
@@ -3432,6 +3466,7 @@ struct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url,
} else {
LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);
c->is_udp = (strncmp(url, "udp:", 4) == 0);
+ c->fd = (void *) (size_t) -1; // Set to INVALID_SOCKET
c->fn = fn;
c->is_client = true;
c->fn_data = fn_data;
@@ -4127,14 +4162,12 @@ static void mg_set_non_blocking_mode(SOCKET fd) {
fcntl(fd, F_SETFL, O_NONBLOCK);
#elif MG_ARCH == MG_ARCH_TIRTOS
int val = 0;
- setsockopt(fd, 0, SO_BLOCKING, &val, sizeof(val));
- int status = 0;
- int res = SockStatus(fd, FDSTATUS_SEND, &status);
- if (res == 0 && status > 0) {
- val = status / 2;
- int val_size = sizeof(val);
- res = SockSet(fd, SOL_SOCKET, SO_SNDLOWAT, &val, val_size);
- }
+ setsockopt(fd, SOL_SOCKET, SO_BLOCKING, &val, sizeof(val));
+ // SPRU524J section 3.3.3 page 63, SO_SNDLOWAT
+ int sz = sizeof(val);
+ getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &sz);
+ val /= 2; // set send low-water mark at half send buffer size
+ setsockopt(fd, SOL_SOCKET, SO_SNDLOWAT, &val, sizeof(val));
#else
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); // Non-blocking mode
fcntl(fd, F_SETFD, FD_CLOEXEC); // Set close-on-exec
@@ -4298,6 +4331,11 @@ void mg_connect_resolved(struct mg_connection *c) {
mg_error(c, "socket(): %d", MG_SOCK_ERRNO);
} else if (c->is_udp) {
MG_EPOLL_ADD(c);
+#if MG_ARCH == MG_ARCH_TIRTOS
+ union usa usa; // TI-RTOS NDK requires binding to receive on UDP sockets
+ socklen_t slen = tousa(&c->loc, &usa);
+ if (bind(c->fd, &usa.sa, slen) != 0) MG_ERROR(("bind: %d", MG_SOCK_ERRNO));
+#endif
mg_call(c, MG_EV_RESOLVE, NULL);
mg_call(c, MG_EV_CONNECT, NULL);
} else {
@@ -4317,6 +4355,7 @@ void mg_connect_resolved(struct mg_connection *c) {
mg_error(c, "connect: %d", MG_SOCK_ERRNO);
}
}
+ (void) rc;
}
static SOCKET raccept(SOCKET sock, union usa *usa, socklen_t len) {
@@ -5325,11 +5364,13 @@ void mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {
}
}
if (opts->ciphers != NULL) SSL_set_cipher_list(tls->ssl, opts->ciphers);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
if (opts->srvname.len > 0) {
char *s = mg_mprintf("%.*s", (int) opts->srvname.len, opts->srvname.ptr);
SSL_set1_host(tls->ssl, s);
free(s);
}
+#endif
c->tls = tls;
c->is_tls = 1;
c->is_tls_hs = 1;
@@ -5585,6 +5626,8 @@ uint64_t mg_millis(void) {
return xTaskGetTickCount() * portTICK_PERIOD_MS;
#elif MG_ARCH == MG_ARCH_AZURERTOS
return tx_time_get() * (1000 /* MS per SEC */ / TX_TIMER_TICKS_PER_SECOND);
+#elif MG_ARCH == MG_ARCH_TIRTOS
+ return (uint64_t) Clock_getTicks();
#elif MG_ARCH == MG_ARCH_ZEPHYR
return (uint64_t) k_uptime_get();
#elif MG_ARCH == MG_ARCH_UNIX && defined(__APPLE__)
@@ -5812,9 +5855,10 @@ static void mg_ws_cb(struct mg_connection *c, int ev, void *ev_data,
if (final) mg_call(c, MG_EV_WS_MSG, &m);
break;
case WEBSOCKET_OP_CLOSE:
- MG_DEBUG(("%lu Got WS CLOSE", c->id));
+ MG_DEBUG(("%lu WS CLOSE", c->id));
mg_call(c, MG_EV_WS_CTL, &m);
- mg_ws_send(c, "", 0, WEBSOCKET_OP_CLOSE);
+ // Echo the payload of the received CLOSE message back to the sender
+ mg_ws_send(c, m.data.ptr, m.data.len, WEBSOCKET_OP_CLOSE);
c->is_draining = 1;
break;
default:
@@ -6089,7 +6133,7 @@ static bool mip_driver_stm32_init(uint8_t *mac, void *userdata) {
// Set MDC clock divider. If user told us the value, use it. Otherwise, guess
int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr;
- ETH->MACMIIAR = ((uint32_t)cr & 3) << 2;
+ ETH->MACMIIAR = ((uint32_t)cr & 7) << 2;
// NOTE(cpq): we do not use extended descriptor bit 7, and do not use
// hardware checksum. Therefore, descriptor size is 4, not 8
@@ -6564,6 +6608,13 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) {
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]));
}
+static size_t ether_output(struct mip_if *ifp, size_t len) {
+ // size_t min = 64; // Pad short frames to 64 bytes (minimum Ethernet size)
+ // if (len < min) memset(ifp->tx.buf + len, 0, min - len), len = min;
+ // mg_hexdump(ifp->tx.buf, len);
+ return ifp->driver->tx(ifp->tx.buf, len, ifp->driver_data);
+}
+
static void arp_ask(struct mip_if *ifp, uint32_t ip) {
struct eth *eth = (struct eth *) ifp->tx.buf;
struct arp *arp = (struct arp *) (eth + 1);
@@ -6575,7 +6626,7 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) {
arp->plen = 4;
arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip;
memcpy(arp->sha, ifp->mac, sizeof(arp->sha));
- ifp->driver->tx(eth, PDIFF(eth, arp + 1), ifp->driver_data);
+ ether_output(ifp, PDIFF(eth, arp + 1));
}
static size_t mg_print_ipv4(mg_pfn_t fn, void *fn_data, va_list *ap) {
@@ -6601,11 +6652,12 @@ static struct ip *tx_ip(struct mip_if *ifp, uint8_t proto, uint32_t ip_src,
uint32_t ip_dst, size_t plen) {
struct eth *eth = (struct eth *) ifp->tx.buf;
struct ip *ip = (struct ip *) (eth + 1);
- uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ?
- if (!mac) mac = arp_cache_find(ifp, ifp->gw); // No, use gateway
- if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it
- if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast
- memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup
+ uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ?
+ if (!mac && (ip_dst & ifp->mask)) arp_ask(ifp, ip_dst); // Same net, lookup
+ if (!mac) mac = arp_cache_find(ifp, ifp->gw); // Use gateway MAC
+ if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it
+ if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast
+ memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup
eth->type = mg_htons(0x800);
memset(ip, 0, sizeof(*ip));
ip->ver = 0x45; // Version 4, header length 5 words
@@ -6637,24 +6689,11 @@ static void tx_udp(struct mip_if *ifp, uint32_t ip_src, uint16_t sport,
udp->csum = csumfin(cs);
memmove(udp + 1, buf, len);
// MG_DEBUG(("UDP LEN %d %d", (int) len, (int) ifp->frame_len));
- ifp->driver->tx(ifp->tx.buf,
- sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len,
- ifp->driver_data);
+ ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len);
}
static void tx_dhcp(struct mip_if *ifp, uint32_t src, uint32_t dst,
uint8_t *opts, size_t optslen) {
-#if 0
-struct dhcp {
- uint8_t op, htype, hlen, hops;
- uint32_t xid;
- uint16_t secs, flags;
- uint32_t ciaddr, yiaddr, siaddr, giaddr;
- uint8_t hwaddr[208];
- uint32_t magic;
- uint8_t options[32];
-};
-#endif
struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};
dhcp.magic = mg_htonl(0x63825363);
memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac));
@@ -6703,7 +6742,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
arp->tpa = pkt->arp->spa;
arp->spa = ifp->ip;
MG_DEBUG(("ARP response: we're %#lx", (long) mg_ntohl(ifp->ip)));
- ifp->driver->tx(ifp->tx.buf, PDIFF(eth, arp + 1), ifp->driver_data);
+ ether_output(ifp, PDIFF(eth, arp + 1));
} else if (pkt->arp->op == mg_htons(2)) {
if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;
// MG_INFO(("ARP RESPONSE"));
@@ -6714,15 +6753,16 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
static void rx_icmp(struct mip_if *ifp, struct pkt *pkt) {
// MG_DEBUG(("ICMP %d", (int) len));
if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) {
- struct ip *ip = tx_ip(ifp, 1, ifp->ip, pkt->ip->src,
- sizeof(struct icmp) + pkt->pay.len);
+ size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp);
+ size_t space = ifp->tx.len - hlen, plen = pkt->pay.len;
+ if (plen > space) plen = space;
+ struct ip *ip =
+ tx_ip(ifp, 1, ifp->ip, pkt->ip->src, sizeof(struct icmp) + plen);
struct icmp *icmp = (struct icmp *) (ip + 1);
- size_t len = PDIFF(ifp->tx.buf, icmp + 1), left = ifp->tx.len - len;
- if (left > pkt->pay.len) left = pkt->pay.len; // Don't overflow TX
- memset(icmp, 0, sizeof(*icmp)); // Set csum to 0
- memcpy(icmp + 1, pkt->pay.buf, left); // Copy RX payload to TX
- icmp->csum = ipcsum(icmp, sizeof(*icmp) + left);
- ifp->driver->tx(ifp->tx.buf, len + left, ifp->driver_data);
+ memset(icmp, 0, sizeof(*icmp)); // Set csum to 0
+ memcpy(icmp + 1, pkt->pay.buf, plen); // Copy RX payload to TX
+ icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen);
+ ether_output(ifp, hlen + plen);
}
}
@@ -6806,8 +6846,7 @@ static size_t tx_tcp(struct mip_if *ifp, uint32_t dst_ip, uint8_t flags,
cs = csumup(cs, &ip->dst, sizeof(ip->dst));
cs = csumup(cs, pseudo, sizeof(pseudo));
tcp->csum = csumfin(cs);
- return ifp->driver->tx(ifp->tx.buf, PDIFF(ifp->tx.buf, tcp + 1) + len,
- ifp->driver_data);
+ return ether_output(ifp, PDIFF(ifp->tx.buf, tcp + 1) + len);
}
static size_t tx_tcp_pkt(struct mip_if *ifp, struct pkt *pkt, uint8_t flags,
@@ -6876,16 +6915,17 @@ long mg_io_recv(struct mg_connection *c, void *buf, size_t len) {
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
struct connstate *s = (struct connstate *) (c + 1);
struct mg_iobuf *io = c->is_tls ? &s->raw : &c->recv;
+ uint32_t seq = mg_ntohl(pkt->tcp->seq);
s->raw.align = c->recv.align;
if (pkt->tcp->flags & TH_FIN) {
s->ack = mg_htonl(pkt->tcp->seq) + 1, s->seq = mg_htonl(pkt->tcp->ack);
c->is_closing = 1;
} else if (pkt->pay.len == 0) {
// TODO(cpq): handle this peer's ACK
- } else if (mg_ntohl(pkt->tcp->seq) != s->ack) {
+ } else if (seq != s->ack) {
// TODO(cpq): peer sent us SEQ which we don't expect. Retransmit rather
// than close this connection
- mg_error(c, "SEQ != ACK: %x %x", mg_ntohl(pkt->tcp->seq), s->ack);
+ mg_error(c, "SEQ != ACK: %x %x", seq, s->ack);
} else if (io->size - io->len < pkt->pay.len &&
!mg_iobuf_resize(io, io->len + pkt->pay.len)) {
mg_error(c, "oom");
@@ -6897,9 +6937,18 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) {
// call back mg_io_recv() which grabs raw data from s->raw
memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len);
io->len += pkt->pay.len;
- // Advance ACK counter and setup a timer to send an ACK back
+
+ MG_DEBUG(("%lu SEQ %x -> %x", c->id, mg_htonl(pkt->tcp->seq), s->ack));
s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);
+#if 1
+ // Send ACK immediately
+ MG_DEBUG((" imm ACK", c->id, mg_htonl(pkt->tcp->seq), s->ack));
+ tx_tcp((struct mip_if *) c->mgr->priv, c->rem.ip, TH_ACK, c->loc.port,
+ c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0);
+#else
+ // Advance ACK counter and setup a timer to send an ACK back
settmout(c, MIP_TTYPE_ACK);
+#endif
if (c->is_tls) {
// TLS connection. Make room for decrypted data in c->recv
@@ -6967,7 +7016,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
}
static void rx_ip(struct mip_if *ifp, struct pkt *pkt) {
- // MG_DEBUG(("IP %d", (int) pkt->pay.len));
+ // MG_DEBUG(("IP %d", (int) pkt->pay.len));
if (pkt->ip->proto == 1) {
pkt->icmp = (struct icmp *) (pkt->ip + 1);
if (pkt->pay.len < sizeof(*pkt->icmp)) return;
@@ -7039,6 +7088,10 @@ static void mip_rx(struct mip_if *ifp, void *buf, size_t len) {
pkt.ip = (struct ip *) (pkt.eth + 1);
if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated
if ((pkt.ip->ver >> 4) != 4) return; // Not IP
+ // MG_DEBUG(("%u %u", mg_ntohs(pkt.ip->len) + 14, pkt.raw.len));
+ if ((size_t) mg_ntohs(pkt.ip->len) + 14 < pkt.raw.len) {
+ pkt.raw.len -= pkt.raw.len - (mg_ntohs(pkt.ip->len) + 14);
+ }
mkpay(&pkt, pkt.ip + 1);
rx_ip(ifp, &pkt);
} else {
@@ -7091,7 +7144,7 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) {
struct connstate *s = (struct connstate *) (c + 1);
if (uptime_ms > s->timer) {
if (s->ttype == MIP_TTYPE_ACK) {
- MG_DEBUG(("%lu ack", c->id));
+ MG_DEBUG(("%lu ack %x %x", c->id, s->seq, s->ack));
tx_tcp(ifp, c->rem.ip, TH_ACK, c->loc.port, c->rem.port,
mg_htonl(s->seq), mg_htonl(s->ack), "", 0);
} else {
diff --git a/examples/zephyr/device-dashboard/src/mongoose.h b/examples/zephyr/device-dashboard/src/mongoose.h
index 03f916ad..575e6a30 100644
--- a/examples/zephyr/device-dashboard/src/mongoose.h
+++ b/examples/zephyr/device-dashboard/src/mongoose.h
@@ -49,19 +49,19 @@ extern "C" {
#define MG_ARCH MG_ARCH_WIN32
#elif defined(ICACHE_FLASH) || defined(ICACHE_RAM_ATTR)
#define MG_ARCH MG_ARCH_ESP8266
+#elif defined(__ZEPHYR__)
+#define MG_ARCH MG_ARCH_ZEPHYR
#elif defined(ESP_PLATFORM)
#define MG_ARCH MG_ARCH_ESP32
#elif defined(FREERTOS_IP_H)
#define MG_ARCH MG_ARCH_FREERTOS_TCP
#elif defined(AZURE_RTOS_THREADX)
#define MG_ARCH MG_ARCH_AZURERTOS
-#elif defined(__ZEPHYR__)
-#define MG_ARCH MG_ARCH_ZEPHYR
#elif defined(PICO_TARGET_NAME)
#define MG_ARCH MG_ARCH_RP2040
#endif
-#if !defined(MG_ARCH)
+#if !defined(MG_ARCH) || (MG_ARCH == MG_ARCH_CUSTOM)
#include "mongoose_custom.h" // keep this include
#endif
@@ -293,6 +293,12 @@ struct timeval {
#define EINTR pdFREERTOS_ERRNO_EINTR
#endif
+// FreeRTOS-TCP uses non-standard semantics for listen() backlog size. It is
+// not a backlog size for pending SYN connections, but a max socket number
+#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE
+#define MG_SOCK_LISTEN_BACKLOG_SIZE 128
+#endif
+
#endif // MG_ARCH == MG_ARCH_FREERTOS_TCP
@@ -414,13 +420,11 @@ struct timeval {
#include
#include
#include
-#include
-#include
+#include
#include
-extern int SockStatus(SOCKET hSock, int request, int *results );
-extern int SockSet(SOCKET hSock, int Type, int Prop, void *pbuf, int size);
+#include
#endif
@@ -1174,6 +1178,7 @@ void mg_http_bauth(struct mg_connection *, const char *user, const char *pass);
struct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v);
size_t mg_http_next_multipart(struct mg_str, size_t, struct mg_http_part *);
int mg_http_status(const struct mg_http_message *hm);
+void mg_hello(const char *url);
void mg_http_serve_ssi(struct mg_connection *c, const char *root,
diff --git a/examples/zephyr/device-dashboard/src/net.c b/examples/zephyr/device-dashboard/src/net.c
index db5eab60..07e77ddb 100644
--- a/examples/zephyr/device-dashboard/src/net.c
+++ b/examples/zephyr/device-dashboard/src/net.c
@@ -170,6 +170,10 @@ void device_dashboard_fn(struct mg_connection *c, int ev, void *ev_data,
// u ? u->name : "NULL"));
if (mg_http_match_uri(hm, "/api/hi")) {
mg_http_reply(c, 200, "", "hi\n"); // Testing endpoint
+ } else if (mg_http_match_uri(hm, "/api/debug")) {
+ int level = mg_json_get_long(hm->body, "$.level", MG_LL_DEBUG);
+ mg_log_set(level);
+ mg_http_reply(c, 200, "", "Debug level set to %d\n", level);
} else if (u == NULL && mg_http_match_uri(hm, "/api/#")) {
// All URIs starting with /api/ must be authenticated
mg_http_reply(c, 403, "", "Denied\n");
diff --git a/examples/zephyr/device-dashboard/src/packed_fs.c b/examples/zephyr/device-dashboard/src/packed_fs.c
index 796f97c6..ac0b61e8 100644
--- a/examples/zephyr/device-dashboard/src/packed_fs.c
+++ b/examples/zephyr/device-dashboard/src/packed_fs.c
@@ -3,2279 +3,40 @@
#include
static const unsigned char v1[] = {
- 39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict'
- 59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co
- 109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h,
- 104, 116, 109, 108, 44, 32, 114, 101, 110, 100, 101, 114, // html, render
- 44, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // , useEffect,
- 32, 117, 115, 101, 83, 116, 97, 116, 101, 44, 32, 117, // useState, u
- 115, 101, 82, 101, 102, 125, 32, 102, 114, 111, 109, 32, // seRef} from
- 39, 46, 47, 112, 114, 101, 97, 99, 116, 46, 109, 105, // './preact.mi
- 110, 46, 106, 115, 39, 59, 10, 10, 99, 111, 110, 115, // n.js';..cons
- 116, 32, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, // t MaxMetrics
- 68, 97, 116, 97, 80, 111, 105, 110, 116, 115, 32, 61, // DataPoints =
- 32, 53, 48, 59, 10, 10, 47, 47, 32, 84, 104, 105, // 50;..// Thi
- 115, 32, 115, 105, 109, 112, 108, 101, 32, 112, 117, 98, // s simple pub
- 108, 105, 115, 104, 47, 115, 117, 98, 115, 99, 114, 105, // lish/subscri
- 98, 101, 32, 105, 115, 32, 117, 115, 101, 100, 32, 116, // be is used t
- 111, 32, 112, 97, 115, 115, 32, 110, 111, 116, 105, 102, // o pass notif
- 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 104, 97, // ications tha
- 116, 32, 119, 101, 114, 101, 10, 47, 47, 32, 114, 101, // t were.// re
- 99, 101, 105, 118, 101, 100, 32, 102, 114, 111, 109, 32, // ceived from
- 116, 104, 101, 32, 115, 101, 114, 118, 101, 114, 44, 32, // the server,
- 116, 111, 32, 97, 108, 108, 32, 99, 104, 105, 108, 100, // to all child
- 32, 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 32, // components
- 111, 102, 32, 116, 104, 101, 32, 97, 112, 112, 46, 10, // of the app..
- 118, 97, 114, 32, 80, 117, 98, 83, 117, 98, 32, 61, // var PubSub =
- 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // (function()
- 32, 123, 10, 32, 32, 118, 97, 114, 32, 104, 97, 110, // {. var han
- 100, 108, 101, 114, 115, 32, 61, 32, 123, 125, 44, 32, // dlers = {},
- 105, 100, 32, 61, 32, 48, 59, 10, 32, 32, 114, 101, // id = 0;. re
- 116, 117, 114, 110, 32, 123, 10, 32, 32, 32, 32, 115, // turn {. s
- 117, 98, 115, 99, 114, 105, 98, 101, 58, 32, 102, 117, // ubscribe: fu
- 110, 99, 116, 105, 111, 110, 40, 102, 110, 41, 32, 123, // nction(fn) {
- 10, 32, 32, 32, 32, 32, 32, 104, 97, 110, 100, 108, // . handl
- 101, 114, 115, 91, 105, 100, 43, 43, 93, 32, 61, 32, // ers[id++] =
- 102, 110, 59, 10, 32, 32, 32, 32, 125, 44, 10, 32, // fn;. },.
- 32, 32, 32, 117, 110, 115, 117, 98, 115, 99, 114, 105, // unsubscri
- 98, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, // be: function
- 40, 105, 100, 41, 32, 123, 10, 32, 32, 32, 32, 32, // (id) {.
- 32, 100, 101, 108, 101, 116, 101, 32, 104, 97, 110, 100, // delete hand
- 108, 101, 114, 115, 91, 105, 100, 93, 59, 10, 32, 32, // lers[id];.
- 32, 32, 125, 44, 10, 32, 32, 32, 32, 112, 117, 98, // },. pub
- 108, 105, 115, 104, 58, 32, 102, 117, 110, 99, 116, 105, // lish: functi
- 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, 32, // on(data) {.
- 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, // for (va
- 114, 32, 107, 32, 105, 110, 32, 104, 97, 110, 100, 108, // r k in handl
- 101, 114, 115, 41, 32, 104, 97, 110, 100, 108, 101, 114, // ers) handler
- 115, 91, 107, 93, 40, 100, 97, 116, 97, 41, 59, 10, // s[k](data);.
- 32, 32, 32, 32, 125, 10, 32, 32, 125, 59, 10, 125, // }. };.}
- 41, 40, 41, 59, 10, 10, 99, 111, 110, 115, 116, 32, // )();..const
- 78, 97, 118, 32, 61, 32, 112, 114, 111, 112, 115, 32, // Nav = props
- 61, 62, 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, // => html`..
- 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, // . <
- 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 102, // div style="f
- 108, 101, 120, 58, 32, 49, 32, 49, 32, 97, 117, 116, // lex: 1 1 aut
- 111, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, // o; display:
- 102, 108, 101, 120, 59, 32, 97, 108, 105, 103, 110, 45, // flex; align-
- 105, 116, 101, 109, 115, 58, 32, 99, 101, 110, 116, 101, // items: cente
- 114, 59, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, // r;">. <
- 98, 62, 89, 111, 117, 114, 32, 80, 114, 111, 100, 117, // b>Your Produ
- 99, 116, 60, 47, 98, 62, 10, 32, 32, 32, 32, 60, // ct. <
- 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, // /div>.
. <
- 115, 112, 97, 110, 62, 76, 111, 103, 103, 101, 100, 32, // span>Logged
- 105, 110, 32, 97, 115, 58, 60, 47, 115, 112, 97, 110, // in as:. .
- 32, 32, 32, 32, 60, 115, 112, 97, 110, 62, 36, 123, // ${
- 112, 114, 111, 112, 115, 46, 117, 115, 101, 114, 125, 60, // props.user}<
- 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, 32, // /span>.
- 32, 60, 97, 32, 99, 108, 97, 115, 115, 61, 34, 98, // logout
- 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, // . .
- 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, // .`;...cons
- 116, 32, 72, 101, 114, 111, 32, 61, 32, 112, 114, 111, // t Hero = pro
- 112, 115, 32, 61, 62, 32, 104, 116, 109, 108, 96, 10, // ps => html`.
- 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, // .
- 10, 32, 32, 60, 104, 49, 32, 115, 116, 121, 108, 101, // . Inte
- 114, 97, 99, 116, 105, 118, 101, 32, 68, 101, 118, 105, // ractive Devi
- 99, 101, 32, 68, 97, 115, 104, 98, 111, 97, 114, 100, // ce Dashboard
- 60, 47, 104, 49, 62, 10, 10, 32, 32, 60, 112, 62, //
..
- 10, 32, 32, 84, 104, 105, 115, 32, 100, 101, 118, 105, // . This devi
- 99, 101, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // ce dashboard
- 32, 105, 115, 32, 100, 101, 118, 101, 108, 111, 112, 101, // is develope
- 100, 32, 117, 115, 105, 110, 103, 32, 116, 104, 101, 32, // d using the
- 109, 111, 100, 101, 114, 110, 32, 97, 110, 100, 32, 99, // modern and c
- 111, 109, 112, 97, 99, 116, 32, 80, 114, 101, 97, 99, // ompact Preac
- 116, 32, 102, 114, 97, 109, 101, 119, 111, 114, 107, 44, // t framework,
- 10, 32, 32, 105, 110, 32, 111, 114, 100, 101, 114, 32, // . in order
- 116, 111, 32, 102, 105, 116, 32, 111, 110, 32, 118, 101, // to fit on ve
- 114, 121, 32, 115, 109, 97, 108, 108, 32, 100, 101, 118, // ry small dev
- 105, 99, 101, 115, 46, 32, 84, 104, 105, 115, 32, 105, // ices. This i
- 115, 10, 32, 32, 97, 32, 60, 97, 32, 104, 114, 101, // s. a h
- 121, 98, 114, 105, 100, 32, 115, 101, 114, 118, 101, 114, // ybrid server
- 60, 47, 97, 62, 32, 119, 104, 105, 99, 104, 10, 32, // which.
- 32, 112, 114, 111, 118, 105, 100, 101, 115, 32, 98, 111, // provides bo
- 116, 104, 32, 115, 116, 97, 116, 105, 99, 32, 97, 110, // th static an
- 100, 32, 100, 121, 110, 97, 109, 105, 99, 32, 99, 111, // d dynamic co
- 110, 116, 101, 110, 116, 46, 32, 32, 83, 116, 97, 116, // ntent. Stat
- 105, 99, 32, 102, 105, 108, 101, 115, 44, 32, 108, 105, // ic files, li
- 107, 101, 32, 67, 83, 83, 47, 74, 83, 47, 72, 84, // ke CSS/JS/HT
- 77, 76, 10, 32, 32, 111, 114, 32, 105, 109, 97, 103, // ML. or imag
- 101, 115, 44, 32, 97, 114, 101, 32, 99, 111, 109, 112, // es, are comp
- 105, 108, 101, 100, 32, 105, 110, 116, 111, 32, 116, 104, // iled into th
- 101, 32, 115, 101, 114, 118, 101, 114, 32, 98, 105, 110, // e server bin
- 97, 114, 121, 46, 10, 10, 32, 32, 84, 104, 105, 115, // ary... This
- 32, 85, 73, 32, 117, 115, 101, 115, 32, 116, 104, 101, // UI uses the
- 32, 82, 69, 83, 84, 32, 65, 80, 73, 32, 105, 109, // REST API im
- 112, 108, 101, 109, 101, 110, 116, 101, 100, 32, 98, 121, // plemented by
- 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 44, // the device,
- 32, 119, 104, 105, 99, 104, 32, 121, 111, 117, 32, 99, // which you c
- 97, 110, 32, 101, 120, 97, 109, 105, 110, 101, 10, 32, // an examine.
- 32, 117, 115, 105, 110, 103, 32, 32, 60, 99, 111, 100, // using curl command-li
- 110, 101, 32, 117, 116, 105, 108, 105, 116, 121, 58, 10, // ne utility:.
- 32, 32, 60, 47, 112, 62, 10, 10, 32, 32, 60, 100, //
.. cur
- 108, 32, 45, 117, 32, 97, 100, 109, 105, 110, 58, 112, // l -u admin:p
- 97, 115, 115, 48, 32, 108, 111, 99, 97, 108, 104, 111, // ass0 localho
- 115, 116, 58, 56, 48, 48, 48, 47, 97, 112, 105, 47, // st:8000/api/
- 99, 111, 110, 102, 105, 103, 47, 103, 101, 116, 60, 47, // config/get
- 99, 111, 100, 101, 62, 32, 60, 47, 100, 105, 118, 62, // code>
- 10, 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, // . curl -u ad
- 109, 105, 110, 58, 112, 97, 115, 115, 48, 32, 108, 111, // min:pass0 lo
- 99, 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, // calhost:8000
- 47, 97, 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, // /api/config/
- 115, 101, 116, 32, 45, 100, 32, 39, 112, 117, 98, 61, // set -d 'pub=
- 109, 103, 47, 116, 111, 112, 105, 99, 39, 60, 47, 99, // mg/topic'
.
- 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, 101, // curl -u adm
- 105, 110, 58, 112, 97, 115, 115, 48, 32, 108, 111, 99, // in:pass0 loc
- 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, // alhost:8000/
- 97, 112, 105, 47, 109, 101, 115, 115, 97, 103, 101, 47, // api/message/
- 115, 101, 110, 100, 32, 45, 100, 32, 39, 109, 101, 115, // send -d 'mes
- 115, 97, 103, 101, 61, 104, 101, 108, 108, 111, 39, 60, // sage=hello'<
- 47, 99, 111, 100, 101, 62, 32, 60, 47, 100, 105, 118, // /code>
.. . T
- 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 99, 97, // he device ca
- 110, 32, 115, 101, 110, 100, 32, 110, 111, 116, 105, 102, // n send notif
- 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 111, 32, // ications to
- 116, 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, // this dashboa
- 114, 100, 32, 97, 116, 32, 97, 110, 121, 116, 105, 109, // rd at anytim
- 101, 46, 32, 78, 111, 116, 105, 102, 105, 99, 97, 116, // e. Notificat
- 105, 111, 110, 115, 10, 32, 32, 97, 114, 101, 32, 115, // ions. are s
- 101, 110, 116, 32, 111, 118, 101, 114, 32, 87, 101, 98, // ent over Web
- 83, 111, 99, 107, 101, 116, 32, 97, 116, 32, 85, 82, // Socket at UR
- 73, 32, 60, 99, 111, 100, 101, 62, 47, 97, 112, 105, // I /api
- 47, 119, 97, 116, 99, 104, 60, 47, 99, 111, 100, 101, // /watch
as JSON st
- 114, 105, 110, 103, 115, 58, 32, 60, 99, 111, 100, 101, // rings: {"name": ".
- 46, 34, 44, 32, 34, 100, 97, 116, 97, 34, 58, 32, // .", "data":
- 46, 46, 46, 125, 60, 47, 99, 111, 100, 101, 62, 10, // ...}
.
- 32, 32, 60, 100, 105, 118, 62, 84, 114, 121, 32, 60, //
Try <
- 99, 111, 100, 101, 62, 119, 115, 99, 97, 116, 32, 45, // code>wscat -
- 45, 97, 117, 116, 104, 32, 117, 115, 101, 114, 49, 58, // -auth user1:
- 112, 97, 115, 115, 49, 32, 45, 45, 99, 111, 110, 110, // pass1 --conn
- 101, 99, 116, 32, 119, 115, 58, 47, 47, 108, 111, 99, // ect ws://loc
- 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, // alhost:8000/
- 97, 112, 105, 47, 119, 97, 116, 99, 104, 60, 47, 99, // api/watch
.
- 32, 60, 47, 112, 62, 10, 60, 47, 100, 105, 118, 62, //
.
- 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 10, 99, // .`;..c
- 111, 110, 115, 116, 32, 76, 111, 103, 105, 110, 32, 61, // onst Login =
- 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, 114, // function(pr
- 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, 110, // ops) {. con
- 115, 116, 32, 91, 117, 115, 101, 114, 44, 32, 115, 101, // st [user, se
- 116, 85, 115, 101, 114, 93, 32, 61, 32, 117, 115, 101, // tUser] = use
- 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, // State('');.
- 32, 99, 111, 110, 115, 116, 32, 91, 112, 97, 115, 115, // const [pass
- 44, 32, 115, 101, 116, 80, 97, 115, 115, 93, 32, 61, // , setPass] =
- 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState(''
- 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, // );. const l
- 111, 103, 105, 110, 32, 61, 32, 101, 118, 32, 61, 62, // ogin = ev =>
- 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, 104, // . fetch
- 40, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // (.
- 39, 47, 97, 112, 105, 47, 108, 111, 103, 105, 110, 39, // '/api/login'
- 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ,.
- 123, 104, 101, 97, 100, 101, 114, 115, 58, 32, 123, 65, // {headers: {A
- 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, // uthorization
- 58, 32, 39, 66, 97, 115, 105, 99, 32, 39, 32, 43, // : 'Basic ' +
- 32, 98, 116, 111, 97, 40, 117, 115, 101, 114, 32, 43, // btoa(user +
- 32, 39, 58, 39, 32, 43, 32, 112, 97, 115, 115, 41, // ':' + pass)
- 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, // }}).
- 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, // .then(r =>
- 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, 32, // r.json()).
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, // .th
- 101, 110, 40, 114, 32, 61, 62, 32, 114, 32, 38, 38, // en(r => r &&
- 32, 112, 114, 111, 112, 115, 46, 108, 111, 103, 105, 110, // props.login
- 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, // (r)).
- 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, 114, // .catch(er
- 114, 32, 61, 62, 32, 101, 114, 114, 41, 59, 10, 32, // r => err);.
- 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, // return html
- 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, // `.
- 10, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, // .
.
- 60, 104, 49, 32, 115, 116, 121, 108, 101, 61, 34, 99, //
Device Dash
- 98, 111, 97, 114, 100, 32, 76, 111, 103, 105, 110, 32, // board Login
- 60, 47, 104, 49, 62, 10, 32, 32, 32, 32, 60, 100, //
.
. <
- 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 39, // input type='
- 116, 101, 120, 116, 39, 32, 112, 108, 97, 99, 101, 104, // text' placeh
- 111, 108, 100, 101, 114, 61, 39, 78, 97, 109, 101, 39, // older='Name'
- 32, 115, 116, 121, 108, 101, 61, 34, 119, 105, 100, 116, // style="widt
- 104, 58, 32, 49, 48, 48, 37, 59, 34, 10, 32, 32, // h: 100%;".
- 32, 32, 32, 32, 32, 32, 111, 110, 105, 110, 112, 117, // oninpu
- 116, 61, 36, 123, 101, 118, 32, 61, 62, 32, 115, 101, // t=${ev => se
- 116, 85, 115, 101, 114, 40, 101, 118, 46, 116, 97, 114, // tUser(ev.tar
- 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, // get.value)}
- 118, 97, 108, 117, 101, 61, 36, 123, 117, 115, 101, 114, // value=${user
- 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, 47, 100, // } />. .
. setPass(
- 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, // ev.target.va
- 108, 117, 101, 41, 125, 32, 118, 97, 108, 117, 101, 61, // lue)} value=
- 36, 123, 112, 97, 115, 115, 125, 10, 32, 32, 32, 32, // ${pass}.
- 32, 32, 32, 32, 111, 110, 99, 104, 97, 110, 103, 101, // onchange
- 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, 62, // =${login} />
- 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, 98, 117, 116, 116, 111, 110, 32, 99, // .
- 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, //
.
- 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
.
- 32, 32, 32, 32, 86, 97, 108, 105, 100, 32, 108, 111, // Valid lo
- 103, 105, 110, 115, 58, 32, 97, 100, 109, 105, 110, 58, // gins: admin:
- 112, 97, 115, 115, 48, 44, 32, 117, 115, 101, 114, 49, // pass0, user1
- 58, 112, 97, 115, 115, 49, 44, 32, 117, 115, 101, 114, // :pass1, user
- 50, 58, 112, 97, 115, 115, 50, 10, 32, 32, 32, 32, // 2:pass2.
- 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, //
. .
`;
- 10, 125, 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, // .};...const
- 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio
- 110, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // n = function
- 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, // (props) {.
- 99, 111, 110, 115, 116, 32, 91, 117, 114, 108, 44, 32, // const [url,
- 115, 101, 116, 85, 114, 108, 93, 32, 61, 32, 117, 115, // setUrl] = us
- 101, 83, 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, // eState(props
- 46, 99, 111, 110, 102, 105, 103, 46, 117, 114, 108, 32, // .config.url
- 124, 124, 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, // || '');. co
- 110, 115, 116, 32, 91, 112, 117, 98, 44, 32, 115, 101, // nst [pub, se
- 116, 80, 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, // tPub] = useS
- 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, // tate(props.c
- 111, 110, 102, 105, 103, 46, 112, 117, 98, 32, 124, 124, // onfig.pub ||
- 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, 115, // '');. cons
- 116, 32, 91, 115, 117, 98, 44, 32, 115, 101, 116, 83, // t [sub, setS
- 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // ub] = useSta
- 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, // te(props.con
- 102, 105, 103, 46, 115, 117, 98, 32, 124, 124, 32, 39, // fig.sub || '
- 39, 41, 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, // ');.. useEf
- 102, 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, // fect(() => {
- 10, 32, 32, 32, 32, 115, 101, 116, 85, 114, 108, 40, // . setUrl(
- 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config
- 46, 117, 114, 108, 41, 59, 10, 32, 32, 32, 32, 115, // .url);. s
- 101, 116, 80, 117, 98, 40, 112, 114, 111, 112, 115, 46, // etPub(props.
- 99, 111, 110, 102, 105, 103, 46, 112, 117, 98, 41, 59, // config.pub);
- 10, 32, 32, 32, 32, 115, 101, 116, 83, 117, 98, 40, // . setSub(
- 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config
- 46, 115, 117, 98, 41, 59, 10, 32, 32, 125, 44, 32, // .sub);. },
- 91, 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, // [props.confi
- 103, 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, // g]);.. cons
- 116, 32, 117, 112, 100, 97, 116, 101, 32, 61, 32, 40, // t update = (
- 110, 97, 109, 101, 44, 32, 118, 97, 108, 41, 32, 61, // name, val) =
- 62, 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, // > fetch('/ap
- 105, 47, 99, 111, 110, 102, 105, 103, 47, 115, 101, 116, // i/config/set
- 39, 44, 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, 32, //
- 32, 32, 32, 109, 101, 116, 104, 111, 100, 58, 32, 39, // method: '
- 112, 111, 115, 116, 39, 44, 10, 32, 32, 32, 32, 32, // post',.
- 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, 32, 96, // body: `
- 36, 123, 110, 97, 109, 101, 125, 61, 36, 123, 101, 110, // ${name}=${en
- 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, 112, 111, // codeURICompo
- 110, 101, 110, 116, 40, 118, 97, 108, 41, 125, 96, 10, // nent(val)}`.
- 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, 32, 32, 125, 41, 46, 99, // }).c
- 97, 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, // atch(err =>
- 101, 114, 114, 41, 59, 10, 32, 32, 99, 111, 110, 115, // err);. cons
- 116, 32, 117, 112, 100, 97, 116, 101, 117, 114, 108, 32, // t updateurl
- 61, 32, 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, // = ev => upda
- 116, 101, 40, 39, 117, 114, 108, 39, 44, 32, 117, 114, // te('url', ur
- 108, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // l);. const
- 117, 112, 100, 97, 116, 101, 112, 117, 98, 32, 61, 32, // updatepub =
- 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, // ev => update
- 40, 39, 112, 117, 98, 39, 44, 32, 112, 117, 98, 41, // ('pub', pub)
- 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 117, 112, // ;. const up
- 100, 97, 116, 101, 115, 117, 98, 32, 61, 32, 101, 118, // datesub = ev
- 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, 40, 39, // => update('
- 115, 117, 98, 39, 44, 32, 115, 117, 98, 41, 59, 10, // sub', sub);.
- 10, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // . console.l
- 111, 103, 40, 112, 114, 111, 112, 115, 44, 32, 91, 117, // og(props, [u
- 114, 108, 44, 32, 112, 117, 98, 44, 32, 115, 117, 98, // rl, pub, sub
- 93, 41, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ]);. return
- 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.
.
- 32, 32, 68, 101, 118, 105, 99, 101, 32, 67, 111, 110, // Device Con
- 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 60, 47, // figuration
- 104, 51, 62, 10, 32, 32, 60, 100, 105, 118, 32, 115, // h3>.
. M
- 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 58, 60, // QTT server:<
- 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, 60, // /span>. <
- 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 34, // input type="
- 116, 101, 120, 116, 34, 32, 115, 116, 121, 108, 101, 61, // text" style=
- 34, 102, 108, 101, 120, 58, 32, 49, 32, 49, 48, 48, // "flex: 1 100
- 37, 59, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, // %;".
- 32, 32, 118, 97, 108, 117, 101, 61, 36, 123, 117, 114, // value=${ur
- 108, 125, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, // l} onchange=
- 36, 123, 117, 112, 100, 97, 116, 101, 117, 114, 108, 125, // ${updateurl}
- 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 111, // . o
- 110, 105, 110, 112, 117, 116, 61, 36, 123, 101, 118, 32, // ninput=${ev
- 61, 62, 32, 115, 101, 116, 85, 114, 108, 40, 101, 118, // => setUrl(ev
- 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, // .target.valu
- 101, 41, 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, // e)} />. <
- 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, 115, // button class
- 61, 34, 98, 116, 110, 34, 32, 100, 105, 115, 97, 98, // ="btn" disab
- 108, 101, 100, 61, 36, 123, 33, 117, 114, 108, 125, 32, // led=${!url}
- 111, 110, 99, 108, 105, 99, 107, 61, 36, 123, 117, 112, // onclick=${up
- 100, 97, 116, 101, 117, 114, 108, 125, 10, 32, 32, 32, // dateurl}.
- 32, 32, 32, 115, 116, 121, 108, 101, 61, 34, 109, 97, // style="ma
- 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, 32, 49, // rgin-left: 1
- 101, 109, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // em; backgrou
- 110, 100, 58, 32, 35, 56, 97, 97, 59, 34, 62, 85, // nd: #8aa;">U
- 112, 100, 97, 116, 101, 60, 47, 98, 117, 116, 116, 111, // pdate.
.
- 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
- 10, 32, 32, 32, 32, 60, 115, 112, 97, 110, 32, 99, // . Subs
- 99, 114, 105, 98, 101, 32, 116, 111, 112, 105, 99, 58, // cribe topic:
- 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, // .
- 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, //
- 115, 101, 116, 83, 117, 98, 40, 101, 118, 46, 116, 97, // setSub(ev.ta
- 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, // rget.value)}
- 32, 47, 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, // />. Upda
- 116, 101, 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, // te.
- 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. <
- 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, 32, 100, 105, 115, 112, 108, 97, 121, 58, // 0; display:
- 32, 102, 108, 101, 120, 59, 34, 62, 10, 32, 32, 32, // flex;">.
- 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // Publish
- 116, 111, 112, 105, 99, 58, 60, 47, 115, 112, 97, 110, // topic:. se
- 116, 80, 117, 98, 40, 101, 118, 46, 116, 97, 114, 103, // tPub(ev.targ
- 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, // et.value)} /
- 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, // >. Update
- 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, 32, 32, // .
- 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, // .
. You c
- 97, 110, 32, 117, 115, 101, 32, 60, 97, 32, 104, 114, // an use . Hive
- 77, 81, 32, 87, 101, 98, 115, 111, 99, 107, 101, 116, // MQ Websocket
- 32, 119, 101, 98, 32, 99, 108, 105, 101, 110, 116, 60, // web client<
- 47, 97, 62, 32, 116, 111, 32, 115, 101, 110, 100, 32, // /a> to send
- 109, 101, 115, 115, 97, 103, 101, 115, 32, 116, 111, 32, // messages to
- 116, 104, 105, 115, 32, 99, 111, 110, 115, 111, 108, 101, // this console
- 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // .. .
- 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, // . T
- 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 107, 101, // he device ke
- 101, 112, 115, 32, 97, 32, 112, 101, 114, 115, 105, 115, // eps a persis
- 116, 101, 110, 116, 32, 99, 111, 110, 110, 101, 99, 116, // tent connect
- 105, 111, 110, 32, 116, 111, 32, 116, 104, 101, 32, 99, // ion to the c
- 111, 110, 102, 105, 103, 117, 114, 101, 100, 32, 77, 81, // onfigured MQ
- 84, 84, 32, 115, 101, 114, 118, 101, 114, 46, 10, 32, // TT server..
- 32, 32, 32, 67, 104, 97, 110, 103, 101, 115, 32, 116, // Changes t
- 111, 32, 116, 104, 105, 115, 32, 99, 111, 110, 102, 105, // o this confi
- 103, 117, 114, 97, 116, 105, 111, 110, 32, 97, 114, 101, // guration are
- 32, 112, 114, 111, 112, 97, 103, 97, 116, 101, 100, 32, // propagated
- 116, 111, 32, 97, 108, 108, 32, 100, 97, 115, 104, 98, // to all dashb
- 111, 97, 114, 100, 115, 58, 32, 116, 114, 121, 10, 32, // oards: try.
- 32, 32, 32, 99, 104, 97, 110, 103, 105, 110, 103, 32, // changing
- 116, 104, 101, 109, 32, 105, 110, 32, 116, 104, 105, 115, // them in this
- 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, 32, 97, // dashboard a
- 110, 100, 32, 111, 98, 115, 101, 114, 118, 101, 32, 99, // nd observe c
- 104, 97, 110, 103, 101, 115, 32, 105, 110, 32, 111, 116, // hanges in ot
- 104, 101, 114, 32, 111, 112, 101, 110, 101, 100, 10, 32, // her opened.
- 32, 32, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // dashboard
- 115, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 60, // s..
<
- 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m
- 115, 103, 34, 62, 10, 32, 32, 32, 32, 78, 111, 116, // sg">. Not
- 101, 58, 32, 97, 100, 109, 105, 110, 105, 115, 116, 114, // e: administr
- 97, 116, 111, 114, 115, 32, 99, 97, 110, 32, 115, 101, // ators can se
- 101, 32, 116, 104, 105, 115, 32, 115, 101, 99, 116, 105, // e this secti
- 111, 110, 32, 97, 110, 100, 32, 99, 97, 110, 32, 99, // on and can c
- 104, 97, 110, 103, 101, 32, 100, 101, 118, 105, 99, 101, // hange device
- 10, 32, 32, 32, 32, 99, 111, 110, 102, 105, 103, 117, // . configu
- 114, 97, 116, 105, 111, 110, 44, 32, 119, 104, 105, 108, // ration, whil
- 115, 116, 32, 117, 115, 101, 114, 115, 32, 99, 97, 110, // st users can
- 110, 111, 116, 46, 10, 32, 32, 60, 47, 100, 105, 118, // not.. .`;.}
- 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, 77, 101, // ;...const Me
- 115, 115, 97, 103, 101, 32, 61, 32, 109, 32, 61, 62, // ssage = m =>
- 32, 104, 116, 109, 108, 96, 60, 100, 105, 118, 32, 115, // html`
- 10, 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, // . qos
- 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag
- 101, 46, 113, 111, 115, 125, 32, 60, 47, 115, 112, 97, // e.qos} . topic: ${m.
- 109, 101, 115, 115, 97, 103, 101, 46, 116, 111, 112, 105, // message.topi
- 99, 125, 32, 60, 47, 115, 112, 97, 110, 62, 10, 32, // c} .
- 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // data
- 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag
- 101, 46, 100, 97, 116, 97, 125, 60, 47, 115, 112, 97, // e.data}.
`;.
- 10, 99, 111, 110, 115, 116, 32, 77, 101, 115, 115, 97, // .const Messa
- 103, 101, 115, 32, 61, 32, 102, 117, 110, 99, 116, 105, // ges = 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, 115, 44, 32, 115, 101, 116, 77, 101, // sages, setMe
- 115, 115, 97, 103, 101, 115, 93, 32, 61, 32, 117, 115, // ssages] = us
- 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);.
- 32, 32, 99, 111, 110, 115, 116, 32, 91, 116, 120, 116, // const [txt
- 44, 32, 115, 101, 116, 84, 120, 116, 93, 32, 61, 32, // , setTxt] =
- 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, 41, // useState('')
- 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, 102, 101, // ;.. useEffe
- 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, 10, 32, // ct(() => {.
- 32, 32, 32, 99, 111, 110, 115, 116, 32, 105, 100, 32, // const id
- 61, 32, 80, 117, 98, 83, 117, 98, 46, 115, 117, 98, // = PubSub.sub
- 115, 99, 114, 105, 98, 101, 40, 102, 117, 110, 99, 116, // scribe(funct
- 105, 111, 110, 40, 109, 115, 103, 41, 32, 123, 10, 32, // ion(msg) {.
- 32, 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, // if (msg
- 46, 110, 97, 109, 101, 32, 61, 61, 32, 39, 109, 101, // .name == 'me
- 115, 115, 97, 103, 101, 39, 41, 32, 115, 101, 116, 77, // ssage') setM
- 101, 115, 115, 97, 103, 101, 115, 40, 120, 32, 61, 62, // essages(x =>
- 32, 120, 46, 99, 111, 110, 99, 97, 116, 40, 91, 109, // x.concat([m
- 115, 103, 46, 100, 97, 116, 97, 93, 41, 41, 59, 10, // sg.data]));.
- 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, // });.
- 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, 117, // return PubSu
- 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, 98, // b.unsubscrib
- 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, 32, // e(id);. },
- 91, 93, 41, 59, 10, 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, 116, 120, 116, 41, 125, // ponent(txt)}
- 96, 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, 125, 41, 46, 116, 104, 101, // }).the
- 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, 84, 120, // n(r => setTx
- 116, 40, 39, 39, 41, 41, 59, 10, 32, 32, 99, 111, // t(''));. co
- 110, 115, 116, 32, 99, 111, 110, 110, 115, 116, 97, 116, // nst connstat
- 117, 115, 32, 61, 32, 112, 114, 111, 112, 115, 46, 99, // us = props.c
- 111, 110, 102, 105, 103, 46, 99, 111, 110, 110, 101, 99, // onfig.connec
- 116, 101, 100, 32, 63, 32, 39, 99, 111, 110, 110, 101, // ted ? 'conne
- 99, 116, 101, 100, 39, 32, 58, 32, 39, 100, 105, 115, // cted' : 'dis
- 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, 59, 10, // connected';.
- 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // return htm
- 108, 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, // l`.
- 10, 32, 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, // .
MQTT me
- 115, 115, 97, 103, 101, 115, 60, 47, 104, 51, 62, 10, // ssages
.
- 32, 32, 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, //
.
- 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, // MQTT server
- 115, 116, 97, 116, 117, 115, 58, 32, 60, 98, 62, 36, // status: $
- 123, 99, 111, 110, 110, 115, 116, 97, 116, 117, 115, 125, // {connstatus}
- 60, 47, 98, 62, 10, 32, 32, 60, 47, 100, 105, 118, // .
.
.
- 36, 123, 109, 101, 115, 115, 97, 103, 101, 115, 46, 109, // ${messages.m
- 97, 112, 40, 109, 101, 115, 115, 97, 103, 101, 32, 61, // ap(message =
- 62, 32, 104, 40, 77, 101, 115, 115, 97, 103, 101, 44, // > h(Message,
- 32, 123, 109, 101, 115, 115, 97, 103, 101, 125, 41, 41, // {message}))
- 125, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // }.
.
- 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
.
- 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // Publish
- 32, 109, 101, 115, 115, 97, 103, 101, 58, 60, 47, 115, // message:. set
- 84, 120, 116, 40, 101, 118, 46, 116, 97, 114, 103, 101, // Txt(ev.targe
- 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, // t.value)} />
- 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, // .
.
- 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. Th
- 101, 32, 109, 101, 115, 115, 97, 103, 101, 32, 103, 101, // e message ge
- 116, 115, 32, 112, 97, 115, 115, 101, 100, 32, 116, 111, // ts passed to
- 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, // the device
- 118, 105, 97, 32, 82, 69, 83, 84, 46, 32, 84, 104, // via REST. Th
- 101, 110, 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, // en the devic
- 101, 32, 115, 101, 110, 100, 115, 32, 105, 116, 32, 116, // e sends it t
- 111, 10, 32, 32, 32, 32, 116, 104, 101, 32, 77, 81, // o. the MQ
- 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, 111, 118, // TT server ov
- 101, 114, 32, 77, 81, 84, 84, 46, 32, 65, 108, 108, // er MQTT. All
- 32, 77, 81, 84, 84, 32, 109, 101, 115, 115, 97, 103, // MQTT messag
- 101, 115, 32, 111, 110, 32, 97, 32, 115, 117, 98, 115, // es on a subs
- 99, 114, 105, 98, 101, 100, 32, 116, 111, 112, 105, 99, // cribed topic
- 10, 32, 32, 32, 32, 114, 101, 99, 101, 105, 118, 101, // . receive
- 100, 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, // d by the dev
- 105, 99, 101, 44, 32, 97, 114, 101, 32, 112, 114, 111, // ice, are pro
- 112, 97, 103, 97, 116, 101, 100, 32, 116, 111, 32, 116, // pagated to t
- 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, 114, // his dashboar
- 100, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, 119, // d via /api/w
- 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, 105, // atch.. .
`;.
- 125, 59, 10, 10, 47, 47, 32, 69, 120, 112, 101, 99, // };..// Expec
- 116, 101, 100, 32, 97, 114, 103, 117, 109, 101, 110, 116, // ted argument
- 115, 58, 10, 47, 47, 32, 100, 97, 116, 97, 58, 32, // s:.// data:
- 116, 105, 109, 101, 115, 101, 114, 105, 101, 115, 44, 32, // timeseries,
- 101, 46, 103, 46, 32, 91, 32, 91, 49, 54, 53, 52, // e.g. [ [1654
- 51, 54, 49, 51, 53, 50, 44, 32, 49, 57, 93, 44, // 361352, 19],
- 32, 91, 49, 54, 53, 52, 51, 54, 49, 51, 53, 51, // [1654361353
- 44, 32, 49, 56, 93, 44, 32, 46, 46, 46, 32, 93, // , 18], ... ]
- 10, 47, 47, 32, 119, 105, 100, 116, 104, 44, 32, 104, // .// width, h
- 101, 105, 103, 104, 116, 44, 32, 121, 116, 105, 99, 107, // eight, ytick
- 115, 44, 32, 120, 116, 105, 99, 107, 115, 44, 32, 121, // s, xticks, y
- 109, 105, 110, 44, 32, 121, 109, 97, 120, 44, 32, 120, // min, ymax, x
- 109, 105, 110, 44, 32, 120, 109, 97, 120, 10, 99, 111, // min, xmax.co
- 110, 115, 116, 32, 83, 86, 71, 32, 61, 32, 102, 117, // nst SVG = fu
- 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, // nction(props
- 41, 32, 123, 10, 32, 32, 47, 47, 32, 32, 32, 32, // ) {. //
- 32, 32, 32, 32, 32, 32, 32, 32, 119, 10, 32, 32, // w.
- 47, 47, 32, 32, 32, 43, 45, 45, 45, 45, 45, 45, // // +------
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------
- 45, 45, 45, 43, 10, 32, 32, 47, 47, 32, 32, 32, // ---+. //
- 124, 32, 32, 32, 32, 32, 32, 32, 32, 104, 49, 32, // | h1
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 10, // |.
- 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // |
- 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +-----------
- 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. //
- 32, 32, 124, 32, 32, 32, 32, 124, 32, 32, 32, 32, // | |
- 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 32, // |
- 124, 32, 32, 104, 10, 32, 32, 47, 47, 32, 32, 32, // | h. //
- 124, 32, 119, 49, 32, 124, 32, 32, 32, 32, 32, 32, // | w1 |
- 32, 32, 32, 32, 32, 124, 32, 119, 50, 32, 124, 10, // | w2 |.
- 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // |
- 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +-----------
- 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. //
- 32, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, // |
- 104, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // h2
- 124, 10, 32, 32, 47, 47, 32, 32, 32, 43, 45, 45, // |. // +--
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------
- 45, 45, 45, 45, 45, 45, 45, 43, 10, 32, 32, 47, // -------+. /
- 47, 10, 32, 32, 108, 101, 116, 32, 119, 32, 61, 32, // /. let w =
- 112, 114, 111, 112, 115, 46, 119, 105, 100, 116, 104, 44, // props.width,
- 32, 104, 32, 61, 32, 112, 114, 111, 112, 115, 46, 104, // h = props.h
- 101, 105, 103, 104, 116, 44, 32, 119, 49, 32, 61, 32, // eight, w1 =
- 51, 48, 44, 32, 119, 50, 32, 61, 32, 48, 44, 32, // 30, w2 = 0,
- 104, 49, 32, 61, 32, 56, 44, 32, 104, 50, 32, 61, // h1 = 8, h2 =
- 32, 49, 56, 59, 10, 32, 32, 108, 101, 116, 32, 121, // 18;. let y
- 116, 105, 99, 107, 115, 32, 61, 32, 112, 114, 111, 112, // ticks = prop
- 115, 46, 121, 116, 105, 99, 107, 115, 32, 124, 124, 32, // s.yticks ||
- 52, 44, 32, 120, 116, 105, 99, 107, 115, 32, 61, 32, // 4, xticks =
- 112, 114, 111, 112, 115, 46, 120, 116, 105, 99, 107, 115, // props.xticks
- 32, 124, 124, 32, 53, 59, 10, 32, 32, 108, 101, 116, // || 5;. let
- 32, 100, 97, 116, 97, 32, 61, 32, 112, 114, 111, 112, // data = prop
- 115, 46, 100, 97, 116, 97, 32, 124, 124, 32, 91, 93, // s.data || []
- 59, 10, 32, 32, 108, 101, 116, 32, 121, 109, 105, 110, // ;. let ymin
- 32, 61, 32, 112, 114, 111, 112, 115, 46, 121, 109, 105, // = props.ymi
- 110, 32, 124, 124, 32, 48, 59, 10, 32, 32, 108, 101, // n || 0;. le
- 116, 32, 121, 109, 97, 120, 32, 61, 32, 112, 114, 111, // t ymax = pro
- 112, 115, 46, 121, 109, 97, 120, 32, 124, 124, 32, 77, // ps.ymax || M
- 97, 116, 104, 46, 109, 97, 120, 46, 97, 112, 112, 108, // ath.max.appl
- 121, 40, 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, // y(null, data
- 46, 109, 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, // .map(p => p[
- 49, 93, 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, // 1]));. let
- 120, 109, 105, 110, 32, 61, 32, 112, 114, 111, 112, 115, // xmin = props
- 46, 120, 109, 105, 110, 32, 124, 124, 32, 77, 97, 116, // .xmin || Mat
- 104, 46, 109, 105, 110, 46, 97, 112, 112, 108, 121, 40, // h.min.apply(
- 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, // null, data.m
- 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, // ap(p => p[0]
- 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, 120, 109, // ));. let xm
- 97, 120, 32, 61, 32, 112, 114, 111, 112, 115, 46, 120, // ax = props.x
- 109, 97, 120, 32, 124, 124, 32, 77, 97, 116, 104, 46, // max || Math.
- 109, 97, 120, 46, 97, 112, 112, 108, 121, 40, 110, 117, // max.apply(nu
- 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, 97, 112, // ll, data.map
- 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, 41, 41, // (p => p[0]))
- 59, 10, 10, 32, 32, 47, 47, 32, 89, 45, 97, 120, // ;.. // Y-ax
- 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line
- 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels
- 10, 32, 32, 108, 101, 116, 32, 121, 116, 97, 32, 61, // . let yta =
- 32, 40, 110, 101, 119, 32, 65, 114, 114, 97, 121, 40, // (new Array(
- 121, 116, 105, 99, 107, 115, 32, 43, 32, 49, 41, 41, // yticks + 1))
- 46, 102, 105, 108, 108, 40, 48, 41, 46, 109, 97, 112, // .fill(0).map
- 40, 40, 95, 44, 32, 105, 41, 32, 61, 62, 32, 105, // ((_, i) => i
- 41, 59, 32, 32, 47, 47, 32, 105, 110, 100, 105, 99, // ); // indic
- 101, 115, 10, 32, 32, 108, 101, 116, 32, 121, 116, 105, // es. let yti
- 32, 61, 32, 105, 32, 61, 62, 32, 104, 32, 45, 32, // = i => h -
- 104, 50, 32, 45, 32, 40, 104, 32, 45, 32, 104, 49, // h2 - (h - h1
- 32, 45, 32, 104, 50, 41, 32, 42, 32, 105, 32, 47, // - h2) * i /
- 32, 121, 116, 105, 99, 107, 115, 59, 32, 32, 32, 32, // yticks;
- 32, 32, 32, 32, 32, 32, 47, 47, 32, 105, 110, 100, // // ind
- 101, 120, 39, 115, 32, 89, 10, 32, 32, 108, 101, 116, // ex's Y. let
- 32, 121, 116, 118, 32, 61, 32, 105, 32, 61, 62, 32, // ytv = i =>
- 40, 121, 109, 97, 120, 32, 45, 32, 121, 109, 105, 110, // (ymax - ymin
- 41, 32, 42, 32, 105, 32, 47, 32, 121, 116, 105, 99, // ) * i / ytic
- 107, 115, 59, 10, 32, 32, 108, 101, 116, 32, 121, 116, // ks;. let yt
- 108, 32, 61, 32, 121, 32, 61, 62, 32, 104, 116, 109, // l = y => htm
- 108, 96, 60, 108, 105, 110, 101, 32, 120, 49, 61, 36, // l`
`;.
- 108, 101, 116, 32, 121, 116, 116, 32, 61, 32, 40, 121, // let ytt = (y
- 44, 32, 118, 41, 32, 61, 62, 32, 104, 116, 109, 108, // , v) => html
- 96, 60, 116, 101, 120, 116, 32, 120, 61, 48, 32, 121, // `
- 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}`
- 59, 10, 10, 32, 32, 47, 47, 32, 88, 45, 97, 120, // ;.. // X-ax
- 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line
- 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels
- 10, 32, 32, 108, 101, 116, 32, 100, 97, 116, 101, 102, // . let datef
- 109, 116, 32, 61, 32, 117, 110, 105, 120, 32, 61, 62, // mt = unix =>
- 32, 40, 110, 101, 119, 32, 68, 97, 116, 101, 40, 117, // (new Date(u
- 110, 105, 120, 32, 42, 32, 49, 48, 48, 48, 41, 41, // nix * 1000))
- 46, 116, 111, 73, 83, 79, 83, 116, 114, 105, 110, 103, // .toISOString
- 40, 41, 46, 115, 117, 98, 115, 116, 114, 40, 49, 52, // ().substr(14
- 44, 32, 53, 41, 59, 10, 32, 32, 108, 101, 116, 32, // , 5);. let
- 120, 116, 97, 32, 61, 32, 40, 110, 101, 119, 32, 65, // xta = (new A
- 114, 114, 97, 121, 40, 120, 116, 105, 99, 107, 115, 32, // rray(xticks
- 43, 32, 49, 41, 41, 46, 102, 105, 108, 108, 40, 48, // + 1)).fill(0
- 41, 46, 109, 97, 112, 40, 40, 95, 44, 32, 105, 41, // ).map((_, i)
- 32, 61, 62, 32, 105, 41, 59, 32, 32, 47, 47, 32, // => i); //
- 105, 110, 100, 105, 99, 101, 115, 10, 32, 32, 108, 101, // indices. le
- 116, 32, 120, 116, 105, 32, 61, 32, 105, 32, 61, 62, // t xti = i =>
- 32, 119, 49, 32, 43, 32, 40, 119, 32, 45, 32, 119, // w1 + (w - w
- 49, 32, 45, 32, 119, 50, 41, 32, 42, 32, 105, 32, // 1 - w2) * i
- 47, 32, 120, 116, 105, 99, 107, 115, 59, 32, 32, 32, // / xticks;
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, // /
- 47, 32, 105, 110, 100, 101, 120, 39, 115, 32, 88, 10, // / index's X.
- 32, 32, 108, 101, 116, 32, 120, 116, 118, 32, 61, 32, // let xtv =
- 105, 32, 61, 62, 32, 100, 97, 116, 101, 102, 109, 116, // i => datefmt
- 40, 120, 109, 105, 110, 32, 43, 32, 40, 120, 109, 97, // (xmin + (xma
- 120, 32, 45, 32, 120, 109, 105, 110, 41, 32, 42, 32, // x - xmin) *
- 105, 32, 47, 32, 120, 116, 105, 99, 107, 115, 41, 59, // i / xticks);
- 10, 32, 32, 108, 101, 116, 32, 120, 116, 108, 32, 61, // . let xtl =
- 32, 120, 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, // x => html`<
- 112, 97, 116, 104, 32, 100, 61, 34, 77, 32, 36, 123, // path d="M ${
- 120, 125, 44, 36, 123, 104, 49, 125, 32, 76, 32, 36, // x},${h1} L $
- 123, 120, 125, 44, 36, 123, 104, 32, 45, 32, 104, 50, // {x},${h - h2
- 125, 34, 32, 99, 108, 97, 115, 115, 61, 34, 116, 105, // }" class="ti
- 99, 107, 34, 47, 62, 96, 59, 10, 32, 32, 108, 101, // ck"/>`;. le
- 116, 32, 120, 116, 116, 32, 61, 32, 40, 120, 44, 32, // t xtt = (x,
- 118, 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, // v) =>.
- 104, 116, 109, 108, 96, 60, 116, 101, 120, 116, 32, 120, // html`
- 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}`
- 59, 10, 10, 32, 32, 47, 47, 32, 84, 114, 97, 110, // ;.. // Tran
- 115, 102, 111, 114, 109, 32, 100, 97, 116, 97, 32, 112, // sform data p
- 111, 105, 110, 116, 115, 32, 97, 114, 114, 97, 121, 32, // oints array
- 105, 110, 116, 111, 32, 99, 111, 111, 114, 100, 105, 110, // into coordin
- 97, 116, 101, 10, 32, 32, 108, 101, 116, 32, 100, 120, // ate. let dx
- 32, 61, 32, 118, 32, 61, 62, 32, 119, 49, 32, 43, // = v => w1 +
- 32, 40, 118, 32, 45, 32, 120, 109, 105, 110, 41, 32, // (v - xmin)
- 47, 32, 40, 40, 120, 109, 97, 120, 32, 45, 32, 120, // / ((xmax - x
- 109, 105, 110, 41, 32, 124, 124, 32, 49, 41, 32, 42, // min) || 1) *
- 32, 40, 119, 32, 45, 32, 119, 49, 32, 45, 32, 119, // (w - w1 - w
- 50, 41, 59, 10, 32, 32, 108, 101, 116, 32, 100, 121, // 2);. let dy
- 32, 61, 32, 118, 32, 61, 62, 32, 104, 32, 45, 32, // = v => h -
- 104, 50, 32, 45, 32, 40, 118, 32, 45, 32, 121, 109, // h2 - (v - ym
- 105, 110, 41, 32, 47, 32, 40, 40, 121, 109, 97, 120, // in) / ((ymax
- 32, 45, 32, 121, 109, 105, 110, 41, 32, 124, 124, 32, // - ymin) ||
- 49, 41, 32, 42, 32, 40, 104, 32, 45, 32, 104, 49, // 1) * (h - h1
- 32, 45, 32, 104, 50, 41, 59, 10, 32, 32, 108, 101, // - h2);. le
- 116, 32, 100, 100, 32, 61, 32, 100, 97, 116, 97, 46, // t dd = data.
- 109, 97, 112, 40, 112, 32, 61, 62, 32, 91, 77, 97, // map(p => [Ma
- 116, 104, 46, 114, 111, 117, 110, 100, 40, 100, 120, 40, // th.round(dx(
- 112, 91, 48, 93, 41, 41, 44, 32, 77, 97, 116, 104, // p[0])), Math
- 46, 114, 111, 117, 110, 100, 40, 100, 121, 40, 112, 91, // .round(dy(p[
- 49, 93, 41, 41, 93, 41, 59, 10, 32, 32, 108, 101, // 1]))]);. le
- 116, 32, 100, 100, 108, 32, 61, 32, 100, 100, 46, 108, // t ddl = dd.l
- 101, 110, 103, 116, 104, 59, 10, 32, 32, 47, 47, 32, // ength;. //
- 65, 110, 100, 32, 112, 108, 111, 116, 32, 116, 104, 101, // And plot the
- 32, 100, 97, 116, 97, 32, 97, 115, 32, 60, 112, 97, // data as
element.
- 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 48, // let begin0
- 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, 77, 32, // = ddl ? `M
- 36, 123, 100, 100, 91, 48, 93, 91, 48, 93, 125, 44, // ${dd[0][0]},
- 36, 123, 100, 100, 91, 48, 93, 91, 49, 93, 125, 96, // ${dd[0][1]}`
- 32, 58, 32, 96, 77, 32, 48, 44, 48, 96, 59, 10, // : `M 0,0`;.
- 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 32, // let begin
- 61, 32, 96, 77, 32, 36, 123, 119, 49, 125, 44, 36, // = `M ${w1},$
- 123, 104, 32, 45, 32, 104, 50, 125, 96, 59, 32, 32, // {h - h2}`;
- 47, 47, 32, 73, 110, 105, 116, 105, 97, 108, 32, 112, // // Initial p
- 111, 105, 110, 116, 10, 32, 32, 108, 101, 116, 32, 101, // oint. let e
- 110, 100, 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, // nd = ddl ? `
- 76, 32, 36, 123, 100, 100, 91, 100, 100, 108, 32, 45, // L ${dd[ddl -
- 32, 49, 93, 91, 48, 93, 125, 44, 36, 123, 104, 32, // 1][0]},${h
- 45, 32, 104, 50, 125, 96, 32, 58, 32, 96, 76, 32, // - h2}` : `L
- 36, 123, 119, 49, 125, 44, 36, 123, 104, 32, 45, 32, // ${w1},${h -
- 104, 50, 125, 96, 59, 10, 32, 32, 108, 101, 116, 32, // h2}`;. let
- 115, 101, 114, 105, 101, 115, 32, 61, 32, 100, 100, 108, // series = ddl
- 32, 63, 32, 100, 100, 46, 109, 97, 112, 40, 112, 32, // ? dd.map(p
- 61, 62, 32, 96, 76, 32, 36, 123, 112, 91, 48, 93, // => `L ${p[0]
- 125, 32, 36, 123, 112, 91, 49, 93, 125, 96, 41, 32, // } ${p[1]}`)
- 58, 32, 91, 93, 59, 10, 10, 32, 32, 114, 101, 116, // : [];.. ret
- 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, 115, // urn html`.. .
- 32, 36, 123, 121, 116, 97, 46, 109, 97, 112, 40, 105, // ${yta.map(i
- 32, 61, 62, 32, 121, 116, 108, 40, 121, 116, 105, 40, // => ytl(yti(
- 105, 41, 41, 41, 125, 10, 32, 32, 36, 123, 121, 116, // i)))}. ${yt
- 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 121, // a.map(i => y
- 116, 116, 40, 121, 116, 105, 40, 105, 41, 44, 32, 121, // tt(yti(i), y
- 116, 118, 40, 105, 41, 41, 41, 125, 10, 32, 32, 36, // tv(i)))}. $
- 123, 120, 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, // {xta.map(i =
- 62, 32, 120, 116, 108, 40, 120, 116, 105, 40, 105, 41, // > xtl(xti(i)
- 41, 41, 125, 10, 32, 32, 36, 123, 100, 97, 116, 97, // ))}. ${data
- 46, 108, 101, 110, 103, 116, 104, 32, 63, 32, 120, 116, // .length ? xt
- 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 120, // a.map(i => x
- 116, 116, 40, 120, 116, 105, 40, 105, 41, 44, 32, 120, // tt(xti(i), x
- 116, 118, 40, 105, 41, 41, 41, 32, 58, 32, 39, 39, // tv(i))) : ''
- 125, 10, 32, 32, 60, 112, 97, 116, 104, 32, 100, 61, // }. .
- 60, 112, 97, 116, 104, 32, 100, 61, 34, 36, 123, 98, // .
- 115, 118, 103, 62, 96, 59, 10, 125, 59, 10, 10, 10, // svg>`;.};...
- 99, 111, 110, 115, 116, 32, 67, 104, 97, 114, 116, 32, // const Chart
- 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, 100, 97, 116, 97, 44, 32, 115, // nst [data, s
- 101, 116, 68, 97, 116, 97, 93, 32, 61, 32, 117, 115, // etData] = us
- 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);.
- 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, // () => {.
- 99, 111, 110, 115, 116, 32, 105, 100, 32, 61, 32, 80, // const id = P
- 117, 98, 83, 117, 98, 46, 115, 117, 98, 115, 99, 114, // ubSub.subscr
- 105, 98, 101, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ibe(function
- 40, 109, 115, 103, 41, 32, 123, 10, 32, 32, 32, 32, // (msg) {.
- 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, 110, 97, // if (msg.na
- 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, 114, 105, // me != 'metri
- 99, 115, 39, 41, 32, 114, 101, 116, 117, 114, 110, 59, // cs') return;
- 10, 32, 32, 32, 32, 32, 32, 115, 101, 116, 68, 97, // . setDa
- 116, 97, 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, // ta(x => x.co
- 110, 99, 97, 116, 40, 91, 109, 115, 103, 46, 100, 97, // ncat([msg.da
- 116, 97, 93, 41, 46, 115, 112, 108, 105, 99, 101, 40, // ta]).splice(
- 45, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, 68, // -MaxMetricsD
- 97, 116, 97, 80, 111, 105, 110, 116, 115, 41, 41, 59, // ataPoints));
- 10, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, // . });.
- 32, 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, // return PubS
- 117, 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, // ub.unsubscri
- 98, 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, // be(id);. },
- 32, 91, 93, 41, 59, 10, 10, 32, 32, 108, 101, 116, // []);.. let
- 32, 120, 109, 97, 120, 32, 61, 32, 48, 44, 32, 109, // xmax = 0, m
- 105, 115, 115, 105, 110, 103, 32, 61, 32, 77, 97, 120, // issing = Max
- 77, 101, 116, 114, 105, 99, 115, 68, 97, 116, 97, 80, // MetricsDataP
- 111, 105, 110, 116, 115, 32, 45, 32, 100, 97, 116, 97, // oints - data
- 46, 108, 101, 110, 103, 116, 104, 59, 10, 32, 32, 105, // .length;. i
- 102, 32, 40, 109, 105, 115, 115, 105, 110, 103, 32, 62, // f (missing >
- 32, 48, 41, 32, 120, 109, 97, 120, 32, 61, 32, 77, // 0) xmax = M
- 97, 116, 104, 46, 114, 111, 117, 110, 100, 40, 68, 97, // ath.round(Da
- 116, 101, 46, 110, 111, 119, 40, 41, 32, 47, 32, 49, // te.now() / 1
- 48, 48, 48, 41, 32, 43, 32, 109, 105, 115, 115, 105, // 000) + missi
- 110, 103, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ng;. return
- 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`..
Data C
- 104, 97, 114, 116, 60, 47, 104, 51, 62, 10, 32, 32, // hart
.
- 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. <
- 36, 123, 83, 86, 71, 125, 32, 104, 101, 105, 103, 104, // ${SVG} heigh
- 116, 61, 50, 52, 48, 32, 119, 105, 100, 116, 104, 61, // t=240 width=
- 54, 48, 48, 32, 121, 109, 105, 110, 61, 48, 32, 121, // 600 ymin=0 y
- 109, 97, 120, 61, 50, 48, 32, 120, 109, 97, 120, 61, // max=20 xmax=
- 36, 123, 120, 109, 97, 120, 125, 32, 100, 97, 116, 97, // ${xmax} data
- 61, 36, 123, 100, 97, 116, 97, 125, 32, 47, 62, 10, // =${data} />.
- 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. <
- 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m
- 115, 103, 34, 62, 10, 32, 32, 32, 32, 84, 104, 105, // sg">. Thi
- 115, 32, 99, 104, 97, 114, 116, 32, 112, 108, 111, 116, // s chart plot
- 115, 32, 108, 105, 118, 101, 32, 115, 101, 110, 115, 111, // s live senso
- 114, 32, 100, 97, 116, 97, 44, 32, 115, 101, 110, 116, // r data, sent
- 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, 105, // by the devi
- 99, 101, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, // ce via /api/
- 119, 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, // watch.. .
`;
- 10, 125, 59, 10, 10, 99, 111, 110, 115, 116, 32, 65, // .};..const A
- 112, 112, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // pp = 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 [
- 99, 111, 110, 102, 105, 103, 44, 32, 115, 101, 116, 67, // config, setC
- 111, 110, 102, 105, 103, 93, 32, 61, 32, 117, 115, 101, // onfig] = use
- 83, 116, 97, 116, 101, 40, 123, 125, 41, 59, 10, 10, // State({});..
- 32, 32, 99, 111, 110, 115, 116, 32, 103, 101, 116, 99, // const getc
- 111, 110, 102, 105, 103, 32, 61, 32, 40, 41, 32, 61, // onfig = () =
- 62, 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, // >. fetc
- 104, 40, 39, 47, 97, 112, 105, 47, 99, 111, 110, 102, // h('/api/conf
- 105, 103, 47, 103, 101, 116, 39, 44, 32, 123, 104, 101, // ig/get', {he
- 97, 100, 101, 114, 115, 58, 32, 123, 65, 117, 116, 104, // aders: {Auth
- 111, 114, 105, 122, 97, 116, 105, 111, 110, 58, 32, 39, // orization: '
- 39, 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, // '}}).
- 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, // .then(r =
- 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, // > r.json()).
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, // .t
- 104, 101, 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, // hen(r => set
- 67, 111, 110, 102, 105, 103, 40, 114, 41, 41, 10, 32, // Config(r)).
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, // .ca
- 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, 99, // tch(err => c
- 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 101, // onsole.log(e
- 114, 114, 41, 41, 59, 10, 10, 32, 32, 99, 111, 110, // rr));.. con
- 115, 116, 32, 108, 111, 103, 105, 110, 32, 61, 32, 102, // st login = f
- 117, 110, 99, 116, 105, 111, 110, 40, 117, 41, 32, 123, // unction(u) {
- 10, 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, 110, // . documen
- 116, 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, 96, // t.cookie = `
- 97, 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, 110, // access_token
- 61, 36, 123, 117, 46, 116, 111, 107, 101, 110, 125, 59, // =${u.token};
- 112, 97, 116, 104, 61, 47, 59, 109, 97, 120, 45, 97, // path=/;max-a
- 103, 101, 61, 51, 54, 48, 48, 96, 59, 10, 32, 32, // ge=3600`;.
- 32, 32, 115, 101, 116, 85, 115, 101, 114, 40, 117, 46, // setUser(u.
- 117, 115, 101, 114, 41, 59, 10, 32, 32, 32, 32, 114, // user);. r
- 101, 116, 117, 114, 110, 32, 103, 101, 116, 99, 111, 110, // eturn getcon
- 102, 105, 103, 40, 41, 59, 10, 32, 32, 125, 59, 10, // fig();. };.
- 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, 111, 103, // . const log
- 111, 117, 116, 32, 61, 32, 101, 118, 32, 61, 62, 32, // out = ev =>
- 123, 10, 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, // {. docume
- 110, 116, 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, // nt.cookie =
- 96, 97, 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, // `access_toke
- 110, 61, 59, 112, 97, 116, 104, 61, 47, 59, 109, 97, // n=;path=/;ma
- 120, 45, 97, 103, 101, 61, 48, 96, 59, 10, 32, 32, // x-age=0`;.
- 32, 32, 115, 101, 116, 85, 115, 101, 114, 40, 39, 39, // setUser(''
- 41, 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 47, // );. };.. /
- 47, 32, 87, 97, 116, 99, 104, 32, 102, 111, 114, 32, // / Watch for
- 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, // notification
- 115, 46, 32, 65, 115, 32, 115, 111, 111, 110, 32, 97, // s. As soon a
- 115, 32, 97, 32, 110, 111, 116, 105, 102, 105, 99, 97, // s a notifica
- 116, 105, 111, 110, 32, 97, 114, 114, 105, 118, 101, 115, // tion arrives
- 44, 32, 112, 97, 115, 115, 32, 105, 116, 32, 111, 110, // , pass it on
- 10, 32, 32, 47, 47, 32, 116, 111, 32, 97, 108, 108, // . // to all
- 32, 115, 117, 98, 115, 99, 114, 105, 98, 101, 100, 32, // subscribed
- 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 10, 32, // components.
- 32, 99, 111, 110, 115, 116, 32, 119, 97, 116, 99, 104, // const watch
- 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, // = function(
- 41, 32, 123, 10, 32, 32, 32, 32, 118, 97, 114, 32, // ) {. var
- 108, 32, 61, 32, 119, 105, 110, 100, 111, 119, 46, 108, // l = window.l
- 111, 99, 97, 116, 105, 111, 110, 44, 32, 112, 114, 111, // ocation, pro
- 116, 111, 32, 61, 32, 108, 46, 112, 114, 111, 116, 111, // to = l.proto
- 99, 111, 108, 46, 114, 101, 112, 108, 97, 99, 101, 40, // col.replace(
- 39, 104, 116, 116, 112, 39, 44, 32, 39, 119, 115, 39, // 'http', 'ws'
- 41, 59, 10, 32, 32, 32, 32, 118, 97, 114, 32, 116, // );. var t
- 105, 100, 44, 32, 119, 115, 85, 82, 73, 32, 61, 32, // id, wsURI =
- 112, 114, 111, 116, 111, 32, 43, 32, 39, 47, 47, 39, // proto + '//'
- 32, 43, 32, 108, 46, 104, 111, 115, 116, 32, 43, 32, // + l.host +
- 39, 47, 97, 112, 105, 47, 119, 97, 116, 99, 104, 39, // '/api/watch'
- 10, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, 99, // . var rec
- 111, 110, 110, 101, 99, 116, 32, 61, 32, 102, 117, 110, // onnect = fun
- 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, // ction() {.
- 32, 32, 32, 32, 118, 97, 114, 32, 119, 115, 32, 61, // var ws =
- 32, 110, 101, 119, 32, 87, 101, 98, 83, 111, 99, 107, // new WebSock
- 101, 116, 40, 119, 115, 85, 82, 73, 41, 59, 10, 32, // et(wsURI);.
- 32, 32, 32, 32, 32, 119, 115, 46, 111, 110, 111, 112, // ws.onop
- 101, 110, 32, 61, 32, 40, 41, 32, 61, 62, 32, 99, // en = () => c
- 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 39, // onsole.log('
- 119, 115, 32, 99, 111, 110, 110, 101, 99, 116, 101, 100, // ws connected
- 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 119, 115, // ');. ws
- 46, 111, 110, 109, 101, 115, 115, 97, 103, 101, 32, 61, // .onmessage =
- 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 118, // function(ev
- 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ) {.
- 116, 114, 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, // try {.
- 32, 32, 32, 32, 118, 97, 114, 32, 109, 115, 103, 32, // var msg
- 61, 32, 74, 83, 79, 78, 46, 112, 97, 114, 115, 101, // = JSON.parse
- 40, 101, 118, 46, 100, 97, 116, 97, 41, 59, 10, 32, // (ev.data);.
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 80, 117, 98, // Pub
- 83, 117, 98, 46, 112, 117, 98, 108, 105, 115, 104, 40, // Sub.publish(
- 109, 115, 103, 41, 59, 10, 32, 32, 32, 32, 32, 32, // msg);.
- 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, // if (msg.
- 110, 97, 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, // name != 'met
- 114, 105, 99, 115, 39, 41, 32, 99, 111, 110, 115, 111, // rics') conso
- 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, 45, 62, // le.log('ws->
- 39, 44, 32, 109, 115, 103, 41, 59, 10, 32, 32, 32, // ', msg);.
- 32, 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, // } catch
- 32, 40, 101, 41, 32, 123, 10, 32, 32, 32, 32, 32, // (e) {.
- 32, 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, // console
- 46, 108, 111, 103, 40, 39, 73, 110, 118, 97, 108, 105, // .log('Invali
- 100, 32, 119, 115, 32, 102, 114, 97, 109, 101, 58, 39, // d ws frame:'
- 44, 32, 101, 118, 46, 100, 97, 116, 97, 41, 59, 32, // , ev.data);
- 32, 47, 47, 32, 101, 115, 108, 105, 110, 116, 45, 100, // // eslint-d
- 105, 115, 97, 98, 108, 101, 45, 108, 105, 110, 101, 10, // isable-line.
- 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, // }.
- 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, 32, 32, // };.
- 32, 119, 115, 46, 111, 110, 99, 108, 111, 115, 101, 32, // ws.onclose
- 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // = function()
- 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, // {. c
- 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout(
- 116, 105, 100, 41, 59, 10, 32, 32, 32, 32, 32, 32, // tid);.
- 32, 32, 116, 105, 100, 32, 61, 32, 115, 101, 116, 84, // tid = setT
- 105, 109, 101, 111, 117, 116, 40, 114, 101, 99, 111, 110, // imeout(recon
- 110, 101, 99, 116, 44, 32, 49, 48, 48, 48, 41, 59, // nect, 1000);
- 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, // . con
- 115, 111, 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, // sole.log('ws
- 32, 100, 105, 115, 99, 111, 110, 110, 101, 99, 116, 101, // disconnecte
- 100, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 125, // d');. }
- 59, 10, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // ;. };.
- 32, 114, 101, 99, 111, 110, 110, 101, 99, 116, 40, 41, // reconnect()
- 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 117, 115, // ;. };.. us
- 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, 61, // eEffect(() =
- 62, 32, 123, 10, 32, 32, 32, 32, 47, 47, 32, 67, // > {. // C
- 97, 108, 108, 101, 100, 32, 111, 110, 99, 101, 32, 97, // alled once a
- 116, 32, 105, 110, 105, 116, 32, 116, 105, 109, 101, 10, // t init time.
- 32, 32, 32, 32, 80, 117, 98, 83, 117, 98, 46, 115, // PubSub.s
- 117, 98, 115, 99, 114, 105, 98, 101, 40, 109, 115, 103, // ubscribe(msg
- 32, 61, 62, 32, 109, 115, 103, 46, 110, 97, 109, 101, // => msg.name
- 32, 61, 61, 32, 39, 99, 111, 110, 102, 105, 103, 39, // == 'config'
- 32, 38, 38, 32, 103, 101, 116, 99, 111, 110, 102, 105, // && getconfi
- 103, 40, 41, 41, 59, 10, 32, 32, 32, 32, 102, 101, // g());. fe
- 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 108, 111, // tch('/api/lo
- 103, 105, 110, 39, 44, 32, 123, 104, 101, 97, 100, 101, // gin', {heade
- 114, 115, 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, // rs: {Authori
- 122, 97, 116, 105, 111, 110, 58, 32, 39, 39, 125, 125, // zation: ''}}
- 41, 10, 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, 46, 116, 104, 101, 110, 40, 114, 32, 61, // .then(r =
- 62, 32, 108, 111, 103, 105, 110, 40, 114, 41, 41, 10, // > login(r)).
- 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, // .the
- 110, 40, 119, 97, 116, 99, 104, 41, 10, 32, 32, 32, // n(watch).
- 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, // .catch(
- 101, 114, 114, 32, 61, 62, 32, 115, 101, 116, 85, 115, // err => setUs
- 101, 114, 40, 39, 39, 41, 41, 59, 10, 32, 32, 125, // er(''));. }
- 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, 105, 102, // , []);.. if
- 32, 40, 33, 117, 115, 101, 114, 41, 32, 114, 101, 116, // (!user) ret
- 117, 114, 110, 32, 104, 116, 109, 108, 96, 60, 36, 123, // urn html`<${
- 76, 111, 103, 105, 110, 125, 32, 108, 111, 103, 105, 110, // Login} login
- 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, 62, // =${login} />
- 96, 59, 10, 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, 100, 105, 118, 32, 99, 108, 97, 115, 115, //
.
- 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
<
- 36, 123, 72, 101, 114, 111, 125, 32, 47, 62, 60, 47, // ${Hero} />
- 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, 105, // div>.
<${C
- 104, 97, 114, 116, 125, 32, 47, 62, 60, 47, 100, 105, // hart} />.
.
- 32, 36, 123, 117, 115, 101, 114, 32, 61, 61, 32, 39, // ${user == '
- 97, 100, 109, 105, 110, 39, 32, 38, 38, 32, 104, 40, // admin' && h(
- 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio
- 110, 44, 32, 123, 99, 111, 110, 102, 105, 103, 125, 41, // n, {config})
- 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, // }.
- 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, // .
<${Messa
- 103, 101, 115, 125, 32, 99, 111, 110, 102, 105, 103, 61, // ges} config=
- 36, 123, 99, 111, 110, 102, 105, 103, 125, 32, 47, 62, // ${config} />
- 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, //
. .
`;
- 10, 125, 59, 10, 10, 119, 105, 110, 100, 111, 119, 46, // .};..window.
- 111, 110, 108, 111, 97, 100, 32, 61, 32, 40, 41, 32, // onload = ()
- 61, 62, 32, 114, 101, 110, 100, 101, 114, 40, 104, 40, // => render(h(
- 65, 112, 112, 41, 44, 32, 100, 111, 99, 117, 109, 101, // App), docume
- 110, 116, 46, 98, 111, 100, 121, 41, 59, 10, 0 // nt.body);.
+ 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, // .. <
+ 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, // head>.
Device
+ 68, 97, 115, 104, 98, 111, 97, 114, 100, 60, 47, 116, // Dashboard.
.
+ 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, //
.
+ 32, 32, 32, 60, 109, 101, 116, 97, 32, 110, 97, 109, //
.
.
+ 10, 32, 32, 60, 98, 111, 100, 121, 62, 60, 47, 98, // . .
.
+ 10, 0 // .
};
static const unsigned char v2[] = {
- 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t,
- 111, 44, 114, 44, 117, 44, 108, 61, 123, 125, 44, 105, // o,r,u,l={},i
- 61, 91, 93, 44, 99, 61, 47, 97, 99, 105, 116, 124, // =[],c=/acit|
- 101, 120, 40, 63, 58, 115, 124, 103, 124, 110, 124, 112, // ex(?:s|g|n|p
- 124, 36, 41, 124, 114, 112, 104, 124, 103, 114, 105, 100, // |$)|rph|grid
- 124, 111, 119, 115, 124, 109, 110, 99, 124, 110, 116, 119, // |ows|mnc|ntw
- 124, 105, 110, 101, 91, 99, 104, 93, 124, 122, 111, 111, // |ine[ch]|zoo
- 124, 94, 111, 114, 100, 124, 105, 116, 101, 114, 97, 47, // |^ord|itera/
- 105, 59, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, // i;function s
- 40, 101, 44, 110, 41, 123, 102, 111, 114, 40, 118, 97, // (e,n){for(va
- 114, 32, 95, 32, 105, 110, 32, 110, 41, 101, 91, 95, // r _ in n)e[_
- 93, 61, 110, 91, 95, 93, 59, 114, 101, 116, 117, 114, // ]=n[_];retur
- 110, 32, 101, 125, 102, 117, 110, 99, 116, 105, 111, 110, // n e}function
- 32, 102, 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, // f(e){var n=
- 101, 46, 112, 97, 114, 101, 110, 116, 78, 111, 100, 101, // e.parentNode
- 59, 110, 38, 38, 110, 46, 114, 101, 109, 111, 118, 101, // ;n&&n.remove
- 67, 104, 105, 108, 100, 40, 101, 41, 125, 102, 117, 110, // Child(e)}fun
- 99, 116, 105, 111, 110, 32, 97, 40, 110, 44, 95, 44, // ction a(n,_,
- 116, 41, 123, 118, 97, 114, 32, 111, 44, 114, 44, 117, // t){var o,r,u
- 44, 108, 61, 123, 125, 59, 102, 111, 114, 40, 117, 32, // ,l={};for(u
- 105, 110, 32, 95, 41, 34, 107, 101, 121, 34, 61, 61, // in _)"key"==
- 117, 63, 111, 61, 95, 91, 117, 93, 58, 34, 114, 101, // u?o=_[u]:"re
- 102, 34, 61, 61, 117, 63, 114, 61, 95, 91, 117, 93, // f"==u?r=_[u]
- 58, 108, 91, 117, 93, 61, 95, 91, 117, 93, 59, 105, // :l[u]=_[u];i
- 102, 40, 97, 114, 103, 117, 109, 101, 110, 116, 115, 46, // f(arguments.
- 108, 101, 110, 103, 116, 104, 62, 50, 38, 38, 40, 108, // length>2&&(l
- 46, 99, 104, 105, 108, 100, 114, 101, 110, 61, 97, 114, // .children=ar
- 103, 117, 109, 101, 110, 116, 115, 46, 108, 101, 110, 103, // guments.leng
- 116, 104, 62, 51, 63, 101, 46, 99, 97, 108, 108, 40, // th>3?e.call(
- 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 50, 41, // arguments,2)
- 58, 116, 41, 44, 34, 102, 117, 110, 99, 116, 105, 111, // :t),"functio
- 110, 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, // n"==typeof n
- 38, 38, 110, 117, 108, 108, 33, 61, 110, 46, 100, 101, // &&null!=n.de
- 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 102, // faultProps)f
- 111, 114, 40, 117, 32, 105, 110, 32, 110, 46, 100, 101, // or(u in n.de
- 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 118, // faultProps)v
- 111, 105, 100, 32, 48, 61, 61, 61, 108, 91, 117, 93, // oid 0===l[u]
- 38, 38, 40, 108, 91, 117, 93, 61, 110, 46, 100, 101, // &&(l[u]=n.de
- 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 91, 117, // faultProps[u
- 93, 41, 59, 114, 101, 116, 117, 114, 110, 32, 112, 40, // ]);return p(
- 110, 44, 108, 44, 111, 44, 114, 44, 110, 117, 108, 108, // n,l,o,r,null
- 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 112, // )}function p
- 40, 101, 44, 116, 44, 111, 44, 114, 44, 117, 41, 123, // (e,t,o,r,u){
- 118, 97, 114, 32, 108, 61, 123, 116, 121, 112, 101, 58, // var l={type:
- 101, 44, 112, 114, 111, 112, 115, 58, 116, 44, 107, 101, // e,props:t,ke
- 121, 58, 111, 44, 114, 101, 102, 58, 114, 44, 95, 95, // y:o,ref:r,__
- 107, 58, 110, 117, 108, 108, 44, 95, 95, 58, 110, 117, // k:null,__:nu
- 108, 108, 44, 95, 95, 98, 58, 48, 44, 95, 95, 101, // ll,__b:0,__e
- 58, 110, 117, 108, 108, 44, 95, 95, 100, 58, 118, 111, // :null,__d:vo
- 105, 100, 32, 48, 44, 95, 95, 99, 58, 110, 117, 108, // id 0,__c:nul
- 108, 44, 95, 95, 104, 58, 110, 117, 108, 108, 44, 99, // l,__h:null,c
- 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 58, 118, // onstructor:v
- 111, 105, 100, 32, 48, 44, 95, 95, 118, 58, 110, 117, // oid 0,__v:nu
- 108, 108, 61, 61, 117, 63, 43, 43, 95, 58, 117, 125, // ll==u?++_:u}
- 59, 114, 101, 116, 117, 114, 110, 32, 110, 117, 108, 108, // ;return null
- 33, 61, 110, 46, 118, 110, 111, 100, 101, 38, 38, 110, // !=n.vnode&&n
- 46, 118, 110, 111, 100, 101, 40, 108, 41, 44, 108, 125, // .vnode(l),l}
- 102, 117, 110, 99, 116, 105, 111, 110, 32, 104, 40, 101, // function h(e
- 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, 46, 99, // ){return e.c
- 104, 105, 108, 100, 114, 101, 110, 125, 102, 117, 110, 99, // hildren}func
- 116, 105, 111, 110, 32, 100, 40, 101, 44, 110, 41, 123, // tion d(e,n){
- 116, 104, 105, 115, 46, 112, 114, 111, 112, 115, 61, 101, // this.props=e
- 44, 116, 104, 105, 115, 46, 99, 111, 110, 116, 101, 120, // ,this.contex
- 116, 61, 110, 125, 102, 117, 110, 99, 116, 105, 111, 110, // t=n}function
- 32, 118, 40, 101, 44, 110, 41, 123, 105, 102, 40, 110, // v(e,n){if(n
- 117, 108, 108, 61, 61, 110, 41, 114, 101, 116, 117, 114, // ull==n)retur
- 110, 32, 101, 46, 95, 95, 63, 118, 40, 101, 46, 95, // n e.__?v(e._
- 95, 44, 101, 46, 95, 95, 46, 95, 95, 107, 46, 105, // _,e.__.__k.i
- 110, 100, 101, 120, 79, 102, 40, 101, 41, 43, 49, 41, // ndexOf(e)+1)
- 58, 110, 117, 108, 108, 59, 102, 111, 114, 40, 118, 97, // :null;for(va
- 114, 32, 95, 59, 110, 60, 101, 46, 95, 95, 107, 46, // r _;n0?p(m.
- 116, 121, 112, 101, 44, 109, 46, 112, 114, 111, 112, 115, // type,m.props
- 44, 109, 46, 107, 101, 121, 44, 110, 117, 108, 108, 44, // ,m.key,null,
- 109, 46, 95, 95, 118, 41, 58, 109, 41, 41, 123, 105, // m.__v):m)){i
- 102, 40, 109, 46, 95, 95, 61, 95, 44, 109, 46, 95, // f(m.__=_,m._
- 95, 98, 61, 95, 46, 95, 95, 98, 43, 49, 44, 110, // _b=_.__b+1,n
- 117, 108, 108, 61, 61, 61, 40, 121, 61, 72, 91, 97, // ull===(y=H[a
- 93, 41, 124, 124, 121, 38, 38, 109, 46, 107, 101, 121, // ])||y&&m.key
- 61, 61, 121, 46, 107, 101, 121, 38, 38, 109, 46, 116, // ==y.key&&m.t
- 121, 112, 101, 61, 61, 61, 121, 46, 116, 121, 112, 101, // ype===y.type
- 41, 72, 91, 97, 93, 61, 118, 111, 105, 100, 32, 48, // )H[a]=void 0
- 59, 101, 108, 115, 101, 32, 102, 111, 114, 40, 100, 61, // ;else for(d=
- 48, 59, 100, 60, 69, 59, 100, 43, 43, 41, 123, 105, // 0;d=t.__.len
- 103, 116, 104, 38, 38, 116, 46, 95, 95, 46, 112, 117, // gth&&t.__.pu
- 115, 104, 40, 123, 125, 41, 44, 116, 46, 95, 95, 91, // sh({}),t.__[
- 101, 93, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // e]}function
- 71, 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, // G(e){return
- 82, 61, 49, 44, 122, 40, 105, 101, 44, 101, 41, 125, // R=1,z(ie,e)}
- 102, 117, 110, 99, 116, 105, 111, 110, 32, 122, 40, 101, // function z(e
- 44, 110, 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, // ,n,_){var t=
- 106, 40, 76, 43, 43, 44, 50, 41, 59, 114, 101, 116, // j(L++,2);ret
- 117, 114, 110, 32, 116, 46, 116, 61, 101, 44, 116, 46, // urn t.t=e,t.
- 95, 95, 99, 124, 124, 40, 116, 46, 95, 95, 61, 91, // __c||(t.__=[
- 95, 63, 95, 40, 110, 41, 58, 105, 101, 40, 118, 111, // _?_(n):ie(vo
- 105, 100, 32, 48, 44, 110, 41, 44, 102, 117, 110, 99, // id 0,n),func
- 116, 105, 111, 110, 40, 101, 41, 123, 118, 97, 114, 32, // tion(e){var
- 110, 61, 116, 46, 116, 40, 116, 46, 95, 95, 91, 48, // n=t.t(t.__[0
- 93, 44, 101, 41, 59, 116, 46, 95, 95, 91, 48, 93, // ],e);t.__[0]
- 33, 61, 61, 110, 38, 38, 40, 116, 46, 95, 95, 61, // !==n&&(t.__=
- 91, 110, 44, 116, 46, 95, 95, 91, 49, 93, 93, 44, // [n,t.__[1]],
- 116, 46, 95, 95, 99, 46, 115, 101, 116, 83, 116, 97, // t.__c.setSta
- 116, 101, 40, 123, 125, 41, 41, 125, 93, 44, 116, 46, // te({}))}],t.
- 95, 95, 99, 61, 78, 41, 44, 116, 46, 95, 95, 125, // __c=N),t.__}
- 102, 117, 110, 99, 116, 105, 111, 110, 32, 74, 40, 101, // function J(e
- 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, 106, 40, // ,_){var t=j(
- 76, 43, 43, 44, 51, 41, 59, 33, 110, 46, 95, 95, // L++,3);!n.__
- 115, 38, 38, 108, 101, 40, 116, 46, 95, 95, 72, 44, // s&&le(t.__H,
- 95, 41, 38, 38, 40, 116, 46, 95, 95, 61, 101, 44, // _)&&(t.__=e,
- 116, 46, 95, 95, 72, 61, 95, 44, 78, 46, 95, 95, // t.__H=_,N.__
- 72, 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, // H.__h.push(t
- 41, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ))}function
- 75, 40, 101, 44, 95, 41, 123, 118, 97, 114, 32, 116, // K(e,_){var t
- 61, 106, 40, 76, 43, 43, 44, 52, 41, 59, 33, 110, // =j(L++,4);!n
- 46, 95, 95, 115, 38, 38, 108, 101, 40, 116, 46, 95, // .__s&&le(t._
- 95, 72, 44, 95, 41, 38, 38, 40, 116, 46, 95, 95, // _H,_)&&(t.__
- 61, 101, 44, 116, 46, 95, 95, 72, 61, 95, 44, 78, // =e,t.__H=_,N
- 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, 41, // .__h.push(t)
- 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 81, // )}function Q
- 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // (e){return R
- 61, 53, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =5,Y(functio
- 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 123, 99, // n(){return{c
- 117, 114, 114, 101, 110, 116, 58, 101, 125, 125, 44, 91, // urrent:e}},[
- 93, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ])}function
- 88, 40, 101, 44, 110, 44, 95, 41, 123, 82, 61, 54, // X(e,n,_){R=6
- 44, 75, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, // ,K(function(
- 41, 123, 34, 102, 117, 110, 99, 116, 105, 111, 110, 34, // ){"function"
- 61, 61, 116, 121, 112, 101, 111, 102, 32, 101, 63, 101, // ==typeof e?e
- 40, 110, 40, 41, 41, 58, 101, 38, 38, 40, 101, 46, // (n()):e&&(e.
- 99, 117, 114, 114, 101, 110, 116, 61, 110, 40, 41, 41, // current=n())
- 125, 44, 110, 117, 108, 108, 61, 61, 95, 63, 95, 58, // },null==_?_:
- 95, 46, 99, 111, 110, 99, 97, 116, 40, 101, 41, 41, // _.concat(e))
- 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 89, 40, // }function Y(
- 101, 44, 110, 41, 123, 118, 97, 114, 32, 95, 61, 106, // e,n){var _=j
- 40, 76, 43, 43, 44, 55, 41, 59, 114, 101, 116, 117, // (L++,7);retu
- 114, 110, 32, 108, 101, 40, 95, 46, 95, 95, 72, 44, // rn le(_.__H,
- 110, 41, 38, 38, 40, 95, 46, 95, 95, 61, 101, 40, // n)&&(_.__=e(
- 41, 44, 95, 46, 95, 95, 72, 61, 110, 44, 95, 46, // ),_.__H=n,_.
- 95, 95, 104, 61, 101, 41, 44, 95, 46, 95, 95, 125, // __h=e),_.__}
- 102, 117, 110, 99, 116, 105, 111, 110, 32, 90, 40, 101, // function Z(e
- 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // ,n){return R
- 61, 56, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =8,Y(functio
- 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, // n(){return e
- 125, 44, 110, 41, 125, 102, 117, 110, 99, 116, 105, 111, // },n)}functio
- 110, 32, 101, 101, 40, 101, 41, 123, 118, 97, 114, 32, // n ee(e){var
- 110, 61, 78, 46, 99, 111, 110, 116, 101, 120, 116, 91, // n=N.context[
- 101, 46, 95, 95, 99, 93, 44, 95, 61, 106, 40, 76, // e.__c],_=j(L
- 43, 43, 44, 57, 41, 59, 114, 101, 116, 117, 114, 110, // ++,9);return
- 32, 95, 46, 99, 61, 101, 44, 110, 63, 40, 110, 117, // _.c=e,n?(nu
- 108, 108, 61, 61, 95, 46, 95, 95, 38, 38, 40, 95, // ll==_.__&&(_
- 46, 95, 95, 61, 33, 48, 44, 110, 46, 115, 117, 98, // .__=!0,n.sub
- 40, 78, 41, 41, 44, 110, 46, 112, 114, 111, 112, 115, // (N)),n.props
- 46, 118, 97, 108, 117, 101, 41, 58, 101, 46, 95, 95, // .value):e.__
- 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 110, 101, // }function ne
- 40, 101, 44, 95, 41, 123, 110, 46, 117, 115, 101, 68, // (e,_){n.useD
- 101, 98, 117, 103, 86, 97, 108, 117, 101, 38, 38, 110, // ebugValue&&n
- 46, 117, 115, 101, 68, 101, 98, 117, 103, 86, 97, 108, // .useDebugVal
- 117, 101, 40, 95, 63, 95, 40, 101, 41, 58, 101, 41, // ue(_?_(e):e)
- 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 95, 101, // }function _e
- 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, 106, 40, // (e){var n=j(
- 76, 43, 43, 44, 49, 48, 41, 44, 95, 61, 71, 40, // L++,10),_=G(
- 41, 59, 114, 101, 116, 117, 114, 110, 32, 110, 46, 95, // );return n._
- 95, 61, 101, 44, 78, 46, 99, 111, 109, 112, 111, 110, // _=e,N.compon
- 101, 110, 116, 68, 105, 100, 67, 97, 116, 99, 104, 124, // entDidCatch|
- 124, 40, 78, 46, 99, 111, 109, 112, 111, 110, 101, 110, // |(N.componen
- 116, 68, 105, 100, 67, 97, 116, 99, 104, 61, 102, 117, // tDidCatch=fu
- 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 110, 46, // nction(e){n.
- 95, 95, 38, 38, 110, 46, 95, 95, 40, 101, 41, 44, // __&&n.__(e),
- 95, 91, 49, 93, 40, 101, 41, 125, 41, 44, 91, 95, // _[1](e)}),[_
- 91, 48, 93, 44, 102, 117, 110, 99, 116, 105, 111, 110, // [0],function
- 40, 41, 123, 95, 91, 49, 93, 40, 118, 111, 105, 100, // (){_[1](void
- 32, 48, 41, 125, 93, 125, 102, 117, 110, 99, 116, 105, // 0)}]}functi
- 111, 110, 32, 116, 101, 40, 41, 123, 73, 46, 102, 111, // on te(){I.fo
- 114, 69, 97, 99, 104, 40, 102, 117, 110, 99, 116, 105, // rEach(functi
- 111, 110, 40, 101, 41, 123, 105, 102, 40, 101, 46, 95, // on(e){if(e._
- 95, 80, 41, 116, 114, 121, 123, 101, 46, 95, 95, 72, // _P)try{e.__H
- 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach
- 40, 114, 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, // (re),e.__H._
- 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, 40, 117, // _h.forEach(u
- 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, 95, 104, // e),e.__H.__h
- 61, 91, 93, 125, 99, 97, 116, 99, 104, 40, 95, 41, // =[]}catch(_)
- 123, 101, 46, 95, 95, 72, 46, 95, 95, 104, 61, 91, // {e.__H.__h=[
- 93, 44, 110, 46, 95, 95, 101, 40, 95, 44, 101, 46, // ],n.__e(_,e.
- 95, 95, 118, 41, 125, 125, 41, 44, 73, 61, 91, 93, // __v)}}),I=[]
- 125, 110, 46, 95, 95, 98, 61, 102, 117, 110, 99, 116, // }n.__b=funct
- 105, 111, 110, 40, 101, 41, 123, 78, 61, 110, 117, 108, // ion(e){N=nul
- 108, 44, 79, 38, 38, 79, 40, 101, 41, 125, 44, 110, // l,O&&O(e)},n
- 46, 95, 95, 114, 61, 102, 117, 110, 99, 116, 105, 111, // .__r=functio
- 110, 40, 101, 41, 123, 86, 38, 38, 86, 40, 101, 41, // n(e){V&&V(e)
- 44, 76, 61, 48, 59, 118, 97, 114, 32, 110, 61, 40, // ,L=0;var n=(
- 78, 61, 101, 46, 95, 95, 99, 41, 46, 95, 95, 72, // N=e.__c).__H
- 59, 110, 38, 38, 40, 110, 46, 95, 95, 104, 46, 102, // ;n&&(n.__h.f
- 111, 114, 69, 97, 99, 104, 40, 114, 101, 41, 44, 110, // orEach(re),n
- 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach
- 40, 117, 101, 41, 44, 110, 46, 95, 95, 104, 61, 91, // (ue),n.__h=[
- 93, 41, 125, 44, 110, 46, 100, 105, 102, 102, 101, 100, // ])},n.diffed
- 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, // =function(e)
- 123, 113, 38, 38, 113, 40, 101, 41, 59, 118, 97, 114, // {q&&q(e);var
- 32, 95, 61, 101, 46, 95, 95, 99, 59, 95, 38, 38, // _=e.__c;_&&
- 95, 46, 95, 95, 72, 38, 38, 95, 46, 95, 95, 72, // _.__H&&_.__H
- 46, 95, 95, 104, 46, 108, 101, 110, 103, 116, 104, 38, // .__h.length&
- 38, 40, 49, 33, 61, 61, 73, 46, 112, 117, 115, 104, // &(1!==I.push
- 40, 95, 41, 38, 38, 87, 61, 61, 61, 110, 46, 114, // (_)&&W===n.r
- 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, // equestAnimat
- 105, 111, 110, 70, 114, 97, 109, 101, 124, 124, 40, 40, // ionFrame||((
- 87, 61, 110, 46, 114, 101, 113, 117, 101, 115, 116, 65, // W=n.requestA
- 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, 97, 109, // nimationFram
- 101, 41, 124, 124, 102, 117, 110, 99, 116, 105, 111, 110, // e)||function
- 40, 101, 41, 123, 118, 97, 114, 32, 110, 44, 95, 61, // (e){var n,_=
- 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 123, 99, // function(){c
- 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout(
- 116, 41, 44, 111, 101, 38, 38, 99, 97, 110, 99, 101, // t),oe&&cance
- 108, 65, 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, // lAnimationFr
- 97, 109, 101, 40, 110, 41, 44, 115, 101, 116, 84, 105, // ame(n),setTi
- 109, 101, 111, 117, 116, 40, 101, 41, 125, 44, 116, 61, // meout(e)},t=
- 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 95, // setTimeout(_
- 44, 49, 48, 48, 41, 59, 111, 101, 38, 38, 40, 110, // ,100);oe&&(n
- 61, 114, 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, // =requestAnim
- 97, 116, 105, 111, 110, 70, 114, 97, 109, 101, 40, 95, // ationFrame(_
- 41, 41, 125, 41, 40, 116, 101, 41, 41, 44, 78, 61, // ))})(te)),N=
- 118, 111, 105, 100, 32, 48, 125, 44, 110, 46, 95, 95, // void 0},n.__
- 99, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // c=function(e
- 44, 95, 41, 123, 95, 46, 115, 111, 109, 101, 40, 102, // ,_){_.some(f
- 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 116, // unction(e){t
- 114, 121, 123, 101, 46, 95, 95, 104, 46, 102, 111, 114, // ry{e.__h.for
- 69, 97, 99, 104, 40, 114, 101, 41, 44, 101, 46, 95, // Each(re),e._
- 95, 104, 61, 101, 46, 95, 95, 104, 46, 102, 105, 108, // _h=e.__h.fil
- 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ter(function
- 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 33, 101, // (e){return!e
- 46, 95, 95, 124, 124, 117, 101, 40, 101, 41, 125, 41, // .__||ue(e)})
- 125, 99, 97, 116, 99, 104, 40, 116, 41, 123, 95, 46, // }catch(t){_.
- 115, 111, 109, 101, 40, 102, 117, 110, 99, 116, 105, 111, // some(functio
- 110, 40, 101, 41, 123, 101, 46, 95, 95, 104, 38, 38, // n(e){e.__h&&
- 40, 101, 46, 95, 95, 104, 61, 91, 93, 41, 125, 41, // (e.__h=[])})
- 44, 95, 61, 91, 93, 44, 110, 46, 95, 95, 101, 40, // ,_=[],n.__e(
- 116, 44, 101, 46, 95, 95, 118, 41, 125, 125, 41, 44, // t,e.__v)}}),
- 66, 38, 38, 66, 40, 101, 44, 95, 41, 125, 44, 110, // B&&B(e,_)},n
- 46, 117, 110, 109, 111, 117, 110, 116, 61, 102, 117, 110, // .unmount=fun
- 99, 116, 105, 111, 110, 40, 101, 41, 123, 36, 38, 38, // ction(e){$&&
- 36, 40, 101, 41, 59, 118, 97, 114, 32, 95, 61, 101, // $(e);var _=e
- 46, 95, 95, 99, 59, 105, 102, 40, 95, 38, 38, 95, // .__c;if(_&&_
- 46, 95, 95, 72, 41, 116, 114, 121, 123, 95, 46, 95, // .__H)try{_._
- 95, 72, 46, 95, 95, 46, 102, 111, 114, 69, 97, 99, // _H.__.forEac
- 104, 40, 114, 101, 41, 125, 99, 97, 116, 99, 104, 40, // h(re)}catch(
- 101, 41, 123, 110, 46, 95, 95, 101, 40, 101, 44, 95, // e){n.__e(e,_
- 46, 95, 95, 118, 41, 125, 125, 59, 118, 97, 114, 32, // .__v)}};var
- 111, 101, 61, 34, 102, 117, 110, 99, 116, 105, 111, 110, // oe="function
- 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 114, 101, // "==typeof re
- 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, 105, // questAnimati
- 111, 110, 70, 114, 97, 109, 101, 59, 102, 117, 110, 99, // onFrame;func
- 116, 105, 111, 110, 32, 114, 101, 40, 101, 41, 123, 118, // tion re(e){v
- 97, 114, 32, 110, 61, 78, 59, 34, 102, 117, 110, 99, // ar n=N;"func
- 116, 105, 111, 110, 34, 61, 61, 116, 121, 112, 101, 111, // tion"==typeo
- 102, 32, 101, 46, 95, 95, 99, 38, 38, 101, 46, 95, // f e.__c&&e._
- 95, 99, 40, 41, 44, 78, 61, 110, 125, 102, 117, 110, // _c(),N=n}fun
- 99, 116, 105, 111, 110, 32, 117, 101, 40, 101, 41, 123, // ction ue(e){
- 118, 97, 114, 32, 110, 61, 78, 59, 101, 46, 95, 95, // var n=N;e.__
- 99, 61, 101, 46, 95, 95, 40, 41, 44, 78, 61, 110, // c=e.__(),N=n
- 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 108, 101, // }function le
- 40, 101, 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, // (e,n){return
- 33, 101, 124, 124, 101, 46, 108, 101, 110, 103, 116, 104, // !e||e.length
- 33, 61, 61, 110, 46, 108, 101, 110, 103, 116, 104, 124, // !==n.length|
- 124, 110, 46, 115, 111, 109, 101, 40, 102, 117, 110, 99, // |n.some(func
- 116, 105, 111, 110, 40, 110, 44, 95, 41, 123, 114, 101, // tion(n,_){re
- 116, 117, 114, 110, 32, 110, 33, 61, 61, 101, 91, 95, // turn n!==e[_
- 93, 125, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, // ]})}function
- 32, 105, 101, 40, 101, 44, 110, 41, 123, 114, 101, 116, // ie(e,n){ret
- 117, 114, 110, 34, 102, 117, 110, 99, 116, 105, 111, 110, // urn"function
- 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, 63, // "==typeof n?
- 110, 40, 101, 41, 58, 110, 125, 118, 97, 114, 32, 99, // n(e):n}var c
- 101, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // e=function(e
- 44, 110, 44, 95, 44, 116, 41, 123, 118, 97, 114, 32, // ,n,_,t){var
- 111, 59, 110, 91, 48, 93, 61, 48, 59, 102, 111, 114, // o;n[0]=0;for
- 40, 118, 97, 114, 32, 114, 61, 49, 59, 114, 60, 110, // (var r=1;r=5&&
- 40, 40, 111, 124, 124, 33, 101, 38, 38, 53, 61, 61, // ((o||!e&&5==
- 61, 116, 41, 38, 38, 40, 117, 46, 112, 117, 115, 104, // =t)&&(u.push
- 40, 116, 44, 48, 44, 111, 44, 95, 41, 44, 116, 61, // (t,0,o,_),t=
- 54, 41, 44, 101, 38, 38, 40, 117, 46, 112, 117, 115, // 6),e&&(u.pus
- 104, 40, 116, 44, 101, 44, 48, 44, 95, 41, 44, 116, // h(t,e,0,_),t
- 61, 54, 41, 41, 44, 111, 61, 34, 34, 125, 44, 105, // =6)),o=""},i
- 61, 48, 59, 105, 60, 101, 46, 108, 101, 110, 103, 116, // =0;i"===n?(t=1,
- 111, 61, 34, 34, 41, 58, 111, 61, 110, 43, 111, 91, // o=""):o=n+o[
- 48, 93, 58, 114, 63, 110, 61, 61, 61, 114, 63, 114, // 0]:r?n===r?r
- 61, 34, 34, 58, 111, 43, 61, 110, 58, 39, 34, 39, // ="":o+=n:'"'
- 61, 61, 61, 110, 124, 124, 34, 39, 34, 61, 61, 61, // ===n||"'"===
- 110, 63, 114, 61, 110, 58, 34, 62, 34, 61, 61, 61, // n?r=n:">"===
- 110, 63, 40, 108, 40, 41, 44, 116, 61, 49, 41, 58, // n?(l(),t=1):
- 116, 38, 38, 40, 34, 61, 34, 61, 61, 61, 110, 63, // t&&("="===n?
- 40, 116, 61, 53, 44, 95, 61, 111, 44, 111, 61, 34, // (t=5,_=o,o="
- 34, 41, 58, 34, 47, 34, 61, 61, 61, 110, 38, 38, // "):"/"===n&&
- 40, 116, 60, 53, 124, 124, 34, 62, 34, 61, 61, 61, // (t<5||">"===
- 101, 91, 105, 93, 91, 99, 43, 49, 93, 41, 63, 40, // e[i][c+1])?(
- 108, 40, 41, 44, 51, 61, 61, 61, 116, 38, 38, 40, // l(),3===t&&(
- 117, 61, 117, 91, 48, 93, 41, 44, 116, 61, 117, 44, // u=u[0]),t=u,
- 40, 117, 61, 117, 91, 48, 93, 41, 46, 112, 117, 115, // (u=u[0]).pus
- 104, 40, 50, 44, 48, 44, 116, 41, 44, 116, 61, 48, // h(2,0,t),t=0
- 41, 58, 34, 32, 34, 61, 61, 61, 110, 124, 124, 34, // ):" "===n||"
- 92, 116, 34, 61, 61, 61, 110, 124, 124, 34, 92, 110, // .t"===n||".n
- 34, 61, 61, 61, 110, 124, 124, 34, 92, 114, 34, 61, // "===n||".r"=
- 61, 61, 110, 63, 40, 108, 40, 41, 44, 116, 61, 50, // ==n?(l(),t=2
- 41, 58, 111, 43, 61, 110, 41, 44, 51, 61, 61, 61, // ):o+=n),3===
- 116, 38, 38, 34, 33, 45, 45, 34, 61, 61, 61, 111, // t&&"!--"===o
- 38, 38, 40, 116, 61, 52, 44, 117, 61, 117, 91, 48, // &&(t=4,u=u[0
- 93, 41, 125, 114, 101, 116, 117, 114, 110, 32, 108, 40, // ])}return l(
- 41, 44, 117, 125, 40, 101, 41, 41, 44, 110, 41, 44, // ),u}(e)),n),
- 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 91, 93, // arguments,[]
- 41, 41, 46, 108, 101, 110, 103, 116, 104, 62, 49, 63, // )).length>1?
- 110, 58, 110, 91, 48, 93, 125, 46, 98, 105, 110, 100, // n:n[0]}.bind
- 40, 97, 41, 59, 101, 120, 112, 111, 114, 116, 123, 97, // (a);export{a
- 32, 97, 115, 32, 104, 44, 102, 101, 32, 97, 115, 32, // as h,fe as
- 104, 116, 109, 108, 44, 77, 32, 97, 115, 32, 114, 101, // html,M as re
- 110, 100, 101, 114, 44, 100, 32, 97, 115, 32, 67, 111, // nder,d as Co
- 109, 112, 111, 110, 101, 110, 116, 44, 70, 32, 97, 115, // mponent,F as
- 32, 99, 114, 101, 97, 116, 101, 67, 111, 110, 116, 101, // createConte
- 120, 116, 44, 71, 32, 97, 115, 32, 117, 115, 101, 83, // xt,G as useS
- 116, 97, 116, 101, 44, 122, 32, 97, 115, 32, 117, 115, // tate,z as us
- 101, 82, 101, 100, 117, 99, 101, 114, 44, 74, 32, 97, // eReducer,J a
- 115, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // s useEffect,
- 75, 32, 97, 115, 32, 117, 115, 101, 76, 97, 121, 111, // K as useLayo
- 117, 116, 69, 102, 102, 101, 99, 116, 44, 81, 32, 97, // utEffect,Q a
- 115, 32, 117, 115, 101, 82, 101, 102, 44, 88, 32, 97, // s useRef,X a
- 115, 32, 117, 115, 101, 73, 109, 112, 101, 114, 97, 116, // s useImperat
- 105, 118, 101, 72, 97, 110, 100, 108, 101, 44, 89, 32, // iveHandle,Y
- 97, 115, 32, 117, 115, 101, 77, 101, 109, 111, 44, 90, // as useMemo,Z
- 32, 97, 115, 32, 117, 115, 101, 67, 97, 108, 108, 98, // as useCallb
- 97, 99, 107, 44, 101, 101, 32, 97, 115, 32, 117, 115, // ack,ee as us
- 101, 67, 111, 110, 116, 101, 120, 116, 44, 110, 101, 32, // eContext,ne
- 97, 115, 32, 117, 115, 101, 68, 101, 98, 117, 103, 86, // as useDebugV
- 97, 108, 117, 101, 44, 95, 101, 32, 97, 115, 32, 117, // alue,_e as u
- 115, 101, 69, 114, 114, 111, 114, 66, 111, 117, 110, 100, // seErrorBound
- 97, 114, 121, 125, 59, 10, 0 // ary};.
-};
-static const unsigned char v3[] = {
39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict'
59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co
109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h,
@@ -3469,7 +1230,1264 @@ static const unsigned char v3[] = {
65, 112, 112, 41, 44, 32, 100, 111, 99, 117, 109, 101, // App), docume
110, 116, 46, 98, 111, 100, 121, 41, 59, 10, 0 // nt.body);.
};
+static const unsigned char v3[] = {
+ 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t,
+ 111, 44, 114, 44, 117, 44, 108, 61, 123, 125, 44, 105, // o,r,u,l={},i
+ 61, 91, 93, 44, 99, 61, 47, 97, 99, 105, 116, 124, // =[],c=/acit|
+ 101, 120, 40, 63, 58, 115, 124, 103, 124, 110, 124, 112, // ex(?:s|g|n|p
+ 124, 36, 41, 124, 114, 112, 104, 124, 103, 114, 105, 100, // |$)|rph|grid
+ 124, 111, 119, 115, 124, 109, 110, 99, 124, 110, 116, 119, // |ows|mnc|ntw
+ 124, 105, 110, 101, 91, 99, 104, 93, 124, 122, 111, 111, // |ine[ch]|zoo
+ 124, 94, 111, 114, 100, 124, 105, 116, 101, 114, 97, 47, // |^ord|itera/
+ 105, 59, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, // i;function s
+ 40, 101, 44, 110, 41, 123, 102, 111, 114, 40, 118, 97, // (e,n){for(va
+ 114, 32, 95, 32, 105, 110, 32, 110, 41, 101, 91, 95, // r _ in n)e[_
+ 93, 61, 110, 91, 95, 93, 59, 114, 101, 116, 117, 114, // ]=n[_];retur
+ 110, 32, 101, 125, 102, 117, 110, 99, 116, 105, 111, 110, // n e}function
+ 32, 102, 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, // f(e){var n=
+ 101, 46, 112, 97, 114, 101, 110, 116, 78, 111, 100, 101, // e.parentNode
+ 59, 110, 38, 38, 110, 46, 114, 101, 109, 111, 118, 101, // ;n&&n.remove
+ 67, 104, 105, 108, 100, 40, 101, 41, 125, 102, 117, 110, // Child(e)}fun
+ 99, 116, 105, 111, 110, 32, 97, 40, 110, 44, 95, 44, // ction a(n,_,
+ 116, 41, 123, 118, 97, 114, 32, 111, 44, 114, 44, 117, // t){var o,r,u
+ 44, 108, 61, 123, 125, 59, 102, 111, 114, 40, 117, 32, // ,l={};for(u
+ 105, 110, 32, 95, 41, 34, 107, 101, 121, 34, 61, 61, // in _)"key"==
+ 117, 63, 111, 61, 95, 91, 117, 93, 58, 34, 114, 101, // u?o=_[u]:"re
+ 102, 34, 61, 61, 117, 63, 114, 61, 95, 91, 117, 93, // f"==u?r=_[u]
+ 58, 108, 91, 117, 93, 61, 95, 91, 117, 93, 59, 105, // :l[u]=_[u];i
+ 102, 40, 97, 114, 103, 117, 109, 101, 110, 116, 115, 46, // f(arguments.
+ 108, 101, 110, 103, 116, 104, 62, 50, 38, 38, 40, 108, // length>2&&(l
+ 46, 99, 104, 105, 108, 100, 114, 101, 110, 61, 97, 114, // .children=ar
+ 103, 117, 109, 101, 110, 116, 115, 46, 108, 101, 110, 103, // guments.leng
+ 116, 104, 62, 51, 63, 101, 46, 99, 97, 108, 108, 40, // th>3?e.call(
+ 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 50, 41, // arguments,2)
+ 58, 116, 41, 44, 34, 102, 117, 110, 99, 116, 105, 111, // :t),"functio
+ 110, 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, // n"==typeof n
+ 38, 38, 110, 117, 108, 108, 33, 61, 110, 46, 100, 101, // &&null!=n.de
+ 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 102, // faultProps)f
+ 111, 114, 40, 117, 32, 105, 110, 32, 110, 46, 100, 101, // or(u in n.de
+ 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 118, // faultProps)v
+ 111, 105, 100, 32, 48, 61, 61, 61, 108, 91, 117, 93, // oid 0===l[u]
+ 38, 38, 40, 108, 91, 117, 93, 61, 110, 46, 100, 101, // &&(l[u]=n.de
+ 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 91, 117, // faultProps[u
+ 93, 41, 59, 114, 101, 116, 117, 114, 110, 32, 112, 40, // ]);return p(
+ 110, 44, 108, 44, 111, 44, 114, 44, 110, 117, 108, 108, // n,l,o,r,null
+ 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 112, // )}function p
+ 40, 101, 44, 116, 44, 111, 44, 114, 44, 117, 41, 123, // (e,t,o,r,u){
+ 118, 97, 114, 32, 108, 61, 123, 116, 121, 112, 101, 58, // var l={type:
+ 101, 44, 112, 114, 111, 112, 115, 58, 116, 44, 107, 101, // e,props:t,ke
+ 121, 58, 111, 44, 114, 101, 102, 58, 114, 44, 95, 95, // y:o,ref:r,__
+ 107, 58, 110, 117, 108, 108, 44, 95, 95, 58, 110, 117, // k:null,__:nu
+ 108, 108, 44, 95, 95, 98, 58, 48, 44, 95, 95, 101, // ll,__b:0,__e
+ 58, 110, 117, 108, 108, 44, 95, 95, 100, 58, 118, 111, // :null,__d:vo
+ 105, 100, 32, 48, 44, 95, 95, 99, 58, 110, 117, 108, // id 0,__c:nul
+ 108, 44, 95, 95, 104, 58, 110, 117, 108, 108, 44, 99, // l,__h:null,c
+ 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 58, 118, // onstructor:v
+ 111, 105, 100, 32, 48, 44, 95, 95, 118, 58, 110, 117, // oid 0,__v:nu
+ 108, 108, 61, 61, 117, 63, 43, 43, 95, 58, 117, 125, // ll==u?++_:u}
+ 59, 114, 101, 116, 117, 114, 110, 32, 110, 117, 108, 108, // ;return null
+ 33, 61, 110, 46, 118, 110, 111, 100, 101, 38, 38, 110, // !=n.vnode&&n
+ 46, 118, 110, 111, 100, 101, 40, 108, 41, 44, 108, 125, // .vnode(l),l}
+ 102, 117, 110, 99, 116, 105, 111, 110, 32, 104, 40, 101, // function h(e
+ 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, 46, 99, // ){return e.c
+ 104, 105, 108, 100, 114, 101, 110, 125, 102, 117, 110, 99, // hildren}func
+ 116, 105, 111, 110, 32, 100, 40, 101, 44, 110, 41, 123, // tion d(e,n){
+ 116, 104, 105, 115, 46, 112, 114, 111, 112, 115, 61, 101, // this.props=e
+ 44, 116, 104, 105, 115, 46, 99, 111, 110, 116, 101, 120, // ,this.contex
+ 116, 61, 110, 125, 102, 117, 110, 99, 116, 105, 111, 110, // t=n}function
+ 32, 118, 40, 101, 44, 110, 41, 123, 105, 102, 40, 110, // v(e,n){if(n
+ 117, 108, 108, 61, 61, 110, 41, 114, 101, 116, 117, 114, // ull==n)retur
+ 110, 32, 101, 46, 95, 95, 63, 118, 40, 101, 46, 95, // n e.__?v(e._
+ 95, 44, 101, 46, 95, 95, 46, 95, 95, 107, 46, 105, // _,e.__.__k.i
+ 110, 100, 101, 120, 79, 102, 40, 101, 41, 43, 49, 41, // ndexOf(e)+1)
+ 58, 110, 117, 108, 108, 59, 102, 111, 114, 40, 118, 97, // :null;for(va
+ 114, 32, 95, 59, 110, 60, 101, 46, 95, 95, 107, 46, // r _;n0?p(m.
+ 116, 121, 112, 101, 44, 109, 46, 112, 114, 111, 112, 115, // type,m.props
+ 44, 109, 46, 107, 101, 121, 44, 110, 117, 108, 108, 44, // ,m.key,null,
+ 109, 46, 95, 95, 118, 41, 58, 109, 41, 41, 123, 105, // m.__v):m)){i
+ 102, 40, 109, 46, 95, 95, 61, 95, 44, 109, 46, 95, // f(m.__=_,m._
+ 95, 98, 61, 95, 46, 95, 95, 98, 43, 49, 44, 110, // _b=_.__b+1,n
+ 117, 108, 108, 61, 61, 61, 40, 121, 61, 72, 91, 97, // ull===(y=H[a
+ 93, 41, 124, 124, 121, 38, 38, 109, 46, 107, 101, 121, // ])||y&&m.key
+ 61, 61, 121, 46, 107, 101, 121, 38, 38, 109, 46, 116, // ==y.key&&m.t
+ 121, 112, 101, 61, 61, 61, 121, 46, 116, 121, 112, 101, // ype===y.type
+ 41, 72, 91, 97, 93, 61, 118, 111, 105, 100, 32, 48, // )H[a]=void 0
+ 59, 101, 108, 115, 101, 32, 102, 111, 114, 40, 100, 61, // ;else for(d=
+ 48, 59, 100, 60, 69, 59, 100, 43, 43, 41, 123, 105, // 0;d=t.__.len
+ 103, 116, 104, 38, 38, 116, 46, 95, 95, 46, 112, 117, // gth&&t.__.pu
+ 115, 104, 40, 123, 125, 41, 44, 116, 46, 95, 95, 91, // sh({}),t.__[
+ 101, 93, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // e]}function
+ 71, 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, // G(e){return
+ 82, 61, 49, 44, 122, 40, 105, 101, 44, 101, 41, 125, // R=1,z(ie,e)}
+ 102, 117, 110, 99, 116, 105, 111, 110, 32, 122, 40, 101, // function z(e
+ 44, 110, 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, // ,n,_){var t=
+ 106, 40, 76, 43, 43, 44, 50, 41, 59, 114, 101, 116, // j(L++,2);ret
+ 117, 114, 110, 32, 116, 46, 116, 61, 101, 44, 116, 46, // urn t.t=e,t.
+ 95, 95, 99, 124, 124, 40, 116, 46, 95, 95, 61, 91, // __c||(t.__=[
+ 95, 63, 95, 40, 110, 41, 58, 105, 101, 40, 118, 111, // _?_(n):ie(vo
+ 105, 100, 32, 48, 44, 110, 41, 44, 102, 117, 110, 99, // id 0,n),func
+ 116, 105, 111, 110, 40, 101, 41, 123, 118, 97, 114, 32, // tion(e){var
+ 110, 61, 116, 46, 116, 40, 116, 46, 95, 95, 91, 48, // n=t.t(t.__[0
+ 93, 44, 101, 41, 59, 116, 46, 95, 95, 91, 48, 93, // ],e);t.__[0]
+ 33, 61, 61, 110, 38, 38, 40, 116, 46, 95, 95, 61, // !==n&&(t.__=
+ 91, 110, 44, 116, 46, 95, 95, 91, 49, 93, 93, 44, // [n,t.__[1]],
+ 116, 46, 95, 95, 99, 46, 115, 101, 116, 83, 116, 97, // t.__c.setSta
+ 116, 101, 40, 123, 125, 41, 41, 125, 93, 44, 116, 46, // te({}))}],t.
+ 95, 95, 99, 61, 78, 41, 44, 116, 46, 95, 95, 125, // __c=N),t.__}
+ 102, 117, 110, 99, 116, 105, 111, 110, 32, 74, 40, 101, // function J(e
+ 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, 106, 40, // ,_){var t=j(
+ 76, 43, 43, 44, 51, 41, 59, 33, 110, 46, 95, 95, // L++,3);!n.__
+ 115, 38, 38, 108, 101, 40, 116, 46, 95, 95, 72, 44, // s&&le(t.__H,
+ 95, 41, 38, 38, 40, 116, 46, 95, 95, 61, 101, 44, // _)&&(t.__=e,
+ 116, 46, 95, 95, 72, 61, 95, 44, 78, 46, 95, 95, // t.__H=_,N.__
+ 72, 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, // H.__h.push(t
+ 41, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ))}function
+ 75, 40, 101, 44, 95, 41, 123, 118, 97, 114, 32, 116, // K(e,_){var t
+ 61, 106, 40, 76, 43, 43, 44, 52, 41, 59, 33, 110, // =j(L++,4);!n
+ 46, 95, 95, 115, 38, 38, 108, 101, 40, 116, 46, 95, // .__s&&le(t._
+ 95, 72, 44, 95, 41, 38, 38, 40, 116, 46, 95, 95, // _H,_)&&(t.__
+ 61, 101, 44, 116, 46, 95, 95, 72, 61, 95, 44, 78, // =e,t.__H=_,N
+ 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, 41, // .__h.push(t)
+ 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 81, // )}function Q
+ 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // (e){return R
+ 61, 53, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =5,Y(functio
+ 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 123, 99, // n(){return{c
+ 117, 114, 114, 101, 110, 116, 58, 101, 125, 125, 44, 91, // urrent:e}},[
+ 93, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ])}function
+ 88, 40, 101, 44, 110, 44, 95, 41, 123, 82, 61, 54, // X(e,n,_){R=6
+ 44, 75, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, // ,K(function(
+ 41, 123, 34, 102, 117, 110, 99, 116, 105, 111, 110, 34, // ){"function"
+ 61, 61, 116, 121, 112, 101, 111, 102, 32, 101, 63, 101, // ==typeof e?e
+ 40, 110, 40, 41, 41, 58, 101, 38, 38, 40, 101, 46, // (n()):e&&(e.
+ 99, 117, 114, 114, 101, 110, 116, 61, 110, 40, 41, 41, // current=n())
+ 125, 44, 110, 117, 108, 108, 61, 61, 95, 63, 95, 58, // },null==_?_:
+ 95, 46, 99, 111, 110, 99, 97, 116, 40, 101, 41, 41, // _.concat(e))
+ 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 89, 40, // }function Y(
+ 101, 44, 110, 41, 123, 118, 97, 114, 32, 95, 61, 106, // e,n){var _=j
+ 40, 76, 43, 43, 44, 55, 41, 59, 114, 101, 116, 117, // (L++,7);retu
+ 114, 110, 32, 108, 101, 40, 95, 46, 95, 95, 72, 44, // rn le(_.__H,
+ 110, 41, 38, 38, 40, 95, 46, 95, 95, 61, 101, 40, // n)&&(_.__=e(
+ 41, 44, 95, 46, 95, 95, 72, 61, 110, 44, 95, 46, // ),_.__H=n,_.
+ 95, 95, 104, 61, 101, 41, 44, 95, 46, 95, 95, 125, // __h=e),_.__}
+ 102, 117, 110, 99, 116, 105, 111, 110, 32, 90, 40, 101, // function Z(e
+ 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // ,n){return R
+ 61, 56, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =8,Y(functio
+ 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, // n(){return e
+ 125, 44, 110, 41, 125, 102, 117, 110, 99, 116, 105, 111, // },n)}functio
+ 110, 32, 101, 101, 40, 101, 41, 123, 118, 97, 114, 32, // n ee(e){var
+ 110, 61, 78, 46, 99, 111, 110, 116, 101, 120, 116, 91, // n=N.context[
+ 101, 46, 95, 95, 99, 93, 44, 95, 61, 106, 40, 76, // e.__c],_=j(L
+ 43, 43, 44, 57, 41, 59, 114, 101, 116, 117, 114, 110, // ++,9);return
+ 32, 95, 46, 99, 61, 101, 44, 110, 63, 40, 110, 117, // _.c=e,n?(nu
+ 108, 108, 61, 61, 95, 46, 95, 95, 38, 38, 40, 95, // ll==_.__&&(_
+ 46, 95, 95, 61, 33, 48, 44, 110, 46, 115, 117, 98, // .__=!0,n.sub
+ 40, 78, 41, 41, 44, 110, 46, 112, 114, 111, 112, 115, // (N)),n.props
+ 46, 118, 97, 108, 117, 101, 41, 58, 101, 46, 95, 95, // .value):e.__
+ 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 110, 101, // }function ne
+ 40, 101, 44, 95, 41, 123, 110, 46, 117, 115, 101, 68, // (e,_){n.useD
+ 101, 98, 117, 103, 86, 97, 108, 117, 101, 38, 38, 110, // ebugValue&&n
+ 46, 117, 115, 101, 68, 101, 98, 117, 103, 86, 97, 108, // .useDebugVal
+ 117, 101, 40, 95, 63, 95, 40, 101, 41, 58, 101, 41, // ue(_?_(e):e)
+ 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 95, 101, // }function _e
+ 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, 106, 40, // (e){var n=j(
+ 76, 43, 43, 44, 49, 48, 41, 44, 95, 61, 71, 40, // L++,10),_=G(
+ 41, 59, 114, 101, 116, 117, 114, 110, 32, 110, 46, 95, // );return n._
+ 95, 61, 101, 44, 78, 46, 99, 111, 109, 112, 111, 110, // _=e,N.compon
+ 101, 110, 116, 68, 105, 100, 67, 97, 116, 99, 104, 124, // entDidCatch|
+ 124, 40, 78, 46, 99, 111, 109, 112, 111, 110, 101, 110, // |(N.componen
+ 116, 68, 105, 100, 67, 97, 116, 99, 104, 61, 102, 117, // tDidCatch=fu
+ 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 110, 46, // nction(e){n.
+ 95, 95, 38, 38, 110, 46, 95, 95, 40, 101, 41, 44, // __&&n.__(e),
+ 95, 91, 49, 93, 40, 101, 41, 125, 41, 44, 91, 95, // _[1](e)}),[_
+ 91, 48, 93, 44, 102, 117, 110, 99, 116, 105, 111, 110, // [0],function
+ 40, 41, 123, 95, 91, 49, 93, 40, 118, 111, 105, 100, // (){_[1](void
+ 32, 48, 41, 125, 93, 125, 102, 117, 110, 99, 116, 105, // 0)}]}functi
+ 111, 110, 32, 116, 101, 40, 41, 123, 73, 46, 102, 111, // on te(){I.fo
+ 114, 69, 97, 99, 104, 40, 102, 117, 110, 99, 116, 105, // rEach(functi
+ 111, 110, 40, 101, 41, 123, 105, 102, 40, 101, 46, 95, // on(e){if(e._
+ 95, 80, 41, 116, 114, 121, 123, 101, 46, 95, 95, 72, // _P)try{e.__H
+ 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach
+ 40, 114, 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, // (re),e.__H._
+ 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, 40, 117, // _h.forEach(u
+ 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, 95, 104, // e),e.__H.__h
+ 61, 91, 93, 125, 99, 97, 116, 99, 104, 40, 95, 41, // =[]}catch(_)
+ 123, 101, 46, 95, 95, 72, 46, 95, 95, 104, 61, 91, // {e.__H.__h=[
+ 93, 44, 110, 46, 95, 95, 101, 40, 95, 44, 101, 46, // ],n.__e(_,e.
+ 95, 95, 118, 41, 125, 125, 41, 44, 73, 61, 91, 93, // __v)}}),I=[]
+ 125, 110, 46, 95, 95, 98, 61, 102, 117, 110, 99, 116, // }n.__b=funct
+ 105, 111, 110, 40, 101, 41, 123, 78, 61, 110, 117, 108, // ion(e){N=nul
+ 108, 44, 79, 38, 38, 79, 40, 101, 41, 125, 44, 110, // l,O&&O(e)},n
+ 46, 95, 95, 114, 61, 102, 117, 110, 99, 116, 105, 111, // .__r=functio
+ 110, 40, 101, 41, 123, 86, 38, 38, 86, 40, 101, 41, // n(e){V&&V(e)
+ 44, 76, 61, 48, 59, 118, 97, 114, 32, 110, 61, 40, // ,L=0;var n=(
+ 78, 61, 101, 46, 95, 95, 99, 41, 46, 95, 95, 72, // N=e.__c).__H
+ 59, 110, 38, 38, 40, 110, 46, 95, 95, 104, 46, 102, // ;n&&(n.__h.f
+ 111, 114, 69, 97, 99, 104, 40, 114, 101, 41, 44, 110, // orEach(re),n
+ 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach
+ 40, 117, 101, 41, 44, 110, 46, 95, 95, 104, 61, 91, // (ue),n.__h=[
+ 93, 41, 125, 44, 110, 46, 100, 105, 102, 102, 101, 100, // ])},n.diffed
+ 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, // =function(e)
+ 123, 113, 38, 38, 113, 40, 101, 41, 59, 118, 97, 114, // {q&&q(e);var
+ 32, 95, 61, 101, 46, 95, 95, 99, 59, 95, 38, 38, // _=e.__c;_&&
+ 95, 46, 95, 95, 72, 38, 38, 95, 46, 95, 95, 72, // _.__H&&_.__H
+ 46, 95, 95, 104, 46, 108, 101, 110, 103, 116, 104, 38, // .__h.length&
+ 38, 40, 49, 33, 61, 61, 73, 46, 112, 117, 115, 104, // &(1!==I.push
+ 40, 95, 41, 38, 38, 87, 61, 61, 61, 110, 46, 114, // (_)&&W===n.r
+ 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, // equestAnimat
+ 105, 111, 110, 70, 114, 97, 109, 101, 124, 124, 40, 40, // ionFrame||((
+ 87, 61, 110, 46, 114, 101, 113, 117, 101, 115, 116, 65, // W=n.requestA
+ 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, 97, 109, // nimationFram
+ 101, 41, 124, 124, 102, 117, 110, 99, 116, 105, 111, 110, // e)||function
+ 40, 101, 41, 123, 118, 97, 114, 32, 110, 44, 95, 61, // (e){var n,_=
+ 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 123, 99, // function(){c
+ 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout(
+ 116, 41, 44, 111, 101, 38, 38, 99, 97, 110, 99, 101, // t),oe&&cance
+ 108, 65, 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, // lAnimationFr
+ 97, 109, 101, 40, 110, 41, 44, 115, 101, 116, 84, 105, // ame(n),setTi
+ 109, 101, 111, 117, 116, 40, 101, 41, 125, 44, 116, 61, // meout(e)},t=
+ 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 95, // setTimeout(_
+ 44, 49, 48, 48, 41, 59, 111, 101, 38, 38, 40, 110, // ,100);oe&&(n
+ 61, 114, 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, // =requestAnim
+ 97, 116, 105, 111, 110, 70, 114, 97, 109, 101, 40, 95, // ationFrame(_
+ 41, 41, 125, 41, 40, 116, 101, 41, 41, 44, 78, 61, // ))})(te)),N=
+ 118, 111, 105, 100, 32, 48, 125, 44, 110, 46, 95, 95, // void 0},n.__
+ 99, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // c=function(e
+ 44, 95, 41, 123, 95, 46, 115, 111, 109, 101, 40, 102, // ,_){_.some(f
+ 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 116, // unction(e){t
+ 114, 121, 123, 101, 46, 95, 95, 104, 46, 102, 111, 114, // ry{e.__h.for
+ 69, 97, 99, 104, 40, 114, 101, 41, 44, 101, 46, 95, // Each(re),e._
+ 95, 104, 61, 101, 46, 95, 95, 104, 46, 102, 105, 108, // _h=e.__h.fil
+ 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ter(function
+ 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 33, 101, // (e){return!e
+ 46, 95, 95, 124, 124, 117, 101, 40, 101, 41, 125, 41, // .__||ue(e)})
+ 125, 99, 97, 116, 99, 104, 40, 116, 41, 123, 95, 46, // }catch(t){_.
+ 115, 111, 109, 101, 40, 102, 117, 110, 99, 116, 105, 111, // some(functio
+ 110, 40, 101, 41, 123, 101, 46, 95, 95, 104, 38, 38, // n(e){e.__h&&
+ 40, 101, 46, 95, 95, 104, 61, 91, 93, 41, 125, 41, // (e.__h=[])})
+ 44, 95, 61, 91, 93, 44, 110, 46, 95, 95, 101, 40, // ,_=[],n.__e(
+ 116, 44, 101, 46, 95, 95, 118, 41, 125, 125, 41, 44, // t,e.__v)}}),
+ 66, 38, 38, 66, 40, 101, 44, 95, 41, 125, 44, 110, // B&&B(e,_)},n
+ 46, 117, 110, 109, 111, 117, 110, 116, 61, 102, 117, 110, // .unmount=fun
+ 99, 116, 105, 111, 110, 40, 101, 41, 123, 36, 38, 38, // ction(e){$&&
+ 36, 40, 101, 41, 59, 118, 97, 114, 32, 95, 61, 101, // $(e);var _=e
+ 46, 95, 95, 99, 59, 105, 102, 40, 95, 38, 38, 95, // .__c;if(_&&_
+ 46, 95, 95, 72, 41, 116, 114, 121, 123, 95, 46, 95, // .__H)try{_._
+ 95, 72, 46, 95, 95, 46, 102, 111, 114, 69, 97, 99, // _H.__.forEac
+ 104, 40, 114, 101, 41, 125, 99, 97, 116, 99, 104, 40, // h(re)}catch(
+ 101, 41, 123, 110, 46, 95, 95, 101, 40, 101, 44, 95, // e){n.__e(e,_
+ 46, 95, 95, 118, 41, 125, 125, 59, 118, 97, 114, 32, // .__v)}};var
+ 111, 101, 61, 34, 102, 117, 110, 99, 116, 105, 111, 110, // oe="function
+ 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 114, 101, // "==typeof re
+ 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, 105, // questAnimati
+ 111, 110, 70, 114, 97, 109, 101, 59, 102, 117, 110, 99, // onFrame;func
+ 116, 105, 111, 110, 32, 114, 101, 40, 101, 41, 123, 118, // tion re(e){v
+ 97, 114, 32, 110, 61, 78, 59, 34, 102, 117, 110, 99, // ar n=N;"func
+ 116, 105, 111, 110, 34, 61, 61, 116, 121, 112, 101, 111, // tion"==typeo
+ 102, 32, 101, 46, 95, 95, 99, 38, 38, 101, 46, 95, // f e.__c&&e._
+ 95, 99, 40, 41, 44, 78, 61, 110, 125, 102, 117, 110, // _c(),N=n}fun
+ 99, 116, 105, 111, 110, 32, 117, 101, 40, 101, 41, 123, // ction ue(e){
+ 118, 97, 114, 32, 110, 61, 78, 59, 101, 46, 95, 95, // var n=N;e.__
+ 99, 61, 101, 46, 95, 95, 40, 41, 44, 78, 61, 110, // c=e.__(),N=n
+ 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 108, 101, // }function le
+ 40, 101, 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, // (e,n){return
+ 33, 101, 124, 124, 101, 46, 108, 101, 110, 103, 116, 104, // !e||e.length
+ 33, 61, 61, 110, 46, 108, 101, 110, 103, 116, 104, 124, // !==n.length|
+ 124, 110, 46, 115, 111, 109, 101, 40, 102, 117, 110, 99, // |n.some(func
+ 116, 105, 111, 110, 40, 110, 44, 95, 41, 123, 114, 101, // tion(n,_){re
+ 116, 117, 114, 110, 32, 110, 33, 61, 61, 101, 91, 95, // turn n!==e[_
+ 93, 125, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, // ]})}function
+ 32, 105, 101, 40, 101, 44, 110, 41, 123, 114, 101, 116, // ie(e,n){ret
+ 117, 114, 110, 34, 102, 117, 110, 99, 116, 105, 111, 110, // urn"function
+ 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, 63, // "==typeof n?
+ 110, 40, 101, 41, 58, 110, 125, 118, 97, 114, 32, 99, // n(e):n}var c
+ 101, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // e=function(e
+ 44, 110, 44, 95, 44, 116, 41, 123, 118, 97, 114, 32, // ,n,_,t){var
+ 111, 59, 110, 91, 48, 93, 61, 48, 59, 102, 111, 114, // o;n[0]=0;for
+ 40, 118, 97, 114, 32, 114, 61, 49, 59, 114, 60, 110, // (var r=1;r=5&&
+ 40, 40, 111, 124, 124, 33, 101, 38, 38, 53, 61, 61, // ((o||!e&&5==
+ 61, 116, 41, 38, 38, 40, 117, 46, 112, 117, 115, 104, // =t)&&(u.push
+ 40, 116, 44, 48, 44, 111, 44, 95, 41, 44, 116, 61, // (t,0,o,_),t=
+ 54, 41, 44, 101, 38, 38, 40, 117, 46, 112, 117, 115, // 6),e&&(u.pus
+ 104, 40, 116, 44, 101, 44, 48, 44, 95, 41, 44, 116, // h(t,e,0,_),t
+ 61, 54, 41, 41, 44, 111, 61, 34, 34, 125, 44, 105, // =6)),o=""},i
+ 61, 48, 59, 105, 60, 101, 46, 108, 101, 110, 103, 116, // =0;i"===n?(t=1,
+ 111, 61, 34, 34, 41, 58, 111, 61, 110, 43, 111, 91, // o=""):o=n+o[
+ 48, 93, 58, 114, 63, 110, 61, 61, 61, 114, 63, 114, // 0]:r?n===r?r
+ 61, 34, 34, 58, 111, 43, 61, 110, 58, 39, 34, 39, // ="":o+=n:'"'
+ 61, 61, 61, 110, 124, 124, 34, 39, 34, 61, 61, 61, // ===n||"'"===
+ 110, 63, 114, 61, 110, 58, 34, 62, 34, 61, 61, 61, // n?r=n:">"===
+ 110, 63, 40, 108, 40, 41, 44, 116, 61, 49, 41, 58, // n?(l(),t=1):
+ 116, 38, 38, 40, 34, 61, 34, 61, 61, 61, 110, 63, // t&&("="===n?
+ 40, 116, 61, 53, 44, 95, 61, 111, 44, 111, 61, 34, // (t=5,_=o,o="
+ 34, 41, 58, 34, 47, 34, 61, 61, 61, 110, 38, 38, // "):"/"===n&&
+ 40, 116, 60, 53, 124, 124, 34, 62, 34, 61, 61, 61, // (t<5||">"===
+ 101, 91, 105, 93, 91, 99, 43, 49, 93, 41, 63, 40, // e[i][c+1])?(
+ 108, 40, 41, 44, 51, 61, 61, 61, 116, 38, 38, 40, // l(),3===t&&(
+ 117, 61, 117, 91, 48, 93, 41, 44, 116, 61, 117, 44, // u=u[0]),t=u,
+ 40, 117, 61, 117, 91, 48, 93, 41, 46, 112, 117, 115, // (u=u[0]).pus
+ 104, 40, 50, 44, 48, 44, 116, 41, 44, 116, 61, 48, // h(2,0,t),t=0
+ 41, 58, 34, 32, 34, 61, 61, 61, 110, 124, 124, 34, // ):" "===n||"
+ 92, 116, 34, 61, 61, 61, 110, 124, 124, 34, 92, 110, // .t"===n||".n
+ 34, 61, 61, 61, 110, 124, 124, 34, 92, 114, 34, 61, // "===n||".r"=
+ 61, 61, 110, 63, 40, 108, 40, 41, 44, 116, 61, 50, // ==n?(l(),t=2
+ 41, 58, 111, 43, 61, 110, 41, 44, 51, 61, 61, 61, // ):o+=n),3===
+ 116, 38, 38, 34, 33, 45, 45, 34, 61, 61, 61, 111, // t&&"!--"===o
+ 38, 38, 40, 116, 61, 52, 44, 117, 61, 117, 91, 48, // &&(t=4,u=u[0
+ 93, 41, 125, 114, 101, 116, 117, 114, 110, 32, 108, 40, // ])}return l(
+ 41, 44, 117, 125, 40, 101, 41, 41, 44, 110, 41, 44, // ),u}(e)),n),
+ 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 91, 93, // arguments,[]
+ 41, 41, 46, 108, 101, 110, 103, 116, 104, 62, 49, 63, // )).length>1?
+ 110, 58, 110, 91, 48, 93, 125, 46, 98, 105, 110, 100, // n:n[0]}.bind
+ 40, 97, 41, 59, 101, 120, 112, 111, 114, 116, 123, 97, // (a);export{a
+ 32, 97, 115, 32, 104, 44, 102, 101, 32, 97, 115, 32, // as h,fe as
+ 104, 116, 109, 108, 44, 77, 32, 97, 115, 32, 114, 101, // html,M as re
+ 110, 100, 101, 114, 44, 100, 32, 97, 115, 32, 67, 111, // nder,d as Co
+ 109, 112, 111, 110, 101, 110, 116, 44, 70, 32, 97, 115, // mponent,F as
+ 32, 99, 114, 101, 97, 116, 101, 67, 111, 110, 116, 101, // createConte
+ 120, 116, 44, 71, 32, 97, 115, 32, 117, 115, 101, 83, // xt,G as useS
+ 116, 97, 116, 101, 44, 122, 32, 97, 115, 32, 117, 115, // tate,z as us
+ 101, 82, 101, 100, 117, 99, 101, 114, 44, 74, 32, 97, // eReducer,J a
+ 115, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // s useEffect,
+ 75, 32, 97, 115, 32, 117, 115, 101, 76, 97, 121, 111, // K as useLayo
+ 117, 116, 69, 102, 102, 101, 99, 116, 44, 81, 32, 97, // utEffect,Q a
+ 115, 32, 117, 115, 101, 82, 101, 102, 44, 88, 32, 97, // s useRef,X a
+ 115, 32, 117, 115, 101, 73, 109, 112, 101, 114, 97, 116, // s useImperat
+ 105, 118, 101, 72, 97, 110, 100, 108, 101, 44, 89, 32, // iveHandle,Y
+ 97, 115, 32, 117, 115, 101, 77, 101, 109, 111, 44, 90, // as useMemo,Z
+ 32, 97, 115, 32, 117, 115, 101, 67, 97, 108, 108, 98, // as useCallb
+ 97, 99, 107, 44, 101, 101, 32, 97, 115, 32, 117, 115, // ack,ee as us
+ 101, 67, 111, 110, 116, 101, 120, 116, 44, 110, 101, 32, // eContext,ne
+ 97, 115, 32, 117, 115, 101, 68, 101, 98, 117, 103, 86, // as useDebugV
+ 97, 108, 117, 101, 44, 95, 101, 32, 97, 115, 32, 117, // alue,_e as u
+ 115, 101, 69, 114, 114, 111, 114, 66, 111, 117, 110, 100, // seErrorBound
+ 97, 114, 121, 125, 59, 10, 0 // ary};.
+};
static const unsigned char v4[] = {
+ 42, 32, 123, 32, 98, 111, 120, 45, 115, 105, 122, 105, // * { box-sizi
+ 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, // ng: border-b
+ 111, 120, 59, 32, 125, 10, 104, 116, 109, 108, 44, 32, // ox; }.html,
+ 98, 111, 100, 121, 32, 123, 32, 109, 97, 114, 103, 105, // body { margi
+ 110, 58, 32, 48, 59, 32, 112, 97, 100, 100, 105, 110, // n: 0; paddin
+ 103, 58, 32, 48, 59, 32, 104, 101, 105, 103, 104, 116, // g: 0; height
+ 58, 32, 49, 48, 48, 37, 59, 32, 102, 111, 110, 116, // : 100%; font
+ 58, 32, 49, 54, 112, 120, 32, 115, 97, 110, 115, 45, // : 16px sans-
+ 115, 101, 114, 105, 102, 59, 32, 125, 10, 115, 101, 108, // serif; }.sel
+ 101, 99, 116, 44, 32, 105, 110, 112, 117, 116, 44, 32, // ect, input,
+ 108, 97, 98, 101, 108, 58, 58, 98, 101, 102, 111, 114, // label::befor
+ 101, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97, 32, // e, textarea
+ 123, 32, 111, 117, 116, 108, 105, 110, 101, 58, 32, 110, // { outline: n
+ 111, 110, 101, 59, 32, 98, 111, 120, 45, 115, 104, 97, // one; box-sha
+ 100, 111, 119, 58, 110, 111, 110, 101, 32, 33, 105, 109, // dow:none !im
+ 112, 111, 114, 116, 97, 110, 116, 59, 32, 98, 111, 114, // portant; bor
+ 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, // der: 1px sol
+ 105, 100, 32, 35, 99, 99, 99, 32, 33, 105, 109, 112, // id #ccc !imp
+ 111, 114, 116, 97, 110, 116, 59, 32, 125, 10, 99, 111, // ortant; }.co
+ 100, 101, 44, 32, 112, 114, 101, 32, 123, 32, 99, 111, // de, pre { co
+ 108, 111, 114, 58, 32, 35, 51, 55, 51, 59, 32, 102, // lor: #373; f
+ 111, 110, 116, 45, 102, 97, 109, 105, 108, 121, 58, 32, // ont-family:
+ 109, 111, 110, 111, 115, 112, 97, 99, 101, 59, 32, 102, // monospace; f
+ 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32, // ont-weight:
+ 98, 111, 108, 100, 101, 114, 59, 32, 102, 111, 110, 116, // bolder; font
+ 45, 115, 105, 122, 101, 58, 32, 115, 109, 97, 108, 108, // -size: small
+ 101, 114, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // er; backgrou
+ 110, 100, 58, 32, 35, 100, 100, 100, 59, 32, 112, 97, // nd: #ddd; pa
+ 100, 100, 105, 110, 103, 58, 32, 48, 46, 49, 101, 109, // dding: 0.1em
+ 32, 48, 46, 51, 101, 109, 59, 32, 98, 111, 114, 100, // 0.3em; bord
+ 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0
+ 46, 50, 101, 109, 59, 32, 125, 10, 116, 101, 120, 116, // .2em; }.text
+ 97, 114, 101, 97, 44, 32, 105, 110, 112, 117, 116, 44, // area, input,
+ 32, 46, 97, 100, 100, 111, 110, 32, 123, 32, 102, 111, // .addon { fo
+ 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 53, 112, // nt-size: 15p
+ 120, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, // x; border: 1
+ 112, 120, 32, 115, 111, 108, 105, 100, 32, 35, 99, 99, // px solid #cc
+ 99, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // c; padding:
+ 48, 46, 53, 101, 109, 59, 32, 125, 10, 97, 44, 32, // 0.5em; }.a,
+ 97, 58, 118, 105, 115, 105, 116, 101, 100, 44, 32, 97, // a:visited, a
+ 58, 97, 99, 116, 105, 118, 101, 32, 123, 32, 99, 111, // :active { co
+ 108, 111, 114, 58, 32, 35, 53, 53, 102, 59, 32, 125, // lor: #55f; }
+ 10, 46, 97, 100, 100, 111, 110, 32, 123, 32, 98, 97, // ..addon { ba
+ 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, 101, // ckground: #e
+ 101, 101, 59, 32, 32, 109, 105, 110, 45, 119, 105, 100, // ee; min-wid
+ 116, 104, 58, 32, 57, 101, 109, 59, 125, 10, 46, 98, // th: 9em;}..b
+ 116, 110, 32, 123, 10, 32, 32, 98, 97, 99, 107, 103, // tn {. backg
+ 114, 111, 117, 110, 100, 58, 32, 35, 99, 99, 99, 59, // round: #ccc;
+ 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi
+ 117, 115, 58, 32, 48, 46, 51, 101, 109, 59, 32, 98, // us: 0.3em; b
+ 111, 114, 100, 101, 114, 58, 32, 48, 59, 32, 99, 111, // order: 0; co
+ 108, 111, 114, 58, 32, 35, 102, 102, 102, 59, 32, 99, // lor: #fff; c
+ 117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, // ursor: point
+ 101, 114, 59, 10, 32, 32, 100, 105, 115, 112, 108, 97, // er;. displa
+ 121, 58, 32, 105, 110, 108, 105, 110, 101, 45, 98, 108, // y: inline-bl
+ 111, 99, 107, 59, 32, 112, 97, 100, 100, 105, 110, 103, // ock; padding
+ 58, 32, 48, 46, 54, 101, 109, 32, 50, 101, 109, 59, // : 0.6em 2em;
+ 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, // font-weight
+ 58, 32, 98, 111, 108, 100, 101, 114, 59, 10, 125, 10, // : bolder;.}.
+ 46, 98, 116, 110, 91, 100, 105, 115, 97, 98, 108, 101, // .btn[disable
+ 100, 93, 32, 123, 32, 111, 112, 97, 99, 105, 116, 121, // d] { opacity
+ 58, 32, 48, 46, 53, 59, 32, 99, 117, 114, 115, 111, // : 0.5; curso
+ 114, 58, 32, 97, 117, 116, 111, 59, 125, 10, 46, 115, // r: auto;}..s
+ 109, 111, 111, 116, 104, 32, 123, 32, 116, 114, 97, 110, // mooth { tran
+ 115, 105, 116, 105, 111, 110, 58, 32, 97, 108, 108, 32, // sition: all
+ 46, 50, 115, 59, 32, 125, 10, 46, 99, 111, 110, 116, // .2s; }..cont
+ 97, 105, 110, 101, 114, 32, 123, 32, 109, 97, 114, 103, // ainer { marg
+ 105, 110, 58, 32, 48, 32, 50, 48, 112, 120, 59, 32, // in: 0 20px;
+ 119, 105, 100, 116, 104, 58, 32, 97, 117, 116, 111, 59, // width: auto;
+ 32, 125, 10, 46, 100, 45, 102, 108, 101, 120, 32, 123, // }..d-flex {
+ 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, // display: fl
+ 101, 120, 59, 32, 125, 10, 46, 100, 45, 110, 111, 110, // ex; }..d-non
+ 101, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, // e { display:
+ 32, 110, 111, 110, 101, 59, 32, 125, 10, 46, 98, 111, // none; }..bo
+ 114, 100, 101, 114, 32, 123, 32, 98, 111, 114, 100, 101, // rder { borde
+ 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, // r: 1px solid
+ 32, 35, 100, 100, 100, 59, 32, 125, 10, 46, 114, 111, // #ddd; }..ro
+ 117, 110, 100, 101, 100, 32, 123, 32, 98, 111, 114, 100, // unded { bord
+ 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0
+ 46, 53, 101, 109, 59, 32, 125, 10, 46, 110, 111, 119, // .5em; }..now
+ 114, 97, 112, 32, 123, 32, 119, 104, 105, 116, 101, 45, // rap { white-
+ 115, 112, 97, 99, 101, 58, 32, 110, 111, 119, 114, 97, // space: nowra
+ 112, 59, 32, 125, 10, 46, 109, 115, 103, 32, 123, 32, // p; }..msg {
+ 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, // background:
+ 35, 100, 101, 102, 59, 32, 98, 111, 114, 100, 101, 114, // #def; border
+ 45, 108, 101, 102, 116, 58, 32, 53, 112, 120, 32, 115, // -left: 5px s
+ 111, 108, 105, 100, 32, 35, 53, 57, 100, 59, 32, 112, // olid #59d; p
+ 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, 53, 101, // adding: 0.5e
+ 109, 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, // m; font-size
+ 58, 32, 57, 48, 37, 59, 32, 109, 97, 114, 103, 105, // : 90%; margi
+ 110, 58, 32, 49, 101, 109, 32, 48, 59, 32, 125, 10, // n: 1em 0; }.
+ 46, 115, 101, 99, 116, 105, 111, 110, 32, 123, 32, 109, // .section { m
+ 97, 114, 103, 105, 110, 58, 32, 48, 32, 49, 101, 109, // argin: 0 1em
+ 59, 32, 125, 10, 46, 116, 111, 112, 105, 99, 44, 32, // ; }..topic,
+ 46, 100, 97, 116, 97, 44, 32, 46, 113, 111, 115, 32, // .data, .qos
+ 123, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // { padding:
+ 48, 46, 50, 101, 109, 32, 48, 46, 53, 101, 109, 59, // 0.2em 0.5em;
+ 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi
+ 117, 115, 58, 32, 48, 46, 52, 101, 109, 59, 32, 109, // us: 0.4em; m
+ 97, 114, 103, 105, 110, 45, 114, 105, 103, 104, 116, 58, // argin-right:
+ 32, 48, 46, 53, 101, 109, 59, 32, 32, 125, 10, 46, // 0.5em; }..
+ 113, 111, 115, 32, 123, 32, 98, 97, 99, 107, 103, 114, // qos { backgr
+ 111, 117, 110, 100, 58, 32, 35, 101, 102, 97, 59, 32, // ound: #efa;
+ 125, 10, 46, 116, 111, 112, 105, 99, 32, 123, 32, 98, // }..topic { b
+ 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: #
+ 102, 101, 97, 59, 32, 125, 10, 46, 100, 97, 116, 97, // fea; }..data
+ 32, 123, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // { backgroun
+ 100, 58, 32, 35, 97, 101, 102, 59, 32, 125, 10, 10, // d: #aef; }..
+ 47, 42, 32, 71, 114, 105, 100, 32, 42, 47, 10, 46, // /* Grid */..
+ 114, 111, 119, 32, 123, 32, 100, 105, 115, 112, 108, 97, // row { displa
+ 121, 58, 32, 102, 108, 101, 120, 59, 32, 102, 108, 101, // y: flex; fle
+ 120, 45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, // x-wrap: wrap
+ 59, 32, 125, 10, 46, 99, 111, 108, 32, 123, 32, 109, // ; }..col { m
+ 97, 114, 103, 105, 110, 58, 32, 48, 59, 32, 112, 97, // argin: 0; pa
+ 100, 100, 105, 110, 103, 58, 32, 48, 59, 32, 111, 118, // dding: 0; ov
+ 101, 114, 102, 108, 111, 119, 58, 32, 97, 117, 116, 111, // erflow: auto
+ 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 50, 32, // ; }..col-12
+ 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100
+ 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 49, // %; }..col-11
+ 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 57, 49, // { width: 91
+ 46, 54, 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, // .66%; }..col
+ 45, 49, 48, 32, 123, 32, 119, 105, 100, 116, 104, 58, // -10 { width:
+ 32, 56, 51, 46, 51, 51, 37, 59, 32, 125, 10, 46, // 83.33%; }..
+ 99, 111, 108, 45, 57, 32, 123, 32, 119, 105, 100, 116, // col-9 { widt
+ 104, 58, 32, 55, 53, 37, 59, 32, 125, 10, 46, 99, // h: 75%; }..c
+ 111, 108, 45, 56, 32, 123, 32, 119, 105, 100, 116, 104, // ol-8 { width
+ 58, 32, 54, 54, 46, 54, 54, 37, 59, 32, 125, 10, // : 66.66%; }.
+ 46, 99, 111, 108, 45, 55, 32, 123, 32, 119, 105, 100, // .col-7 { wid
+ 116, 104, 58, 32, 53, 56, 46, 51, 51, 37, 59, 32, // th: 58.33%;
+ 125, 10, 46, 99, 111, 108, 45, 54, 32, 123, 32, 119, // }..col-6 { w
+ 105, 100, 116, 104, 58, 32, 53, 48, 37, 59, 32, 125, // idth: 50%; }
+ 10, 46, 99, 111, 108, 45, 53, 32, 123, 32, 119, 105, // ..col-5 { wi
+ 100, 116, 104, 58, 32, 52, 49, 46, 54, 54, 37, 59, // dth: 41.66%;
+ 32, 125, 10, 46, 99, 111, 108, 45, 52, 32, 123, 32, // }..col-4 {
+ 119, 105, 100, 116, 104, 58, 32, 51, 51, 46, 51, 51, // width: 33.33
+ 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 51, 32, // %; }..col-3
+ 123, 32, 119, 105, 100, 116, 104, 58, 32, 50, 53, 37, // { width: 25%
+ 59, 32, 125, 10, 46, 99, 111, 108, 45, 50, 32, 123, // ; }..col-2 {
+ 32, 119, 105, 100, 116, 104, 58, 32, 49, 54, 46, 54, // width: 16.6
+ 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, // 6%; }..col-1
+ 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 56, 46, // { width: 8.
+ 51, 51, 37, 59, 32, 125, 10, 64, 109, 101, 100, 105, // 33%; }.@medi
+ 97, 32, 40, 109, 105, 110, 45, 119, 105, 100, 116, 104, // a (min-width
+ 58, 32, 49, 51, 49, 48, 112, 120, 41, 32, 123, 32, // : 1310px) {
+ 46, 99, 111, 110, 116, 97, 105, 110, 101, 114, 32, 123, // .container {
+ 32, 109, 97, 114, 103, 105, 110, 58, 32, 97, 117, 116, // margin: aut
+ 111, 59, 32, 119, 105, 100, 116, 104, 58, 32, 49, 50, // o; width: 12
+ 55, 48, 112, 120, 59, 32, 125, 32, 125, 10, 64, 109, // 70px; } }.@m
+ 101, 100, 105, 97, 32, 40, 109, 97, 120, 45, 119, 105, // edia (max-wi
+ 100, 116, 104, 58, 32, 57, 50, 48, 112, 120, 41, 32, // dth: 920px)
+ 123, 32, 46, 114, 111, 119, 32, 46, 99, 111, 108, 32, // { .row .col
+ 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100
+ 37, 59, 32, 125, 32, 125, 10, 0 // %; } }.
+};
+static const unsigned char v5[] = {
137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, // .PNG........
73, 72, 68, 82, 0, 0, 0, 128, 0, 0, 0, 128, // IHDR........
8, 6, 0, 0, 0, 195, 62, 97, 203, 0, 0, 0, // ......>a....
@@ -3793,195 +2811,6 @@ static const unsigned char v4[] = {
126, 121, 49, 188, 0, 0, 0, 0, 73, 69, 78, 68, // ~y1.....IEND
174, 66, 96, 130, 0 // .B`.
};
-static const unsigned char v5[] = {
- 42, 32, 123, 32, 98, 111, 120, 45, 115, 105, 122, 105, // * { box-sizi
- 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, // ng: border-b
- 111, 120, 59, 32, 125, 10, 104, 116, 109, 108, 44, 32, // ox; }.html,
- 98, 111, 100, 121, 32, 123, 32, 109, 97, 114, 103, 105, // body { margi
- 110, 58, 32, 48, 59, 32, 112, 97, 100, 100, 105, 110, // n: 0; paddin
- 103, 58, 32, 48, 59, 32, 104, 101, 105, 103, 104, 116, // g: 0; height
- 58, 32, 49, 48, 48, 37, 59, 32, 102, 111, 110, 116, // : 100%; font
- 58, 32, 49, 54, 112, 120, 32, 115, 97, 110, 115, 45, // : 16px sans-
- 115, 101, 114, 105, 102, 59, 32, 125, 10, 115, 101, 108, // serif; }.sel
- 101, 99, 116, 44, 32, 105, 110, 112, 117, 116, 44, 32, // ect, input,
- 108, 97, 98, 101, 108, 58, 58, 98, 101, 102, 111, 114, // label::befor
- 101, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97, 32, // e, textarea
- 123, 32, 111, 117, 116, 108, 105, 110, 101, 58, 32, 110, // { outline: n
- 111, 110, 101, 59, 32, 98, 111, 120, 45, 115, 104, 97, // one; box-sha
- 100, 111, 119, 58, 110, 111, 110, 101, 32, 33, 105, 109, // dow:none !im
- 112, 111, 114, 116, 97, 110, 116, 59, 32, 98, 111, 114, // portant; bor
- 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, // der: 1px sol
- 105, 100, 32, 35, 99, 99, 99, 32, 33, 105, 109, 112, // id #ccc !imp
- 111, 114, 116, 97, 110, 116, 59, 32, 125, 10, 99, 111, // ortant; }.co
- 100, 101, 44, 32, 112, 114, 101, 32, 123, 32, 99, 111, // de, pre { co
- 108, 111, 114, 58, 32, 35, 51, 55, 51, 59, 32, 102, // lor: #373; f
- 111, 110, 116, 45, 102, 97, 109, 105, 108, 121, 58, 32, // ont-family:
- 109, 111, 110, 111, 115, 112, 97, 99, 101, 59, 32, 102, // monospace; f
- 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32, // ont-weight:
- 98, 111, 108, 100, 101, 114, 59, 32, 102, 111, 110, 116, // bolder; font
- 45, 115, 105, 122, 101, 58, 32, 115, 109, 97, 108, 108, // -size: small
- 101, 114, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // er; backgrou
- 110, 100, 58, 32, 35, 100, 100, 100, 59, 32, 112, 97, // nd: #ddd; pa
- 100, 100, 105, 110, 103, 58, 32, 48, 46, 49, 101, 109, // dding: 0.1em
- 32, 48, 46, 51, 101, 109, 59, 32, 98, 111, 114, 100, // 0.3em; bord
- 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0
- 46, 50, 101, 109, 59, 32, 125, 10, 116, 101, 120, 116, // .2em; }.text
- 97, 114, 101, 97, 44, 32, 105, 110, 112, 117, 116, 44, // area, input,
- 32, 46, 97, 100, 100, 111, 110, 32, 123, 32, 102, 111, // .addon { fo
- 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 53, 112, // nt-size: 15p
- 120, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, // x; border: 1
- 112, 120, 32, 115, 111, 108, 105, 100, 32, 35, 99, 99, // px solid #cc
- 99, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // c; padding:
- 48, 46, 53, 101, 109, 59, 32, 125, 10, 97, 44, 32, // 0.5em; }.a,
- 97, 58, 118, 105, 115, 105, 116, 101, 100, 44, 32, 97, // a:visited, a
- 58, 97, 99, 116, 105, 118, 101, 32, 123, 32, 99, 111, // :active { co
- 108, 111, 114, 58, 32, 35, 53, 53, 102, 59, 32, 125, // lor: #55f; }
- 10, 46, 97, 100, 100, 111, 110, 32, 123, 32, 98, 97, // ..addon { ba
- 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, 101, // ckground: #e
- 101, 101, 59, 32, 32, 109, 105, 110, 45, 119, 105, 100, // ee; min-wid
- 116, 104, 58, 32, 57, 101, 109, 59, 125, 10, 46, 98, // th: 9em;}..b
- 116, 110, 32, 123, 10, 32, 32, 98, 97, 99, 107, 103, // tn {. backg
- 114, 111, 117, 110, 100, 58, 32, 35, 99, 99, 99, 59, // round: #ccc;
- 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi
- 117, 115, 58, 32, 48, 46, 51, 101, 109, 59, 32, 98, // us: 0.3em; b
- 111, 114, 100, 101, 114, 58, 32, 48, 59, 32, 99, 111, // order: 0; co
- 108, 111, 114, 58, 32, 35, 102, 102, 102, 59, 32, 99, // lor: #fff; c
- 117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, // ursor: point
- 101, 114, 59, 10, 32, 32, 100, 105, 115, 112, 108, 97, // er;. displa
- 121, 58, 32, 105, 110, 108, 105, 110, 101, 45, 98, 108, // y: inline-bl
- 111, 99, 107, 59, 32, 112, 97, 100, 100, 105, 110, 103, // ock; padding
- 58, 32, 48, 46, 54, 101, 109, 32, 50, 101, 109, 59, // : 0.6em 2em;
- 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, // font-weight
- 58, 32, 98, 111, 108, 100, 101, 114, 59, 10, 125, 10, // : bolder;.}.
- 46, 98, 116, 110, 91, 100, 105, 115, 97, 98, 108, 101, // .btn[disable
- 100, 93, 32, 123, 32, 111, 112, 97, 99, 105, 116, 121, // d] { opacity
- 58, 32, 48, 46, 53, 59, 32, 99, 117, 114, 115, 111, // : 0.5; curso
- 114, 58, 32, 97, 117, 116, 111, 59, 125, 10, 46, 115, // r: auto;}..s
- 109, 111, 111, 116, 104, 32, 123, 32, 116, 114, 97, 110, // mooth { tran
- 115, 105, 116, 105, 111, 110, 58, 32, 97, 108, 108, 32, // sition: all
- 46, 50, 115, 59, 32, 125, 10, 46, 99, 111, 110, 116, // .2s; }..cont
- 97, 105, 110, 101, 114, 32, 123, 32, 109, 97, 114, 103, // ainer { marg
- 105, 110, 58, 32, 48, 32, 50, 48, 112, 120, 59, 32, // in: 0 20px;
- 119, 105, 100, 116, 104, 58, 32, 97, 117, 116, 111, 59, // width: auto;
- 32, 125, 10, 46, 100, 45, 102, 108, 101, 120, 32, 123, // }..d-flex {
- 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, // display: fl
- 101, 120, 59, 32, 125, 10, 46, 100, 45, 110, 111, 110, // ex; }..d-non
- 101, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, // e { display:
- 32, 110, 111, 110, 101, 59, 32, 125, 10, 46, 98, 111, // none; }..bo
- 114, 100, 101, 114, 32, 123, 32, 98, 111, 114, 100, 101, // rder { borde
- 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, // r: 1px solid
- 32, 35, 100, 100, 100, 59, 32, 125, 10, 46, 114, 111, // #ddd; }..ro
- 117, 110, 100, 101, 100, 32, 123, 32, 98, 111, 114, 100, // unded { bord
- 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0
- 46, 53, 101, 109, 59, 32, 125, 10, 46, 110, 111, 119, // .5em; }..now
- 114, 97, 112, 32, 123, 32, 119, 104, 105, 116, 101, 45, // rap { white-
- 115, 112, 97, 99, 101, 58, 32, 110, 111, 119, 114, 97, // space: nowra
- 112, 59, 32, 125, 10, 46, 109, 115, 103, 32, 123, 32, // p; }..msg {
- 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, // background:
- 35, 100, 101, 102, 59, 32, 98, 111, 114, 100, 101, 114, // #def; border
- 45, 108, 101, 102, 116, 58, 32, 53, 112, 120, 32, 115, // -left: 5px s
- 111, 108, 105, 100, 32, 35, 53, 57, 100, 59, 32, 112, // olid #59d; p
- 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, 53, 101, // adding: 0.5e
- 109, 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, // m; font-size
- 58, 32, 57, 48, 37, 59, 32, 109, 97, 114, 103, 105, // : 90%; margi
- 110, 58, 32, 49, 101, 109, 32, 48, 59, 32, 125, 10, // n: 1em 0; }.
- 46, 115, 101, 99, 116, 105, 111, 110, 32, 123, 32, 109, // .section { m
- 97, 114, 103, 105, 110, 58, 32, 48, 32, 49, 101, 109, // argin: 0 1em
- 59, 32, 125, 10, 46, 116, 111, 112, 105, 99, 44, 32, // ; }..topic,
- 46, 100, 97, 116, 97, 44, 32, 46, 113, 111, 115, 32, // .data, .qos
- 123, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // { padding:
- 48, 46, 50, 101, 109, 32, 48, 46, 53, 101, 109, 59, // 0.2em 0.5em;
- 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi
- 117, 115, 58, 32, 48, 46, 52, 101, 109, 59, 32, 109, // us: 0.4em; m
- 97, 114, 103, 105, 110, 45, 114, 105, 103, 104, 116, 58, // argin-right:
- 32, 48, 46, 53, 101, 109, 59, 32, 32, 125, 10, 46, // 0.5em; }..
- 113, 111, 115, 32, 123, 32, 98, 97, 99, 107, 103, 114, // qos { backgr
- 111, 117, 110, 100, 58, 32, 35, 101, 102, 97, 59, 32, // ound: #efa;
- 125, 10, 46, 116, 111, 112, 105, 99, 32, 123, 32, 98, // }..topic { b
- 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: #
- 102, 101, 97, 59, 32, 125, 10, 46, 100, 97, 116, 97, // fea; }..data
- 32, 123, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // { backgroun
- 100, 58, 32, 35, 97, 101, 102, 59, 32, 125, 10, 10, // d: #aef; }..
- 47, 42, 32, 71, 114, 105, 100, 32, 42, 47, 10, 46, // /* Grid */..
- 114, 111, 119, 32, 123, 32, 100, 105, 115, 112, 108, 97, // row { displa
- 121, 58, 32, 102, 108, 101, 120, 59, 32, 102, 108, 101, // y: flex; fle
- 120, 45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, // x-wrap: wrap
- 59, 32, 125, 10, 46, 99, 111, 108, 32, 123, 32, 109, // ; }..col { m
- 97, 114, 103, 105, 110, 58, 32, 48, 59, 32, 112, 97, // argin: 0; pa
- 100, 100, 105, 110, 103, 58, 32, 48, 59, 32, 111, 118, // dding: 0; ov
- 101, 114, 102, 108, 111, 119, 58, 32, 97, 117, 116, 111, // erflow: auto
- 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 50, 32, // ; }..col-12
- 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100
- 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 49, // %; }..col-11
- 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 57, 49, // { width: 91
- 46, 54, 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, // .66%; }..col
- 45, 49, 48, 32, 123, 32, 119, 105, 100, 116, 104, 58, // -10 { width:
- 32, 56, 51, 46, 51, 51, 37, 59, 32, 125, 10, 46, // 83.33%; }..
- 99, 111, 108, 45, 57, 32, 123, 32, 119, 105, 100, 116, // col-9 { widt
- 104, 58, 32, 55, 53, 37, 59, 32, 125, 10, 46, 99, // h: 75%; }..c
- 111, 108, 45, 56, 32, 123, 32, 119, 105, 100, 116, 104, // ol-8 { width
- 58, 32, 54, 54, 46, 54, 54, 37, 59, 32, 125, 10, // : 66.66%; }.
- 46, 99, 111, 108, 45, 55, 32, 123, 32, 119, 105, 100, // .col-7 { wid
- 116, 104, 58, 32, 53, 56, 46, 51, 51, 37, 59, 32, // th: 58.33%;
- 125, 10, 46, 99, 111, 108, 45, 54, 32, 123, 32, 119, // }..col-6 { w
- 105, 100, 116, 104, 58, 32, 53, 48, 37, 59, 32, 125, // idth: 50%; }
- 10, 46, 99, 111, 108, 45, 53, 32, 123, 32, 119, 105, // ..col-5 { wi
- 100, 116, 104, 58, 32, 52, 49, 46, 54, 54, 37, 59, // dth: 41.66%;
- 32, 125, 10, 46, 99, 111, 108, 45, 52, 32, 123, 32, // }..col-4 {
- 119, 105, 100, 116, 104, 58, 32, 51, 51, 46, 51, 51, // width: 33.33
- 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 51, 32, // %; }..col-3
- 123, 32, 119, 105, 100, 116, 104, 58, 32, 50, 53, 37, // { width: 25%
- 59, 32, 125, 10, 46, 99, 111, 108, 45, 50, 32, 123, // ; }..col-2 {
- 32, 119, 105, 100, 116, 104, 58, 32, 49, 54, 46, 54, // width: 16.6
- 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, // 6%; }..col-1
- 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 56, 46, // { width: 8.
- 51, 51, 37, 59, 32, 125, 10, 64, 109, 101, 100, 105, // 33%; }.@medi
- 97, 32, 40, 109, 105, 110, 45, 119, 105, 100, 116, 104, // a (min-width
- 58, 32, 49, 51, 49, 48, 112, 120, 41, 32, 123, 32, // : 1310px) {
- 46, 99, 111, 110, 116, 97, 105, 110, 101, 114, 32, 123, // .container {
- 32, 109, 97, 114, 103, 105, 110, 58, 32, 97, 117, 116, // margin: aut
- 111, 59, 32, 119, 105, 100, 116, 104, 58, 32, 49, 50, // o; width: 12
- 55, 48, 112, 120, 59, 32, 125, 32, 125, 10, 64, 109, // 70px; } }.@m
- 101, 100, 105, 97, 32, 40, 109, 97, 120, 45, 119, 105, // edia (max-wi
- 100, 116, 104, 58, 32, 57, 50, 48, 112, 120, 41, 32, // dth: 920px)
- 123, 32, 46, 114, 111, 119, 32, 46, 99, 111, 108, 32, // { .row .col
- 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100
- 37, 59, 32, 125, 32, 125, 10, 0 // %; } }.
-};
-static const unsigned char v6[] = {
- 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, // .. <
- 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, // head>. Device
- 68, 97, 115, 104, 98, 111, 97, 114, 100, 60, 47, 116, // Dashboard. .
- 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, // .
- 32, 32, 32, 60, 109, 101, 116, 97, 32, 110, 97, 109, // . .
- 10, 32, 32, 60, 98, 111, 100, 121, 62, 60, 47, 98, // . . .
- 10, 0 // .
-};
static const struct packed_file {
const char *name;
@@ -3989,12 +2818,11 @@ static const struct packed_file {
size_t size;
time_t mtime;
} packed_files[] = {
- {"/web_root/main.js.orig", v1, sizeof(v1), 1656079031},
- {"/web_root/preact.min.js", v2, sizeof(v2), 1655487950},
- {"/web_root/main.js", v3, sizeof(v3), 1663771957},
- {"/web_root/user.png", v4, sizeof(v4), 1655487950},
- {"/web_root/style.css", v5, sizeof(v5), 1655487950},
- {"/web_root/index.html", v6, sizeof(v6), 1655487950},
+ {"/web_root/index.html", v1, sizeof(v1), 1659483223},
+ {"/web_root/main.js", v2, sizeof(v2), 1662621376},
+ {"/web_root/preact.min.js", v3, sizeof(v3), 1659483223},
+ {"/web_root/style.css", v4, sizeof(v4), 1659483223},
+ {"/web_root/user.png", v5, sizeof(v5), 1659483223},
{NULL, NULL, 0, 0}
};
diff --git a/mip/mip.c b/mip/mip.c
index 37723361..eb6a2540 100644
--- a/mip/mip.c
+++ b/mip/mip.c
@@ -296,6 +296,13 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) {
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]));
}
+static size_t ether_output(struct mip_if *ifp, size_t len) {
+ // size_t min = 64; // Pad short frames to 64 bytes (minimum Ethernet size)
+ // if (len < min) memset(ifp->tx.buf + len, 0, min - len), len = min;
+ // mg_hexdump(ifp->tx.buf, len);
+ return ifp->driver->tx(ifp->tx.buf, len, ifp->driver_data);
+}
+
static void arp_ask(struct mip_if *ifp, uint32_t ip) {
struct eth *eth = (struct eth *) ifp->tx.buf;
struct arp *arp = (struct arp *) (eth + 1);
@@ -307,7 +314,7 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) {
arp->plen = 4;
arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip;
memcpy(arp->sha, ifp->mac, sizeof(arp->sha));
- ifp->driver->tx(eth, PDIFF(eth, arp + 1), ifp->driver_data);
+ ether_output(ifp, PDIFF(eth, arp + 1));
}
static size_t mg_print_ipv4(mg_pfn_t fn, void *fn_data, va_list *ap) {
@@ -333,11 +340,12 @@ static struct ip *tx_ip(struct mip_if *ifp, uint8_t proto, uint32_t ip_src,
uint32_t ip_dst, size_t plen) {
struct eth *eth = (struct eth *) ifp->tx.buf;
struct ip *ip = (struct ip *) (eth + 1);
- uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ?
- if (!mac) mac = arp_cache_find(ifp, ifp->gw); // No, use gateway
- if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it
- if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast
- memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup
+ uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ?
+ if (!mac && (ip_dst & ifp->mask)) arp_ask(ifp, ip_dst); // Same net, lookup
+ if (!mac) mac = arp_cache_find(ifp, ifp->gw); // Use gateway MAC
+ if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it
+ if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast
+ memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup
eth->type = mg_htons(0x800);
memset(ip, 0, sizeof(*ip));
ip->ver = 0x45; // Version 4, header length 5 words
@@ -369,24 +377,11 @@ static void tx_udp(struct mip_if *ifp, uint32_t ip_src, uint16_t sport,
udp->csum = csumfin(cs);
memmove(udp + 1, buf, len);
// MG_DEBUG(("UDP LEN %d %d", (int) len, (int) ifp->frame_len));
- ifp->driver->tx(ifp->tx.buf,
- sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len,
- ifp->driver_data);
+ ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len);
}
static void tx_dhcp(struct mip_if *ifp, uint32_t src, uint32_t dst,
uint8_t *opts, size_t optslen) {
-#if 0
-struct dhcp {
- uint8_t op, htype, hlen, hops;
- uint32_t xid;
- uint16_t secs, flags;
- uint32_t ciaddr, yiaddr, siaddr, giaddr;
- uint8_t hwaddr[208];
- uint32_t magic;
- uint8_t options[32];
-};
-#endif
struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};
dhcp.magic = mg_htonl(0x63825363);
memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac));
@@ -435,7 +430,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
arp->tpa = pkt->arp->spa;
arp->spa = ifp->ip;
MG_DEBUG(("ARP response: we're %#lx", (long) mg_ntohl(ifp->ip)));
- ifp->driver->tx(ifp->tx.buf, PDIFF(eth, arp + 1), ifp->driver_data);
+ ether_output(ifp, PDIFF(eth, arp + 1));
} else if (pkt->arp->op == mg_htons(2)) {
if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;
// MG_INFO(("ARP RESPONSE"));
@@ -446,15 +441,16 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
static void rx_icmp(struct mip_if *ifp, struct pkt *pkt) {
// MG_DEBUG(("ICMP %d", (int) len));
if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) {
- struct ip *ip = tx_ip(ifp, 1, ifp->ip, pkt->ip->src,
- sizeof(struct icmp) + pkt->pay.len);
+ size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp);
+ size_t space = ifp->tx.len - hlen, plen = pkt->pay.len;
+ if (plen > space) plen = space;
+ struct ip *ip =
+ tx_ip(ifp, 1, ifp->ip, pkt->ip->src, sizeof(struct icmp) + plen);
struct icmp *icmp = (struct icmp *) (ip + 1);
- size_t len = PDIFF(ifp->tx.buf, icmp + 1), left = ifp->tx.len - len;
- if (left > pkt->pay.len) left = pkt->pay.len; // Don't overflow TX
- memset(icmp, 0, sizeof(*icmp)); // Set csum to 0
- memcpy(icmp + 1, pkt->pay.buf, left); // Copy RX payload to TX
- icmp->csum = ipcsum(icmp, sizeof(*icmp) + left);
- ifp->driver->tx(ifp->tx.buf, len + left, ifp->driver_data);
+ memset(icmp, 0, sizeof(*icmp)); // Set csum to 0
+ memcpy(icmp + 1, pkt->pay.buf, plen); // Copy RX payload to TX
+ icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen);
+ ether_output(ifp, hlen + plen);
}
}
@@ -538,8 +534,7 @@ static size_t tx_tcp(struct mip_if *ifp, uint32_t dst_ip, uint8_t flags,
cs = csumup(cs, &ip->dst, sizeof(ip->dst));
cs = csumup(cs, pseudo, sizeof(pseudo));
tcp->csum = csumfin(cs);
- return ifp->driver->tx(ifp->tx.buf, PDIFF(ifp->tx.buf, tcp + 1) + len,
- ifp->driver_data);
+ return ether_output(ifp, PDIFF(ifp->tx.buf, tcp + 1) + len);
}
static size_t tx_tcp_pkt(struct mip_if *ifp, struct pkt *pkt, uint8_t flags,
@@ -608,16 +603,17 @@ long mg_io_recv(struct mg_connection *c, void *buf, size_t len) {
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
struct connstate *s = (struct connstate *) (c + 1);
struct mg_iobuf *io = c->is_tls ? &s->raw : &c->recv;
+ uint32_t seq = mg_ntohl(pkt->tcp->seq);
s->raw.align = c->recv.align;
if (pkt->tcp->flags & TH_FIN) {
s->ack = mg_htonl(pkt->tcp->seq) + 1, s->seq = mg_htonl(pkt->tcp->ack);
c->is_closing = 1;
} else if (pkt->pay.len == 0) {
// TODO(cpq): handle this peer's ACK
- } else if (mg_ntohl(pkt->tcp->seq) != s->ack) {
+ } else if (seq != s->ack) {
// TODO(cpq): peer sent us SEQ which we don't expect. Retransmit rather
// than close this connection
- mg_error(c, "SEQ != ACK: %x %x", mg_ntohl(pkt->tcp->seq), s->ack);
+ mg_error(c, "SEQ != ACK: %x %x", seq, s->ack);
} else if (io->size - io->len < pkt->pay.len &&
!mg_iobuf_resize(io, io->len + pkt->pay.len)) {
mg_error(c, "oom");
@@ -629,9 +625,18 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) {
// call back mg_io_recv() which grabs raw data from s->raw
memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len);
io->len += pkt->pay.len;
- // Advance ACK counter and setup a timer to send an ACK back
+
+ MG_DEBUG(("%lu SEQ %x -> %x", c->id, mg_htonl(pkt->tcp->seq), s->ack));
s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);
+#if 1
+ // Send ACK immediately
+ MG_DEBUG((" imm ACK", c->id, mg_htonl(pkt->tcp->seq), s->ack));
+ tx_tcp((struct mip_if *) c->mgr->priv, c->rem.ip, TH_ACK, c->loc.port,
+ c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0);
+#else
+ // Advance ACK counter and setup a timer to send an ACK back
settmout(c, MIP_TTYPE_ACK);
+#endif
if (c->is_tls) {
// TLS connection. Make room for decrypted data in c->recv
@@ -699,7 +704,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
}
static void rx_ip(struct mip_if *ifp, struct pkt *pkt) {
- // MG_DEBUG(("IP %d", (int) pkt->pay.len));
+ // MG_DEBUG(("IP %d", (int) pkt->pay.len));
if (pkt->ip->proto == 1) {
pkt->icmp = (struct icmp *) (pkt->ip + 1);
if (pkt->pay.len < sizeof(*pkt->icmp)) return;
@@ -771,6 +776,10 @@ static void mip_rx(struct mip_if *ifp, void *buf, size_t len) {
pkt.ip = (struct ip *) (pkt.eth + 1);
if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated
if ((pkt.ip->ver >> 4) != 4) return; // Not IP
+ // Truncate frame to what IP header tells us
+ if ((size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth) < pkt.raw.len) {
+ pkt.raw.len = (size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth);
+ }
mkpay(&pkt, pkt.ip + 1);
rx_ip(ifp, &pkt);
} else {
@@ -823,7 +832,7 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) {
struct connstate *s = (struct connstate *) (c + 1);
if (uptime_ms > s->timer) {
if (s->ttype == MIP_TTYPE_ACK) {
- MG_DEBUG(("%lu ack", c->id));
+ MG_DEBUG(("%lu ack %x %x", c->id, s->seq, s->ack));
tx_tcp(ifp, c->rem.ip, TH_ACK, c->loc.port, c->rem.port,
mg_htonl(s->seq), mg_htonl(s->ack), "", 0);
} else {
diff --git a/mongoose.c b/mongoose.c
index 5c567a62..1ebd29c9 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -6608,6 +6608,13 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) {
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]));
}
+static size_t ether_output(struct mip_if *ifp, size_t len) {
+ // size_t min = 64; // Pad short frames to 64 bytes (minimum Ethernet size)
+ // if (len < min) memset(ifp->tx.buf + len, 0, min - len), len = min;
+ // mg_hexdump(ifp->tx.buf, len);
+ return ifp->driver->tx(ifp->tx.buf, len, ifp->driver_data);
+}
+
static void arp_ask(struct mip_if *ifp, uint32_t ip) {
struct eth *eth = (struct eth *) ifp->tx.buf;
struct arp *arp = (struct arp *) (eth + 1);
@@ -6619,7 +6626,7 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) {
arp->plen = 4;
arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip;
memcpy(arp->sha, ifp->mac, sizeof(arp->sha));
- ifp->driver->tx(eth, PDIFF(eth, arp + 1), ifp->driver_data);
+ ether_output(ifp, PDIFF(eth, arp + 1));
}
static size_t mg_print_ipv4(mg_pfn_t fn, void *fn_data, va_list *ap) {
@@ -6645,11 +6652,12 @@ static struct ip *tx_ip(struct mip_if *ifp, uint8_t proto, uint32_t ip_src,
uint32_t ip_dst, size_t plen) {
struct eth *eth = (struct eth *) ifp->tx.buf;
struct ip *ip = (struct ip *) (eth + 1);
- uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ?
- if (!mac) mac = arp_cache_find(ifp, ifp->gw); // No, use gateway
- if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it
- if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast
- memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup
+ uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ?
+ if (!mac && (ip_dst & ifp->mask)) arp_ask(ifp, ip_dst); // Same net, lookup
+ if (!mac) mac = arp_cache_find(ifp, ifp->gw); // Use gateway MAC
+ if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it
+ if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast
+ memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup
eth->type = mg_htons(0x800);
memset(ip, 0, sizeof(*ip));
ip->ver = 0x45; // Version 4, header length 5 words
@@ -6681,24 +6689,11 @@ static void tx_udp(struct mip_if *ifp, uint32_t ip_src, uint16_t sport,
udp->csum = csumfin(cs);
memmove(udp + 1, buf, len);
// MG_DEBUG(("UDP LEN %d %d", (int) len, (int) ifp->frame_len));
- ifp->driver->tx(ifp->tx.buf,
- sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len,
- ifp->driver_data);
+ ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len);
}
static void tx_dhcp(struct mip_if *ifp, uint32_t src, uint32_t dst,
uint8_t *opts, size_t optslen) {
-#if 0
-struct dhcp {
- uint8_t op, htype, hlen, hops;
- uint32_t xid;
- uint16_t secs, flags;
- uint32_t ciaddr, yiaddr, siaddr, giaddr;
- uint8_t hwaddr[208];
- uint32_t magic;
- uint8_t options[32];
-};
-#endif
struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};
dhcp.magic = mg_htonl(0x63825363);
memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac));
@@ -6747,7 +6742,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
arp->tpa = pkt->arp->spa;
arp->spa = ifp->ip;
MG_DEBUG(("ARP response: we're %#lx", (long) mg_ntohl(ifp->ip)));
- ifp->driver->tx(ifp->tx.buf, PDIFF(eth, arp + 1), ifp->driver_data);
+ ether_output(ifp, PDIFF(eth, arp + 1));
} else if (pkt->arp->op == mg_htons(2)) {
if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;
// MG_INFO(("ARP RESPONSE"));
@@ -6758,15 +6753,16 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
static void rx_icmp(struct mip_if *ifp, struct pkt *pkt) {
// MG_DEBUG(("ICMP %d", (int) len));
if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) {
- struct ip *ip = tx_ip(ifp, 1, ifp->ip, pkt->ip->src,
- sizeof(struct icmp) + pkt->pay.len);
+ size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp);
+ size_t space = ifp->tx.len - hlen, plen = pkt->pay.len;
+ if (plen > space) plen = space;
+ struct ip *ip =
+ tx_ip(ifp, 1, ifp->ip, pkt->ip->src, sizeof(struct icmp) + plen);
struct icmp *icmp = (struct icmp *) (ip + 1);
- size_t len = PDIFF(ifp->tx.buf, icmp + 1), left = ifp->tx.len - len;
- if (left > pkt->pay.len) left = pkt->pay.len; // Don't overflow TX
- memset(icmp, 0, sizeof(*icmp)); // Set csum to 0
- memcpy(icmp + 1, pkt->pay.buf, left); // Copy RX payload to TX
- icmp->csum = ipcsum(icmp, sizeof(*icmp) + left);
- ifp->driver->tx(ifp->tx.buf, len + left, ifp->driver_data);
+ memset(icmp, 0, sizeof(*icmp)); // Set csum to 0
+ memcpy(icmp + 1, pkt->pay.buf, plen); // Copy RX payload to TX
+ icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen);
+ ether_output(ifp, hlen + plen);
}
}
@@ -6850,8 +6846,7 @@ static size_t tx_tcp(struct mip_if *ifp, uint32_t dst_ip, uint8_t flags,
cs = csumup(cs, &ip->dst, sizeof(ip->dst));
cs = csumup(cs, pseudo, sizeof(pseudo));
tcp->csum = csumfin(cs);
- return ifp->driver->tx(ifp->tx.buf, PDIFF(ifp->tx.buf, tcp + 1) + len,
- ifp->driver_data);
+ return ether_output(ifp, PDIFF(ifp->tx.buf, tcp + 1) + len);
}
static size_t tx_tcp_pkt(struct mip_if *ifp, struct pkt *pkt, uint8_t flags,
@@ -6920,16 +6915,17 @@ long mg_io_recv(struct mg_connection *c, void *buf, size_t len) {
static void read_conn(struct mg_connection *c, struct pkt *pkt) {
struct connstate *s = (struct connstate *) (c + 1);
struct mg_iobuf *io = c->is_tls ? &s->raw : &c->recv;
+ uint32_t seq = mg_ntohl(pkt->tcp->seq);
s->raw.align = c->recv.align;
if (pkt->tcp->flags & TH_FIN) {
s->ack = mg_htonl(pkt->tcp->seq) + 1, s->seq = mg_htonl(pkt->tcp->ack);
c->is_closing = 1;
} else if (pkt->pay.len == 0) {
// TODO(cpq): handle this peer's ACK
- } else if (mg_ntohl(pkt->tcp->seq) != s->ack) {
+ } else if (seq != s->ack) {
// TODO(cpq): peer sent us SEQ which we don't expect. Retransmit rather
// than close this connection
- mg_error(c, "SEQ != ACK: %x %x", mg_ntohl(pkt->tcp->seq), s->ack);
+ mg_error(c, "SEQ != ACK: %x %x", seq, s->ack);
} else if (io->size - io->len < pkt->pay.len &&
!mg_iobuf_resize(io, io->len + pkt->pay.len)) {
mg_error(c, "oom");
@@ -6941,9 +6937,18 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) {
// call back mg_io_recv() which grabs raw data from s->raw
memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len);
io->len += pkt->pay.len;
- // Advance ACK counter and setup a timer to send an ACK back
+
+ MG_DEBUG(("%lu SEQ %x -> %x", c->id, mg_htonl(pkt->tcp->seq), s->ack));
s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);
+#if 1
+ // Send ACK immediately
+ MG_DEBUG((" imm ACK", c->id, mg_htonl(pkt->tcp->seq), s->ack));
+ tx_tcp((struct mip_if *) c->mgr->priv, c->rem.ip, TH_ACK, c->loc.port,
+ c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0);
+#else
+ // Advance ACK counter and setup a timer to send an ACK back
settmout(c, MIP_TTYPE_ACK);
+#endif
if (c->is_tls) {
// TLS connection. Make room for decrypted data in c->recv
@@ -7011,7 +7016,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
}
static void rx_ip(struct mip_if *ifp, struct pkt *pkt) {
- // MG_DEBUG(("IP %d", (int) pkt->pay.len));
+ // MG_DEBUG(("IP %d", (int) pkt->pay.len));
if (pkt->ip->proto == 1) {
pkt->icmp = (struct icmp *) (pkt->ip + 1);
if (pkt->pay.len < sizeof(*pkt->icmp)) return;
@@ -7083,6 +7088,10 @@ static void mip_rx(struct mip_if *ifp, void *buf, size_t len) {
pkt.ip = (struct ip *) (pkt.eth + 1);
if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated
if ((pkt.ip->ver >> 4) != 4) return; // Not IP
+ // Truncate frame to what IP header tells us
+ if ((size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth) < pkt.raw.len) {
+ pkt.raw.len = (size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth);
+ }
mkpay(&pkt, pkt.ip + 1);
rx_ip(ifp, &pkt);
} else {
@@ -7135,7 +7144,7 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) {
struct connstate *s = (struct connstate *) (c + 1);
if (uptime_ms > s->timer) {
if (s->ttype == MIP_TTYPE_ACK) {
- MG_DEBUG(("%lu ack", c->id));
+ MG_DEBUG(("%lu ack %x %x", c->id, s->seq, s->ack));
tx_tcp(ifp, c->rem.ip, TH_ACK, c->loc.port, c->rem.port,
mg_htonl(s->seq), mg_htonl(s->ack), "", 0);
} else {