initial code for interface
This commit is contained in:
parent
b2d5bc92a3
commit
13514d1600
50
o_manager.py
50
o_manager.py
@ -7,6 +7,10 @@ import json
|
|||||||
import socket
|
import socket
|
||||||
import fcntl
|
import fcntl
|
||||||
import struct
|
import struct
|
||||||
|
import math
|
||||||
|
import numpy
|
||||||
|
from plot_gen import TimeSeriesAccumulator
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
|
||||||
def get_ip_address(ifname):
|
def get_ip_address(ifname):
|
||||||
@ -72,6 +76,7 @@ class OManager:
|
|||||||
"name": i["op"].name,
|
"name": i["op"].name,
|
||||||
"weight": i["weight"],
|
"weight": i["weight"],
|
||||||
"pids": i["op"].pids,
|
"pids": i["op"].pids,
|
||||||
|
"status": i["op"].status,
|
||||||
"log": i["op"].get_log(lines=10),
|
"log": i["op"].get_log(lines=10),
|
||||||
"io_stat": i["op"].get_io_stat(lines=5),
|
"io_stat": i["op"].get_io_stat(lines=5),
|
||||||
"ping_stat": i["op"].get_ping_stat(lines=5)
|
"ping_stat": i["op"].get_ping_stat(lines=5)
|
||||||
@ -83,6 +88,51 @@ class OManager:
|
|||||||
}
|
}
|
||||||
return state
|
return state
|
||||||
|
|
||||||
|
def get_stat(self, time_range=5, n_bins=200):
|
||||||
|
stat = []
|
||||||
|
|
||||||
|
now = datetime.now()
|
||||||
|
for i in self.instances:
|
||||||
|
lines = math.ceil(time_range*60/5)
|
||||||
|
io_stat = i["op"].get_io_stat(lines=lines)
|
||||||
|
first_line = True
|
||||||
|
prev_value = None
|
||||||
|
io_tas = TimeSeriesAccumulator(
|
||||||
|
start_time=now-timedelta(minutes=time_range), end_time=now, n_bins=n_bins)
|
||||||
|
for line in io_stat:
|
||||||
|
time, value = line.split(",")
|
||||||
|
time = datetime.utcfromtimestamp(float(time))
|
||||||
|
value = float(value)
|
||||||
|
if first_line:
|
||||||
|
first_line = False
|
||||||
|
else:
|
||||||
|
delta = max(0, value - prev_value)
|
||||||
|
io_tas.add(time, delta/5)
|
||||||
|
prev_value = value
|
||||||
|
ping_stat = i["op"].get_ping_stat(lines=lines)
|
||||||
|
ping_tas = TimeSeriesAccumulator(
|
||||||
|
start_time=now-timedelta(minutes=time_range), end_time=now, n_bins=n_bins)
|
||||||
|
for line in ping_stat:
|
||||||
|
time, value = line.split(",")
|
||||||
|
time = datetime.utcfromtimestamp(float(time))
|
||||||
|
value = float(value)
|
||||||
|
ping_tas.add(time, delta)
|
||||||
|
|
||||||
|
def ping_mean(x):
|
||||||
|
x = numpy.array(x)
|
||||||
|
return numpy.mean(x[x > 0])
|
||||||
|
|
||||||
|
def ping_rate(x):
|
||||||
|
x = numpy.array(x)
|
||||||
|
return numpy.count_nonzero(x > 0)/len(x)
|
||||||
|
|
||||||
|
stat.append({
|
||||||
|
"io_mean": io_tas.get_f(numpy.mean),
|
||||||
|
"ping_mean": ping_tas.get_f(ping_mean),
|
||||||
|
"ping_rate": ping_tas.get_f(ping_rate)
|
||||||
|
})
|
||||||
|
return stat
|
||||||
|
|
||||||
def generate_lb_cfg(self, load_balance_mode):
|
def generate_lb_cfg(self, load_balance_mode):
|
||||||
lb_cfg_fp = os.path.join(
|
lb_cfg_fp = os.path.join(
|
||||||
self.base_folder, f"go-socks-lb-{load_balance_mode}.yml")
|
self.base_folder, f"go-socks-lb-{load_balance_mode}.yml")
|
||||||
|
|||||||
127
olb_web.py
127
olb_web.py
@ -1,127 +0,0 @@
|
|||||||
import tornado.ioloop
|
|
||||||
import tornado.web
|
|
||||||
import json
|
|
||||||
import argparse
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
from o_manager import OManager
|
|
||||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
|
|
||||||
ap = argparse.ArgumentParser()
|
|
||||||
ap.add_argument("-i", "--interface", required=False,
|
|
||||||
help="interface (default: eth0)", default="eth0")
|
|
||||||
ap.add_argument("-s", "--session_folder", required=True,
|
|
||||||
help="path to the session folder")
|
|
||||||
args = vars(ap.parse_args())
|
|
||||||
session_folder = args["session_folder"]
|
|
||||||
interface = args["interface"]
|
|
||||||
om = OManager(session_folder, interface)
|
|
||||||
|
|
||||||
|
|
||||||
class MainHandler(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
buf = "<html>\n<head><meta http-equiv=\"refresh\" content=\"5\"></head>\n"
|
|
||||||
buf += "<body>\n"
|
|
||||||
buf += f"ops len: {len(om.instances)}, lb pids: {om.pids} <br/>\n"
|
|
||||||
if len(om.instances):
|
|
||||||
for i in om.instances:
|
|
||||||
op = i["op"]
|
|
||||||
idx = i["idx"]
|
|
||||||
weight = i["weight"]
|
|
||||||
buf += f"op #{idx}, name: {op.name} <br/>\n"
|
|
||||||
buf += f"status: {op.status}, weight: {weight} <br/>\n"
|
|
||||||
buf += f"op pids: {op.pids}<br/>\n"
|
|
||||||
buf += "log: <br/>\n"
|
|
||||||
buf += "<pre>\n"
|
|
||||||
buf += "\n".join(op.get_log(lines=10))
|
|
||||||
buf += f"\nSpeed: {op.get_latest_speed()}\n"
|
|
||||||
buf += "\nio_stat\n"
|
|
||||||
buf += "\n".join(op.get_io_stat(lines=5))
|
|
||||||
buf += "\nping_stat\n"
|
|
||||||
buf += "\n".join(op.get_ping_stat(lines=5))
|
|
||||||
buf += "\n</pre>\n"
|
|
||||||
buf += "</body>\n</html>"
|
|
||||||
self.write(buf)
|
|
||||||
|
|
||||||
|
|
||||||
class ConfigsHandeler(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
cfgs = json.loads(open("profiles.json", "r").read())
|
|
||||||
buf = "Select one configuration to create. <br/>\n"
|
|
||||||
for idx, cfg in enumerate(cfgs):
|
|
||||||
buf += f"<a href='/create?i={idx}'>{cfg['name']}</a><br/>\n"
|
|
||||||
self.write(buf)
|
|
||||||
|
|
||||||
|
|
||||||
class CreateInstantceHandler(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
idx = self.get_query_argument("i", None)
|
|
||||||
if idx != None:
|
|
||||||
idx = int(idx)
|
|
||||||
cfgs = json.loads(open("profiles.json", "r").read())
|
|
||||||
cfg = cfgs[idx]
|
|
||||||
om.new_op(cfg["cfg_fp"], cfg["name"],
|
|
||||||
additional_cfg=cfg["additional_cfg"])
|
|
||||||
self.write("create sucess!")
|
|
||||||
else:
|
|
||||||
self.write("need idx")
|
|
||||||
|
|
||||||
|
|
||||||
class StartInstatnceHandler(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
idx = self.get_query_argument("i", None)
|
|
||||||
if idx != None:
|
|
||||||
om.start_op(int(idx))
|
|
||||||
self.write("start sucess!")
|
|
||||||
else:
|
|
||||||
om.start_all()
|
|
||||||
self.write("start all")
|
|
||||||
|
|
||||||
|
|
||||||
class StopInstatnceHandler(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
idx = self.get_query_argument("i", None)
|
|
||||||
if idx != None:
|
|
||||||
om.stop_op(int(idx))
|
|
||||||
self.write("stop sucess!")
|
|
||||||
else:
|
|
||||||
om.stop_all()
|
|
||||||
self.write("stop all")
|
|
||||||
|
|
||||||
|
|
||||||
class RemoveInstatnceHandler(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
idx = self.get_query_argument("i", None)
|
|
||||||
if idx != None:
|
|
||||||
om.remove_op(int(idx))
|
|
||||||
self.write("remove sucess!")
|
|
||||||
else:
|
|
||||||
om.remove_all_op()
|
|
||||||
self.write("remove all")
|
|
||||||
|
|
||||||
|
|
||||||
class ClearCacheInstatnceHandler(tornado.web.RequestHandler):
|
|
||||||
def get(self):
|
|
||||||
om.clear_cache()
|
|
||||||
|
|
||||||
|
|
||||||
def make_app():
|
|
||||||
return tornado.web.Application([
|
|
||||||
(r"/", MainHandler),
|
|
||||||
(r"/select", ConfigsHandeler),
|
|
||||||
(r"/create", CreateInstantceHandler),
|
|
||||||
(r"/start", StartInstatnceHandler),
|
|
||||||
(r"/stop", StopInstatnceHandler),
|
|
||||||
(r"/remove", RemoveInstatnceHandler),
|
|
||||||
(r"/clear_cache", ClearCacheInstatnceHandler),
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app = make_app()
|
|
||||||
app.listen(8000)
|
|
||||||
proc = subprocess.Popen([os.path.join(dir_path, "iptable_docker.sh"), interface],
|
|
||||||
stdout=subprocess.PIPE)
|
|
||||||
outs, errs = proc.communicate()
|
|
||||||
print(outs.decode())
|
|
||||||
tornado.ioloop.IOLoop.current().start()
|
|
||||||
38
plot_gen.py
Normal file
38
plot_gen.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
from datetime import timezone
|
||||||
|
|
||||||
|
|
||||||
|
class TimeSeriesAccumulator:
|
||||||
|
def __init__(self, start_time, end_time, n_bins):
|
||||||
|
self.start_time = start_time
|
||||||
|
self.start_timestamp = start_time.replace(
|
||||||
|
tzinfo=timezone.utc).timestamp()
|
||||||
|
self.end_time = end_time
|
||||||
|
self.end_timestamp = end_time.replace(tzinfo=timezone.utc).timestamp()
|
||||||
|
self.n_bins = n_bins
|
||||||
|
self.bin_time = (self.end_timestamp -
|
||||||
|
self.start_timestamp)/self.n_bins
|
||||||
|
self.data = [[] for _ in range(n_bins)]
|
||||||
|
|
||||||
|
def add(self, time, value):
|
||||||
|
timestamp = time.replace(tzinfo=timezone.utc).timestamp()
|
||||||
|
if time < self.start_time or time > self.end_time:
|
||||||
|
return
|
||||||
|
idx = int((timestamp - self.start_timestamp)/self.bin_time)
|
||||||
|
self.data[idx].append(value)
|
||||||
|
|
||||||
|
def get_f(self, f):
|
||||||
|
return [f(i) for i in self.data]
|
||||||
|
|
||||||
|
def get_ts(self):
|
||||||
|
return [datetime.utcfromtimestamp(self.start_timestamp+(i+1)*self.bin_time) for i in range(self.n_bins)]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
tsa = TimeSeriesAccumulator(start_time=datetime(
|
||||||
|
2020, 7, 27, 23, 0, 0), end_time=datetime(2020, 7, 28, 0, 0, 0), n_bins=2)
|
||||||
|
tsa.add(datetime(2020, 7, 27, 23, 15, 0), 1)
|
||||||
|
tsa.add(datetime(2020, 7, 27, 23, 45, 0), 2)
|
||||||
|
tsa.add(datetime(2020, 7, 27, 22, 45, 0), 3)
|
||||||
|
print(tsa.get_ts())
|
||||||
|
print(tsa.get_f(lambda x: sum(x)))
|
||||||
155
tabler/dist/css/demo.css
vendored
Normal file
155
tabler/dist/css/demo.css
vendored
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/*!
|
||||||
|
* Tabler (v1.0.0-alpha.7)
|
||||||
|
* Copyright 2018-2020 The Tabler Authors
|
||||||
|
* Copyright 2018-2020 codecalm
|
||||||
|
* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
Dark mode
|
||||||
|
*/
|
||||||
|
pre.highlight,
|
||||||
|
.highlight pre {
|
||||||
|
max-height: 30rem;
|
||||||
|
margin: 1.5rem 0;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
background: #354052;
|
||||||
|
border-radius: 3px;
|
||||||
|
color: #ffffff; }
|
||||||
|
pre.highlight::-webkit-scrollbar,
|
||||||
|
.highlight pre::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
-webkit-transition: .3s background;
|
||||||
|
transition: .3s background; }
|
||||||
|
pre.highlight::-webkit-scrollbar-thumb,
|
||||||
|
.highlight pre::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 5px;
|
||||||
|
background: transparent; }
|
||||||
|
pre.highlight::-webkit-scrollbar-corner,
|
||||||
|
.highlight pre::-webkit-scrollbar-corner {
|
||||||
|
background: transparent; }
|
||||||
|
pre.highlight:hover::-webkit-scrollbar-thumb,
|
||||||
|
.highlight pre:hover::-webkit-scrollbar-thumb {
|
||||||
|
background: #cbcfd6;
|
||||||
|
background: #5d6675; }
|
||||||
|
|
||||||
|
.highlight .c, .highlight .c1 {
|
||||||
|
color: #a0aec0; }
|
||||||
|
|
||||||
|
.highlight .na, .highlight .nx, .highlight .nl, .language-css .highlight .na, .language-scss .highlight .na {
|
||||||
|
color: #ffe484; }
|
||||||
|
|
||||||
|
.highlight .s, .highlight .dl, .highlight .s1, .highlight .s2, .highlight .mh {
|
||||||
|
color: #b5f4a5; }
|
||||||
|
|
||||||
|
.highlight .mi, .highlight .language-js .nb, .highlight .nc, .highlight .nd, .highlight .nt {
|
||||||
|
color: #93ddfd; }
|
||||||
|
|
||||||
|
.highlight .language-html .nt, .highlight .nb {
|
||||||
|
color: #ff8383; }
|
||||||
|
|
||||||
|
.highlight .k, .highlight .kd, .highlight .nv, .highlight .n {
|
||||||
|
color: #d9a9ff; }
|
||||||
|
|
||||||
|
.example {
|
||||||
|
padding: 2rem;
|
||||||
|
margin: 2rem 0;
|
||||||
|
border: 1px solid rgba(110, 117, 130, 0.2);
|
||||||
|
border-radius: 3px 3px 0 0;
|
||||||
|
position: relative;
|
||||||
|
min-height: 12rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
overflow-x: auto; }
|
||||||
|
|
||||||
|
.example-centered {
|
||||||
|
justify-content: center; }
|
||||||
|
.example-centered .example-content {
|
||||||
|
flex: 0 auto; }
|
||||||
|
|
||||||
|
.example-content {
|
||||||
|
font-size: 0.875rem;
|
||||||
|
flex: 1;
|
||||||
|
max-width: 100%; }
|
||||||
|
|
||||||
|
.example-bg {
|
||||||
|
background: #f5f7fb; }
|
||||||
|
|
||||||
|
.example-code {
|
||||||
|
margin: 2rem 0;
|
||||||
|
border-top: none; }
|
||||||
|
.example-code pre {
|
||||||
|
margin: 0;
|
||||||
|
border-radius: 0 0 3px 3px; }
|
||||||
|
.example + .example-code {
|
||||||
|
margin-top: -2rem; }
|
||||||
|
|
||||||
|
.example-column {
|
||||||
|
margin: 0 auto; }
|
||||||
|
.example-column > .card:last-of-type {
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
|
.example-column-1 {
|
||||||
|
max-width: 20rem; }
|
||||||
|
|
||||||
|
.example-column-2 {
|
||||||
|
max-width: 40rem; }
|
||||||
|
|
||||||
|
.example-modal-backdrop {
|
||||||
|
background: #354052;
|
||||||
|
opacity: 0.24;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 2px 2px 0 0; }
|
||||||
|
|
||||||
|
@media not print {
|
||||||
|
.theme-dark .example-code {
|
||||||
|
border: 1px solid rgba(110, 117, 130, 0.2);
|
||||||
|
border-top: none; } }
|
||||||
|
|
||||||
|
@media not print and (prefers-color-scheme: dark) {
|
||||||
|
.theme-dark-auto .example-code {
|
||||||
|
border: 1px solid rgba(110, 117, 130, 0.2);
|
||||||
|
border-top: none; } }
|
||||||
|
|
||||||
|
.card-sponsor {
|
||||||
|
background: #dbe7f6 no-repeat center/100% 100%;
|
||||||
|
border-color: #548ed2;
|
||||||
|
min-height: 316px; }
|
||||||
|
|
||||||
|
body.no-transitions * {
|
||||||
|
transition: none !important; }
|
||||||
|
|
||||||
|
.toc-entry:before {
|
||||||
|
content: '- '; }
|
||||||
|
|
||||||
|
.toc-entry ul {
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 1rem; }
|
||||||
|
|
||||||
|
.toc-entry a {
|
||||||
|
color: #6e7582; }
|
||||||
|
|
||||||
|
.dropdown-menu-demo {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
margin-bottom: 1rem; }
|
||||||
|
|
||||||
|
.demo-icon-preview {
|
||||||
|
position: -webkit-sticky;
|
||||||
|
position: sticky;
|
||||||
|
top: 0; }
|
||||||
|
.demo-icon-preview svg {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
stroke-width: 1.5;
|
||||||
|
max-width: 15rem;
|
||||||
|
margin: 0 auto;
|
||||||
|
display: block; }
|
||||||
|
/*# sourceMappingURL=demo.css.map */
|
||||||
11683
tabler/dist/css/tabler.css
vendored
Normal file
11683
tabler/dist/css/tabler.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
tabler/dist/css/tabler.css.map
vendored
Normal file
1
tabler/dist/css/tabler.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
7
tabler/dist/css/tabler.min.css
vendored
Normal file
7
tabler/dist/css/tabler.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
tabler/dist/css/tabler.min.css.map
vendored
Normal file
1
tabler/dist/css/tabler.min.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
6
tabler/dist/js/tabler.min.js
vendored
Normal file
6
tabler/dist/js/tabler.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
tabler/dist/js/tabler.min.js.map
vendored
Normal file
1
tabler/dist/js/tabler.min.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
14
tabler/dist/libs/apexcharts/dist/apexcharts.min.js
vendored
Normal file
14
tabler/dist/libs/apexcharts/dist/apexcharts.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
tabler/dist/libs/autosize/dist/autosize.min.js
vendored
Normal file
6
tabler/dist/libs/autosize/dist/autosize.min.js
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
autosize 4.0.2
|
||||||
|
license: MIT
|
||||||
|
http://www.jacklmoore.com/autosize
|
||||||
|
*/
|
||||||
|
!function(e,t){if("function"==typeof define&&define.amd)define(["module","exports"],t);else if("undefined"!=typeof exports)t(module,exports);else{var n={exports:{}};t(n,n.exports),e.autosize=n.exports}}(this,function(e,t){"use strict";var n,o,p="function"==typeof Map?new Map:(n=[],o=[],{has:function(e){return-1<n.indexOf(e)},get:function(e){return o[n.indexOf(e)]},set:function(e,t){-1===n.indexOf(e)&&(n.push(e),o.push(t))},delete:function(e){var t=n.indexOf(e);-1<t&&(n.splice(t,1),o.splice(t,1))}}),c=function(e){return new Event(e,{bubbles:!0})};try{new Event("test")}catch(e){c=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!1),t}}function r(r){if(r&&r.nodeName&&"TEXTAREA"===r.nodeName&&!p.has(r)){var e,n=null,o=null,i=null,d=function(){r.clientWidth!==o&&a()},l=function(t){window.removeEventListener("resize",d,!1),r.removeEventListener("input",a,!1),r.removeEventListener("keyup",a,!1),r.removeEventListener("autosize:destroy",l,!1),r.removeEventListener("autosize:update",a,!1),Object.keys(t).forEach(function(e){r.style[e]=t[e]}),p.delete(r)}.bind(r,{height:r.style.height,resize:r.style.resize,overflowY:r.style.overflowY,overflowX:r.style.overflowX,wordWrap:r.style.wordWrap});r.addEventListener("autosize:destroy",l,!1),"onpropertychange"in r&&"oninput"in r&&r.addEventListener("keyup",a,!1),window.addEventListener("resize",d,!1),r.addEventListener("input",a,!1),r.addEventListener("autosize:update",a,!1),r.style.overflowX="hidden",r.style.wordWrap="break-word",p.set(r,{destroy:l,update:a}),"vertical"===(e=window.getComputedStyle(r,null)).resize?r.style.resize="none":"both"===e.resize&&(r.style.resize="horizontal"),n="content-box"===e.boxSizing?-(parseFloat(e.paddingTop)+parseFloat(e.paddingBottom)):parseFloat(e.borderTopWidth)+parseFloat(e.borderBottomWidth),isNaN(n)&&(n=0),a()}function s(e){var t=r.style.width;r.style.width="0px",r.offsetWidth,r.style.width=t,r.style.overflowY=e}function u(){if(0!==r.scrollHeight){var e=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push({node:e.parentNode,scrollTop:e.parentNode.scrollTop}),e=e.parentNode;return t}(r),t=document.documentElement&&document.documentElement.scrollTop;r.style.height="",r.style.height=r.scrollHeight+n+"px",o=r.clientWidth,e.forEach(function(e){e.node.scrollTop=e.scrollTop}),t&&(document.documentElement.scrollTop=t)}}function a(){u();var e=Math.round(parseFloat(r.style.height)),t=window.getComputedStyle(r,null),n="content-box"===t.boxSizing?Math.round(parseFloat(t.height)):r.offsetHeight;if(n<e?"hidden"===t.overflowY&&(s("scroll"),u(),n="content-box"===t.boxSizing?Math.round(parseFloat(window.getComputedStyle(r,null).height)):r.offsetHeight):"hidden"!==t.overflowY&&(s("hidden"),u(),n="content-box"===t.boxSizing?Math.round(parseFloat(window.getComputedStyle(r,null).height)):r.offsetHeight),i!==n){i=n;var o=c("autosize:resized");try{r.dispatchEvent(o)}catch(e){}}}}function i(e){var t=p.get(e);t&&t.destroy()}function d(e){var t=p.get(e);t&&t.update()}var l=null;"undefined"==typeof window||"function"!=typeof window.getComputedStyle?((l=function(e){return e}).destroy=function(e){return e},l.update=function(e){return e}):((l=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(e){return r(e)}),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],i),e},l.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],d),e}),t.default=l,e.exports=t.default});
|
||||||
7
tabler/dist/libs/bootstrap/dist/js/bootstrap.bundle.min.js
vendored
Normal file
7
tabler/dist/libs/bootstrap/dist/js/bootstrap.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
13
tabler/dist/libs/flatpickr/dist/flatpickr.min.css
vendored
Executable file
13
tabler/dist/libs/flatpickr/dist/flatpickr.min.css
vendored
Executable file
File diff suppressed because one or more lines are too long
2
tabler/dist/libs/flatpickr/dist/flatpickr.min.js
vendored
Executable file
2
tabler/dist/libs/flatpickr/dist/flatpickr.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
146
tabler/dist/libs/flatpickr/dist/plugins/rangePlugin.js
vendored
Executable file
146
tabler/dist/libs/flatpickr/dist/plugins/rangePlugin.js
vendored
Executable file
@ -0,0 +1,146 @@
|
|||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||||
|
typeof define === 'function' && define.amd ? define(factory) :
|
||||||
|
(global = global || self, global.rangePlugin = factory());
|
||||||
|
}(this, function () { 'use strict';
|
||||||
|
|
||||||
|
function rangePlugin(config) {
|
||||||
|
if (config === void 0) { config = {}; }
|
||||||
|
return function (fp) {
|
||||||
|
var dateFormat = "", secondInput, _secondInputFocused, _prevDates;
|
||||||
|
var createSecondInput = function () {
|
||||||
|
if (config.input) {
|
||||||
|
secondInput =
|
||||||
|
config.input instanceof Element
|
||||||
|
? config.input
|
||||||
|
: window.document.querySelector(config.input);
|
||||||
|
if (!secondInput) {
|
||||||
|
fp.config.errorHandler(new Error("Invalid input element specified"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (fp.config.wrap) {
|
||||||
|
secondInput = secondInput.querySelector("[data-input]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
secondInput = fp._input.cloneNode();
|
||||||
|
secondInput.removeAttribute("id");
|
||||||
|
secondInput._flatpickr = undefined;
|
||||||
|
}
|
||||||
|
if (secondInput.value) {
|
||||||
|
var parsedDate = fp.parseDate(secondInput.value);
|
||||||
|
if (parsedDate)
|
||||||
|
fp.selectedDates.push(parsedDate);
|
||||||
|
}
|
||||||
|
secondInput.setAttribute("data-fp-omit", "");
|
||||||
|
fp._bind(secondInput, ["focus", "click"], function () {
|
||||||
|
if (fp.selectedDates[1]) {
|
||||||
|
fp.latestSelectedDateObj = fp.selectedDates[1];
|
||||||
|
fp._setHoursFromDate(fp.selectedDates[1]);
|
||||||
|
fp.jumpToDate(fp.selectedDates[1]);
|
||||||
|
}
|
||||||
|
_secondInputFocused = true;
|
||||||
|
fp.isOpen = false;
|
||||||
|
fp.open(undefined, config.position === "left" ? fp._input : secondInput);
|
||||||
|
});
|
||||||
|
fp._bind(fp._input, ["focus", "click"], function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
fp.isOpen = false;
|
||||||
|
fp.open();
|
||||||
|
});
|
||||||
|
if (fp.config.allowInput)
|
||||||
|
fp._bind(secondInput, "keydown", function (e) {
|
||||||
|
if (e.key === "Enter") {
|
||||||
|
fp.setDate([fp.selectedDates[0], secondInput.value], true, dateFormat);
|
||||||
|
secondInput.click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!config.input)
|
||||||
|
fp._input.parentNode &&
|
||||||
|
fp._input.parentNode.insertBefore(secondInput, fp._input.nextSibling);
|
||||||
|
};
|
||||||
|
var plugin = {
|
||||||
|
onParseConfig: function () {
|
||||||
|
fp.config.mode = "range";
|
||||||
|
dateFormat = fp.config.altInput
|
||||||
|
? fp.config.altFormat
|
||||||
|
: fp.config.dateFormat;
|
||||||
|
},
|
||||||
|
onReady: function () {
|
||||||
|
createSecondInput();
|
||||||
|
fp.config.ignoredFocusElements.push(secondInput);
|
||||||
|
if (fp.config.allowInput) {
|
||||||
|
fp._input.removeAttribute("readonly");
|
||||||
|
secondInput.removeAttribute("readonly");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
secondInput.setAttribute("readonly", "readonly");
|
||||||
|
}
|
||||||
|
fp._bind(fp._input, "focus", function () {
|
||||||
|
fp.latestSelectedDateObj = fp.selectedDates[0];
|
||||||
|
fp._setHoursFromDate(fp.selectedDates[0]);
|
||||||
|
_secondInputFocused = false;
|
||||||
|
fp.jumpToDate(fp.selectedDates[0]);
|
||||||
|
});
|
||||||
|
if (fp.config.allowInput)
|
||||||
|
fp._bind(fp._input, "keydown", function (e) {
|
||||||
|
if (e.key === "Enter")
|
||||||
|
fp.setDate([fp._input.value, fp.selectedDates[1]], true, dateFormat);
|
||||||
|
});
|
||||||
|
fp.setDate(fp.selectedDates, false);
|
||||||
|
plugin.onValueUpdate(fp.selectedDates);
|
||||||
|
fp.loadedPlugins.push("range");
|
||||||
|
},
|
||||||
|
onPreCalendarPosition: function () {
|
||||||
|
if (_secondInputFocused) {
|
||||||
|
fp._positionElement = secondInput;
|
||||||
|
setTimeout(function () {
|
||||||
|
fp._positionElement = fp._input;
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onChange: function () {
|
||||||
|
if (!fp.selectedDates.length) {
|
||||||
|
setTimeout(function () {
|
||||||
|
if (fp.selectedDates.length)
|
||||||
|
return;
|
||||||
|
secondInput.value = "";
|
||||||
|
_prevDates = [];
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
if (_secondInputFocused) {
|
||||||
|
setTimeout(function () {
|
||||||
|
secondInput.focus();
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onDestroy: function () {
|
||||||
|
if (!config.input)
|
||||||
|
secondInput.parentNode &&
|
||||||
|
secondInput.parentNode.removeChild(secondInput);
|
||||||
|
},
|
||||||
|
onValueUpdate: function (selDates) {
|
||||||
|
var _a, _b, _c;
|
||||||
|
if (!secondInput)
|
||||||
|
return;
|
||||||
|
_prevDates =
|
||||||
|
!_prevDates || selDates.length >= _prevDates.length
|
||||||
|
? selDates.slice() : _prevDates;
|
||||||
|
if (_prevDates.length > selDates.length) {
|
||||||
|
var newSelectedDate = selDates[0];
|
||||||
|
var newDates = _secondInputFocused
|
||||||
|
? [_prevDates[0], newSelectedDate]
|
||||||
|
: [newSelectedDate, _prevDates[1]];
|
||||||
|
fp.setDate(newDates, false);
|
||||||
|
_prevDates = newDates.slice();
|
||||||
|
}
|
||||||
|
_a = fp.selectedDates.map(function (d) { return fp.formatDate(d, dateFormat); }), _b = _a[0], fp._input.value = _b === void 0 ? "" : _b, _c = _a[1], secondInput.value = _c === void 0 ? "" : _c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return plugin;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return rangePlugin;
|
||||||
|
|
||||||
|
}));
|
||||||
1
tabler/dist/libs/fullcalendar/core/main.min.css
vendored
Normal file
1
tabler/dist/libs/fullcalendar/core/main.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
tabler/dist/libs/fullcalendar/core/main.min.js
vendored
Normal file
6
tabler/dist/libs/fullcalendar/core/main.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
tabler/dist/libs/fullcalendar/daygrid/main.min.css
vendored
Normal file
1
tabler/dist/libs/fullcalendar/daygrid/main.min.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em}
|
||||||
6
tabler/dist/libs/fullcalendar/daygrid/main.min.js
vendored
Normal file
6
tabler/dist/libs/fullcalendar/daygrid/main.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
tabler/dist/libs/fullcalendar/interaction/main.min.js
vendored
Normal file
6
tabler/dist/libs/fullcalendar/interaction/main.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
tabler/dist/libs/fullcalendar/list/main.min.css
vendored
Normal file
1
tabler/dist/libs/fullcalendar/list/main.min.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}
|
||||||
6
tabler/dist/libs/fullcalendar/list/main.min.js
vendored
Normal file
6
tabler/dist/libs/fullcalendar/list/main.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
tabler/dist/libs/fullcalendar/timegrid/main.min.css
vendored
Normal file
1
tabler/dist/libs/fullcalendar/timegrid/main.min.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
@charset "UTF-8";.fc-timeGrid-view .fc-day-grid{position:relative;z-index:2}.fc-timeGrid-view .fc-day-grid .fc-row{min-height:3em}.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-mirror-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-time-grid-event{margin-bottom:1px}.fc-time-grid-event-inset{-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event .fc-content{overflow:hidden;max-height:100%}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:" - "}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}
|
||||||
6
tabler/dist/libs/fullcalendar/timegrid/main.min.js
vendored
Normal file
6
tabler/dist/libs/fullcalendar/timegrid/main.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
tabler/dist/libs/imask/dist/imask.min.js
vendored
Normal file
2
tabler/dist/libs/imask/dist/imask.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
tabler/dist/libs/jquery/dist/jquery.slim.min.js
vendored
Normal file
2
tabler/dist/libs/jquery/dist/jquery.slim.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
tabler/dist/libs/jqvmap/dist/jquery.vmap.min.js
vendored
Normal file
10
tabler/dist/libs/jqvmap/dist/jquery.vmap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
tabler/dist/libs/jqvmap/dist/jqvmap.min.css
vendored
Normal file
1
tabler/dist/libs/jqvmap/dist/jqvmap.min.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.jqvmap-label,.jqvmap-pin{pointer-events:none}.jqvmap-label{position:absolute;display:none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#292929;color:#fff;font-family:sans-serif,Verdana;font-size:smaller;padding:3px}.jqvmap-zoomin,.jqvmap-zoomout{position:absolute;left:10px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#000;padding:3px;color:#fff;width:10px;height:10px;cursor:pointer;line-height:10px;text-align:center}.jqvmap-zoomin{top:10px}.jqvmap-zoomout{top:30px}.jqvmap-region{cursor:pointer}.jqvmap-ajax_response{width:100%;height:500px}
|
||||||
2
tabler/dist/libs/jqvmap/dist/maps/continents/jquery.vmap.europe.js
vendored
Normal file
2
tabler/dist/libs/jqvmap/dist/maps/continents/jquery.vmap.europe.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
tabler/dist/libs/jqvmap/dist/maps/jquery.vmap.usa.js
vendored
Normal file
2
tabler/dist/libs/jqvmap/dist/maps/jquery.vmap.usa.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
tabler/dist/libs/jqvmap/dist/maps/jquery.vmap.world.js
vendored
Normal file
2
tabler/dist/libs/jqvmap/dist/maps/jquery.vmap.world.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
tabler/dist/libs/nouislider/distribute/nouislider.min.css
vendored
Normal file
2
tabler/dist/libs/nouislider/distribute/nouislider.min.css
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/*! nouislider - 14.2.0 - 3/27/2020 */
|
||||||
|
.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-connect{height:100%;width:100%}.noUi-origin{height:10%;width:10%}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;top:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#FAFAFA;border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-connects{border-radius:3px}.noUi-connect{background:#3FB8AF}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#B8B8B8}[disabled] .noUi-handle,[disabled].noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-sub{background:#AAA}.noUi-marker-large{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}
|
||||||
2
tabler/dist/libs/nouislider/distribute/nouislider.min.js
vendored
Normal file
2
tabler/dist/libs/nouislider/distribute/nouislider.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
7
tabler/dist/libs/peity/jquery.peity.min.js
vendored
Normal file
7
tabler/dist/libs/peity/jquery.peity.min.js
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
// Peity jQuery plugin version 3.3.0
|
||||||
|
// (c) 2018 Ben Pickles
|
||||||
|
//
|
||||||
|
// http://benpickles.github.io/peity
|
||||||
|
//
|
||||||
|
// Released under MIT license.
|
||||||
|
!function(t,i,e,n){var a=t.fn.peity=function(i,e){return l&&this.each(function(){var n=t(this),h=n.data("_peity");h?(i&&(h.type=i),t.extend(h.opts,e)):(h=new r(n,i,t.extend({},a.defaults[i],n.data("peity"),e)),n.change(function(){h.draw()}).data("_peity",h)),h.draw()}),this},r=function(t,i,e){this.$el=t,this.type=i,this.opts=e},h=r.prototype,s=h.svgElement=function(e,n){return t(i.createElementNS("http://www.w3.org/2000/svg",e)).attr(n)},l="createElementNS"in i&&s("svg",{})[0].createSVGRect;h.draw=function(){var t=this.opts;a.graphers[this.type].call(this,t),t.after&&t.after.call(this,t)},h.fill=function(){var i=this.opts.fill;return t.isFunction(i)?i:function(t,e){return i[e%i.length]}},h.prepare=function(t,i){return this.$svg||this.$el.hide().after(this.$svg=s("svg",{class:"peity"})),this.$svg.empty().data("_peity",this).attr({height:i,width:t})},h.values=function(){return t.map(this.$el.text().split(this.opts.delimiter),function(t){return parseFloat(t)})},a.defaults={},a.graphers={},a.register=function(t,i,e){this.defaults[t]=i,this.graphers[t]=e},a.register("pie",{fill:["#ff9900","#fff4dd","#ffc66e"],radius:8},function(i){if(!i.delimiter){var n=this.$el.text().match(/[^0-9\.]/);i.delimiter=n?n[0]:","}var a=t.map(this.values(),function(t){return t>0?t:0});if("/"==i.delimiter){var r=a[0],h=a[1];a=[r,e.max(0,h-r)]}for(var l=0,p=a.length,o=0;l<p;l++)o+=a[l];o||(p=2,o=1,a=[0,1]);var f=2*i.radius,c=this.prepare(i.width||f,i.height||f),u=c.width()/2,d=c.height()/2,g=e.min(u,d),v=i.innerRadius;"donut"!=this.type||v||(v=.5*g);var m=e.PI,y=this.fill(),w=this.scale=function(t,i){var n=t/o*m*2-m/2;return[i*e.cos(n)+u,i*e.sin(n)+d]},x=0;for(l=0;l<p;l++){var k,$=a[l],j=$/o;if(0!=j){if(1==j)if(v){var A=u-.01,E=d-g,F=d-v;k=s("path",{d:["M",u,E,"A",g,g,0,1,1,A,E,"L",A,F,"A",v,v,0,1,0,u,F].join(" "),"data-value":$})}else k=s("circle",{cx:u,cy:d,"data-value":$,r:g});else{var M=x+$,S=["M"].concat(w(x,g),"A",g,g,0,j>.5?1:0,1,w(M,g),"L");v?S=S.concat(w(M,v),"A",v,v,0,j>.5?1:0,0,w(x,v)):S.push(u,d),x+=$,k=s("path",{d:S.join(" "),"data-value":$})}k.attr("fill",y.call(this,$,l,a)),c.append(k)}}}),a.register("donut",t.extend(!0,{},a.defaults.pie),function(t){a.graphers.pie.call(this,t)}),a.register("line",{delimiter:",",fill:"#c6d9fd",height:16,min:0,stroke:"#4d89f9",strokeWidth:1,width:32},function(t){var i=this.values();1==i.length&&i.push(i[0]);for(var a=e.max.apply(e,t.max==n?i:i.concat(t.max)),r=e.min.apply(e,t.min==n?i:i.concat(t.min)),h=this.prepare(t.width,t.height),l=t.strokeWidth,p=h.width(),o=h.height()-l,f=a-r,c=this.x=function(t){return t*(p/(i.length-1))},u=this.y=function(t){var i=o;return f&&(i-=(t-r)/f*o),i+l/2},d=u(e.max(r,0)),g=[0,d],v=0;v<i.length;v++)g.push(c(v),u(i[v]));g.push(p,d),t.fill&&h.append(s("polygon",{fill:t.fill,points:g.join(" ")})),l&&h.append(s("polyline",{fill:"none",points:g.slice(2,g.length-2).join(" "),stroke:t.stroke,"stroke-width":l,"stroke-linecap":"square"}))}),a.register("bar",{delimiter:",",fill:["#4D89F9"],height:16,min:0,padding:.1,width:32},function(t){for(var i=this.values(),a=e.max.apply(e,t.max==n?i:i.concat(t.max)),r=e.min.apply(e,t.min==n?i:i.concat(t.min)),h=this.prepare(t.width,t.height),l=h.width(),p=h.height(),o=a-r,f=t.padding,c=this.fill(),u=this.x=function(t){return t*l/i.length},d=this.y=function(t){return p-(o?(t-r)/o*p:1)},g=0;g<i.length;g++){var v,m=u(g+f),y=u(g+1-f)-m,w=i[g],x=d(w),k=x,$=x;o?w<0?k=d(e.min(a,0)):$=d(e.max(r,0)):v=1,0==(v=$-k)&&(v=1,a>0&&o&&k--),h.append(s("rect",{"data-value":w,fill:c.call(this,w,g,i),x:m,y:k,width:y,height:v}))}})}(jQuery,document,Math);
|
||||||
333
tabler/dist/libs/selectize/dist/css/selectize.css
vendored
Normal file
333
tabler/dist/libs/selectize/dist/css/selectize.css
vendored
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
/**
|
||||||
|
* selectize.css (v0.12.6)
|
||||||
|
* Copyright (c) 2013–2015 Brian Reavis & contributors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
|
||||||
|
* file except in compliance with the License. You may obtain a copy of the License at:
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software distributed under
|
||||||
|
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
||||||
|
* ANY KIND, either express or implied. See the License for the specific language
|
||||||
|
* governing permissions and limitations under the License.
|
||||||
|
*
|
||||||
|
* @author Brian Reavis <brian@thirdroute.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
.selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
|
||||||
|
visibility: visible !important;
|
||||||
|
background: #f2f2f2 !important;
|
||||||
|
background: rgba(0, 0, 0, 0.06) !important;
|
||||||
|
border: 0 none !important;
|
||||||
|
-webkit-box-shadow: inset 0 0 12px 4px #fff;
|
||||||
|
box-shadow: inset 0 0 12px 4px #fff;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
|
||||||
|
content: '!';
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-drag_drop .ui-sortable-helper {
|
||||||
|
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
.selectize-dropdown-header {
|
||||||
|
position: relative;
|
||||||
|
padding: 5px 8px;
|
||||||
|
border-bottom: 1px solid #d0d0d0;
|
||||||
|
background: #f8f8f8;
|
||||||
|
-webkit-border-radius: 3px 3px 0 0;
|
||||||
|
-moz-border-radius: 3px 3px 0 0;
|
||||||
|
border-radius: 3px 3px 0 0;
|
||||||
|
}
|
||||||
|
.selectize-dropdown-header-close {
|
||||||
|
position: absolute;
|
||||||
|
right: 8px;
|
||||||
|
top: 50%;
|
||||||
|
color: #303030;
|
||||||
|
opacity: 0.4;
|
||||||
|
margin-top: -12px;
|
||||||
|
line-height: 20px;
|
||||||
|
font-size: 20px !important;
|
||||||
|
}
|
||||||
|
.selectize-dropdown-header-close:hover {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.selectize-dropdown.plugin-optgroup_columns .optgroup {
|
||||||
|
border-right: 1px solid #f2f2f2;
|
||||||
|
border-top: 0 none;
|
||||||
|
float: left;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
|
||||||
|
border-right: 0 none;
|
||||||
|
}
|
||||||
|
.selectize-dropdown.plugin-optgroup_columns .optgroup:before {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.selectize-dropdown.plugin-optgroup_columns .optgroup-header {
|
||||||
|
border-top: 0 none;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-remove_button [data-value] {
|
||||||
|
position: relative;
|
||||||
|
padding-right: 24px !important;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-remove_button [data-value] .remove {
|
||||||
|
z-index: 1;
|
||||||
|
/* fixes ie bug (see #392) */
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 17px;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 2px 0 0 0;
|
||||||
|
border-left: 1px solid #d0d0d0;
|
||||||
|
-webkit-border-radius: 0 2px 2px 0;
|
||||||
|
-moz-border-radius: 0 2px 2px 0;
|
||||||
|
border-radius: 0 2px 2px 0;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-remove_button [data-value] .remove:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-remove_button [data-value].active .remove {
|
||||||
|
border-left-color: #cacaca;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-remove_button .disabled [data-value] .remove {
|
||||||
|
border-left-color: #ffffff;
|
||||||
|
}
|
||||||
|
.selectize-control.plugin-remove_button .remove-single {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
font-size: 23px;
|
||||||
|
}
|
||||||
|
.selectize-control {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.selectize-dropdown,
|
||||||
|
.selectize-input,
|
||||||
|
.selectize-input input {
|
||||||
|
color: #303030;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 18px;
|
||||||
|
-webkit-font-smoothing: inherit;
|
||||||
|
}
|
||||||
|
.selectize-input,
|
||||||
|
.selectize-control.single .selectize-input.input-active {
|
||||||
|
background: #fff;
|
||||||
|
cursor: text;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.selectize-input {
|
||||||
|
border: 1px solid #d0d0d0;
|
||||||
|
padding: 8px 8px;
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.selectize-control.multi .selectize-input.has-items {
|
||||||
|
padding: 6px 8px 3px;
|
||||||
|
}
|
||||||
|
.selectize-input.full {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.selectize-input.disabled,
|
||||||
|
.selectize-input.disabled * {
|
||||||
|
cursor: default !important;
|
||||||
|
}
|
||||||
|
.selectize-input.focus {
|
||||||
|
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
|
||||||
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
.selectize-input.dropdown-active {
|
||||||
|
-webkit-border-radius: 3px 3px 0 0;
|
||||||
|
-moz-border-radius: 3px 3px 0 0;
|
||||||
|
border-radius: 3px 3px 0 0;
|
||||||
|
}
|
||||||
|
.selectize-input > * {
|
||||||
|
vertical-align: baseline;
|
||||||
|
display: -moz-inline-stack;
|
||||||
|
display: inline-block;
|
||||||
|
zoom: 1;
|
||||||
|
*display: inline;
|
||||||
|
}
|
||||||
|
.selectize-control.multi .selectize-input > div {
|
||||||
|
cursor: pointer;
|
||||||
|
margin: 0 3px 3px 0;
|
||||||
|
padding: 2px 6px;
|
||||||
|
background: #f2f2f2;
|
||||||
|
color: #303030;
|
||||||
|
border: 0 solid #d0d0d0;
|
||||||
|
}
|
||||||
|
.selectize-control.multi .selectize-input > div.active {
|
||||||
|
background: #e8e8e8;
|
||||||
|
color: #303030;
|
||||||
|
border: 0 solid #cacaca;
|
||||||
|
}
|
||||||
|
.selectize-control.multi .selectize-input.disabled > div,
|
||||||
|
.selectize-control.multi .selectize-input.disabled > div.active {
|
||||||
|
color: #7d7d7d;
|
||||||
|
background: #ffffff;
|
||||||
|
border: 0 solid #ffffff;
|
||||||
|
}
|
||||||
|
.selectize-input > input {
|
||||||
|
display: inline-block !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
min-height: 0 !important;
|
||||||
|
max-height: none !important;
|
||||||
|
max-width: 100% !important;
|
||||||
|
margin: 0 2px 0 0 !important;
|
||||||
|
text-indent: 0 !important;
|
||||||
|
border: 0 none !important;
|
||||||
|
background: none !important;
|
||||||
|
line-height: inherit !important;
|
||||||
|
-webkit-user-select: auto !important;
|
||||||
|
-webkit-box-shadow: none !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
.selectize-input > input::-ms-clear {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.selectize-input > input:focus {
|
||||||
|
outline: none !important;
|
||||||
|
}
|
||||||
|
.selectize-input::after {
|
||||||
|
content: ' ';
|
||||||
|
display: block;
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
.selectize-input.dropdown-active::before {
|
||||||
|
content: ' ';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
background: #f0f0f0;
|
||||||
|
height: 1px;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
.selectize-dropdown {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 10;
|
||||||
|
border: 1px solid #d0d0d0;
|
||||||
|
background: #fff;
|
||||||
|
margin: -1px 0 0 0;
|
||||||
|
border-top: 0 none;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||||
|
-webkit-border-radius: 0 0 3px 3px;
|
||||||
|
-moz-border-radius: 0 0 3px 3px;
|
||||||
|
border-radius: 0 0 3px 3px;
|
||||||
|
}
|
||||||
|
.selectize-dropdown [data-selectable] {
|
||||||
|
cursor: pointer;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.selectize-dropdown [data-selectable] .highlight {
|
||||||
|
background: rgba(125, 168, 208, 0.2);
|
||||||
|
-webkit-border-radius: 1px;
|
||||||
|
-moz-border-radius: 1px;
|
||||||
|
border-radius: 1px;
|
||||||
|
}
|
||||||
|
.selectize-dropdown .option,
|
||||||
|
.selectize-dropdown .optgroup-header {
|
||||||
|
padding: 5px 8px;
|
||||||
|
}
|
||||||
|
.selectize-dropdown .option,
|
||||||
|
.selectize-dropdown [data-disabled],
|
||||||
|
.selectize-dropdown [data-disabled] [data-selectable].option {
|
||||||
|
cursor: inherit;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
.selectize-dropdown [data-selectable].option {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.selectize-dropdown .optgroup:first-child .optgroup-header {
|
||||||
|
border-top: 0 none;
|
||||||
|
}
|
||||||
|
.selectize-dropdown .optgroup-header {
|
||||||
|
color: #303030;
|
||||||
|
background: #fff;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.selectize-dropdown .active {
|
||||||
|
background-color: #f5fafd;
|
||||||
|
color: #495c68;
|
||||||
|
}
|
||||||
|
.selectize-dropdown .active.create {
|
||||||
|
color: #495c68;
|
||||||
|
}
|
||||||
|
.selectize-dropdown .create {
|
||||||
|
color: rgba(48, 48, 48, 0.5);
|
||||||
|
}
|
||||||
|
.selectize-dropdown-content {
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
max-height: 200px;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
}
|
||||||
|
.selectize-control.single .selectize-input,
|
||||||
|
.selectize-control.single .selectize-input input {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.selectize-control.single .selectize-input.input-active,
|
||||||
|
.selectize-control.single .selectize-input.input-active input {
|
||||||
|
cursor: text;
|
||||||
|
}
|
||||||
|
.selectize-control.single .selectize-input:after {
|
||||||
|
content: ' ';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 15px;
|
||||||
|
margin-top: -3px;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 5px 5px 0 5px;
|
||||||
|
border-color: #808080 transparent transparent transparent;
|
||||||
|
}
|
||||||
|
.selectize-control.single .selectize-input.dropdown-active:after {
|
||||||
|
margin-top: -4px;
|
||||||
|
border-width: 0 5px 5px 5px;
|
||||||
|
border-color: transparent transparent #808080 transparent;
|
||||||
|
}
|
||||||
|
.selectize-control.rtl.single .selectize-input:after {
|
||||||
|
left: 15px;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
.selectize-control.rtl .selectize-input > input {
|
||||||
|
margin: 0 4px 0 -2px !important;
|
||||||
|
}
|
||||||
|
.selectize-control .selectize-input.disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
4
tabler/dist/libs/selectize/dist/js/standalone/selectize.min.js
vendored
Normal file
4
tabler/dist/libs/selectize/dist/js/standalone/selectize.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
616
tabler/index.html
Normal file
616
tabler/index.html
Normal file
@ -0,0 +1,616 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<!--
|
||||||
|
* Tabler - Premium and Open Source dashboard template with responsive and high quality UI.
|
||||||
|
* @version 1.0.0-alpha.7
|
||||||
|
* @link https://github.com/tabler/tabler
|
||||||
|
* Copyright 2018-2019 The Tabler Authors
|
||||||
|
* Copyright 2018-2019 codecalm.net Paweł Kuna
|
||||||
|
* Licensed under MIT (https://tabler.io/license)
|
||||||
|
-->
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||||
|
<title>Openvpn Load Balancing Socks5 Server</title>
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
|
||||||
|
<meta name="msapplication-TileColor" content="#206bc4" />
|
||||||
|
<meta name="theme-color" content="#206bc4" />
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="HandheldFriendly" content="True" />
|
||||||
|
<meta name="MobileOptimized" content="320" />
|
||||||
|
<meta name="robots" content="noindex,nofollow,noarchive" />
|
||||||
|
<link rel="icon" href="./favicon.ico" type="image/x-icon" />
|
||||||
|
<link rel="shortcut icon" href="./favicon.ico" type="image/x-icon" />
|
||||||
|
<!-- CSS files -->
|
||||||
|
<link href="./dist/libs/jqvmap/dist/jqvmap.min.css" rel="stylesheet" />
|
||||||
|
<link href="./dist/css/tabler.min.css" rel="stylesheet" />
|
||||||
|
<link href="./dist/css/demo.min.css" rel="stylesheet" />
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="antialiased">
|
||||||
|
<aside class="navbar navbar-vertical navbar-expand-lg navbar-dark">
|
||||||
|
<div class="container">
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-menu">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<a href="." class="navbar-brand navbar-brand-autodark">
|
||||||
|
Dashboard
|
||||||
|
</a>
|
||||||
|
<div class="navbar-nav flex-row d-lg-none">
|
||||||
|
<div class="nav-item dropdown d-none d-md-flex mr-3">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="collapse navbar-collapse" id="navbar-menu">
|
||||||
|
<ul class="navbar-nav pt-lg-3">
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="./index.html">
|
||||||
|
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
|
||||||
|
fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<polyline points="5 12 3 12 12 3 21 12 19 12" />
|
||||||
|
<path d="M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7" />
|
||||||
|
<path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6" /></svg>
|
||||||
|
</span>
|
||||||
|
<span class="nav-link-title">
|
||||||
|
Home
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#navbar-base" data-toggle="dropdown" role="button"
|
||||||
|
aria-expanded="false">
|
||||||
|
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
|
||||||
|
fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<rect x="4" y="4" width="6" height="5" rx="2" />
|
||||||
|
<rect x="4" y="13" width="6" height="7" rx="2" />
|
||||||
|
<rect x="14" y="4" width="6" height="7" rx="2" />
|
||||||
|
<rect x="14" y="15" width="6" height="5" rx="2" /></svg>
|
||||||
|
</span>
|
||||||
|
<span class="nav-link-title">
|
||||||
|
Connections
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-columns dropdown-menu-columns-2">
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./empty.html">
|
||||||
|
Empty page
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./blank.html">
|
||||||
|
Blank page
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./buttons.html">
|
||||||
|
Buttons
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./cards.html">
|
||||||
|
Cards
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./dropdowns.html">
|
||||||
|
Dropdowns
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./icons.html">
|
||||||
|
Icons
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./modals.html">
|
||||||
|
Modals
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./maps.html">
|
||||||
|
Maps
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./maps-vector.html">
|
||||||
|
Vector maps
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./navigation.html">
|
||||||
|
Navigation
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./charts.html">
|
||||||
|
Charts
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./tables.html">
|
||||||
|
Tables
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./calendar.html">
|
||||||
|
Calendar
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./carousel.html">
|
||||||
|
Carousel
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="dropdown-item" href="./lists.html">
|
||||||
|
Lists
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="dropright">
|
||||||
|
<a class="dropdown-item dropdown-toggle" href="#sidebar-authentication" data-toggle="dropdown"
|
||||||
|
role="button" aria-expanded="false">
|
||||||
|
Authentication
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<a href="./sign-in.html" class="dropdown-item">Sign in</a>
|
||||||
|
<a href="./sign-up.html" class="dropdown-item">Sign up</a>
|
||||||
|
<a href="./forgot-password.html" class="dropdown-item">Forgot password</a>
|
||||||
|
<a href="./terms-of-service.html" class="dropdown-item">Terms of service</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="dropright">
|
||||||
|
<a class="dropdown-item dropdown-toggle" href="#sidebar-error" data-toggle="dropdown" role="button"
|
||||||
|
aria-expanded="false">
|
||||||
|
Error pages
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<a href="./400.html" class="dropdown-item">400 page</a>
|
||||||
|
<a href="./401.html" class="dropdown-item">401 page</a>
|
||||||
|
<a href="./403.html" class="dropdown-item">403 page</a>
|
||||||
|
<a href="./404.html" class="dropdown-item">404 page</a>
|
||||||
|
<a href="./500.html" class="dropdown-item">500 page</a>
|
||||||
|
<a href="./503.html" class="dropdown-item">503 page</a>
|
||||||
|
<a href="./maintenance.html" class="dropdown-item">Maintenance page</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
<div class="page">
|
||||||
|
<div class="content">
|
||||||
|
<div class="container-xl">
|
||||||
|
<!-- Page title -->
|
||||||
|
<div class="page-header">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-auto">
|
||||||
|
<h2 class="page-title">
|
||||||
|
Home
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row row-deck row-cards">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-sm-6 col-xl-3">
|
||||||
|
<div class="card card-sm">
|
||||||
|
<div class="card-body d-flex align-items-center">
|
||||||
|
<span class="bg-blue text-white stamp mr-3"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||||
|
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<path d="M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2" />
|
||||||
|
<path d="M12 3v3m0 12v3" /></svg>
|
||||||
|
</span>
|
||||||
|
<div class="mr-3 lh-sm">
|
||||||
|
<div class="strong">
|
||||||
|
132 Sales
|
||||||
|
</div>
|
||||||
|
<div class="text-muted">12 waiting payments</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6 col-xl-3">
|
||||||
|
<div class="card card-sm">
|
||||||
|
<div class="card-body d-flex align-items-center">
|
||||||
|
<span class="bg-green text-white stamp mr-3"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||||
|
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<circle cx="9" cy="19" r="2" />
|
||||||
|
<circle cx="17" cy="19" r="2" />
|
||||||
|
<path d="M3 3h2l2 12a3 3 0 0 0 3 2h7a3 3 0 0 0 3 -2l1 -7h-15.2" /></svg>
|
||||||
|
</span>
|
||||||
|
<div class="mr-3 lh-sm">
|
||||||
|
<div class="strong">
|
||||||
|
78 Orders
|
||||||
|
</div>
|
||||||
|
<div class="text-muted">32 shipped</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6 col-xl-3">
|
||||||
|
<div class="card card-sm">
|
||||||
|
<div class="card-body d-flex align-items-center">
|
||||||
|
<div class="mr-3">
|
||||||
|
<div class="chart-sparkline chart-sparkline-square" id="sparkline-67"></div>
|
||||||
|
</div>
|
||||||
|
<div class="mr-3 lh-sm">
|
||||||
|
<div class="strong">
|
||||||
|
1,352 Members
|
||||||
|
</div>
|
||||||
|
<div class="text-muted">163 registered today</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6 col-xl-3">
|
||||||
|
<div class="card card-sm">
|
||||||
|
<div class="card-body d-flex align-items-center">
|
||||||
|
<div class="mr-3 lh-sm">
|
||||||
|
<div class="strong">
|
||||||
|
132 Comments
|
||||||
|
</div>
|
||||||
|
<div class="text-muted">16 waiting</div>
|
||||||
|
</div>
|
||||||
|
<div class="ml-auto">
|
||||||
|
<div class="chart-sparkline chart-sparkline-square" id="sparkline-68"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
<div class="subheader">
|
||||||
|
<h3>Traffic summary</h3>
|
||||||
|
</div>
|
||||||
|
<div class="ml-auto lh-1">
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="dropdown-toggle text-muted" href="#" data-toggle="dropdown" aria-haspopup="true"
|
||||||
|
aria-expanded="false">
|
||||||
|
Last 7 days
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
|
<a class="dropdown-item active" href="#">Last 7 days</a>
|
||||||
|
<a class="dropdown-item" href="#">Last 30 days</a>
|
||||||
|
<a class="dropdown-item" href="#">Last 3 months</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="chart-mentions" class="chart-lg"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h4 class="card-title">Most Visited Pages</h4>
|
||||||
|
</div>
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table card-table table-vcenter">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Page name</th>
|
||||||
|
<th>Visitors</th>
|
||||||
|
<th>Unique</th>
|
||||||
|
<th colspan="2">Bounce rate</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
/about.html
|
||||||
|
<a href="#" class="link-secondary ml-2"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||||
|
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5" />
|
||||||
|
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5" /></svg>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="text-muted">4,896</td>
|
||||||
|
<td class="text-muted">3,654</td>
|
||||||
|
<td class="text-muted">82.54%</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<div class="chart-sparkline" id="sparkline-69"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
/special-promo.html
|
||||||
|
<a href="#" class="link-secondary ml-2"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||||
|
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5" />
|
||||||
|
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5" /></svg>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="text-muted">3,652</td>
|
||||||
|
<td class="text-muted">3,215</td>
|
||||||
|
<td class="text-muted">76.29%</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<div class="chart-sparkline" id="sparkline-70"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
/news/1,new-ui-kit.html
|
||||||
|
<a href="#" class="link-secondary ml-2"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||||
|
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5" />
|
||||||
|
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5" /></svg>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="text-muted">3,256</td>
|
||||||
|
<td class="text-muted">2,865</td>
|
||||||
|
<td class="text-muted">72.65%</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<div class="chart-sparkline" id="sparkline-71"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
/lorem-ipsum-dolor-sit-amet-very-long-url.html
|
||||||
|
<a href="#" class="link-secondary ml-2"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||||
|
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" />
|
||||||
|
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5" />
|
||||||
|
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5" /></svg>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="text-muted">986</td>
|
||||||
|
<td class="text-muted">865</td>
|
||||||
|
<td class="text-muted">44.89%</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<div class="chart-sparkline" id="sparkline-72"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="footer footer-transparent">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row text-center align-items-center flex-row-reverse">
|
||||||
|
<div class="col-lg-auto ml-lg-auto">
|
||||||
|
<ul class="list-inline list-inline-dots mb-0">
|
||||||
|
<li class="list-inline-item"><a href="" class="link-secondary"></a></li>
|
||||||
|
<li class="list-inline-item"><a href="" class="link-secondary"></a></li>
|
||||||
|
<li class="list-inline-item"><a href="" target="_blank" class="link-secondary"></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
|
||||||
|
2020
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Libs JS -->
|
||||||
|
<script src="./dist/libs/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<script src="./dist/libs/jquery/dist/jquery.slim.min.js"></script>
|
||||||
|
<script src="./dist/libs/apexcharts/dist/apexcharts.min.js"></script>
|
||||||
|
<script src="./dist/libs/jqvmap/dist/jquery.vmap.min.js"></script>
|
||||||
|
<script src="./dist/libs/jqvmap/dist/maps/jquery.vmap.world.js"></script>
|
||||||
|
<script src="./dist/libs/peity/jquery.peity.min.js"></script>
|
||||||
|
<!-- Tabler Core -->
|
||||||
|
<script src="./dist/js/tabler.min.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// @formatter:off
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
window.ApexCharts && (new ApexCharts(document.getElementById('chart-mentions'), {
|
||||||
|
chart: {
|
||||||
|
type: "line",
|
||||||
|
fontFamily: 'inherit',
|
||||||
|
height: 240,
|
||||||
|
parentHeightOffset: 0,
|
||||||
|
toolbar: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
animations: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
stacked: true,
|
||||||
|
},
|
||||||
|
plotOptions: {
|
||||||
|
bar: {
|
||||||
|
columnWidth: '50%',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false,
|
||||||
|
},
|
||||||
|
fill: {
|
||||||
|
opacity: 0.6,
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
name: "Web",
|
||||||
|
data: [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 12, 5, 8, 22, 6, 8, 6, 4, 1, 8, 24, 29, 51, 40, 47, 23,
|
||||||
|
26, 50, 26, 41, 22, 46, 47, 81, 46, 6
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
name: "Social",
|
||||||
|
data: [2, 5, 4, 3, 3, 1, 4, 7, 5, 1, 2, 5, 3, 2, 6, 7, 7, 1, 5, 5, 2, 12, 4, 6, 18, 3, 5, 2, 13,
|
||||||
|
15, 20, 47, 18, 15, 11, 10, 0
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
name: "Other",
|
||||||
|
data: [2, 9, 10, 7, 8, 3, 6, 5, 5, 4, 6, 4, 1, 9, 3, 6, 7, 5, 2, 8, 4, 9, 1, 2, 6, 7, 5, 1, 8,
|
||||||
|
3,
|
||||||
|
2, 3, 4, 9, 7, 1, 6
|
||||||
|
]
|
||||||
|
}],
|
||||||
|
grid: {
|
||||||
|
padding: {
|
||||||
|
top: -20,
|
||||||
|
right: 0,
|
||||||
|
left: -4,
|
||||||
|
bottom: -4
|
||||||
|
},
|
||||||
|
strokeDashArray: 4,
|
||||||
|
xaxis: {
|
||||||
|
lines: {
|
||||||
|
show: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
labels: {
|
||||||
|
padding: 0
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
axisBorder: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
type: 'datetime',
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
labels: {
|
||||||
|
padding: 4
|
||||||
|
},
|
||||||
|
},
|
||||||
|
labels: [
|
||||||
|
'2020-06-20', '2020-06-21', '2020-06-22', '2020-06-23', '2020-06-24', '2020-06-25', '2020-06-26',
|
||||||
|
'2020-06-27', '2020-06-28', '2020-06-29', '2020-06-30', '2020-07-01', '2020-07-02', '2020-07-03',
|
||||||
|
'2020-07-04', '2020-07-05', '2020-07-06', '2020-07-07', '2020-07-08', '2020-07-09', '2020-07-10',
|
||||||
|
'2020-07-11', '2020-07-12', '2020-07-13', '2020-07-14', '2020-07-15', '2020-07-16', '2020-07-17',
|
||||||
|
'2020-07-18', '2020-07-19', '2020-07-20', '2020-07-21', '2020-07-22', '2020-07-23', '2020-07-24',
|
||||||
|
'2020-07-25', '2020-07-26'
|
||||||
|
],
|
||||||
|
colors: ["#206bc4", "#79a6dc", "#bfe399"],
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
position: 'bottom',
|
||||||
|
height: 32,
|
||||||
|
offsetY: 8,
|
||||||
|
markers: {
|
||||||
|
width: 8,
|
||||||
|
height: 8,
|
||||||
|
radius: 100,
|
||||||
|
},
|
||||||
|
itemMargin: {
|
||||||
|
horizontal: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})).render();
|
||||||
|
});
|
||||||
|
// @formatter:on
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
$().peity && $('#sparkline-67').text("56/100").peity("pie", {
|
||||||
|
width: 40,
|
||||||
|
height: 40,
|
||||||
|
stroke: "#cd201f",
|
||||||
|
strokeWidth: 2,
|
||||||
|
fill: ["#cd201f", "rgba(110, 117, 130, 0.2)"],
|
||||||
|
padding: .2,
|
||||||
|
innerRadius: 17,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
$().peity && $('#sparkline-68').text("22/100").peity("pie", {
|
||||||
|
width: 40,
|
||||||
|
height: 40,
|
||||||
|
stroke: "#fab005",
|
||||||
|
strokeWidth: 2,
|
||||||
|
fill: ["#fab005", "rgba(110, 117, 130, 0.2)"],
|
||||||
|
padding: .2,
|
||||||
|
innerRadius: 17,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
$().peity && $('#sparkline-69').text("17, 24, 20, 10, 5, 1, 4, 18, 13").peity("line", {
|
||||||
|
width: 64,
|
||||||
|
height: 40,
|
||||||
|
stroke: "#206bc4",
|
||||||
|
strokeWidth: 2,
|
||||||
|
fill: ["#d2e1f3"],
|
||||||
|
padding: .2,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
$().peity && $('#sparkline-70').text("13, 11, 19, 22, 12, 7, 14, 3, 21").peity("line", {
|
||||||
|
width: 64,
|
||||||
|
height: 40,
|
||||||
|
stroke: "#206bc4",
|
||||||
|
strokeWidth: 2,
|
||||||
|
fill: ["#d2e1f3"],
|
||||||
|
padding: .2,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
$().peity && $('#sparkline-71').text("10, 13, 10, 4, 17, 3, 23, 22, 19").peity("line", {
|
||||||
|
width: 64,
|
||||||
|
height: 40,
|
||||||
|
stroke: "#206bc4",
|
||||||
|
strokeWidth: 2,
|
||||||
|
fill: ["#d2e1f3"],
|
||||||
|
padding: .2,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
$().peity && $('#sparkline-72').text("9, 6, 14, 11, 8, 24, 2, 16, 15").peity("line", {
|
||||||
|
width: 64,
|
||||||
|
height: 40,
|
||||||
|
stroke: "#206bc4",
|
||||||
|
strokeWidth: 2,
|
||||||
|
fill: ["#d2e1f3"],
|
||||||
|
padding: .2,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.body.style.display = "block"
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
6
test.py
6
test.py
@ -49,6 +49,11 @@ class StateHandler(tornado.web.RequestHandler):
|
|||||||
self.write(json.dumps(om.serialize()))
|
self.write(json.dumps(om.serialize()))
|
||||||
|
|
||||||
|
|
||||||
|
class StatHandler(tornado.web.RequestHandler):
|
||||||
|
def get(self):
|
||||||
|
self.write(json.dumps(om.get_stat()))
|
||||||
|
|
||||||
|
|
||||||
class ConfigsHandeler(tornado.web.RequestHandler):
|
class ConfigsHandeler(tornado.web.RequestHandler):
|
||||||
def get(self):
|
def get(self):
|
||||||
cfgs = json.loads(open("profiles.json", "r").read())
|
cfgs = json.loads(open("profiles.json", "r").read())
|
||||||
@ -114,6 +119,7 @@ def make_app():
|
|||||||
return tornado.web.Application([
|
return tornado.web.Application([
|
||||||
(r"/", MainHandler),
|
(r"/", MainHandler),
|
||||||
(r"/state", StateHandler),
|
(r"/state", StateHandler),
|
||||||
|
(r"/stat", StatHandler),
|
||||||
(r"/select", ConfigsHandeler),
|
(r"/select", ConfigsHandeler),
|
||||||
(r"/create", CreateInstantceHandler),
|
(r"/create", CreateInstantceHandler),
|
||||||
(r"/start", StartInstatnceHandler),
|
(r"/start", StartInstatnceHandler),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user