devel
This commit is contained in:
parent
f6abf5dc3b
commit
1fe5df7aef
11
README.md
11
README.md
|
@ -2,4 +2,13 @@
|
|||
_a very basic factorio server control panel_
|
||||
|
||||
Features:
|
||||
* spawn server(s)
|
||||
* spawn server(s)
|
||||
|
||||
|
||||
|
||||
## Installation
|
||||
```
|
||||
git clone https://socialg.it/david/factoriocp.git
|
||||
cd factoriocp
|
||||
wget https://raw.githubusercontent.com/bottlepy/bottle/0.12.10/bottle.py
|
||||
```
|
||||
|
|
57
app.py
57
app.py
|
@ -1,57 +0,0 @@
|
|||
# imports
|
||||
|
||||
import requests
|
||||
from configparser import ConfigParser
|
||||
from bottle import route, run, template, error, get, \
|
||||
post, request, response, redirect, \
|
||||
static_file
|
||||
|
||||
|
||||
# config
|
||||
|
||||
configfile = "app.conf"
|
||||
config = ConfigParser()
|
||||
config.read(configfile)
|
||||
|
||||
if config['DEFAULT']['app_name']:
|
||||
app_name = config['DEFAULT']['app_name']
|
||||
else:
|
||||
app_name = "FactorioCP"
|
||||
|
||||
if config['DEFAULT']['static_files']:
|
||||
static_files = config['DEFAULT']['static_files']
|
||||
else:
|
||||
static_files = "static"
|
||||
|
||||
if config['DEFAULT']['cookie_secret']:
|
||||
cookie_secret = config['DEFAULT']['cookie_secret']
|
||||
else:
|
||||
cookie_secret = "norealsecretDTR47SNI2390LGFsn4T-LASED2309h"
|
||||
|
||||
if config['DEFAULT']['cookie_max_age']:
|
||||
cookie_max_age = int(config['DEFAULT']['cookie_max_age'])
|
||||
else:
|
||||
cookie_max_age=3600
|
||||
|
||||
if config['DEFAULT']['cookie_name']:
|
||||
cookie_name = config['DEFAULT']['cookie_name']
|
||||
else:
|
||||
cookie_name = "factoriocp"
|
||||
|
||||
|
||||
# functions
|
||||
|
||||
|
||||
# routing
|
||||
|
||||
@get('/')
|
||||
def home():
|
||||
pass
|
||||
|
||||
|
||||
|
||||
# run development webserver
|
||||
run(host='localhost', port=8000, debug=True, reloader=True)
|
||||
|
||||
# run prod server
|
||||
#run(host='0.0.0.0', port=8000)
|
|
@ -0,0 +1,18 @@
|
|||
# factoriocp sample configfile
|
||||
# rename this file to app.conf
|
||||
|
||||
[DEFAULT]
|
||||
app_name=factoriocp
|
||||
cookie_name=factoriocp
|
||||
cookie_max_age=3600
|
||||
cookie_secret=something secret like this 0rE5vYvF 0rDbj5Io Z0h28k-k 12jtcRW0
|
||||
static_files=/path/to/static/files
|
||||
|
||||
[server]
|
||||
host=localhost
|
||||
port=8000
|
||||
debug=True
|
||||
|
||||
[factorio]
|
||||
path=/path/to/factorio/servers
|
||||
users=username anotheruser athirduser
|
|
@ -0,0 +1,121 @@
|
|||
# imports
|
||||
|
||||
import requests
|
||||
from configparser import ConfigParser
|
||||
from bottle import route, run, template, error, get, \
|
||||
post, request, response, redirect, \
|
||||
static_file
|
||||
|
||||
|
||||
# config
|
||||
|
||||
configfile = "factoriocp.conf"
|
||||
config = ConfigParser()
|
||||
config.read(configfile)
|
||||
|
||||
|
||||
# functions
|
||||
|
||||
# verify session
|
||||
def logged_in():
|
||||
username = request.get_cookie(config['DEFAULT']['cookie_name'],
|
||||
secret=config['DEFAULT']['cookie_secret'])
|
||||
if username:
|
||||
return username
|
||||
else:
|
||||
return False
|
||||
|
||||
# authenticate against factorio.com
|
||||
def log_in(username, password):
|
||||
data = { "username": username, "password": password }
|
||||
l = requests.post("https://auth.factorio.com/api-login", data=data)
|
||||
if l.status_code == 200:
|
||||
response.set_cookie(config['DEFAULT']['cookie_name'],
|
||||
username,
|
||||
secret=config['DEFAULT']['cookie_secret'],
|
||||
max_age=config['DEFAULT']['cookie_max_age'])
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
# get a list of server dicts
|
||||
def get_servers():
|
||||
pass
|
||||
return [{ "name": "Creative fun", "version": "0.14.20", "status": "online" },
|
||||
{ "name": "Mad enemies", "version": "0.14.19", "status": "offline" }]
|
||||
|
||||
|
||||
# routing
|
||||
|
||||
# render main page
|
||||
@get('/')
|
||||
def home():
|
||||
username = logged_in()
|
||||
message = request.get_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
||||
secret=config['DEFAULT']['cookie_secret'])
|
||||
if username:
|
||||
# render homepage
|
||||
servers = get_servers()
|
||||
return template('default',
|
||||
username=username,
|
||||
servers=servers,
|
||||
app_name=config['DEFAULT']['app_name'],
|
||||
message=message)
|
||||
else:
|
||||
# render login
|
||||
return template('login',
|
||||
app_name=config['DEFAULT']['app_name'],
|
||||
cookie_max_age=int(config['DEFAULT']['cookie_max_age']),
|
||||
message=message)
|
||||
|
||||
# get login credentials
|
||||
@post('/login')
|
||||
def post_login():
|
||||
username = request.forms.get('username')
|
||||
password = request.forms.get('password')
|
||||
if log_in(username, password):
|
||||
message = { "message": "You have logged in successfully", "alert": "success" }
|
||||
response.set_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
||||
message,
|
||||
secret=config['DEFAULT']['cookie_secret'],
|
||||
max_age=5)
|
||||
redirect('/')
|
||||
else:
|
||||
message = { "message": "User or password wrong", "alert": "danger" }
|
||||
response.set_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
||||
message,
|
||||
secret=config['DEFAULT']['cookie_secret'],
|
||||
max_age=5)
|
||||
redirect('/')
|
||||
|
||||
# delete cookie
|
||||
@get('/logout')
|
||||
@get('/logout/')
|
||||
def logout():
|
||||
if logged_in():
|
||||
response.delete_cookie(config['DEFAULT']['cookie_name'])
|
||||
message = { "message": "You have logged out successfully", "alert": "success" }
|
||||
response.set_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
||||
message,
|
||||
secret=config['DEFAULT']['cookie_secret'],
|
||||
max_age=5)
|
||||
redirect('/')
|
||||
else:
|
||||
redirect('/')
|
||||
|
||||
# serve static files
|
||||
@get('/static/<filename:path>')
|
||||
def send_static(filename):
|
||||
return static_file(filename, root=config['DEFAULT']['static_files'])
|
||||
|
||||
|
||||
# run webserver
|
||||
if __name__ == "__main__":
|
||||
if str(config['server']['debug']) == "True":
|
||||
run(host=config['server']['host'],
|
||||
port=config['server']['port'],
|
||||
debug=True,
|
||||
reloader=True)
|
||||
else:
|
||||
run(host=config['server']['host'],
|
||||
port=config['server']['port'])
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,996 @@
|
|||
.container {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.container::after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
@media (min-width: 576px) {
|
||||
.container {
|
||||
width: 540px;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.container {
|
||||
width: 720px;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.container {
|
||||
width: 960px;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.container {
|
||||
width: 1140px;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.container-fluid::after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.row {
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
||||
.row::after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
@media (min-width: 576px) {
|
||||
.row {
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.row {
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.row {
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.row {
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
}
|
||||
|
||||
.col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 {
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
@media (min-width: 576px) {
|
||||
.col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 {
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 {
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 {
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.col-xs, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 {
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.col-xs-1 {
|
||||
float: left;
|
||||
width: 8.333333%;
|
||||
}
|
||||
|
||||
.col-xs-2 {
|
||||
float: left;
|
||||
width: 16.666667%;
|
||||
}
|
||||
|
||||
.col-xs-3 {
|
||||
float: left;
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.col-xs-4 {
|
||||
float: left;
|
||||
width: 33.333333%;
|
||||
}
|
||||
|
||||
.col-xs-5 {
|
||||
float: left;
|
||||
width: 41.666667%;
|
||||
}
|
||||
|
||||
.col-xs-6 {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.col-xs-7 {
|
||||
float: left;
|
||||
width: 58.333333%;
|
||||
}
|
||||
|
||||
.col-xs-8 {
|
||||
float: left;
|
||||
width: 66.666667%;
|
||||
}
|
||||
|
||||
.col-xs-9 {
|
||||
float: left;
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.col-xs-10 {
|
||||
float: left;
|
||||
width: 83.333333%;
|
||||
}
|
||||
|
||||
.col-xs-11 {
|
||||
float: left;
|
||||
width: 91.666667%;
|
||||
}
|
||||
|
||||
.col-xs-12 {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.pull-xs-0 {
|
||||
right: auto;
|
||||
}
|
||||
|
||||
.pull-xs-1 {
|
||||
right: 8.333333%;
|
||||
}
|
||||
|
||||
.pull-xs-2 {
|
||||
right: 16.666667%;
|
||||
}
|
||||
|
||||
.pull-xs-3 {
|
||||
right: 25%;
|
||||
}
|
||||
|
||||
.pull-xs-4 {
|
||||
right: 33.333333%;
|
||||
}
|
||||
|
||||
.pull-xs-5 {
|
||||
right: 41.666667%;
|
||||
}
|
||||
|
||||
.pull-xs-6 {
|
||||
right: 50%;
|
||||
}
|
||||
|
||||
.pull-xs-7 {
|
||||
right: 58.333333%;
|
||||
}
|
||||
|
||||
.pull-xs-8 {
|
||||
right: 66.666667%;
|
||||
}
|
||||
|
||||
.pull-xs-9 {
|
||||
right: 75%;
|
||||
}
|
||||
|
||||
.pull-xs-10 {
|
||||
right: 83.333333%;
|
||||
}
|
||||
|
||||
.pull-xs-11 {
|
||||
right: 91.666667%;
|
||||
}
|
||||
|
||||
.pull-xs-12 {
|
||||
right: 100%;
|
||||
}
|
||||
|
||||
.push-xs-0 {
|
||||
left: auto;
|
||||
}
|
||||
|
||||
.push-xs-1 {
|
||||
left: 8.333333%;
|
||||
}
|
||||
|
||||
.push-xs-2 {
|
||||
left: 16.666667%;
|
||||
}
|
||||
|
||||
.push-xs-3 {
|
||||
left: 25%;
|
||||
}
|
||||
|
||||
.push-xs-4 {
|
||||
left: 33.333333%;
|
||||
}
|
||||
|
||||
.push-xs-5 {
|
||||
left: 41.666667%;
|
||||
}
|
||||
|
||||
.push-xs-6 {
|
||||
left: 50%;
|
||||
}
|
||||
|
||||
.push-xs-7 {
|
||||
left: 58.333333%;
|
||||
}
|
||||
|
||||
.push-xs-8 {
|
||||
left: 66.666667%;
|
||||
}
|
||||
|
||||
.push-xs-9 {
|
||||
left: 75%;
|
||||
}
|
||||
|
||||
.push-xs-10 {
|
||||
left: 83.333333%;
|
||||
}
|
||||
|
||||
.push-xs-11 {
|
||||
left: 91.666667%;
|
||||
}
|
||||
|
||||
.push-xs-12 {
|
||||
left: 100%;
|
||||
}
|
||||
|
||||
.offset-xs-1 {
|
||||
margin-left: 8.333333%;
|
||||
}
|
||||
|
||||
.offset-xs-2 {
|
||||
margin-left: 16.666667%;
|
||||
}
|
||||
|
||||
.offset-xs-3 {
|
||||
margin-left: 25%;
|
||||
}
|
||||
|
||||
.offset-xs-4 {
|
||||
margin-left: 33.333333%;
|
||||
}
|
||||
|
||||
.offset-xs-5 {
|
||||
margin-left: 41.666667%;
|
||||
}
|
||||
|
||||
.offset-xs-6 {
|
||||
margin-left: 50%;
|
||||
}
|
||||
|
||||
.offset-xs-7 {
|
||||
margin-left: 58.333333%;
|
||||
}
|
||||
|
||||
.offset-xs-8 {
|
||||
margin-left: 66.666667%;
|
||||
}
|
||||
|
||||
.offset-xs-9 {
|
||||
margin-left: 75%;
|
||||
}
|
||||
|
||||
.offset-xs-10 {
|
||||
margin-left: 83.333333%;
|
||||
}
|
||||
|
||||
.offset-xs-11 {
|
||||
margin-left: 91.666667%;
|
||||
}
|
||||
|
||||
@media (min-width: 576px) {
|
||||
.col-sm-1 {
|
||||
float: left;
|
||||
width: 8.333333%;
|
||||
}
|
||||
.col-sm-2 {
|
||||
float: left;
|
||||
width: 16.666667%;
|
||||
}
|
||||
.col-sm-3 {
|
||||
float: left;
|
||||
width: 25%;
|
||||
}
|
||||
.col-sm-4 {
|
||||
float: left;
|
||||
width: 33.333333%;
|
||||
}
|
||||
.col-sm-5 {
|
||||
float: left;
|
||||
width: 41.666667%;
|
||||
}
|
||||
.col-sm-6 {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.col-sm-7 {
|
||||
float: left;
|
||||
width: 58.333333%;
|
||||
}
|
||||
.col-sm-8 {
|
||||
float: left;
|
||||
width: 66.666667%;
|
||||
}
|
||||
.col-sm-9 {
|
||||
float: left;
|
||||
width: 75%;
|
||||
}
|
||||
.col-sm-10 {
|
||||
float: left;
|
||||
width: 83.333333%;
|
||||
}
|
||||
.col-sm-11 {
|
||||
float: left;
|
||||
width: 91.666667%;
|
||||
}
|
||||
.col-sm-12 {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
.pull-sm-0 {
|
||||
right: auto;
|
||||
}
|
||||
.pull-sm-1 {
|
||||
right: 8.333333%;
|
||||
}
|
||||
.pull-sm-2 {
|
||||
right: 16.666667%;
|
||||
}
|
||||
.pull-sm-3 {
|
||||
right: 25%;
|
||||
}
|
||||
.pull-sm-4 {
|
||||
right: 33.333333%;
|
||||
}
|
||||
.pull-sm-5 {
|
||||
right: 41.666667%;
|
||||
}
|
||||
.pull-sm-6 {
|
||||
right: 50%;
|
||||
}
|
||||
.pull-sm-7 {
|
||||
right: 58.333333%;
|
||||
}
|
||||
.pull-sm-8 {
|
||||
right: 66.666667%;
|
||||
}
|
||||
.pull-sm-9 {
|
||||
right: 75%;
|
||||
}
|
||||
.pull-sm-10 {
|
||||
right: 83.333333%;
|
||||
}
|
||||
.pull-sm-11 {
|
||||
right: 91.666667%;
|
||||
}
|
||||
.pull-sm-12 {
|
||||
right: 100%;
|
||||
}
|
||||
.push-sm-0 {
|
||||
left: auto;
|
||||
}
|
||||
.push-sm-1 {
|
||||
left: 8.333333%;
|
||||
}
|
||||
.push-sm-2 {
|
||||
left: 16.666667%;
|
||||
}
|
||||
.push-sm-3 {
|
||||
left: 25%;
|
||||
}
|
||||
.push-sm-4 {
|
||||
left: 33.333333%;
|
||||
}
|
||||
.push-sm-5 {
|
||||
left: 41.666667%;
|
||||
}
|
||||
.push-sm-6 {
|
||||
left: 50%;
|
||||
}
|
||||
.push-sm-7 {
|
||||
left: 58.333333%;
|
||||
}
|
||||
.push-sm-8 {
|
||||
left: 66.666667%;
|
||||
}
|
||||
.push-sm-9 {
|
||||
left: 75%;
|
||||
}
|
||||
.push-sm-10 {
|
||||
left: 83.333333%;
|
||||
}
|
||||
.push-sm-11 {
|
||||
left: 91.666667%;
|
||||
}
|
||||
.push-sm-12 {
|
||||
left: 100%;
|
||||
}
|
||||
.offset-sm-0 {
|
||||
margin-left: 0%;
|
||||
}
|
||||
.offset-sm-1 {
|
||||
margin-left: 8.333333%;
|
||||
}
|
||||
.offset-sm-2 {
|
||||
margin-left: 16.666667%;
|
||||
}
|
||||
.offset-sm-3 {
|
||||
margin-left: 25%;
|
||||
}
|
||||
.offset-sm-4 {
|
||||
margin-left: 33.333333%;
|
||||
}
|
||||
.offset-sm-5 {
|
||||
margin-left: 41.666667%;
|
||||
}
|
||||
.offset-sm-6 {
|
||||
margin-left: 50%;
|
||||
}
|
||||
.offset-sm-7 {
|
||||
margin-left: 58.333333%;
|
||||
}
|
||||
.offset-sm-8 {
|
||||
margin-left: 66.666667%;
|
||||
}
|
||||
.offset-sm-9 {
|
||||
margin-left: 75%;
|
||||
}
|
||||
.offset-sm-10 {
|
||||
margin-left: 83.333333%;
|
||||
}
|
||||
.offset-sm-11 {
|
||||
margin-left: 91.666667%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.col-md-1 {
|
||||
float: left;
|
||||
width: 8.333333%;
|
||||
}
|
||||
.col-md-2 {
|
||||
float: left;
|
||||
width: 16.666667%;
|
||||
}
|
||||
.col-md-3 {
|
||||
float: left;
|
||||
width: 25%;
|
||||
}
|
||||
.col-md-4 {
|
||||
float: left;
|
||||
width: 33.333333%;
|
||||
}
|
||||
.col-md-5 {
|
||||
float: left;
|
||||
width: 41.666667%;
|
||||
}
|
||||
.col-md-6 {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.col-md-7 {
|
||||
float: left;
|
||||
width: 58.333333%;
|
||||
}
|
||||
.col-md-8 {
|
||||
float: left;
|
||||
width: 66.666667%;
|
||||
}
|
||||
.col-md-9 {
|
||||
float: left;
|
||||
width: 75%;
|
||||
}
|
||||
.col-md-10 {
|
||||
float: left;
|
||||
width: 83.333333%;
|
||||
}
|
||||
.col-md-11 {
|
||||
float: left;
|
||||
width: 91.666667%;
|
||||
}
|
||||
.col-md-12 {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
.pull-md-0 {
|
||||
right: auto;
|
||||
}
|
||||
.pull-md-1 {
|
||||
right: 8.333333%;
|
||||
}
|
||||
.pull-md-2 {
|
||||
right: 16.666667%;
|
||||
}
|
||||
.pull-md-3 {
|
||||
right: 25%;
|
||||
}
|
||||
.pull-md-4 {
|
||||
right: 33.333333%;
|
||||
}
|
||||
.pull-md-5 {
|
||||
right: 41.666667%;
|
||||
}
|
||||
.pull-md-6 {
|
||||
right: 50%;
|
||||
}
|
||||
.pull-md-7 {
|
||||
right: 58.333333%;
|
||||
}
|
||||
.pull-md-8 {
|
||||
right: 66.666667%;
|
||||
}
|
||||
.pull-md-9 {
|
||||
right: 75%;
|
||||
}
|
||||
.pull-md-10 {
|
||||
right: 83.333333%;
|
||||
}
|
||||
.pull-md-11 {
|
||||
right: 91.666667%;
|
||||
}
|
||||
.pull-md-12 {
|
||||
right: 100%;
|
||||
}
|
||||
.push-md-0 {
|
||||
left: auto;
|
||||
}
|
||||
.push-md-1 {
|
||||
left: 8.333333%;
|
||||
}
|
||||
.push-md-2 {
|
||||
left: 16.666667%;
|
||||
}
|
||||
.push-md-3 {
|
||||
left: 25%;
|
||||
}
|
||||
.push-md-4 {
|
||||
left: 33.333333%;
|
||||
}
|
||||
.push-md-5 {
|
||||
left: 41.666667%;
|
||||
}
|
||||
.push-md-6 {
|
||||
left: 50%;
|
||||
}
|
||||
.push-md-7 {
|
||||
left: 58.333333%;
|
||||
}
|
||||
.push-md-8 {
|
||||
left: 66.666667%;
|
||||
}
|
||||
.push-md-9 {
|
||||
left: 75%;
|
||||
}
|
||||
.push-md-10 {
|
||||
left: 83.333333%;
|
||||
}
|
||||
.push-md-11 {
|
||||
left: 91.666667%;
|
||||
}
|
||||
.push-md-12 {
|
||||
left: 100%;
|
||||
}
|
||||
.offset-md-0 {
|
||||
margin-left: 0%;
|
||||
}
|
||||
.offset-md-1 {
|
||||
margin-left: 8.333333%;
|
||||
}
|
||||
.offset-md-2 {
|
||||
margin-left: 16.666667%;
|
||||
}
|
||||
.offset-md-3 {
|
||||
margin-left: 25%;
|
||||
}
|
||||
.offset-md-4 {
|
||||
margin-left: 33.333333%;
|
||||
}
|
||||
.offset-md-5 {
|
||||
margin-left: 41.666667%;
|
||||
}
|
||||
.offset-md-6 {
|
||||
margin-left: 50%;
|
||||
}
|
||||
.offset-md-7 {
|
||||
margin-left: 58.333333%;
|
||||
}
|
||||
.offset-md-8 {
|
||||
margin-left: 66.666667%;
|
||||
}
|
||||
.offset-md-9 {
|
||||
margin-left: 75%;
|
||||
}
|
||||
.offset-md-10 {
|
||||
margin-left: 83.333333%;
|
||||
}
|
||||
.offset-md-11 {
|
||||
margin-left: 91.666667%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.col-lg-1 {
|
||||
float: left;
|
||||
width: 8.333333%;
|
||||
}
|
||||
.col-lg-2 {
|
||||
float: left;
|
||||
width: 16.666667%;
|
||||
}
|
||||
.col-lg-3 {
|
||||
float: left;
|
||||
width: 25%;
|
||||
}
|
||||
.col-lg-4 {
|
||||
float: left;
|
||||
width: 33.333333%;
|
||||
}
|
||||
.col-lg-5 {
|
||||
float: left;
|
||||
width: 41.666667%;
|
||||
}
|
||||
.col-lg-6 {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.col-lg-7 {
|
||||
float: left;
|
||||
width: 58.333333%;
|
||||
}
|
||||
.col-lg-8 {
|
||||
float: left;
|
||||
width: 66.666667%;
|
||||
}
|
||||
.col-lg-9 {
|
||||
float: left;
|
||||
width: 75%;
|
||||
}
|
||||
.col-lg-10 {
|
||||
float: left;
|
||||
width: 83.333333%;
|
||||
}
|
||||
.col-lg-11 {
|
||||
float: left;
|
||||
width: 91.666667%;
|
||||
}
|
||||
.col-lg-12 {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
.pull-lg-0 {
|
||||
right: auto;
|
||||
}
|
||||
.pull-lg-1 {
|
||||
right: 8.333333%;
|
||||
}
|
||||
.pull-lg-2 {
|
||||
right: 16.666667%;
|
||||
}
|
||||
.pull-lg-3 {
|
||||
right: 25%;
|
||||
}
|
||||
.pull-lg-4 {
|
||||
right: 33.333333%;
|
||||
}
|
||||
.pull-lg-5 {
|
||||
right: 41.666667%;
|
||||
}
|
||||
.pull-lg-6 {
|
||||
right: 50%;
|
||||
}
|
||||
.pull-lg-7 {
|
||||
right: 58.333333%;
|
||||
}
|
||||
.pull-lg-8 {
|
||||
right: 66.666667%;
|
||||
}
|
||||
.pull-lg-9 {
|
||||
right: 75%;
|
||||
}
|
||||
.pull-lg-10 {
|
||||
right: 83.333333%;
|
||||
}
|
||||
.pull-lg-11 {
|
||||
right: 91.666667%;
|
||||
}
|
||||
.pull-lg-12 {
|
||||
right: 100%;
|
||||
}
|
||||
.push-lg-0 {
|
||||
left: auto;
|
||||
}
|
||||
.push-lg-1 {
|
||||
left: 8.333333%;
|
||||
}
|
||||
.push-lg-2 {
|
||||
left: 16.666667%;
|
||||
}
|
||||
.push-lg-3 {
|
||||
left: 25%;
|
||||
}
|
||||
.push-lg-4 {
|
||||
left: 33.333333%;
|
||||
}
|
||||
.push-lg-5 {
|
||||
left: 41.666667%;
|
||||
}
|
||||
.push-lg-6 {
|
||||
left: 50%;
|
||||
}
|
||||
.push-lg-7 {
|
||||
left: 58.333333%;
|
||||
}
|
||||
.push-lg-8 {
|
||||
left: 66.666667%;
|
||||
}
|
||||
.push-lg-9 {
|
||||
left: 75%;
|
||||
}
|
||||
.push-lg-10 {
|
||||
left: 83.333333%;
|
||||
}
|
||||
.push-lg-11 {
|
||||
left: 91.666667%;
|
||||
}
|
||||
.push-lg-12 {
|
||||
left: 100%;
|
||||
}
|
||||
.offset-lg-0 {
|
||||
margin-left: 0%;
|
||||
}
|
||||
.offset-lg-1 {
|
||||
margin-left: 8.333333%;
|
||||
}
|
||||
.offset-lg-2 {
|
||||
margin-left: 16.666667%;
|
||||
}
|
||||
.offset-lg-3 {
|
||||
margin-left: 25%;
|
||||
}
|
||||
.offset-lg-4 {
|
||||
margin-left: 33.333333%;
|
||||
}
|
||||
.offset-lg-5 {
|
||||
margin-left: 41.666667%;
|
||||
}
|
||||
.offset-lg-6 {
|
||||
margin-left: 50%;
|
||||
}
|
||||
.offset-lg-7 {
|
||||
margin-left: 58.333333%;
|
||||
}
|
||||
.offset-lg-8 {
|
||||
margin-left: 66.666667%;
|
||||
}
|
||||
.offset-lg-9 {
|
||||
margin-left: 75%;
|
||||
}
|
||||
.offset-lg-10 {
|
||||
margin-left: 83.333333%;
|
||||
}
|
||||
.offset-lg-11 {
|
||||
margin-left: 91.666667%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.col-xl-1 {
|
||||
float: left;
|
||||
width: 8.333333%;
|
||||
}
|
||||
.col-xl-2 {
|
||||
float: left;
|
||||
width: 16.666667%;
|
||||
}
|
||||
.col-xl-3 {
|
||||
float: left;
|
||||
width: 25%;
|
||||
}
|
||||
.col-xl-4 {
|
||||
float: left;
|
||||
width: 33.333333%;
|
||||
}
|
||||
.col-xl-5 {
|
||||
float: left;
|
||||
width: 41.666667%;
|
||||
}
|
||||
.col-xl-6 {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.col-xl-7 {
|
||||
float: left;
|
||||
width: 58.333333%;
|
||||
}
|
||||
.col-xl-8 {
|
||||
float: left;
|
||||
width: 66.666667%;
|
||||
}
|
||||
.col-xl-9 {
|
||||
float: left;
|
||||
width: 75%;
|
||||
}
|
||||
.col-xl-10 {
|
||||
float: left;
|
||||
width: 83.333333%;
|
||||
}
|
||||
.col-xl-11 {
|
||||
float: left;
|
||||
width: 91.666667%;
|
||||
}
|
||||
.col-xl-12 {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
.pull-xl-0 {
|
||||
right: auto;
|
||||
}
|
||||
.pull-xl-1 {
|
||||
right: 8.333333%;
|
||||
}
|
||||
.pull-xl-2 {
|
||||
right: 16.666667%;
|
||||
}
|
||||
.pull-xl-3 {
|
||||
right: 25%;
|
||||
}
|
||||
.pull-xl-4 {
|
||||
right: 33.333333%;
|
||||
}
|
||||
.pull-xl-5 {
|
||||
right: 41.666667%;
|
||||
}
|
||||
.pull-xl-6 {
|
||||
right: 50%;
|
||||
}
|
||||
.pull-xl-7 {
|
||||
right: 58.333333%;
|
||||
}
|
||||
.pull-xl-8 {
|
||||
right: 66.666667%;
|
||||
}
|
||||
.pull-xl-9 {
|
||||
right: 75%;
|
||||
}
|
||||
.pull-xl-10 {
|
||||
right: 83.333333%;
|
||||
}
|
||||
.pull-xl-11 {
|
||||
right: 91.666667%;
|
||||
}
|
||||
.pull-xl-12 {
|
||||
right: 100%;
|
||||
}
|
||||
.push-xl-0 {
|
||||
left: auto;
|
||||
}
|
||||
.push-xl-1 {
|
||||
left: 8.333333%;
|
||||
}
|
||||
.push-xl-2 {
|
||||
left: 16.666667%;
|
||||
}
|
||||
.push-xl-3 {
|
||||
left: 25%;
|
||||
}
|
||||
.push-xl-4 {
|
||||
left: 33.333333%;
|
||||
}
|
||||
.push-xl-5 {
|
||||
left: 41.666667%;
|
||||
}
|
||||
.push-xl-6 {
|
||||
left: 50%;
|
||||
}
|
||||
.push-xl-7 {
|
||||
left: 58.333333%;
|
||||
}
|
||||
.push-xl-8 {
|
||||
left: 66.666667%;
|
||||
}
|
||||
.push-xl-9 {
|
||||
left: 75%;
|
||||
}
|
||||
.push-xl-10 {
|
||||
left: 83.333333%;
|
||||
}
|
||||
.push-xl-11 {
|
||||
left: 91.666667%;
|
||||
}
|
||||
.push-xl-12 {
|
||||
left: 100%;
|
||||
}
|
||||
.offset-xl-0 {
|
||||
margin-left: 0%;
|
||||
}
|
||||
.offset-xl-1 {
|
||||
margin-left: 8.333333%;
|
||||
}
|
||||
.offset-xl-2 {
|
||||
margin-left: 16.666667%;
|
||||
}
|
||||
.offset-xl-3 {
|
||||
margin-left: 25%;
|
||||
}
|
||||
.offset-xl-4 {
|
||||
margin-left: 33.333333%;
|
||||
}
|
||||
.offset-xl-5 {
|
||||
margin-left: 41.666667%;
|
||||
}
|
||||
.offset-xl-6 {
|
||||
margin-left: 50%;
|
||||
}
|
||||
.offset-xl-7 {
|
||||
margin-left: 58.333333%;
|
||||
}
|
||||
.offset-xl-8 {
|
||||
margin-left: 66.666667%;
|
||||
}
|
||||
.offset-xl-9 {
|
||||
margin-left: 75%;
|
||||
}
|
||||
.offset-xl-10 {
|
||||
margin-left: 83.333333%;
|
||||
}
|
||||
.offset-xl-11 {
|
||||
margin-left: 91.666667%;
|
||||
}
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-grid.css.map */
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,453 @@
|
|||
/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */
|
||||
html {
|
||||
font-family: sans-serif;
|
||||
line-height: 1.15;
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
main,
|
||||
menu,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
audio,
|
||||
canvas,
|
||||
progress,
|
||||
video {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
audio:not([controls]) {
|
||||
display: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
template,
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
-webkit-text-decoration-skip: objects;
|
||||
}
|
||||
|
||||
a:active,
|
||||
a:hover {
|
||||
outline-width: 0;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: none;
|
||||
text-decoration: underline;
|
||||
text-decoration: underline dotted;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
mark {
|
||||
background-color: #ff0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
img {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: monospace, monospace;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 1em 40px;
|
||||
}
|
||||
|
||||
hr {
|
||||
-webkit-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font: inherit;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
optgroup {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
button,
|
||||
input {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
button,
|
||||
html [type="button"],
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
button::-moz-focus-inner,
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
border-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
button:-moz-focusring,
|
||||
[type="button"]:-moz-focusring,
|
||||
[type="reset"]:-moz-focusring,
|
||||
[type="submit"]:-moz-focusring {
|
||||
outline: 1px dotted ButtonText;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #c0c0c0;
|
||||
margin: 0 2px;
|
||||
padding: 0.35em 0.625em 0.75em;
|
||||
}
|
||||
|
||||
legend {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: inherit;
|
||||
display: table;
|
||||
max-width: 100%;
|
||||
padding: 0;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
[type="checkbox"],
|
||||
[type="radio"] {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type="search"] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
[type="search"]::-webkit-search-cancel-button,
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-input-placeholder {
|
||||
color: inherit;
|
||||
opacity: 0.54;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button;
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
-webkit-box-sizing: inherit;
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
@-ms-viewport {
|
||||
width: device-width;
|
||||
}
|
||||
|
||||
html {
|
||||
font-size: 16px;
|
||||
-ms-overflow-style: scrollbar;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
font-size: 1rem;
|
||||
line-height: 1.5;
|
||||
color: #373a3c;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
[tabindex="-1"]:focus {
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin-top: 0;
|
||||
margin-bottom: .5rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title],
|
||||
abbr[data-original-title] {
|
||||
cursor: help;
|
||||
border-bottom: 1px dotted #818a91;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: .5rem;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0275d8;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:focus, a:hover {
|
||||
color: #014c8c;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:focus {
|
||||
outline: 5px auto -webkit-focus-ring-color;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
a:not([href]):not([tabindex]) {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:not([href]):not([tabindex]):focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
pre {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
[role="button"] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a,
|
||||
area,
|
||||
button,
|
||||
[role="button"],
|
||||
input,
|
||||
label,
|
||||
select,
|
||||
summary,
|
||||
textarea {
|
||||
-ms-touch-action: manipulation;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.75rem;
|
||||
padding-bottom: 0.75rem;
|
||||
color: #818a91;
|
||||
text-align: left;
|
||||
caption-side: bottom;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
margin-bottom: .5rem;
|
||||
}
|
||||
|
||||
button:focus {
|
||||
outline: 1px dotted;
|
||||
outline: 5px auto -webkit-focus-ring-color;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
textarea {
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
input[type="radio"]:disabled,
|
||||
input[type="checkbox"]:disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
input[type="date"],
|
||||
input[type="time"],
|
||||
input[type="datetime-local"],
|
||||
input[type="month"] {
|
||||
-webkit-appearance: listbox;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: .5rem;
|
||||
font-size: 1.5rem;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
input[type="search"] {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-reboot.css.map */
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,2 @@
|
|||
/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{font-size:16px;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#818a91;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{line-height:inherit}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}
|
||||
/*# sourceMappingURL=bootstrap-reboot.min.css.map */
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"sources":["../../scss/_normalize.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_tab-focus.scss"],"names":[],"mappings":"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"}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,45 @@
|
|||
body {
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.form-signin {
|
||||
max-width: 330px;
|
||||
padding: 15px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.form-signin .form-signin-heading,
|
||||
.form-signin .checkbox {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.form-signin .checkbox {
|
||||
font-weight: normal;
|
||||
}
|
||||
.form-signin .form-control {
|
||||
position: relative;
|
||||
height: auto;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.form-signin .form-control:focus {
|
||||
z-index: 2;
|
||||
}
|
||||
.form-signin input[type="email"] {
|
||||
margin-bottom: -1px;
|
||||
border-bottom-right-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
.form-signin input[type="password"] {
|
||||
margin-bottom: 10px;
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: auto;
|
||||
max-width: 680px;
|
||||
padding: 0 15px;
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
/* Sticky footer styles
|
||||
-------------------------------------------------- */
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
body {
|
||||
/* Margin bottom by footer height */
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
.footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
/* Set the fixed height of the footer here */
|
||||
height: 60px;
|
||||
line-height: 60px; /* Vertically center the text there */
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
|
||||
/* Custom page CSS
|
||||
-------------------------------------------------- */
|
||||
/* Not required for template or sticky footer method. */
|
||||
|
||||
.container {
|
||||
width: auto;
|
||||
max-width: 680px;
|
||||
padding: 0 15px;
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,71 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="icon" href="/static/favicon.ico">
|
||||
|
||||
<title>{{ app_name }}</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template -->
|
||||
<link href="/static/css/sticky-footer.css" rel="stylesheet">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
<p>
|
||||
%if message:
|
||||
<div class="alert alert-{{ message['alert'] }} alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
{{ message['message'] }}.
|
||||
</div>
|
||||
%end
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Begin page content -->
|
||||
<div class="container">
|
||||
<div class="mt-1">
|
||||
<h1>{{ app_name }}</h1>
|
||||
</div>
|
||||
<p class="lead">{{ username }} (<a href="/logout">logout</a>)</p>
|
||||
<p>This is your Factorio server control panel.</p>
|
||||
<p>It is <a href="https://en.wikipedia.org/wiki/Free_software">free software</a> and its code is hosted <a href="https://socialg.it/david/factoriocp">here</a>.</p>
|
||||
|
||||
|
||||
<h2>Servers</h2>
|
||||
<hr>
|
||||
%for server in servers:
|
||||
%if server['status'] == "online":
|
||||
<h4>{{ server['name'] }} <span class="tag tag-success">{{ server['status'] }}</span></h4>
|
||||
%else:
|
||||
<h4>{{ server['name'] }} <span class="tag tag-danger">{{ server['status'] }}</span></h4>
|
||||
%end
|
||||
Version: <b>{{ server['version'] }}</b>
|
||||
<br><br>
|
||||
%end
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<span class="text-muted">factoriocp v0.1</span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Bootstrap core JavaScript
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
<script>window.jQuery || document.write('<script src="/static/js/vendor/jquery.min.js"><\/script>')</script>
|
||||
<script src="/static/js/bootstrap.min.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,55 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="icon" href="/static/favicon.ico">
|
||||
|
||||
<title>{{ app_name }}</title>
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template -->
|
||||
<link href="/static/css/signin.css" rel="stylesheet">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
%if message:
|
||||
<div class="alert alert-{{ message['alert'] }} alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
{{ message['message'] }}.
|
||||
</div>
|
||||
%end
|
||||
</div>
|
||||
<div class="container">
|
||||
<form class="form-signin" action="/login" method="post">
|
||||
<h2 class="form-signin-heading">{{ app_name }}</h2>
|
||||
<label for="inputFactorioaccount" class="sr-only">Factorio account</label>
|
||||
<input name="username" type="text" id="inputfactorioaccount" class="form-control" placeholder="Factorio account" required autofocus>
|
||||
<label for="inputPassword" class="sr-only">Password</label>
|
||||
<input name="password" type="password" id="inputPassword" class="form-control" placeholder="Password" required>
|
||||
<p>For security reasons every session will expire {{ int(cookie_max_age/60) }} minutes after login.</p>
|
||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Login</button>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div> <!-- /container -->
|
||||
|
||||
<!-- Bootstrap core JavaScript
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
<script>window.jQuery || document.write('<script src="/static/js/vendor/jquery.min.js"><\/script>')</script>
|
||||
<script src="/static/js/bootstrap.min.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
Reference in New Issue