Compare commits

...

5 Commits
next ... master

Author SHA1 Message Date
Tjatse 224046b132 test on v6.9.2 2017-05-27 17:55:05 +08:00
Tjatse 937316fc11 test on v0.6 LTS 2017-05-27 17:49:15 +08:00
Jun 8899bd413a Merge pull request #51 from KTachibanaM/doc
make readme more readable
2017-05-27 17:34:53 +08:00
Tjatse 511d57654c Revert "component all"
This reverts commit 491040f28c.
2017-04-01 12:49:03 +08:00
Hanjie Wang cd0e125d17 make readme more readable 2017-03-21 11:33:01 -05:00
86 changed files with 20448 additions and 1548 deletions

12
.gitignore vendored
View File

@ -1,11 +1,5 @@
node_modules
logs
*.pid
.idea/
bower_components/
examples/*.js
logs/
node_modules/
web/public/js/dist/
web/public/js/babel/
web/public/css/
web/public/vendor
bower_components/

View File

@ -1,14 +1,5 @@
.*
*.pid
.idea/
bower_components/
examples/
Gruntfile.js
bower.json
logs/
node_modules/
screenshots/
test/
web/public/js/src/
web/public/js/babel/
web/public/less/
node_modules
.gitignore
screenshots
logs
*.pid

View File

@ -6,5 +6,4 @@ node_js:
- 0.10
- 0.11
- 0.12
- 0.4
- 0.5
- 6.9.2

View File

@ -1,19 +1,3 @@
# 0.2.0
**Bugs**
- caught process exceptions
**Enhancements**
- Refactor
- Humanize config
- Update dependencies
- Read logs from event bus
- Add thanks
**Breaking Changes**
- Uniform socket.io namespaces
- UI/UX
# 0.1.4-rc.1
**Bugs**
- clean ANSI.

View File

@ -1,270 +0,0 @@
'use strict'
var path = require('path')
var webpack = require('webpack')
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js')
const nodeEnv = process.env.NODE_ENV || 'development'
const isProduction = nodeEnv === 'production'
const webRoot = 'web'
const vendorDir = `${webRoot}/public/vendor/`
const babelDir = `${webRoot}/public/js/babel/`
const srcDir = `${webRoot}/public/js/src/`
const distDir = `${webRoot}/public/js/dist/`
const lessDir = `${webRoot}/public/less/`
const cssDir = `${webRoot}/public/css/`
let joinPath = (cwd, f) => {
if (f.indexOf('!') === 0) {
return '!' + cwd + f.substr(1)
}
return cwd + f
}
let uglifyRename = (dest, src) => {
return path.join(dest, src.replace(/\.js$/, '.min.js'))
}
module.exports = (grunt) => {
const themes = [
'default'
]
const compressScripts = [
'colorbrewer/colorbrewer.js',
'fastclick/fastclick.js'
]
const compressStylesheets = [
'normalize-css/normalize'
].map((f) => joinPath(vendorDir, f))
const jshintFiles = [
'**/*.js',
'!**/*.min.js'
].map((f) => joinPath(srcDir, f))
const uglifyFiles = [
'**/*.js',
'!**/*.min.js'
]
const webpackScripts = [
// 'views/index'
]
const webpackConfig = {
cache: false,
entry: (() => {
let entries = {}
webpackScripts.forEach((s) => {
entries[s] = `./${srcDir}${s}.js`
})
return entries
})(),
output: {
path: path.join(__dirname, distDir),
filename: '[name].min.js',
chunkFilename: '[chunkhash].js'
},
resolve: {
extensions: ['', '.js']
},
module: {
loaders: [{
test: /\.js$/,
loader: 'babel',
query: {
presets: ['es2015']
}
}]
},
plugins: [commonsPlugin]
}
const uglifyConfig = {
mangle: false,
beautify: !isProduction,
compress: {
unused: false,
side_effects: false
},
sourceMap: false,
preserveComments: false,
report: 'gzip',
banner: isProduction ? '/*\n <%= pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n*/' : ''
}
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
bower: {
install: {
options: {
targetDir: vendorDir,
verbose: !isProduction,
layout: 'byComponent',
cleanTargetDir: true,
bowerOptions: {
production: isProduction
}
}
}
},
less: (() => {
let conf = {}
let ts = ['development', 'production']
ts.forEach((c) => {
conf[c] = {
options: {
compress: isProduction
},
files: (() => {
let files = {}
themes.forEach((theme) => {
files[`${cssDir}${theme}.min.css`] = `${lessDir}${theme}.less`
})
return files
})()
}
})
return conf
})(),
jshint: {
options: {
jshintrc: '.jshintrc',
verbose: true
},
files: jshintFiles
},
csslint: {
options: {
csslintrc: `${lessDir}.csslintrc`
},
dist: themes.map((theme) => `${cssDir}${theme}.min.css`)
},
cssmin: {
options: {
shorthandCompacting: false,
roundingPrecision: -1
},
target: {
files: (() => {
let conf = {}
compressStylesheets.map((s) => {
conf[`${s}.min.css`] = `${s}.css`
})
return conf
})()
}
},
uglify: {
options: uglifyConfig,
scripts: {
files: [{
expand: true,
cwd: babelDir,
src: uglifyFiles,
dest: distDir,
rename: uglifyRename
}]
},
bowerScripts: {
options: {
compress: true,
beautify: false
},
files: [{
expand: true,
cwd: vendorDir,
src: compressScripts,
dest: vendorDir,
rename: uglifyRename
}]
}
},
babel: {
options: {
sourceMap: false
},
babelify: {
files: [{
expand: true,
cwd: srcDir,
src: ['**/*.js', '!**/*.min.js'].concat(webpackScripts.map((s) => `!${s}.js`)),
dest: babelDir,
ext: '.js'
}]
}
},
clean: {
options: {
force: true
},
label: [`${babelDir}**/*`],
dist: [`${distDir}**/*`]
},
webpack: {
options: webpackConfig,
build: {
plugins: (() => {
let plugins = [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': process.env.NODE_ENV
}
}),
new webpack.optimize.DedupePlugin()
]
if (isProduction) {
plugins.push(new webpack.optimize.UglifyJsPlugin(uglifyConfig))
}
return plugins
})()
},
'build-dev': {
devtool: 'sourcemap',
debug: true
}
},
'webpack-dev-server': {
options: {
webpack: webpackConfig,
publicPath: '/' + webpackConfig.output.publicPath
},
start: {
keepAlive: true,
webpack: {
devtool: 'eval',
debug: true
}
}
},
copy: {
libs: {
files: [
{ expand: true, cwd: srcDir, src: ['libs/*.min.js'], dest: distDir }
]
}
},
watch: {
options: {
event: ['changed', 'added']
},
files: ['public/less/**/*.less', '<%= jshint.files %>'],
tasks: ['compress']
}
})
grunt.loadNpmTasks('grunt-contrib-cssmin')
grunt.loadNpmTasks('grunt-contrib-copy')
grunt.loadNpmTasks('grunt-contrib-jshint')
grunt.loadNpmTasks('grunt-contrib-watch')
grunt.loadNpmTasks('grunt-bower-task')
grunt.loadNpmTasks('grunt-contrib-less')
grunt.loadNpmTasks('grunt-contrib-uglify')
grunt.loadNpmTasks('grunt-contrib-csslint')
grunt.loadNpmTasks('grunt-contrib-clean')
grunt.loadNpmTasks('grunt-babel')
grunt.loadNpmTasks('grunt-webpack')
grunt.registerTask('lint', ['jshint', 'csslint'])
grunt.registerTask('compress:css', [`less:${nodeEnv}`, 'csslint'])
grunt.registerTask('compress:js', ['jshint', 'clean', 'babel:babelify', 'uglify:scripts', 'webpack:build', 'copy'])
grunt.registerTask('compress', ['compress:css', 'compress:js'])
grunt.registerTask('bowerComponents', ['bower:install', 'uglify:bowerScripts', 'cssmin'])
grunt.registerTask('default', ['watch'])
}

View File

@ -4,7 +4,9 @@ pm2-gui [![NPM version](https://badge.fury.io/js/pm2-gui.svg)](http://badge.fury
An elegant web & terminal interface for Unitech/PM2.
> Compatible with PM2 v0.12.7+
> If you wanna update to pm2-gui@latest, make sure you've read the [change logs](CHANGELOG.md).
> You can track lifecycle by [pm2-ant](https://github.com/Tjatse/pm2-ant)
![image](screenshots/pm2-gui.gif)
@ -21,8 +23,9 @@ An elegant web & terminal interface for Unitech/PM2.
![image](screenshots/design.jpg)
<a name="feats" />
<a name="feats"></a>
# Features
- Curses-like dashboard.
- Remoting monitor / web control.
- All the heartbeats (no matter **monitor** or **tail (logs)**) are automatic destroyed.
@ -37,13 +40,15 @@ An elegant web & terminal interface for Unitech/PM2.
- Supports [ANSI color codes](#ss_logs) by [ansi-html](https://github.com/Tjatse/ansi-html).
- High performance. In my case, there are near one hundred processes, but `pm2-gui` works without any suck.
<a name="cauts" />
<a name="cauts"></a>
# Cautions
- Web Interface is wrote by CSS3 && HTML5, so view it with the latest version of the browser (WebGL, Animation, WebSocket supports), e.g. Chrome, Safari and Firefox.
- I've never test it on Internet Explorer / Windows.
<a name="ins" />
<a name="ins"></a>
# Installation
```bash
$ npm install pm2-gui -g
$ pm2-gui <cmd> [options]
@ -58,8 +63,9 @@ $ npm install --production
$ ./pm2-gui <cmd> [options]
```
<a name="usage" />
<a name="usage"></a>
# Usage
Run the following command to get usage helps:
```bash
$ pm2-gui
@ -78,12 +84,14 @@ pm2GUI.startAgent([ini_config_file]);
pm2GUI.dashboard([ini_config_file]);
```
<a name="config" />
<a name="config"></a>
# Configuration
Edit the `pm2-gui/pm2-gui.ini` file or copy the [config example](./pm2-gui.ini) to `/etc/pm2-gui.ini` (starting with `pm2-gui start /etc/pm2-gui.ini`):
<a name="ui" />
<a name="ui"></a>
# UI/UX
- Amazing and smooth animations.
- High performance.
@ -115,10 +123,11 @@ Tail Logs
![image](screenshots/logs.jpg)
<a name="serv" />
<a name="serv"></a>
# Serving apps locally with nginx and custom domain
- [simple](examples/nginx/pm.example.com.conf)
- [advantage](examples/nginx/pm2.example.com.conf)
- [advanced](examples/nginx/pm2.example.com.conf)
## Test
```bash

View File

@ -1,7 +0,0 @@
# Sort by names
aeisenberg,Andrew Eisenberg,
AlexeyKhristov,Alexey Khristov,
bamoo456,GeorgeChen,
jbnicolai,Joshua Appelman,
PavelVanecek,Pavel Vaněček,
tjatse,Jun

View File

@ -1,78 +0,0 @@
{
"name": "pm2-gui",
"description": "An elegant web & terminal interface for Unitech/PM2.",
"main": "./pm2-gui.js",
"authors": [
"tjatse"
],
"license": "MIT",
"keywords": [
"monitor",
"dashboard",
"PM2",
"PM2",
"interface",
"PM2",
"web",
"PM2",
"ui",
"PM2",
"gui",
"PM2",
"dashboard",
"PM2",
"monitor"
],
"homepage": "https://github.com/Tjatse/pm2-gui",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"AdminLTE": "adminlte#^2.3.8",
"bootstrap": "^3.3.7",
"chart.js": "npm:chart.js#^2.2.1",
"colorbrewer": "^1.0.0",
"font-awesome": "^4.7.0",
"Ionicons": "ionicons#^2.0.1",
"lodash": "^4.17.2",
"moment": "^2.17.1",
"humanize-plus": "^1.8.2",
"jquery": "^1.12.4",
"fastclick": "^1.0.6",
"socket.io-client": "^1.7.1",
"animate.css": "^3.5.2",
"remarkable-bootstrap-notify": "^3.1.3",
"jquery-slimscroll": "^1.3.8",
"PACE": "pace#^1.0.2"
},
"exportsOverride": {
"animate.css": {
"/": "*.min.css"
},
"colorbrewer": {
"/": "colorbrewer.*"
},
"fastclick": {
"/": "lib/fastclick.js"
},
"jquery-slimscroll": {
"/": "*.min.js"
},
"moment": {
"/": "min/*.min.js"
},
"PACE": {
"/": "*.min.js",
"themes": "themes/"
},
"*": {
"/": "dist/",
"fonts": "fonts/",
"css": "css/"
}
}
}

View File

@ -61,7 +61,7 @@ Layout.prototype.render = function (monitor) {
namespace: conf.NSP[ns]
}, options), function (err, socket) {
if (err) {
return next(new Error('Fatal error leading to connect to ' + socket.nsp + ': ' + err))
return next(new Error('Fatal to connect to ' + socket.nsp + ' due to ' + err))
}
next(null, socket)
})
@ -100,18 +100,16 @@ Layout.prototype._observe = function () {
console.info('Listening socket events...')
// watch processes
this._socket(conf.NSP.PROCESS)
.on(conf.SOCKET_EVENTS.DATA_PROCESSES, function (data) {
if (data.processes) {
self._data.processes = {
data: data.processes,
tick: Date.now()
}
self._processesTable()
.on(conf.SOCKET_EVENTS.DATA_PROCESSES, function (procs) {
self._data.processes = {
data: procs,
tick: Date.now()
}
self._processesTable()
})
.emit(conf.SOCKET_EVENTS.PULL_PROCESSES)
.on(conf.SOCKET_EVENTS.DATA_USAGE, function (proc) {
if (!self._data.usages || proc.id !== self._data.usages.id || self._data.usages.time === proc.time) {
if (!self._data.usages || proc.pid !== self._data.usages.pid || self._data.usages.time === proc.time) {
return
}
self._data.usages.time = proc.time
@ -147,7 +145,7 @@ Layout.prototype._processesTable = function () {
// show first process informations.
this._describeInfo(0)
// bind `select` event on datatable.
this._eles.processes.rows.on('select', _.debounce(this._onProcessesTableSelect.bind(this), 500))
this._eles.processes.rows.on('select', this._onProcessesTableSelect.bind(this))
}
// cache last tick
this._data.processesLastTick = this._data.processes.tick
@ -260,7 +258,7 @@ Layout.prototype._cpuAndMemUsage = function (index) {
this._socket(conf.NSP.PROCESS).emit(conf.SOCKET_EVENTS.PULL_USAGE, pm2.pid)
}
this._data.processCount++
this._data.usages.id = pm2.pid
this._data.usages.pid = pm2.pid
this._eles.cpu.setData(this._data.usages.cpu, 0, 100)
this._eles.cpu.setLabel('CPU Usage (' + (this._data.usages.cpu[this._data.usages.cpu.length - 1]).toFixed(2) + '%)')
@ -280,10 +278,7 @@ Layout.prototype._displayLogs = function (index) {
return
}
this._stopLogging()
this._socket(conf.NSP.LOG).emit(conf.SOCKET_EVENTS.PULL_LOGS, {
id: pm2.pm_id,
ansi: true
})
this._socket(conf.NSP.LOG).emit(conf.SOCKET_EVENTS.PULL_LOGS, pm2.pm_id, true)
this._data.lastLogPMId = pm2.pm_id
}

View File

@ -1,28 +1,25 @@
'use strict'
var http = require('http')
var ms = require('ms')
var fs = require('fs')
var path = require('path')
var url = require('url')
var ms = require('ms')
var rc = require('rc')
var _ = require('lodash')
var chalk = require('chalk')
var ansiHTML = require('ansi-html')
var totalmem = require('os').totalmem()
var pidusage = require('pidusage')
var url = require('url')
var socketIOClient = require('socket.io-client')
var pkg = require('../package')
var pm = require('./pm')
var stat = require('./stat')
var conf = require('./util/conf')
var Log = require('./util/log')
var defConf
var ignoredErrorKeys = ['namespace', 'keepANSI']
var msKeys = ['refresh', 'process_refresh']
var allowedSysStatsKeys = ['cpus', 'arch', 'hostname', 'platform', 'release', 'uptime', 'memory']
var localhost = '0.0.0.0'
module.exports = Monitor
@ -36,6 +33,7 @@ function Monitor (options) {
if (!(this instanceof Monitor)) {
return new Monitor(options)
}
// Initialize...
this._init(options)
}
@ -85,7 +83,7 @@ Monitor.prototype.connect = function (options, fn) {
throw new Error('Port is required!')
}
var serverUri = Monitor.toConnectionString(options)
console.debug('Connecting to', serverUri)
console.info('Connecting to', serverUri)
fn = _.once(fn)
@ -126,7 +124,7 @@ Monitor.available = function (options) {
}
var wrapLocal = function () {
return {
value: (options.agent && options.agent.authorization ? options.agent.authorization + '@' : '') + localhost + ':' + options.port,
value: (options.agent && options.agent.authorization ? options.agent.authorization + '@' : '') + '127.0.0.1:' + options.port,
short: 'localhost'
}
}
@ -149,9 +147,9 @@ Monitor.available = function (options) {
maxShortLength = Math.max(maxShortLength, conn.short.length)
}
if (!options.notFormatName && q.choices.length > 1) {
if (q.choices.length > 1) {
q.choices.forEach(function (c) {
c.name = '[' + c.short + Array(maxShortLength - c.short.length + 1).join(_.isUndefined(options.blank) ? ' ' : options.blank) + '] '
c.name = '[' + c.short + Array(maxShortLength - c.short.length + 1).join(options.blank || ' ') + '] '
})
}
@ -164,7 +162,7 @@ Monitor.available = function (options) {
* @return {String}
*/
Monitor.toConnectionString = function (connection) {
var uri = (connection.protocol || 'http:') + '//' + (connection.hostname || localhost) + ':' + connection.port +
var uri = (connection.protocol || 'http:') + '//' + (connection.hostname || '127.0.0.1') + ':' + connection.port +
(connection.path || '') + (connection.namespace || '')
if (connection.authorization) {
@ -181,7 +179,7 @@ Monitor.toConnectionString = function (connection) {
Monitor.parseConnectionString = function (connectionString) {
var connection = {
port: 8088,
hostname: localhost,
hostname: '127.0.0.1',
authorization: ''
}
var lastAt = connectionString.lastIndexOf('@')
@ -306,6 +304,19 @@ Monitor.prototype._init = function (options) {
}
}
/**
* Emit error to clients.
* @param {Error} err
* @param {Object} options
* @return {N/A}
*/
Monitor.prototype._emitError = function (err, options) {
var data = _.extend({
error: options.keepANSI ? chalk.red(err.message) : '<span style="color: #ff0000">Error: ' + err.message + '</span>'
}, _.omit(options, ignoredErrorKeys))
this._broadcast(conf.SOCKET_EVENTS.ERROR, data, conf.NSP[options.namespace])
}
/**
* Connection event of `sys` namespace.
* @param {Socket} socket
@ -315,11 +326,10 @@ Monitor.prototype._connectSysSocket = function (socket) {
var self = this
self._cache.noClient = false
console.debug('Connected to ' + socket.nsp.name + '!')
console.info('Connected to ' + socket.nsp.name + '!')
socket.on(conf.SOCKET_EVENTS.DISCONNECT, disconnect)
socket.on(conf.SOCKET_EVENTS.PULL_ACTION, act)
socket.on(conf.SOCKET_EVENTS.PULL_VERSION, version)
socket.on(conf.SOCKET_EVENTS.PULL_ACTION, actions)
// pm2 version
self._pm2Ver(socket)
@ -336,78 +346,14 @@ Monitor.prototype._connectSysSocket = function (socket) {
self._cache.noClient = self._cache.sockio.of(conf.NSP.SYS).sockets.length === 0
}
function version () {
var that = this
var localVersion = pkg.version
var npm = rc('npm', {
registry: 'https://registry.npmjs.org/'
})
var remoteVersion = 'unknown'
var remote = _.trimEnd(npm.registry, '/') + '/' + pkg.name
console.debug('quering npm package version from', remote)
http.get(remote, function (res) {
var statusCode = res.statusCode
var contentType = res.headers['content-type']
let error
if (statusCode !== 200) {
remoteVersion = 'invalid response status'
error = 'Request Failed. Status Code: ' + statusCode
} else if (!/^application\/json/.test(contentType)) {
remoteVersion = 'invalid content type'
error = 'Invalid content-type. Expected application/json but received' + contentType
}
if (error) {
console.error(error)
res.resume()
finish()
return
}
res.setEncoding('utf8')
let rawData = ''
res.on('data', function (chunk) {
rawData += chunk
})
res.on('end', function () {
try {
let parsedData = JSON.parse(rawData)
var distTags = parsedData['dist-tags'];
if (distTags && distTags.latest) {
remoteVersion = distTags
}
} catch (e) {
remoteVersion = 'parse error'
console.error(e.message)
}
finish()
})
}).on('error', function (err) {
console.error(err.message)
remoteVersion = 'http error'
finish()
})
function finish () {
that.emit(conf.SOCKET_EVENTS.DATA_VERSION, {
local: localVersion,
remoteVersion: remoteVersion
})
}
}
function act (data) {
var action = data.action
var id = data.id
function actions (action, id) {
var prefix = '[pm2:' + id + ']'
console.debug(prefix, action, 'sending to pm2 daemon...')
if (self.options.readonly) {
console.warn(prefix, 'denied, readonly!!!')
return socket.emit(conf.SOCKET_EVENTS.DATA_ACTION, {
id: id,
error: 'Fatal error leading to execute the <' + action + '> operation: denied by server, it is readonly!'
error: 'Fatal to execute the <' + action + '> operation due to denied by server, it is readonly!'
})
}
pm.action({
@ -419,7 +365,7 @@ Monitor.prototype._connectSysSocket = function (socket) {
console.error(action, err.message)
return socket.emit(conf.SOCKET_EVENTS.DATA_ACTION, {
id: id,
error: 'Fatal error leading to execute the <' + action + '> operation: ' + err.message
error: 'Fatal to execute the <' + action + '> operation due to ' + err.message
})
}
console.debug(prefix, action, 'completed(' + (forceRefresh ? 'force refresh' : 'holding') + ')')
@ -439,17 +385,15 @@ Monitor.prototype._connectLogSocket = function (socket) {
socket.on(conf.SOCKET_EVENTS.DISCONNECT, self._closeLogSubscribers.bind(self))
socket.on(conf.SOCKET_EVENTS.PULL_LOGS_END, self._closeLogSubscribers.bind(self))
socket.on(conf.SOCKET_EVENTS.PULL_LOGS, subscribeLog)
console.debug('Connected to ' + socket.nsp.name + '!')
console.info('Connected to ' + socket.nsp.name + '!')
function subscribeLog (data) {
var pmId = data.id
var keepANSI = !!data.ansi
console.debug('[pm2:' + pmId + ']', 'subscribing...')
function subscribeLog (pmId, keepANSI) {
console.info('[pm2:' + pmId + ']', 'subscribing...')
socket._pm_id = pmId
socket._ansi = !!keepANSI
if (self._cache.logSubscribers[pmId]) {
console.warn('[pm2:' + pmId + ']', 'duplicated subscribing!!!')
console.warn('[pm2:' + pmId + ']', 'subscribed!!!')
return
}
self._cache.logSubscribers[pmId] = socket
@ -458,7 +402,7 @@ Monitor.prototype._connectLogSocket = function (socket) {
id: pmId,
text: '[' + (new Date()).toLocaleString() + '] waiting for logs...'
})
console.debug('[pm2:' + pmId + ']', 'subscribed!!!')
console.info('[pm2:' + pmId + ']', 'subscribed!!!')
}
}
@ -473,7 +417,7 @@ Monitor.prototype._connectProcessSocket = function (socket) {
socket.on(conf.SOCKET_EVENTS.DISCONNECT, stopMonitorUsage)
socket.on(conf.SOCKET_EVENTS.PULL_USAGE, monitorUsage)
socket.on(conf.SOCKET_EVENTS.PULL_PROCESSES, sendProcs)
console.debug('Connected to ' + socket.nsp.name + '!')
console.info('Connected to ' + socket.nsp.name + '!')
// send prefetch processes to client.
sendProcs()
@ -495,18 +439,20 @@ Monitor.prototype._connectProcessSocket = function (socket) {
function runTimer () {
pidusage.stat(pid, function (err, stat) {
var data = {
pid: pid,
time: Date.now()
}
if (err) {
clearInterval(self._cache.usages[pidStr])
delete self._cache.usages[pidStr]
console.error('[pid:' + pidStr + ']', err.message)
data.error = err.message
} else {
stat.memory = stat.memory * 100 / totalmem
data.usage = stat
return self._emitError(err, {
id: pid,
namespace: conf.NSP.PROCESS
})
}
stat.memory = stat.memory * 100 / totalmem
var data = {
pid: pid,
time: Date.now(),
usage: stat
}
self._broadcast.call(self, conf.SOCKET_EVENTS.DATA_USAGE, data, conf.NSP.PROCESS) // eslint-disable-line no-useless-call
})
@ -594,14 +540,14 @@ Monitor.prototype._systemStat = function (fn) {
*/
Monitor.prototype._observePM2 = function () {
var pm2Daemon = this.options.pm2Conf.DAEMON_PUB_PORT
console.debug('Connecting to pm2 daemon:', pm2Daemon)
console.info('Connecting to pm2 daemon:', pm2Daemon)
this._cache.pm2Subscriber = pm.sub({
socketPath: pm2Daemon,
context: this
}, function (data) {
this._cache.awake = true
console.info(chalk.magenta(data.event), '[pm2:' + data.process.pm_id + ']', data.process.name)
console.info(chalk.magenta(data.event), data.process.name + '-' + data.process.pm_id)
this._throttleRefresh()
})
// awake from log
@ -633,33 +579,33 @@ Monitor.prototype._refreshProcs = function () {
socketPath: this.options.pm2Conf.DAEMON_RPC_PORT,
context: this
}, function (err, procs) {
var data = {}
if (err) {
err = new Error('Fatal PM2 error: ' + (data.error = err.message))
} else {
// Wrap processes and cache them.
data.processes = procs.map(function (proc) {
proc.pm2_env = proc.pm2_env || {
USER: 'UNKNOWN'
}
var pm2Env = {
user: proc.pm2_env.USER
}
for (var key in proc.pm2_env) {
// Ignore useless fields.
if (/^(_|axm_)+/.test(key) || /versioning|command/i.test(key) || key.charCodeAt(0) <= 90) {
continue
}
pm2Env[key] = proc.pm2_env[key]
}
proc.pm2_env = pm2Env
return proc
err = new Error('Fatal to connect to pm2 daemon due to ' + err.message)
return this._emitError(err, {
namespace: conf.NSP.PROCESS
})
this._cache.processes = data.processes
}
// Wrap processes and cache them.
this._cache.processes = procs.map(function (proc) {
proc.pm2_env = proc.pm2_env || {
USER: 'UNKNOWN'
}
var pm2Env = {
user: proc.pm2_env.USER
}
for (var key in proc.pm2_env) {
// Ignore useless fields.
if (/^(_|axm_)+/.test(key) || /versioning|command/i.test(key) || key.charCodeAt(0) <= 90) {
continue
}
pm2Env[key] = proc.pm2_env[key]
}
proc.pm2_env = pm2Env
return proc
})
// Emit to client.
this._broadcast(conf.SOCKET_EVENTS.DATA_PROCESSES, data, conf.NSP.PROCESS)
this._broadcast(conf.SOCKET_EVENTS.DATA_PROCESSES, this._cache.processes, conf.NSP.PROCESS)
})
}
@ -669,7 +615,7 @@ Monitor.prototype._refreshProcs = function () {
*/
Monitor.prototype._pm2Ver = function (socket) {
var pm2RPC = this.options.pm2Conf.DAEMON_RPC_PORT
console.debug('pm2 semver')
console.info('Fetching pm2 version:', pm2RPC)
pm.version(pm2RPC, function (err, version) {
socket.emit(conf.SOCKET_EVENTS.DATA_PM2_VERSION, (err || !version) ? '0.0.0' : version, conf.NSP.SYS)
})
@ -729,7 +675,7 @@ Monitor.prototype._closeLogSubscribers = function (pmId) {
}
function unsubscribe (id) {
console.debug('[pm2:' + id + ']', 'unsubscribed!!!')
console.info('[pm2:' + id + ']', 'unsubscribed!!!')
delete self._cache.logSubscribers[id]
}
}
@ -755,32 +701,32 @@ Monitor.prototype._logSubscriberChanged = function () {
var pmId = d.process.pm_id
if (!self._cache.awake) {
self._cache.awake = true
console.info(chalk.magenta('awake:1st'), '[pm2:' + pmId + ']', d.process.name)
console.info(chalk.magenta('awake:1st'), d.process.name + '-' + pmId)
self._throttleRefresh()
if (_.keys(self._cache.logSubscribers).length === 0) {
self._cache.pm2SubscriberIsLogging = false
self._cache.pm2Subscriber.off('log:*')
console.debug('[pm2:log]', chalk.red('deactivate'), '\'cause no subscriber')
console.info('[pm2:log]', chalk.red('deactivate'), '\'cause no subscriber')
}
} else if ((sock = self._cache.logSubscribers[pmId])) {
var text = d.data
if (text) {
console.debug('[pm2:' + pmId + '] sent log')
console.info('[pm2:' + pmId + '] sent log')
text = text.replace(/[\r\n\t]+$/, '')
sock.emit(conf.SOCKET_EVENTS.DATA, {
id: pmId,
text: chalk.bold[e === 'err' ? 'red' : 'green']('[' + e + ']') + ' ' + (sock._ansi ? text : ansiHTML(text))
text: '[' + e + ']' + (sock._ansi ? text : ansiHTML(text))
})
}
}
})
console.debug('[pm2:log]', chalk.green('Activate'))
console.info('[pm2:log]', chalk.green('Activate'))
} else if (this._cache.pm2SubscriberIsLogging) {
this._cache.pm2SubscriberIsLogging = false
this._cache.pm2Subscriber.off('log:*')
console.debug('[pm2:log]', chalk.red('deactivate'))
console.info('[pm2:log]', chalk.red('deactivate'))
} else {
console.debug('[pm2:log]', 'deactivated')
console.warn('[pm2:log]', 'deactivated')
}
}
@ -796,7 +742,7 @@ Monitor.prototype._listeningSocketIO = function () {
this._cache.sockio._listening = true
for (var nsp in conf.NSP) {
var fnName = '_connect' + (nsp[0] + nsp.slice(1).toLowerCase()) + 'Socket'
console.debug('Listening connection event on', nsp.toLowerCase(), 'by func:' + fnName)
console.info('Listening connection event on', nsp.toLowerCase(), 'by func:' + fnName)
this._cache.sockio.of(conf.NSP[nsp]).on(conf.SOCKET_EVENTS.CONNECTION, this[fnName].bind(this))
}

View File

@ -30,18 +30,16 @@ exports.SOCKET_EVENTS = {
CONNECT_ERROR: 'connect_error',
DISCONNECT: 'disconnect',
DATA: 'data',
DATA_USAGE: 'data.usage',
DATA_ACTION: 'data.action',
DATA_USAGE: 'data.usage',
DATA_PROCESSES: 'data.processes',
DATA_SYSTEM_STATS: 'data.sysstat',
DATA_VERSION: 'data.version',
DATA_PM2_VERSION: 'data.pm2version',
PULL_LOGS: 'pull.log',
PULL_LOGS_END: 'pull.log_end',
PULL_USAGE: 'pull.usage',
PULL_ACTION: 'pull.action',
PULL_LOGS_END: 'pull.log_end',
PULL_PROCESSES: 'pull.processes',
PULL_VERSION: 'pull.version'
PULL_ACTION: 'pull.action'
}
/**

48
lib/util/router.js Normal file
View File

@ -0,0 +1,48 @@
'use strict'
var path = require('path')
var _ = require('lodash')
var fs = require('fs')
var regJs = /\.js$/
var regMain = /^(index|main|home)$/
var routes = []
var namespace = ''
// bind actions.
global.action = function (method, path, func) {
if (_.isFunction(method)) {
func = method
method = 'get'
path = func.name
} else if (_.isFunction(path)) {
func = path
path = func.name
}
if (!_.isString(method) || !_.isString(path) || !_.isFunction(func)) {
throw new Error('Arguments of action() should be one of `[FUNCTION]` / `[METHOD], [FUNCTION]` / `[METHOD], [PATH], [FUNCTION]`.')
}
routes.push({
method: method,
path: '/' + (regMain.test(namespace) ? '' : namespace) + (path ? '/' + path : ''),
fn: func
})
}
var cwd = path.resolve(__dirname, '../../', 'web/routes')
// initialize.
module.exports = function (server) {
fs.readdirSync(cwd)
.forEach(function (f) {
if (!f || !regJs.test(f)) {
return
}
namespace = path.basename(f, '.js')
require(path.resolve(cwd, f))
})
routes.forEach(function (route) {
route.path = route.path.replace(/\/+/g, '/')
server[route.method](route.path, route.fn)
})
}

View File

@ -4,11 +4,7 @@
"description": "An elegant web & terminal interface for Unitech/PM2.",
"main": "./pm2-gui.js",
"scripts": {
"start": "node --harmony index.js",
"test": "NODE_ENV=test bash test/index.sh",
"grunt": "./node_modules/.bin/grunt",
"compress": "npm run grunt compress",
"bower": "npm run grunt bowerComponents"
"test": "NODE_ENV=test bash test/index.sh"
},
"bin": {
"pm2-gui": "./pm2-gui"
@ -42,41 +38,24 @@
"ansi-html": "~0.0.6",
"async": "^1.5.2",
"blessed": "^0.1.81",
"body-parser": "^1.15.2",
"chalk": "^1.1.3",
"commander": "^2.9.0",
"compression": "^1.6.2",
"express": "^4.13.4",
"express-session": "^1.13.0",
"inquirer": "^1.0.3",
"jade": "^1.11.0",
"lodash": "^4.12.0",
"ms": "^0.7.2",
"pidusage": "^1.0.8",
"pm2-axon": "^2.0.11",
"pm2-axon-rpc": "^0.3.6",
"rc": "^1.1.6",
"socket.io": "^1.4.8",
"socket.io-client": "^1.4.8",
"windows-cpu": "^0.1.4"
},
"devDependencies": {
"babel-core": "^6.18.2",
"babel-preset-es2015": "^6.18.0",
"bower-npm-resolver": "^0.7.0",
"grunt": "^1.0.1",
"grunt-babel": "^6.0.0",
"grunt-bower-task": "^0.4.0",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-csslint": "^2.0.0",
"grunt-contrib-cssmin": "^1.0.2",
"grunt-contrib-jshint": "^1.1.0",
"grunt-contrib-less": "^1.4.0",
"grunt-contrib-uglify": "^2.0.0",
"grunt-contrib-watch": "^1.0.0",
"grunt-webpack": "^1.0.18",
"webpack": "^1.14.0",
"webpack-dev-server": "^1.16.2"
"babel-preset-es2015": "^6.18.0"
},
"standard": {
"ignore": [

View File

@ -46,7 +46,7 @@ function server (){
if [ 0 -eq $? ];
then
echo -e "$prefixINFO Starting..."
$node $SRC/libs/daemon "$@"
$node $SRC/lib/daemon "$@"
sleep 1;
fi
status;
@ -84,7 +84,7 @@ case "$1" in
server "$@";
;;
mon)
$node $SRC/libs/daemon "$@";
$node $SRC/lib/daemon "$@";
status;
;;
stop)

View File

@ -41,7 +41,7 @@ date = false
;
; Log level, one of debug, log, info, warn, error.
;
level = log
level = info
;
; Socket.io origins check, e.g.:
; origins = 'example.com:* http://example.com:* http://www.example.com:8088'
@ -52,7 +52,7 @@ level = log
;
; This authorization will be used to authorize socket / web connections if it's set.
;
authorization = passwd
;authorization = AuTh
;
; A value indicates whether agent offline or not.
;
@ -65,5 +65,4 @@ authorization = passwd
; pm2@171 = AuTh@https://192.168.1.171:9002/sockserv
; pm2@172 = 192.168.1.172:9001
; pm2@173 = 192.168.1.173:9000
;
pm2@128 = AuTh@192.168.100.138:8088
;

View File

@ -7,10 +7,10 @@ var _ = require('lodash')
var socketIO = require('socket.io')
var inquirer = require('inquirer')
var Monitor = require('./libs/monitor')
var Log = require('./libs/util/log')
var Layout = require('./libs/blessed-widget/layout')
var Monitor = require('./lib/monitor')
var Log = require('./lib/util/log')
var Web = require('./web/index')
var Layout = require('./lib/blessed-widget/layout')
var regLocal = /^(127\.0\.0\.1|0\.0\.0\.0|localhost)$/i
@ -65,7 +65,7 @@ function startWebServer (confFile) {
// express server
var server = Web({
middleware: function (req, res, next) {
res.locals.config = options
req._config = options
next()
},
port: options.port
@ -75,6 +75,7 @@ function startWebServer (confFile) {
origins: options.origins || '*:*'
})
monitor.run()
console.info('Web server is listening on 127.0.0.1:' + options.port)
}
/**

View File

@ -1,60 +1,27 @@
'use strict'
var express = require('express')
var session = require('express-session')
var path = require('path')
var http = require('http')
var express = require('express')
var compression = require('compression')
var session = require('express-session')
var bodyParser = require('body-parser')
var router = require('../lib/util/router')
var router = require('./router')
/**
* Start the express server
* @param {Object} options:
* {Function} middleware
* {Number} port
* @return {Express} server
*/
module.exports = function (options) {
var app = express()
// view engine
app.set('view engine', 'jade')
app.set('views', path.join(__dirname, 'templates/views'))
// session
app.use(express.static(path.join(__dirname, 'public')))
app.use(session({
secret: 'pm2@gui',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 7 * 24 * 3600000
}
saveUninitialized: true
}))
// body parser
app.use(bodyParser.urlencoded({
extended: true
}))
app.use(bodyParser.json())
// compression
app.use(compression())
// middlewares
if (options.middleware) {
app.use(options.middleware)
}
// routers
app.use('/', router)
// app.get('*', function (req, res) {
// res.render('errors/404', {
// title: '404'
// })
// })
// server
router(app)
var server = http.Server(app)
server.listen(options.port)
server.on('listening', function () {
let addr = server.address()
console.info('Express server started on port %s at %s', addr.port, addr.address || 'localhost')
})
return server
}

View File

@ -1,58 +0,0 @@
'use strict'
var _ = require('lodash')
var url = require('url')
var whitelist = [
/\/auth\/signin/i,
/\/auth\/signout/i
]
/**
* Middleware of express
* @param {Request} req
* @param {Resonse} res
* @param {Function} next
* @return {N/A}
*/
module.exports = function (req, res, next) {
var pathname = url.parse(req.url).pathname
var redirectTo = decodeURIComponent(req.url)
var conf = res.locals.config
var user
if (conf.agent && conf.agent.authorization) {
user = req.session && req.session.user
if (!user && !whitelist.some((d) => d.test(pathname || ''))) {
return res.redirect('/auth/signin?redirectTo=' + (redirectTo || ''))
}
} else {
user = {
nick: 'anony',
full: 'anonymous user',
anony: true,
activedAt: Date.now()
}
}
var locals = {
user: _.omit(user, 'passwd'),
title: '',
error: ''
}
var routePath = res.locals.path
var render = res.render
_.extend(res.locals, locals)
res.render = (templatePath, extraData) => {
if (_.isUndefined(templatePath) || _.isObject(templatePath)) {
extraData = templatePath ? _.clone(templatePath) : {}
templatePath = routePath
}
templatePath = _.trim(templatePath, '/') || 'index'
return render.call(res, templatePath, _.extend(locals, extraData || {}))
}
next()
}

2863
web/public/css/animation.min.css vendored Normal file

File diff suppressed because it is too large Load Diff

181
web/public/css/auth.css Normal file
View File

@ -0,0 +1,181 @@
/*****************
COMMON
******************/
html,
body {
background-color: #000;
font-family: Consolas, Menlo, Monaco, monospace;
letter-spacing: 0.5px;
height: 100%;
-webkit-text-size-adjust: none;
background: transparent url(/img/carbon.png) 0 0 repeat;
}
.load {
background: url(/img/ajax-loading.gif) no-repeat center center;
width: 20px;
height: 20px;
display: block;
}
/*****************
END OF COMMON
******************/
/*****************
LOGIN
******************/
.auth-form {
text-align: center;
width: 400px;
height: 200px;
position: absolute;
margin-top: -100px;
margin-left: -200px;
top: 50%;
left: 50%;
animation: bounceInDown 1s;
-moz-animation: bounceInDown 1s;
-o-animation: bounceInDown 1s;
-webkit-animation: bounceInDown 1s;
}
.auth-form > * {
outline: none;
position: absolute;
left: 50%;
border: 0;
}
.auth-form div {
top: 0;
width: 80px;
height: 32px;
margin-left: -40px;
font-size: 32px;
font-weight: bold;
color: #20D3EF;
position: absolute;
animation: shake 1s;
-moz-animation: shake 1s;
-o-animation: shake 1s;
-webkit-animation: shake 1s;
animation-delay: 1s;
-moz-animation-delay: 1s;
-o-animation-delay: 1s;
-webkit-animation-delay: 1s;
}
.auth-form input {
top: 50px;
margin-left: -150px;
padding: 0 10px;
width: 300px;
height: 38px;
line-height: 38px;
color: #f0f0f0;
text-shadow: 1px 1px 1px #000;
background: rgba(0, 0, 0, 0.16);
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 4px #000, 0 1px #444;
-moz-box-shadow: inset 0 1px 4px #000, 0 1px #444;
-o-box-shadow: inset 0 1px 4px #000, 0 1px #444;
box-shadow: inset 0 1px 4px #000, 0 1px #444;
}
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0px 1000px #ccc inset;
}
.auth-form a {
margin-left: -24px;
border-radius: 24px;
top: 104px;
text-decoration: none;
width: 56px;
height: 56px;
display: block;
background-color: #000;
border-radius: 29px;
box-shadow: 0px 1px 0px 0px rgba(250, 250, 250, 0.1), inset 0px 1px 2px rgba(0, 0, 0, 0.5);
}
.auth-form a:before,
.auth-form a:after {
display: block;
width: 48px;
height: 48px;
border-radius: 24px;
position: absolute;
left: 4px;
top: 4px;
}
.auth-form a:before {
content: '';
top: 2px;
box-shadow: 0px 3px 0px 0px rgba(0, 0, 0, .1), 0px 5px 10px 0px rgba(0, 0, 0, .9), inset 0px 1px 1px 0px rgba(250, 250, 250, .2), inset 0px -12px 35px 0px rgba(0, 0, 0, .5);
background-color: rgb(50, 50, 50);
}
.auth-form a:active:before,
.auth-form a.active:before {
box-shadow: 0px 3px 0px 0px rgba(0, 0, 0, .1), 0px 5px 10px 0px rgba(0, 0, 0, .9), inset 0px 1px 1px 0px rgba(250, 250, 250, .2), inset 0px -12px 35px 0px rgba(0, 0, 0, .9);
background-color: rgb(40, 40, 40);
top: 4px;
}
.auth-form a:after {
content: '\e127';
font-family: 'Glyphicons Halflings';
font-size: 20px;
line-height: 48px;
top: 2px;
color: #0d5202;
transition: color 500ms ease;
-o-transition: color 500ms ease;
-moz-transition: color 500ms ease;
-webkit-transition: color 500ms ease;
}
.auth-form a:hover:after {
color: #19af00;
}
.auth-form a:active:after,
.auth-form a.active:after {
color: #a4ff95;
top: 4px;
}
.auth-form > span {
display: block;
width: 8px;
height: 8px;
border-radius: 4px;
top: 64px;
left: 82%;
background-color: #ff0000;
box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 2px #fa9191;
transition: background-color 300ms, box-shadow 500ms;
-o-transition: background-color 300ms, box-shadow 500ms;
-moz-transition: background-color 300ms, box-shadow 500ms;
-webkit-transition: background-color 300ms, box-shadow 500ms;
}
.auth-form > span.active {
box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 2px #32b703;
background-color: #489825;
}
/*****************
END OF LOGIN
******************/

6710
web/public/css/bootstrap.min.css vendored Executable file

File diff suppressed because it is too large Load Diff

671
web/public/css/index.css Normal file
View File

@ -0,0 +1,671 @@
/*****************
COMMON
******************/
html,
body {
background-color: #000;
font-family: Consolas, Menlo, Monaco, monospace;
letter-spacing: 0.5px;
height: 100%;
-webkit-text-size-adjust: none;
}
.load {
background: url(/img/ajax-loading.gif) no-repeat center center;
width: 20px;
height: 20px;
display: block;
}
/*****************
END OF COMMON
******************/
/*****************
SPINNER
******************/
.spinner {
z-index: 9999;
text-align: center;
position: absolute;
top: 50%;
left: 50%;
margin-left: -50px;
margin-top: -20px;
width: 100px;
height: 40px;
}
@-webkit-keyframes stretchdelay {
0%,
40%,
100% {
-webkit-transform: scaleY(0.4)
}
20% {
-webkit-transform: scaleY(1.0)
}
}
@-moz-keyframes stretchdelay {
0%,
40%,
100% {
-webkit-transform: scaleY(0.4)
}
20% {
-webkit-transform: scaleY(1.0)
}
}
@-o-keyframes stretchdelay {
0%,
40%,
100% {
-webkit-transform: scaleY(0.4)
}
20% {
-webkit-transform: scaleY(1.0)
}
}
@keyframes stretchdelay {
0%,
40%,
100% {
transform: scaleY(0.4);
-moz-transform: scaleY(0.4);
-o-transform: scaleY(0.4);
-webkit-transform: scaleY(0.4);
}
20% {
transform: scaleY(1.0);
-moz-transform: scaleY(1.0);
-o-transform: scaleY(1.0);
-webkit-transform: scaleY(1.0);
}
}
.spinner > div {
background-color: #f0f0f0;
height: 100%;
display: inline-block;
width: 8px;
margin: auto 2px;
-webkit-animation: stretchdelay 1.1s infinite ease-in-out;
-moz-animation: stretchdelay 1.1s infinite ease-in-out;
-o-animation: stretchdelay 1.1s infinite ease-in-out;
animation: stretchdelay 1.1s infinite ease-in-out;
}
.spinner > div:nth-child(1) {
-webkit-animation-delay: 0s;
-moz-animation-delay: 0s;
-o-animation-delay: 0s;
animation-delay: 0s;
}
.spinner > div:nth-child(2) {
-webkit-animation-delay: 0.1s;
-moz-animation-delay: 0.1s;
-o-animation-delay: 0.1s;
animation-delay: 0.1s;
}
.spinner > div:nth-child(3) {
-webkit-animation-delay: 0.2s;
-moz-animation-delay: 0.2s;
-o-animation-delay: 0.2s;
animation-delay: 0.2s;
}
.spinner > div:nth-child(4) {
-webkit-animation-delay: 0.3s;
-moz-animation-delay: 0.3s;
-o-animation-delay: 0.3s;
animation-delay: 0.3s;
}
.spinner > div:nth-child(5) {
-webkit-animation-delay: 0.4s;
-moz-animation-delay: 0.4s;
-o-animation-delay: 0.4s;
animation-delay: 0.4s;
}
/*****************
END OF SPINNER
******************/
/*****************
MEM && CPU
******************/
.polar-usage {
margin: 0 auto;
position: relative;
}
.polar-usage text {
text-anchor: middle;
font-size: 10px;
fill: #fff;
}
.polar-usage .chooser {
position: absolute;
z-index: 99;
text-align: center;
vertical-align: middle;
}
.polar-usage .chooser button {
padding: 3px 6px 2px;
background: transparent;
border-color: transparent;
}
.polar-usage .chooser button:hover {
background-color: #3071a9;
border-color: #285e8e;
}
.polar-usage .chooser button .glyphicon {
top: 2px;
}
.polar-usage .chooser .dropdown-menu {
min-width: 100px;
background-color: #41497a;
opacity: 0.8;
}
.polar-usage .chooser.open .dropdown-menu:before {
left: 35px;
width: 14px;
right: auto;
position: absolute;
top: -7px;
display: inline-block;
border-right: 7px solid rgba(0, 0, 0, 0);
border-bottom: 7px solid #41497a;
border-left: 7px solid rgba(0, 0, 0, 0);
border-bottom-color: rgba(0, 0, 0, 0.2);
content: '';
}
.polar-usage .chooser.open .dropdown-menu:after {
width: 12px;
left: 36px;
right: auto;
position: absolute;
top: -6px;
display: inline-block;
border-right: 6px solid rgba(0, 0, 0, 0);
border-bottom: 6px solid #41497a;
border-left: 6px solid rgba(0, 0, 0, 0);
content: '';
}
.polar-usage .chooser .dropdown-menu li {
margin: 0 5px;
padding-left: 2px;
}
.polar-usage .chooser .dropdown-menu li > a {
padding-left: 0;
padding-right: 0;
color: #f0f0f0;
font-style: 12px;
font-weight: normal;
text-shadow: none;
}
.polar-usage .chooser .dropdown-menu li:hover > a {
color: #f6e800;
}
.polar-usage .chooser .dropdown-menu li.active > a {
color: #0bab24;
}
.polar-usage .chooser .dropdown-menu li:hover > a,
.polar-usage .chooser .dropdown-menu li.active > a {
background-color: transparent;
font-weight: bold;
}
.system-info {
width: 200px;
margin: 0 auto;
display: none;
}
.system-info dl * {
width: 95px;
height: 20px;
line-height: 20px;
display: inline-block;
margin: 0;
font-weight: normal;
}
.system-info dl dt {
padding-right: 5px;
text-align: right;
color: #fff;
}
.system-info dl dd {
text-align: left;
padding-left: 5px;
color: #ccc;
}
.procs-hint-container {
position: absolute;
bottom: -1px;
left: 50%;
margin-left: -50px;
width: 100px;
height: 50px;
background: #3b4163;
border-radius: 50px 50px 0 0;
box-shadow: 0 -2px 3px #272e44;
-moz-box-shadow: 0 -2px 3px #272e44;
-o-box-shadow: 0 -2px 3px #272e44;
}
.procs-hint-container div {
width: 100%;
line-height: 65px;
text-align: center;
font-size: 16px;
color: #8e99bb;
text-shadow: 1px 1px 1px #000;
}
.procs-hint-container div span {
color: #c1ccec;
}
/*****************
END OF MEM && CPU
******************/
/*****************
REPO && VER
******************/
.repo {
width: 100px;
text-align: center;
position: absolute;
left: 50%;
top: 3px;
margin-left: -50px;
}
.repo a {
display: block;
color: #666;
}
.repo a:hover {
color: #fff;
}
.repo span {
display: block;
color: #888;
font-size: 10px;
}
/*****************
END OF REPO && VER
******************/
/*****************
PROCESSES
******************/
.procs,
.slimScrollDiv {
width: 720px;
margin: 0 auto;
}
.procs .proc-div {
height: 1px;
margin: 5px auto;
width: 95%;
background: -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0, #3b4163), color-stop(0.3, rgb(255, 255, 255)), color-stop(0.9, #3b4163));
background: -moz-linear-gradient(left, #3b4163, rgb(255, 255, 255), #3b4163);
background: -o-linear-gradient(left, #3b4163, rgb(255, 255, 255), #3b4163);
filter: progid: DXImageTransform.Microsoft.gradient(startColorstr=#3b4163, endColorstr=#fff, GradientType=1);
}
.procs .proc {
height: 50px;
position: relative;
left: 20px;
right: 20px;
}
.procs .proc-stop .proc-info {
opacity: 0.8;
}
.procs .proc .proc-col {
display: table-cell;
}
.procs .proc .proc-status {
text-align: center;
width: 50px;
height: 50px;
}
.procs .proc .proc-status i {
font-size: 16px;
top: -18px;
color: #5fe210;
}
.procs .proc-empty .proc-status i {
color: #fddf68
}
.procs .proc-stop .proc-status i {
color: #e98080;
}
.procs .proc .proc-info {
width: 600px;
}
.proc-info ul,
.proc-info ul li {
list-style: none;
list-style-position: outside;
margin: 0;
padding: 0;
}
.proc-info > ul {
display: block;
height: 30px;
}
.proc-info > ul.proc-content {
height: 20px;
}
.proc-info ul.proc-title > li {
height: 30px;
line-height: 30px;
font-size: 16px;
color: #fff;
float: left;
}
.proc-info ul.proc-title li.proc-name {
color: #73cce5;
cursor: pointer;
margin: 0 4px 0 2px;
}
.proc-info ul.proc-title li.proc-alert {
color: #fff;
margin: 0 4px 0 2px;
}
.proc-info ul.proc-title li sup {
font-size: 10px;
color: #4b8698;
}
.proc-info ul.proc-title li.proc-ops {
width: 70px;
float: right;
text-align: right;
position: relative;
}
.proc-ops ul,
.proc-ops .load {
position: absolute;
right: 0;
top: 0;
}
.proc-ops ul li {
float: left;
padding: 0 2px;
}
.proc-ops ul li i {
font-size: 12px;
color: #fff;
cursor: pointer;
opacity: 0.7;
}
.proc-ops ul li i:hover {
opacity: 0.8;
}
.proc-ops ul li i:active {
opacity: 1;
}
.proc-info ul.proc-content {
height: 20px;
}
.proc-info ul.proc-content li {
color: #ccc;
height: 20px;
line-height: 20px;
font-size: 12px;
float: left;
text-align: left;
padding-left: 5px;
}
.proc-info ul.proc-content li.proc-file {
width: 300px;
padding-left: 0;
}
.proc-info ul.proc-content li.proc-mem {
color: #5cb85c;
width: 35px;
}
.proc-info ul.proc-content li.proc-restart {
color: #f0ad4e;
width: 30px;
}
.proc-info ul.proc-content li.proc-uptime {
color: #888;
float: right;
text-align: right;
width: 150px;
}
.proc-info ul.proc-content li.proc-mode {
width: 70px;
}
.proc-info ul.proc-content li.proc-mode span {
border-radius: 3px;
padding: 3px 5px;
}
.proc-info ul.proc-content li.proc-mode-fork span {
color: #fff;
background: #323332;
}
.proc-info ul.proc-content li.proc-mode-cluster span {
color: #fff;
background: #426dbe;
}
/*****************
END OF PROCESSES
******************/
/*****************
POPUP
******************/
.proc-popup {
color: #555;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-o-border-radius: 5px;
border-radius: 5px;
}
#popup {
height: 330px;
width: 100%;
position: relative;
}
#popup .load {
background-image: url(/img/ajax-loading-invert.gif);
position: absolute;
left: 50%;
top: 50%;
margin-left: -10px;
margin-top: -10px;
}
#popup pre {
background: transparent;
border: 0;
border-radius: 0;
}
#popup .nav {
padding-left: 10px;
}
#popup .nav > li > a {
padding: 5px 15px;
}
#popup .nav > li:hover > a {
border-bottom: solid 1px #fff;
}
#popup .nav-tabs > li {
margin-bottom: -2px;
margin-right: 5px;
}
#log {
padding: 5px;
}
#log span {
font-size: 12px;
}
#log > span {
padding: 2px;
display: block;
}
/*****************
END OF POPUP
******************/
/*****************
GRAPH
******************/
.graph svg {
font-size: 10px;
margin: 20px auto 0 20px;
}
.graph .line {
fill: none;
stroke-width: 2px;
}
.graph .axis path,
.graph .axis line {
fill: none;
stroke: #999999;
shape-rendering: crispEdges;
}
.graph .axis text {
fill: #999999
}
.graph ul,
.graph ul li {
list-style: none;
padding: 0;
margin: 0;
}
.graph ul {
position: absolute;
right: 10px;
top: 10px;
}
.graph ul li {
height: 18px;
line-height: 18px;
list-style-type: square;
font-size: 10px;
font-weight: normal;
}
.graph ul li span {
width: 10px;
height: 5px;
display: block;
}
.graph span {
padding-top: 100px;
display: block;
text-align: center;
}
/*****************
END OF GRAPH
******************/
#procs_action {
position: absolute;
left: 50%;
margin-left: -140px;
bottom: -145px;
display: none;
}

105
web/public/css/jquery.avgrund.min.css vendored Normal file
View File

@ -0,0 +1,105 @@
.avgrund-popin {
position: absolute;
background: #fff;
padding: 10px;
overflow: hidden;
visibility: hidden;
opacity: 0;
filter: alpha(opacity=0);
top: 50%;
left: 50%;
z-index: 1000;
box-shadow: 0 1px 10px 0 rgba(0, 0, 0, .5);
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-ms-transform: scale(0.8);
-o-transform: scale(0.8);
transform: scale(0.8)
}
.avgrund-overlay {
background: #000;
width: 100%;
position: relative;
top: -1500px;
left: 0;
z-index: 101;
visibility: hidden;
opacity: 0;
filter: alpha(opacity=0)
}
body.avgrund-ready, .avgrund-ready .avgrund-popin, .avgrund-ready .avgrund-overlay {
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webkit-transition: 0.3s all ease-out;
-moz-transition: 0.3s all ease-out;
-ms-transition: 0.3s all ease-out;
-o-transition: 0.3s all ease-out;
transition: 0.3s all ease-out
}
body.avgrund-active {
-webkit-transform: scale(0.9);
-moz-transform: scale(0.9);
-ms-transform: scale(0.9);
-o-transform: scale(0.9);
transform: scale(0.9);
overflow: hidden
}
.avgrund-active .avgrund-popin {
visibility: visible;
opacity: 1;
filter: alpha(opacity=100);
-webkit-transform: scale(1.1);
-moz-transform: scale(1.1);
-ms-transform: scale(1.1);
-o-transform: scale(1.1);
transform: scale(1.1)
}
.avgrund-active .avgrund-overlay {
visibility: visible;
opacity: .5;
filter: alpha(opacity=50);
height: 20000px
}
.avgrund-popin.stack {
-webkit-transform: scale(1.5);
-moz-transform: scale(1.5);
-ms-transform: scale(1.5);
-o-transform: scale(1.5);
transform: scale(1.5)
}
.avgrund-active .avgrund-popin.stack {
-webkit-transform: scale(1.1);
-moz-transform: scale(1.1);
-ms-transform: scale(1.1);
-o-transform: scale(1.1);
transform: scale(1.1)
}
.avgrund-active .avgrund-blur {
-webkit-filter: blur(1px);
-moz-filter: blur(1px);
-ms-filter: blur(1px);
-o-filter: blur(1px);
filter: blur(1px)
}
.avgrund-close {
display: block;
color: #555;
font-size: 13px;
text-decoration: none;
text-transform: uppercase;
position: absolute;
top: 6px;
right: 10px
}

View File

@ -0,0 +1,199 @@
/**
* fullPage 2.4.3
* https://github.com/alvarotrigo/fullPage.js
* MIT licensed
*
* Copyright (C) 2013 alvarotrigo.com - A project by Alvaro Trigo
*/
html, body {
margin: 0;
padding: 0;
overflow: hidden;
/*Avoid flicker on slides transitions for mobile phones #336 */
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
#superContainer {
height: 100%;
position: relative;
/* Touch detection for Windows 8 */
-ms-touch-action: none;
/* IE 11 on Windows Phone 8.1*/
touch-action: none;
}
.fp-section {
position: relative;
-webkit-box-sizing: border-box; /* Safari<=5 Android<=3 */
-moz-box-sizing: border-box; /* <=28 */
box-sizing: border-box;
}
.fp-slide {
float: left;
}
.fp-slide, .fp-slidesContainer {
height: 100%;
display: block;
}
.fp-slides {
z-index: 1;
height: 100%;
overflow: hidden;
position: relative;
-webkit-transition: all 0.3s ease-out; /* Safari<=6 Android<=4.3 */
transition: all 0.3s ease-out;
}
.fp-section.fp-table, .fp-slide.fp-table {
display: table;
width: 100%;
}
.fp-tableCell {
display: table-cell;
vertical-align: middle;
width: 100%;
height: 100%;
}
.fp-slidesContainer {
float: left;
position: relative;
}
.fp-controlArrow {
position: absolute;
z-index: 4;
top: 50%;
cursor: pointer;
width: 0;
height: 0;
border-style: solid;
margin-top: -38px;
}
.fp-controlArrow.fp-prev {
left: 15px;
width: 0;
border-width: 38.5px 34px 38.5px 0;
border-color: transparent #fff transparent transparent;
}
.fp-controlArrow.fp-next {
right: 15px;
border-width: 38.5px 0 38.5px 34px;
border-color: transparent transparent transparent #fff;
}
.fp-scrollable {
overflow: scroll;
}
.fp-notransition {
-webkit-transition: none !important;
transition: none !important;
}
#fp-nav {
position: fixed;
z-index: 100;
margin-top: -32px;
top: 50%;
opacity: 1;
}
#fp-nav.right {
right: 17px;
}
#fp-nav.left {
left: 17px;
}
.fp-slidesNav {
position: absolute;
z-index: 4;
left: 50%;
opacity: 1;
}
.fp-slidesNav.bottom {
bottom: 17px;
}
.fp-slidesNav.top {
top: 17px;
}
#fp-nav ul,
.fp-slidesNav ul {
margin: 0;
padding: 0;
}
#fp-nav li,
.fp-slidesNav li {
display: block;
width: 14px;
height: 13px;
margin: 7px;
position: relative;
}
.fp-slidesNav li {
display: inline-block;
}
#fp-nav li a,
.fp-slidesNav li a {
display: block;
position: relative;
z-index: 1;
width: 100%;
height: 100%;
cursor: pointer;
text-decoration: none;
}
#fp-nav li .active span,
.fp-slidesNav .active span {
background: #fff;
}
#fp-nav span,
.fp-slidesNav span {
top: 2px;
left: 2px;
width: 8px;
height: 8px;
border: 1px solid #eee;
background: rgba(0, 0, 0, 0);
border-radius: 50%;
position: absolute;
z-index: 1;
}
.fp-tooltip {
position: absolute;
top: -2px;
color: #fff;
font-size: 14px;
font-family: arial, helvetica, sans-serif;
white-space: nowrap;
max-width: 220px;
}
.fp-tooltip.right {
right: 20px;
}
.fp-tooltip.left {
left: 20px;
}

86
web/public/css/jquery.sticky.min.css vendored Normal file
View File

@ -0,0 +1,86 @@
/**
* jquery.sticky 0.0.1
* https://github.com/Tjatse/sticky
*
* Apache, License 2.0
* Copyright (C) 2014 Tjatse
*/
.sticky-holder {
position: fixed;
z-index: 99999;
font-family: Verdana, Helvetica, STHeiti, 'sans-serif'
}
.sticky {
box-shadow: 1px 1px 2px #000, -1px -1px 1px #444, inset -1px -1px 2px #fff, inset 1px 1px 2px #fff;
-moz-box-shadow: 1px 1px 2px #000, -1px -1px 1px #444, inset -1px -1px 2px #fff, inset 1px 1px 2px #fff;
-webkit-box-shadow: 1px 1px 2px #000, -1px -1px 1px #444, inset -1px -1px 2px #fff, inset 1px 1px 2px #fff;
-o-box-shadow: 1px 1px 2px #000, -1px -1px 1px #444, inset -1px -1px 2px #fff, inset 1px 1px 2px #fff;
background: #fafafa;
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
-o-border-radius: 4px;
position: absolute;
border: solid 1px #000;
background-image: -moz-linear-gradient(top, #fff, #eee);
background-image: -o-linear-gradient(top, #fff, #eee);
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(1, #eee));
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff', endColorstr='#eee', GradientType=0);
animation-duration: 500ms;
animation-delay: 0s;
animation-iteration-count: 1;
-moz-animation-duration: 500ms;
-moz-animation-delay: 0s;
-moz-animation-iteration-count: 1;
-webkit-animation-duration: 500ms;
-webkit-animation-delay: 0s;
-webkit-animation-iteration-count: 1;
-o-animation-duration: 500ms;
-o-animation-delay: 0s;
-o-animation-iteration-count: 1
}
.sticky div.sticky-title {
font-weight: bold;
font-size: 14px;
margin: 0 10px 0 10px;
padding: 5px 10px 8px 0;
border-bottom: solid 1px #eee
}
.sticky p.sticky-body {
font-size: 14px;
line-height: 22px;
color: #555;
padding: 10px;
margin: 0;
clear: both;
float: none
}
.sticky img.sticky-icon {
float: left;
margin: 5px 5px 5px 0;
max-width: 32px;
max-height: 32px
}
.sticky > span {
font-size: 18px;
font-weight: bold;
position: absolute;
right: 5px;
top: 5px;
width: 20px;
height: 20px;
line-height: 20px;
display: block;
text-align: center;
cursor: pointer;
color: #ccc
}
.sticky > span:hover {
color: #000
}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,229 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
<font-face units-per-em="1200" ascent="960" descent="-240" />
<missing-glyph horiz-adv-x="500" />
<glyph />
<glyph />
<glyph unicode="&#xd;" />
<glyph unicode=" " />
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#x2000;" horiz-adv-x="652" />
<glyph unicode="&#x2001;" horiz-adv-x="1304" />
<glyph unicode="&#x2002;" horiz-adv-x="652" />
<glyph unicode="&#x2003;" horiz-adv-x="1304" />
<glyph unicode="&#x2004;" horiz-adv-x="434" />
<glyph unicode="&#x2005;" horiz-adv-x="326" />
<glyph unicode="&#x2006;" horiz-adv-x="217" />
<glyph unicode="&#x2007;" horiz-adv-x="217" />
<glyph unicode="&#x2008;" horiz-adv-x="163" />
<glyph unicode="&#x2009;" horiz-adv-x="260" />
<glyph unicode="&#x200a;" horiz-adv-x="72" />
<glyph unicode="&#x202f;" horiz-adv-x="260" />
<glyph unicode="&#x205f;" horiz-adv-x="326" />
<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

BIN
web/public/img/carbon.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 117 B

BIN
web/public/img/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

BIN
web/public/img/info.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

BIN
web/public/img/restart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
web/public/img/save.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
web/public/img/stop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

133
web/public/js/auth.html.js Normal file
View File

@ -0,0 +1,133 @@
var btn, pwd, light, timer;
$(window).ready(function () {
light = $('span');
pwd = $('input:password');
pwd.focus();
// Login.
pwd.keyup(function (e) {
if (e.keyCode == 13) {
login();
}
});
btn = $('a').click(login);
drawLogo();
});
// Login event.
function login() {
// Called one time.
if (btn.hasClass('active')) {
return;
}
var val = pwd.val().trim();
if (!val) {
pwd.focus();
return;
}
// Post data to server.
lightUp();
$.ajax({
url: 'auth_api?t=' + Math.random(),
data: {
authorization: val
},
dataType: 'json',
error: function () {
info('Can not get response from server, it is an internal error.');
lightOff();
},
success: function (res) {
lightOff();
if (res.error) {
return info(res.error);
} else {
window.location.href = '/';
}
}
});
};
// Beginning of AJAX.
function lightUp() {
lightOff();
btn.addClass('active');
timer = setInterval(function () {
light.toggleClass('active');
}, 500);
}
// Ending of AJAX.
function lightOff() {
if (timer) {
clearInterval(timer);
timer = null;
}
$('.active').removeClass('active');
}
// Show tips.
function info(msg) {
$.sticky({
body: msg,
icon: './img/info.png',
useAnimateCss: true
});
}
function drawLogo() {
var w = 80,
h = 32;
var svg = d3.select('#logo')
.append('svg')
.attr('width', w)
.attr('height', h);
var filter = svg.append('defs')
.append('filter')
.attr('id', 'dropshadow')
filter.append('feGaussianBlur')
.attr('in', 'SourceAlpha')
.attr('stdDeviation', 1)
.attr('result', 'blur');
filter.append('feOffset')
.attr('in', 'blur')
.attr('dx', 4)
.attr('dy', 4)
.attr('result', 'offsetBlur')
filter.append('feFlood')
.attr('in', 'offsetBlur')
.attr('flood-color', '#0a6506')
.attr('flood-opacity', '0.9')
.attr('result', 'offsetColor');
filter.append('feComposite')
.attr('in', 'offsetColor')
.attr('in2', 'offsetBlur')
.attr('operator', 'in')
.attr('result', 'offsetBlur');
var feMerge = filter.append('feMerge');
feMerge.append('feMergeNode')
.attr('in', 'offsetBlur')
feMerge.append('feMergeNode')
.attr('in', 'SourceGraphic');
var vis = svg
.append('g')
.attr('width', w)
.attr('height', h);
vis.append('path')
.style('fill', 'none')
.style('stroke', '#fff')
.style('stroke-width', 2)
.attr('d', 'M24,12 T16,8 T4,16 T16,28 T24,20 T18,20 T28,18 T30,16 T44,24 T48,16 T58,8 L58,28 T62,16 T68,16 T72,16 T76,16')
.attr('filter', 'url(#dropshadow)');
}

27
web/public/js/bootstrap.min.js vendored Executable file
View File

@ -0,0 +1,27 @@
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),s=i.data("bs.alert");s||i.data("bs.alert",s=new o(this)),"string"==typeof e&&s[e].call(i)})}
var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.3.0",o.TRANSITION_DURATION=150,o.prototype.close=function(e){function i(){r.detach().trigger("closed.bs.alert").remove()}
var s=t(this),n=s.attr("data-target");n||(n=s.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,""));var r=t(n);e&&e.preventDefault(),r.length||(r=s.closest(".alert")),r.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(r.removeClass("in"),t.support.transition&&r.hasClass("fade")?r.one("bsTransitionEnd",i).emulateTransitionEnd(o.TRANSITION_DURATION):i())};var s=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=s,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.button"),n="object"==typeof e&&e;s||o.data("bs.button",s=new i(this,n)),"toggle"==e?s.toggle():e&&s.setState(e)})}
var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.isLoading=!1};i.VERSION="3.3.0",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",o=this.$element,s=o.is("input")?"val":"html",n=o.data();e+="Text",null==n.resetText&&o.data("resetText",o[s]()),setTimeout(t.proxy(function(){o[s](null==n[e]?this.options[e]:n[e]),"loadingText"==e?(this.isLoading=!0,o.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,o.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")&&(i.prop("checked")&&this.$element.hasClass("active")?t=!1:e.find(".active").removeClass("active")),t&&i.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));t&&this.$element.toggleClass("active")};var o=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=o,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var o=t(i.target);o.hasClass("btn")||(o=o.closest(".btn")),e.call(o,"toggle"),i.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){t(e.target).closest(".btn").toggleClass("focus","focus"==e.type)})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.carousel"),n=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e),r="string"==typeof e?e:n.slide;s||o.data("bs.carousel",s=new i(this,n)),"number"==typeof e?s.to(e):r?s[r]():n.interval&&s.pause().cycle()})}
var i=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",t.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.3.0",i.TRANSITION_DURATION=600,i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},i.prototype.keydown=function(t){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}
t.preventDefault()},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.getItemForDirection=function(t,e){var i="prev"==t?-1:1,o=this.getItemIndex(e),s=(o+i)%this.$items.length;return this.$items.eq(s)},i.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));return t>this.$items.length-1||0>t?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",this.$items.eq(t))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){return this.sliding?void 0:this.slide("next")},i.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},i.prototype.slide=function(e,o){var s=this.$element.find(".item.active"),n=o||this.getItemForDirection(e,s),r=this.interval,a="next"==e?"left":"right",l="next"==e?"first":"last",h=this;if(!n.length){if(!this.options.wrap)return;n=this.$element.find(".item")[l]()}
if(n.hasClass("active"))return this.sliding=!1;var d=n[0],p=t.Event("slide.bs.carousel",{relatedTarget:d,direction:a});if(this.$element.trigger(p),!p.isDefaultPrevented()){if(this.sliding=!0,r&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var c=t(this.$indicators.children()[this.getItemIndex(n)]);c&&c.addClass("active")}
var f=t.Event("slid.bs.carousel",{relatedTarget:d,direction:a});return t.support.transition&&this.$element.hasClass("slide")?(n.addClass(e),n[0].offsetWidth,s.addClass(a),n.addClass(a),s.one("bsTransitionEnd",function(){n.removeClass([e,a].join(" ")).addClass("active"),s.removeClass(["active",a].join(" ")),h.sliding=!1,setTimeout(function(){h.$element.trigger(f)},0)}).emulateTransitionEnd(i.TRANSITION_DURATION)):(s.removeClass("active"),n.addClass("active"),this.sliding=!1,this.$element.trigger(f)),r&&this.cycle(),this}};var o=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=o,this};var s=function(i){var o,s=t(this),n=t(s.attr("data-target")||(o=s.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""));if(n.hasClass("carousel")){var r=t.extend({},n.data(),s.data()),a=s.attr("data-slide-to");a&&(r.interval=!1),e.call(n,r),a&&n.data("bs.carousel").to(a),i.preventDefault()}};t(document).on("click.bs.carousel.data-api","[data-slide]",s).on("click.bs.carousel.data-api","[data-slide-to]",s),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),+function(t){"use strict";function e(e){e&&3===e.which||(t(s).remove(),t(n).each(function(){var o=t(this),s=i(o),n={relatedTarget:this};s.hasClass("open")&&(s.trigger(e=t.Event("hide.bs.dropdown",n)),e.isDefaultPrevented()||(o.attr("aria-expanded","false"),s.removeClass("open").trigger("hidden.bs.dropdown",n)))}))}
function i(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}
function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new r(this)),"string"==typeof e&&o[e].call(i)})}
var s=".dropdown-backdrop",n='[data-toggle="dropdown"]',r=function(e){t(e).on("click.bs.dropdown",this.toggle)};r.VERSION="3.3.0",r.prototype.toggle=function(o){var s=t(this);if(!s.is(".disabled, :disabled")){var n=i(s),r=n.hasClass("open");if(e(),!r){"ontouchstart"in document.documentElement&&!n.closest(".navbar-nav").length&&t('<div class="dropdown-backdrop"/>').insertAfter(t(this)).on("click",e);var a={relatedTarget:this};if(n.trigger(o=t.Event("show.bs.dropdown",a)),o.isDefaultPrevented())return;s.trigger("focus").attr("aria-expanded","true"),n.toggleClass("open").trigger("shown.bs.dropdown",a)}
return!1}},r.prototype.keydown=function(e){if(/(38|40|27|32)/.test(e.which)){var o=t(this);if(e.preventDefault(),e.stopPropagation(),!o.is(".disabled, :disabled")){var s=i(o),r=s.hasClass("open");if(!r&&27!=e.which||r&&27==e.which)return 27==e.which&&s.find(n).trigger("focus"),o.trigger("click");var a=" li:not(.divider):visible a",l=s.find('[role="menu"]'+a+', [role="listbox"]'+a);if(l.length){var h=l.index(e.target);38==e.which&&h>0&&h--,40==e.which&&h<l.length-1&&h++,~h||(h=0),l.eq(h).trigger("focus")}}}};var a=t.fn.dropdown;t.fn.dropdown=o,t.fn.dropdown.Constructor=r,t.fn.dropdown.noConflict=function(){return t.fn.dropdown=a,this},t(document).on("click.bs.dropdown.data-api",e).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",n,r.prototype.toggle).on("keydown.bs.dropdown.data-api",n,r.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',r.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',r.prototype.keydown)}(jQuery),+function(t){"use strict";function e(e,o){return this.each(function(){var s=t(this),n=s.data("bs.modal"),r=t.extend({},i.DEFAULTS,s.data(),"object"==typeof e&&e);n||s.data("bs.modal",n=new i(this,r)),"string"==typeof e?n[e](o):r.show&&n.show(o)})}
var i=function(e,i){this.options=i,this.$body=t(document.body),this.$element=t(e),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};i.VERSION="3.3.0",i.TRANSITION_DURATION=300,i.BACKDROP_TRANSITION_DURATION=150,i.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},i.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},i.prototype.show=function(e){var o=this,s=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(s),this.isShown||s.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.backdrop(function(){var s=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),s&&o.$element[0].offsetWidth,o.$element.addClass("in").attr("aria-hidden",!1),o.enforceFocus();var n=t.Event("shown.bs.modal",{relatedTarget:e});s?o.$element.find(".modal-dialog").one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(n)}).emulateTransitionEnd(i.TRANSITION_DURATION):o.$element.trigger("focus").trigger(n)}))},i.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(i.TRANSITION_DURATION):this.hideModal())},i.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},i.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},i.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},i.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},i.prototype.backdrop=function(e){var o=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var n=t.support.transition&&s;if(this.$backdrop=t('<div class="modal-backdrop '+s+'" />').prependTo(this.$element).on("click.dismiss.bs.modal",t.proxy(function(t){t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),n&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;n?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var r=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",r).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):r()}else e&&e()},i.prototype.checkScrollbar=function(){this.scrollbarWidth=this.measureScrollbar()},i.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",t+this.scrollbarWidth)},i.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},i.prototype.measureScrollbar=function(){if(document.body.clientWidth>=window.innerWidth)return 0;var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var o=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=i,t.fn.modal.noConflict=function(){return t.fn.modal=o,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(i){var o=t(this),s=o.attr("href"),n=t(o.attr("data-target")||s&&s.replace(/.*(?=#[^\s]+$)/,"")),r=n.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(s)&&s},n.data(),o.data());o.is("a")&&i.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){o.is(":visible")&&o.trigger("focus")})}),e.call(n,r,this)})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.tooltip"),n="object"==typeof e&&e,r=n&&n.selector;(s||"destroy"!=e)&&(r?(s||o.data("bs.tooltip",s={}),s[r]||(s[r]=new i(this,n))):s||o.data("bs.tooltip",s=new i(this,n)),"string"==typeof e&&s[e]())})}
var i=function(t,e){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",t,e)};i.VERSION="3.3.0",i.TRANSITION_DURATION=150,i.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,o){this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(o),this.$viewport=this.options.viewport&&t(this.options.viewport.selector||this.options.viewport);for(var s=this.options.trigger.split(" "),n=s.length;n--;){var r=s[n];if("click"==r)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=r){var a="hover"==r?"mouseenter":"focusin",l="hover"==r?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}
this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,o){i[t]!=o&&(e[t]=o)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i&&i.$tip&&i.$tip.is(":visible")?void(i.hoverState="in"):(i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide()},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var s=this,n=this.tip(),r=this.getUID(this.type);this.setContent(),n.attr("id",r),this.$element.attr("aria-describedby",r),this.options.animation&&n.addClass("fade");var a="function"==typeof this.options.placement?this.options.placement.call(this,n[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,h=l.test(a);h&&(a=a.replace(l,"")||"top"),n.detach().css({top:0,left:0,display:"block"}).addClass(a).data("bs."+this.type,this),this.options.container?n.appendTo(this.options.container):n.insertAfter(this.$element);var d=this.getPosition(),p=n[0].offsetWidth,c=n[0].offsetHeight;if(h){var f=a,u=this.options.container?t(this.options.container):this.$element.parent(),g=this.getPosition(u);a="bottom"==a&&d.bottom+c>g.bottom?"top":"top"==a&&d.top-c<g.top?"bottom":"right"==a&&d.right+p>g.width?"left":"left"==a&&d.left-p<g.left?"right":a,n.removeClass(f).addClass(a)}
var v=this.getCalculatedOffset(a,d,p,c);this.applyPlacement(v,a);var m=function(){var t=s.hoverState;s.$element.trigger("shown.bs."+s.type),s.hoverState=null,"out"==t&&s.leave(s)};t.support.transition&&this.$tip.hasClass("fade")?n.one("bsTransitionEnd",m).emulateTransitionEnd(i.TRANSITION_DURATION):m()}},i.prototype.applyPlacement=function(e,i){var o=this.tip(),s=o[0].offsetWidth,n=o[0].offsetHeight,r=parseInt(o.css("margin-top"),10),a=parseInt(o.css("margin-left"),10);isNaN(r)&&(r=0),isNaN(a)&&(a=0),e.top=e.top+r,e.left=e.left+a,t.offset.setOffset(o[0],t.extend({using:function(t){o.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),o.addClass("in");var l=o[0].offsetWidth,h=o[0].offsetHeight;"top"==i&&h!=n&&(e.top=e.top+n-h);var d=this.getViewportAdjustedDelta(i,e,l,h);d.left?e.left+=d.left:e.top+=d.top;var p=/top|bottom/.test(i),c=p?2*d.left-s+l:2*d.top-n+h,f=p?"offsetWidth":"offsetHeight";o.offset(e),this.replaceArrow(c,o[0][f],p)},i.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?"left":"top",50*(1-t/e)+"%").css(i?"top":"left","")},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},i.prototype.hide=function(e){function o(){"in"!=s.hoverState&&n.detach(),s.$element.removeAttr("aria-describedby").trigger("hidden.bs."+s.type),e&&e()}
var s=this,n=this.tip(),r=t.Event("hide.bs."+this.type);return this.$element.trigger(r),r.isDefaultPrevented()?void 0:(n.removeClass("in"),t.support.transition&&this.$tip.hasClass("fade")?n.one("bsTransitionEnd",o).emulateTransitionEnd(i.TRANSITION_DURATION):o(),this.hoverState=null,this)},i.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},i.prototype.hasContent=function(){return this.getTitle()},i.prototype.getPosition=function(e){e=e||this.$element;var i=e[0],o="BODY"==i.tagName,s=i.getBoundingClientRect();null==s.width&&(s=t.extend({},s,{width:s.right-s.left,height:s.bottom-s.top}));var n=o?{top:0,left:0}:e.offset(),r={scroll:o?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop()},a=o?{width:t(window).width(),height:t(window).height()}:null;return t.extend({},s,r,a,n)},i.prototype.getCalculatedOffset=function(t,e,i,o){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:"top"==t?{top:e.top-o,left:e.left+e.width/2-i/2}:"left"==t?{top:e.top+e.height/2-o/2,left:e.left-i}:{top:e.top+e.height/2-o/2,left:e.left+e.width}},i.prototype.getViewportAdjustedDelta=function(t,e,i,o){var s={top:0,left:0};if(!this.$viewport)return s;var n=this.options.viewport&&this.options.viewport.padding||0,r=this.getPosition(this.$viewport);if(/right|left/.test(t)){var a=e.top-n-r.scroll,l=e.top+n-r.scroll+o;a<r.top?s.top=r.top-a:l>r.top+r.height&&(s.top=r.top+r.height-l)}else{var h=e.left-n,d=e.left+n+i;h<r.left?s.left=r.left-h:d>r.width&&(s.left=r.left+r.width-d)}
return s},i.prototype.getTitle=function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},i.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},i.prototype.tip=function(){return this.$tip=this.$tip||t(this.options.template)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&(i=t(e.currentTarget).data("bs."+this.type),i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type)})};var o=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.popover"),n="object"==typeof e&&e,r=n&&n.selector;(s||"destroy"!=e)&&(r?(s||o.data("bs.popover",s={}),s[r]||(s[r]=new i(this,n))):s||o.data("bs.popover",s=new i(this,n)),"string"==typeof e&&s[e]())})}
var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.3.0",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},i.prototype.tip=function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip};var o=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.tab");s||o.data("bs.tab",s=new i(this)),"string"==typeof e&&s[e]()})}
var i=function(e){this.element=t(e)};i.VERSION="3.3.0",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),o=e.data("target");if(o||(o=e.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var s=i.find(".active:last a"),n=t.Event("hide.bs.tab",{relatedTarget:e[0]}),r=t.Event("show.bs.tab",{relatedTarget:s[0]});if(s.trigger(n),e.trigger(r),!r.isDefaultPrevented()&&!n.isDefaultPrevented()){var a=t(o);this.activate(e.closest("li"),i),this.activate(a,a.parent(),function(){s.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:s[0]})})}}},i.prototype.activate=function(e,o,s){function n(){r.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),a?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu")&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),s&&s()}
var r=o.find("> .active"),a=s&&t.support.transition&&(r.length&&r.hasClass("fade")||!!o.find("> .fade").length);r.length&&a?r.one("bsTransitionEnd",n).emulateTransitionEnd(i.TRANSITION_DURATION):n(),r.removeClass("in")};var o=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=o,this};var s=function(i){i.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',s).on("click.bs.tab.data-api",'[data-toggle="pill"]',s)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.affix"),n="object"==typeof e&&e;s||o.data("bs.affix",s=new i(this,n)),"string"==typeof e&&s[e]()})}
var i=function(e,o){this.options=t.extend({},i.DEFAULTS,o),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};i.VERSION="3.3.0",i.RESET="affix affix-top affix-bottom",i.DEFAULTS={offset:0,target:window},i.prototype.getState=function(t,e,i,o){var s=this.$target.scrollTop(),n=this.$element.offset(),r=this.$target.height();if(null!=i&&"top"==this.affixed)return i>s?"top":!1;if("bottom"==this.affixed)return null!=i?s+this.unpin<=n.top?!1:"bottom":t-o>=s+r?!1:"bottom";var a=null==this.affixed,l=a?s:n.top,h=a?r:e;return null!=i&&i>=l?"top":null!=o&&l+h>=t-o?"bottom":!1},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=this.$element.height(),o=this.options.offset,s=o.top,n=o.bottom,r=t("body").height();"object"!=typeof o&&(n=s=o),"function"==typeof s&&(s=o.top(this.$element)),"function"==typeof n&&(n=o.bottom(this.$element));var a=this.getState(r,e,s,n);if(this.affixed!=a){null!=this.unpin&&this.$element.css("top","");var l="affix"+(a?"-"+a:""),h=t.Event(l+".bs.affix");if(this.$element.trigger(h),h.isDefaultPrevented())return;this.affixed=a,this.unpin="bottom"==a?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==a&&this.$element.offset({top:r-e-n})}};var o=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=o,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var i=t(this),o=i.data();o.offset=o.offset||{},null!=o.offsetBottom&&(o.offset.bottom=o.offsetBottom),null!=o.offsetTop&&(o.offset.top=o.offsetTop),e.call(i,o)})})}(jQuery),+function(t){"use strict";function e(e){var i,o=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(o)}
function i(e){return this.each(function(){var i=t(this),s=i.data("bs.collapse"),n=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);!s&&n.toggle&&"show"==e&&(n.toggle=!1),s||i.data("bs.collapse",s=new o(this,n)),"string"==typeof e&&s[e]()})}
var o=function(e,i){this.$element=t(e),this.options=t.extend({},o.DEFAULTS,i),this.$trigger=t(this.options.trigger).filter('[href="#'+e.id+'"], [data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};o.VERSION="3.3.0",o.TRANSITION_DURATION=350,o.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},o.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},o.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,s=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(s&&s.length&&(e=s.data("bs.collapse"),e&&e.transitioning))){var n=t.Event("show.bs.collapse");if(this.$element.trigger(n),!n.isDefaultPrevented()){s&&s.length&&(i.call(s,"hide"),e||s.data("bs.collapse",null));var r=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[r](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[r](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return a.call(this);var l=t.camelCase(["scroll",r].join("-"));this.$element.one("bsTransitionEnd",t.proxy(a,this)).emulateTransitionEnd(o.TRANSITION_DURATION)[r](this.$element[0][l])}}}},o.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var s=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(s,this)).emulateTransitionEnd(o.TRANSITION_DURATION):s.call(this)}}},o.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},o.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,o){var s=t(o);this.addAriaAndCollapsedClass(e(s),s)},this)).end()},o.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var s=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=o,t.fn.collapse.noConflict=function(){return t.fn.collapse=s,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(o){var s=t(this);s.attr("data-target")||o.preventDefault();var n=e(s),r=n.data("bs.collapse"),a=r?"toggle":t.extend({},s.data(),{trigger:this});i.call(n,a)})}(jQuery),+function(t){"use strict";function e(i,o){var s=t.proxy(this.process,this);this.$body=t("body"),this.$scrollElement=t(t(i).is("body")?window:i),this.options=t.extend({},e.DEFAULTS,o),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s),this.refresh(),this.process()}
function i(i){return this.each(function(){var o=t(this),s=o.data("bs.scrollspy"),n="object"==typeof i&&i;s||o.data("bs.scrollspy",s=new e(this,n)),"string"==typeof i&&s[i]()})}
e.VERSION="3.3.0",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e="offset",i=0;t.isWindow(this.$scrollElement[0])||(e="position",i=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var o=this;this.$body.find(this.selector).map(function(){var o=t(this),s=o.data("target")||o.attr("href"),n=/^#./.test(s)&&t(s);return n&&n.length&&n.is(":visible")&&[[n[e]().top+i,s]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){o.offsets.push(this[0]),o.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),s=this.offsets,n=this.targets,r=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=o)return r!=(t=n[n.length-1])&&this.activate(t);if(r&&e<s[0])return this.activeTarget=null,this.clear();for(t=s.length;t--;)r!=n[t]&&e>=s[t]&&(!s[t+1]||e<=s[t+1])&&this.activate(n[t])},e.prototype.activate=function(e){this.activeTarget=e,this.clear();var i=this.selector+'[data-target="'+e+'"],'+this.selector+'[href="'+e+'"]',o=t(i).parents("li").addClass("active");o.parent(".dropdown-menu").length&&(o=o.closest("li.dropdown").addClass("active")),o.trigger("activate.bs.scrollspy")},e.prototype.clear=function(){t(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var o=t.fn.scrollspy;t.fn.scrollspy=i,t.fn.scrollspy.Constructor=e,t.fn.scrollspy.noConflict=function(){return t.fn.scrollspy=o,this},t(window).on("load.bs.scrollspy.data-api",function(){t('[data-spy="scroll"]').each(function(){var e=t(this);i.call(e,e.data())})})}(jQuery),+function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]};return!1}
t.fn.emulateTransitionEnd=function(e){var i=!1,o=this;t(this).one("bsTransitionEnd",function(){i=!0});var s=function(){i||t(o).trigger(t.support.transition.end)};return setTimeout(s,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){return t(e.target).is(this)?e.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery);

5
web/public/js/d3.min.js vendored Normal file

File diff suppressed because one or more lines are too long

8
web/public/js/fanavi.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1422
web/public/js/index.html.js Normal file

File diff suppressed because it is too large Load Diff

140
web/public/js/jquery-1.11.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

5
web/public/js/jquery.avgrund.min.js vendored Normal file
View File

@ -0,0 +1,5 @@
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function($){$.fn.avgrund=function(a){var b={width:380,height:280,showClose:!1,showCloseText:"",closeByEscape:!0,closeByDocument:!0,holderClass:"",overlayClass:"",enableStackAnimation:!1,onBlurContainer:"",openOnEvent:!0,setEvent:"click",onLoad:!1,onUnload:!1,template:"<p>This is test popin content!</p>"};return a=$.extend(b,a),this.each(function(){function b(b){a.closeByEscape&&27===b.keyCode&&e()}
function c(b){a.closeByDocument?$(b.target).is(".avgrund-overlay, .avgrund-close")&&(b.preventDefault(),e()):$(b.target).is(".avgrund-close")&&(b.preventDefault(),e())}
function d(){"function"==typeof a.onLoad&&a.onLoad(f),setTimeout(function(){g.addClass("avgrund-active")},100);var d=$('<div class="avgrund-popin '+a.holderClass+'"></div>');d.append(j),g.append(d),$(".avgrund-popin").css({width:h+"px",height:i+"px","margin-left":"-"+(h/2+10)+"px","margin-top":"-"+(i/2+10)+"px"}),a.showClose&&$(".avgrund-popin").append('<a href="#" class="avgrund-close">'+a.showCloseText+"</a>"),a.enableStackAnimation&&$(".avgrund-popin").addClass("stack"),g.bind("keyup",b).bind("click",c)}
function e(){g.unbind("keyup",b).unbind("click",c).removeClass("avgrund-active"),setTimeout(function(){$(".avgrund-popin").remove()},500),"function"==typeof a.onUnload&&a.onUnload(f)}
var f=$(this),g=$("body"),h=a.width>640?640:a.width,i=a.height>350?350:a.height,j="function"==typeof a.template?a.template(f):a.template;g.addClass("avgrund-ready"),0===$(".avgrund-overlay").length&&g.append('<div class="avgrund-overlay '+a.overlayClass+'"></div>'),""!==a.onBlurContainer&&$(a.onBlurContainer).addClass("avgrund-blur"),a.openOnEvent?f.bind(a.setEvent,function(a){a.stopPropagation(),$(a.target).is("a")&&a.preventDefault(),d()}):d()})}});

50
web/public/js/jquery.fullPage.min.js vendored Executable file
View File

@ -0,0 +1,50 @@
(function(a){a.fn.fullpage=function(c){function ga(){a("body").append('<div id="fp-nav"><ul></ul></div>');h=a("#fp-nav");h.css("color",c.navigationColor);h.addClass(c.navigationPosition);for(var b=0;b<a(".fp-section").length;b++){var d="";c.anchors.length&&(d=c.anchors[b]);var e=c.navigationTooltips[b];"undefined"===typeof e&&(e="");h.find("ul").append('<li data-tooltip="'+e+'"><a href="#'+d+'"><span></span></a></li>')}}
function I(){a(".fp-section").each(function(){var b=a(this).find(".fp-slide");b.length?b.each(function(){w(a(this))}):w(a(this))});a.isFunction(c.afterRender)&&c.afterRender.call(this)}
function J(){if(!c.autoScrolling||c.scrollBar){var b=a(window).scrollTop(),d=0,e=Math.abs(b-a(".fp-section").first().offset().top);a(".fp-section").each(function(c){var f=Math.abs(b-a(this).offset().top);f<e&&(d=c,e=f)});var f=a(".fp-section").eq(d)}
if(!c.autoScrolling&&!f.hasClass("active")){A=!0;var g=a(".fp-section.active").index(".fp-section")+1,ha=B(f),h=f.data("anchor");f.addClass("active").siblings().removeClass("active");l||(a.isFunction(c.onLeave)&&c.onLeave.call(this,g,f.index(".fp-section")+1,ha),a.isFunction(c.afterLoad)&&c.afterLoad.call(this,h,f.index(".fp-section")+1));C(h,0);c.anchors.length&&!l&&(q=h,location.hash=h);clearTimeout(K);K=setTimeout(function(){A=!1},100)}
c.scrollBar&&(clearTimeout(L),L=setTimeout(function(){l||m(f)},1E3))}
function M(b){return scrollable=b.find(".fp-slides").length?b.find(".fp-slide.active").find(".fp-scrollable"):b.find(".fp-scrollable")}
function x(b,d){if("down"==b)var c="bottom",f=a.fn.fullpage.moveSectionDown;else c="top",f=a.fn.fullpage.moveSectionUp;if(0<d.length)if(c="top"===c?!d.scrollTop():"bottom"===c?d.scrollTop()+1+d.innerHeight()>=d[0].scrollHeight:void 0,c)f();else return!0;else f()}
function ia(b){var d=b.originalEvent;if(!N(b.target)){c.autoScrolling&&b.preventDefault();b=a(".fp-section.active");var e=M(b);l||t||(d=O(d),r=d.y,y=d.x,b.find(".fp-slides").length&&Math.abs(z-y)>Math.abs(s-r)?Math.abs(z-y)>a(window).width()/100*c.touchSensitivity&&(z>y?a.fn.fullpage.moveSlideRight():a.fn.fullpage.moveSlideLeft()):c.autoScrolling&&Math.abs(s-r)>a(window).height()/100*c.touchSensitivity&&(s>r?x("down",e):r>s&&x("up",e)))}}
function N(b,d){d=d||0;var e=a(b).parent();return d<c.normalScrollElementTouchThreshold&&e.is(c.normalScrollElements)?!0:d==c.normalScrollElementTouchThreshold?!1:N(e,++d)}
function ja(b){b=O(b.originalEvent);s=b.y;z=b.x}
function n(b){if(c.autoScrolling){b=window.event||b;var d=Math.max(-1,Math.min(1,b.wheelDelta||-b.deltaY||-b.detail));c.scrollBar&&(b.preventDefault?b.preventDefault():b.returnValue=!1);b=a(".fp-section.active");b=M(b);l||(0>d?x("down",b):x("up",b));return!1}}
function P(b){var d=a(".fp-section.active").find(".fp-slides");if(d.length&&!t){var e=d.find(".fp-slide.active"),f=null,f="prev"===b?e.prev(".fp-slide"):e.next(".fp-slide");if(!f.length){if(!c.loopHorizontal)return;f="prev"===b?e.siblings(":last"):e.siblings(":first")}
t=!0;u(d,f)}}
function Q(){a(".fp-slide.active").each(function(){D(a(this))})}
function m(b,d,e){var f=b.position();if("undefined"!==typeof f&&(d={element:b,callback:d,isMovementUp:e,dest:f,dtop:f.top,yMovement:B(b),anchorLink:b.data("anchor"),sectionIndex:b.index(".fp-section"),activeSlide:b.find(".fp-slide.active"),activeSection:a(".fp-section.active"),leavingSection:a(".fp-section.active").index(".fp-section")+1,localIsResizing:v},!(d.activeSection.is(b)&&!v||c.scrollBar&&a(window).scrollTop()===d.dtop))){if(d.activeSlide.length)var g=d.activeSlide.data("anchor"),h=d.activeSlide.index();c.autoScrolling&&c.continuousVertical&&"undefined"!==typeof d.isMovementUp&&(!d.isMovementUp&&"up"==d.yMovement||d.isMovementUp&&"down"==d.yMovement)&&(d.isMovementUp?a(".fp-section.active").before(d.activeSection.nextAll(".fp-section")):a(".fp-section.active").after(d.activeSection.prevAll(".fp-section").get().reverse()),p(a(".fp-section.active").position().top),Q(),d.wrapAroundElements=d.activeSection,d.dest=d.element.position(),d.dtop=d.dest.top,d.yMovement=B(d.element));b.addClass("active").siblings().removeClass("active");l=!0;"undefined"!==typeof d.anchorLink&&R(h,g,d.anchorLink);a.isFunction(c.onLeave)&&!d.localIsResizing&&c.onLeave.call(this,d.leavingSection,d.sectionIndex+1,d.yMovement);ka(d);q=d.anchorLink;c.autoScrolling&&C(d.anchorLink,d.sectionIndex)}}
function ka(b){if(c.css3&&c.autoScrolling&&!c.scrollBar)S("translate3d(0px, -"+b.dtop+"px, 0px)",!0),setTimeout(function(){T(b)},c.scrollingSpeed);else{var d=la(b);a(d.element).animate(d.options,c.scrollingSpeed,c.easing).promise().done(function(){T(b)})}}
function la(b){var a={};c.autoScrolling&&!c.scrollBar?(a.options={top:-b.dtop},a.element="."+U):(a.options={scrollTop:b.dtop},a.element="html, body");return a}
function ma(b){b.wrapAroundElements&&b.wrapAroundElements.length&&(b.isMovementUp?a(".fp-section:first").before(b.wrapAroundElements):a(".fp-section:last").after(b.wrapAroundElements),p(a(".fp-section.active").position().top),Q())}
function T(b){ma(b);a.isFunction(c.afterLoad)&&!b.localIsResizing&&c.afterLoad.call(this,b.anchorLink,b.sectionIndex+1);setTimeout(function(){l=!1;a.isFunction(b.callback)&&b.callback.call(this)},600)}
function V(){if(!A){var b=window.location.hash.replace("#","").split("/"),a=b[0],b=b[1];if(a.length){var c="undefined"===typeof q,f="undefined"===typeof q&&"undefined"===typeof b&&!t;(a&&a!==q&&!c||f||!t&&E!=b)&&F(a,b)}}}
function u(b,d){var e=d.position(),f=b.find(".fp-slidesContainer").parent(),g=d.index(),h=b.closest(".fp-section"),l=h.index(".fp-section"),m=h.data("anchor"),p=h.find(".fp-slidesNav"),k=d.data("anchor"),q=v;if(c.onSlideLeave){var n=h.find(".fp-slide.active").index(),r;r=n==g?"none":n>g?"left":"right";q||"none"===r||a.isFunction(c.onSlideLeave)&&c.onSlideLeave.call(this,m,l+1,n,r)}
d.addClass("active").siblings().removeClass("active");"undefined"===typeof k&&(k=g);c.loopHorizontal||(h.find(".fp-controlArrow.fp-prev").toggle(0!=g),h.find(".fp-controlArrow.fp-next").toggle(!d.is(":last-child")));h.hasClass("active")&&R(g,k,m);var s=function(){q||a.isFunction(c.afterSlideLoad)&&c.afterSlideLoad.call(this,m,l+1,k,g);t=!1};c.css3?(e="translate3d(-"+e.left+"px, 0px, 0px)",W(b.find(".fp-slidesContainer"),0<c.scrollingSpeed).css(X(e)),setTimeout(function(){s()},c.scrollingSpeed,c.easing)):f.animate({scrollLeft:e.left},c.scrollingSpeed,c.easing,function(){s()});p.find(".active").removeClass("active");p.find("li").eq(g).find("a").addClass("active")}
function Y(){Z();G?"text"!==a(document.activeElement).attr("type")&&a.fn.fullpage.reBuild(!0):(clearTimeout($),$=setTimeout(function(){a.fn.fullpage.reBuild(!0)},500))}
function Z(){if(c.responsive){var b=g.hasClass("fp-responsive");a(window).width()<c.responsive?b||(a.fn.fullpage.setAutoScrolling(!1),a("#fp-nav").hide(),g.addClass("fp-responsive")):b&&(a.fn.fullpage.setAutoScrolling(!0),a("#fp-nav").show(),g.removeClass("fp-responsive"))}}
function W(b,a){var e="all "+c.scrollingSpeed+"ms "+c.easingcss3;return a?(b.removeClass("fp-notransition"),b.css({"-webkit-transition":e,transition:e})):H(b)}
function H(b){return b.addClass("fp-notransition")}
function na(b,c){if(825>b||900>c){var e=Math.min(100*b/825,100*c/900).toFixed(2);a("body").css("font-size",e+"%")}else a("body").css("font-size","100%")}
function C(b,d){c.menu&&(a(c.menu).find(".active").removeClass("active"),a(c.menu).find('[data-menuanchor="'+b+'"]').addClass("active"));c.navigation&&(a("#fp-nav").find(".active").removeClass("active"),b?a("#fp-nav").find('a[href="#'+b+'"]').addClass("active"):a("#fp-nav").find("li").eq(d).find("a").addClass("active"))}
function B(b){var c=a(".fp-section.active").index(".fp-section");b=b.index(".fp-section");return c==b?"none":c>b?"up":"down"}
function w(b){b.css("overflow","hidden");var a=b.closest(".fp-section"),e=b.find(".fp-scrollable");if(e.length)var f=e.get(0).scrollHeight;else f=b.get(0).scrollHeight,c.verticalCentered&&(f=b.find(".fp-tableCell").get(0).scrollHeight);a=k-parseInt(a.css("padding-bottom"))-parseInt(a.css("padding-top"));f>a?e.length?e.css("height",a+"px").parent().css("height",a+"px"):(c.verticalCentered?b.find(".fp-tableCell").wrapInner('<div class="fp-scrollable" />'):b.wrapInner('<div class="fp-scrollable" />'),b.find(".fp-scrollable").slimScroll({allowPageScroll:!0,height:a+"px",size:"10px",alwaysVisible:!0})):aa(b);b.css("overflow","")}
function aa(b){b.find(".fp-scrollable").children().first().unwrap().unwrap();b.find(".slimScrollBar").remove();b.find(".slimScrollRail").remove()}
function ba(b){b.addClass("fp-table").wrapInner('<div class="fp-tableCell" style="height:'+ca(b)+'px;" />')}
function ca(b){var a=k;if(c.paddingTop||c.paddingBottom)a=b,a.hasClass("fp-section")||(a=b.closest(".fp-section")),b=parseInt(a.css("padding-top"))+
parseInt(a.css("padding-bottom")),a=k-b;return a}
function S(b,a){W(g,a);g.css(X(b))}
function F(b,c){"undefined"===typeof c&&(c=0);var e=isNaN(b)?a('[data-anchor="'+b+'"]'):a(".fp-section").eq(b-1);b===q||e.hasClass("active")?da(e,c):m(e,function(){da(e,c)})}
function da(b,a){if("undefined"!=typeof a){var c=b.find(".fp-slides"),f=c.find('[data-anchor="'+a+'"]');f.length||(f=c.find(".fp-slide").eq(a));f.length&&u(c,f)}}
function oa(b,a){b.append('<div class="fp-slidesNav"><ul></ul></div>');var e=b.find(".fp-slidesNav");e.addClass(c.slidesNavPosition);for(var f=0;f<a;f++)e.find("ul").append('<li><a href="#"><span></span></a></li>');e.css("margin-left","-"+e.width()/2+"px");e.find("li").first().find("a").addClass("active")}
function R(b,a,e){var f="";c.anchors.length&&(b?("undefined"!==typeof e&&(f=e),"undefined"===typeof a&&(a=b),E=a,location.hash=f+"/"+a):("undefined"!==typeof b&&(E=a),location.hash=e))}
function pa(){var a=document.createElement("p"),c,e={webkitTransform:"-webkit-transform",OTransform:"-o-transform",msTransform:"-ms-transform",MozTransform:"-moz-transform",transform:"transform"};document.body.insertBefore(a,null);for(var f in e)void 0!==a.style[f]&&(a.style[f]="translate3d(1px,1px,1px)",c=window.getComputedStyle(a).getPropertyValue(e[f]));document.body.removeChild(a);return void 0!==c&&0<c.length&&"none"!==c}
function ea(){return window.PointerEvent?{down:"pointerdown",move:"pointermove"}:{down:"MSPointerDown",move:"MSPointerMove"}}
function O(a){var c=[];window.navigator.msPointerEnabled?(c.y=a.pageY,c.x=a.pageX):(c.y=a.touches[0].pageY,c.x=a.touches[0].pageX);return c}
function D(b){var d=c.scrollingSpeed;a.fn.fullpage.setScrollingSpeed(0);u(b.closest(".fp-slides"),b);a.fn.fullpage.setScrollingSpeed(d)}
function p(a){c.scrollBar?g.scrollTop(a):c.css3?S("translate3d(0px, -"+a+"px, 0px)",!1):g.css("top",-a)}
function X(a){return{"-webkit-transform":a,"-moz-transform":a,"-ms-transform":a,transform:a}}
function qa(){p(0);a("#fp-nav, .fp-slidesNav, .fp-controlArrow").remove();a(".fp-section").css({height:"","background-color":"",padding:""});a(".fp-slide").css({width:""});g.css({height:"",position:"","-ms-touch-action":"","touch-action":""});a(".fp-section, .fp-slide").each(function(){aa(a(this));a(this).removeClass("fp-table active")});H(g);H(g.find(".fp-easing"));g.find(".fp-tableCell, .fp-slidesContainer, .fp-slides").each(function(){a(this).replaceWith(this.childNodes)});a("html, body").scrollTop(0)}
c=a.extend({menu:!1,anchors:[],navigation:!1,navigationPosition:"right",navigationColor:"#000",navigationTooltips:[],slidesNavigation:!1,slidesNavPosition:"bottom",scrollBar:!1,css3:!0,scrollingSpeed:700,autoScrolling:!0,easing:"easeInQuart",easingcss3:"ease",loopBottom:!1,loopTop:!1,loopHorizontal:!0,continuousVertical:!1,normalScrollElements:null,scrollOverflow:!1,touchSensitivity:5,normalScrollElementTouchThreshold:5,keyboardScrolling:!0,animateAnchor:!0,controlArrowColor:"#fff",verticalCentered:!0,resize:!0,sectionsColor:[],paddingTop:0,paddingBottom:0,fixedElements:null,responsive:0,sectionSelector:".section",slideSelector:".slide",afterLoad:null,onLeave:null,afterRender:null,afterResize:null,afterReBuild:null,afterSlideLoad:null,onSlideLeave:null},c);c.continuousVertical&&(c.loopTop||c.loopBottom)&&(c.continuousVertical=!1,console&&console.warn&&console.warn("Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled"));c.continuousVertical&&c.scrollBar&&(c.continuousVertical=!1,console&&console.warn&&console.warn("Option `scrollBar` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled"));a.fn.fullpage.setAutoScrolling=function(b){c.autoScrolling=b;b=a(".fp-section.active");c.autoScrolling&&!c.scrollBar?(a("html, body").css({overflow:"hidden",height:"100%"}),g.css({"-ms-touch-action":"none","touch-action":"none"}),b.length&&p(b.position().top)):(a("html, body").css({overflow:"visible",height:"initial"}),g.css({"-ms-touch-action":"","touch-action":""}),p(0),a("html, body").scrollTop(b.position().top))};a.fn.fullpage.setScrollingSpeed=function(a){c.scrollingSpeed=a};a.fn.fullpage.setMouseWheelScrolling=function(a){a?document.addEventListener?(document.addEventListener("mousewheel",n,!1),document.addEventListener("wheel",n,!1)):document.attachEvent("onmousewheel",n):document.addEventListener?(document.removeEventListener("mousewheel",n,!1),document.removeEventListener("wheel",n,!1)):document.detachEvent("onmousewheel",n)};a.fn.fullpage.setAllowScrolling=function(b){if(b){if(a.fn.fullpage.setMouseWheelScrolling(!0),G||fa)MSPointer=ea(),a(document).off("touchstart "+MSPointer.down).on("touchstart "+
MSPointer.down,ja),a(document).off("touchmove "+MSPointer.move).on("touchmove "+MSPointer.move,ia)}else if(a.fn.fullpage.setMouseWheelScrolling(!1),G||fa)MSPointer=ea(),a(document).off("touchstart "+MSPointer.down),a(document).off("touchmove "+MSPointer.move)};a.fn.fullpage.setKeyboardScrolling=function(a){c.keyboardScrolling=a};a.fn.fullpage.moveSectionUp=function(){var b=a(".fp-section.active").prev(".fp-section");b.length||!c.loopTop&&!c.continuousVertical||(b=a(".fp-section").last());b.length&&m(b,null,!0)};a.fn.fullpage.moveSectionDown=function(){var b=a(".fp-section.active").next(".fp-section");b.length||!c.loopBottom&&!c.continuousVertical||(b=a(".fp-section").first());b.length&&m(b,null,!1)};a.fn.fullpage.moveTo=function(b,c){var e="",e=isNaN(b)?a('[data-anchor="'+b+'"]'):a(".fp-section").eq(b-1);"undefined"!==typeof c?F(b,c):0<e.length&&m(e)};a.fn.fullpage.moveSlideRight=function(){P("next")};a.fn.fullpage.moveSlideLeft=function(){P("prev")};a.fn.fullpage.reBuild=function(b){v=!0;var d=a(window).width();k=a(window).height();c.resize&&na(k,d);a(".fp-section").each(function(){parseInt(a(this).css("padding-bottom"));parseInt(a(this).css("padding-top"));c.verticalCentered&&a(this).find(".fp-tableCell").css("height",ca(a(this))+"px");a(this).css("height",k+"px");if(c.scrollOverflow){var b=a(this).find(".fp-slide");b.length?b.each(function(){w(a(this))}):w(a(this))}
b=a(this).find(".fp-slides");b.length&&u(b,b.find(".fp-slide.active"))});a(".fp-section.active").position();d=a(".fp-section.active");d.index(".fp-section")&&m(d);v=!1;a.isFunction(c.afterResize)&&b&&c.afterResize.call(this);a.isFunction(c.afterReBuild)&&!b&&c.afterReBuild.call(this)};var t=!1,G=navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|Windows Phone|Tizen|Bada)/),fa="ontouchstart"in window||0<navigator.msMaxTouchPoints,g=a(this),k=a(window).height(),l=!1,v=!1,q,E,h,U="fullpage-wrapper";a.fn.fullpage.setAllowScrolling(!0);c.css3&&(c.css3=pa());a(this).length?(g.css({height:"100%",position:"relative"}),g.addClass(U)):console.error("Error! Fullpage.js needs to be initialized with a selector. For example: $('#myContainer').fullpage();");a(c.sectionSelector).each(function(){a(this).addClass("fp-section")});a(c.slideSelector).each(function(){a(this).addClass("fp-slide")});c.navigation&&ga();a(".fp-section").each(function(b){var d=a(this),e=a(this).find(".fp-slide"),f=e.length;b||0!==a(".fp-section.active").length||a(this).addClass("active");a(this).css("height",k+"px");(c.paddingTop||c.paddingBottom)&&a(this).css("padding",c.paddingTop+" 0 "+c.paddingBottom+" 0");"undefined"!==typeof c.sectionsColor[b]&&a(this).css("background-color",c.sectionsColor[b]);"undefined"!==typeof c.anchors[b]&&a(this).attr("data-anchor",c.anchors[b]);if(1<f){b=100*f;var g=100/f;e.wrapAll('<div class="fp-slidesContainer" />');e.parent().wrap('<div class="fp-slides" />');a(this).find(".fp-slidesContainer").css("width",b+"%");a(this).find(".fp-slides").after('<div class="fp-controlArrow fp-prev"></div><div class="fp-controlArrow fp-next"></div>');"#fff"!=c.controlArrowColor&&(a(this).find(".fp-controlArrow.fp-next").css("border-color","transparent transparent transparent "+c.controlArrowColor),a(this).find(".fp-controlArrow.fp-prev").css("border-color","transparent "+c.controlArrowColor+" transparent transparent"));c.loopHorizontal||a(this).find(".fp-controlArrow.fp-prev").hide();c.slidesNavigation&&oa(a(this),f);e.each(function(b){a(this).css("width",g+"%");c.verticalCentered&&ba(a(this))});d=d.find(".fp-slide.active");0==d.length?e.eq(0).addClass("active"):D(d)}else c.verticalCentered&&ba(a(this))}).promise().done(function(){a.fn.fullpage.setAutoScrolling(c.autoScrolling);var b=a(".fp-section.active").find(".fp-slide.active");b.length&&(0!=a(".fp-section.active").index(".fp-section")||0==a(".fp-section.active").index(".fp-section")&&0!=b.index())&&D(b);c.fixedElements&&c.css3&&a(c.fixedElements).appendTo("body");c.navigation&&(h.css("margin-top","-"+h.height()/2+"px"),h.find("li").eq(a(".fp-section.active").index(".fp-section")).find("a").addClass("active"));c.menu&&c.css3&&a(c.menu).closest(".fullpage-wrapper").length&&a(c.menu).appendTo("body");c.scrollOverflow?("complete"===document.readyState&&I(),a(window).on("load",I)):a.isFunction(c.afterRender)&&c.afterRender.call(this);Z();b=window.location.hash.replace("#","").split("/")[0];if(b.length){var d=a('[data-anchor="'+b+'"]');!c.animateAnchor&&d.length&&(c.autoScrolling?p(d.position().top):(p(0),a("html, body").scrollTop(d.position().top)),C(b,null),a.isFunction(c.afterLoad)&&c.afterLoad.call(this,b,d.index(".fp-section")+1),d.addClass("active").siblings().removeClass("active"))}
a(window).on("load",function(){var a=window.location.hash.replace("#","").split("/"),b=a[0],a=a[1];b&&F(b,a)})});var K,L,A=!1;a(window).on("scroll",J);var s=0,z=0,r=0,y=0;a(window).on("hashchange",V);a(document).keydown(function(b){if(c.keyboardScrolling&&!l&&c.autoScrolling)switch(b.which){case 38:case 33:a.fn.fullpage.moveSectionUp();break;case 40:case 34:a.fn.fullpage.moveSectionDown();break;case 36:a.fn.fullpage.moveTo(1);break;case 35:a.fn.fullpage.moveTo(a(".fp-section").length);break;case 37:a.fn.fullpage.moveSlideLeft();break;case 39:a.fn.fullpage.moveSlideRight()}});a(document).on("click touchstart","#fp-nav a",function(b){b.preventDefault();b=a(this).parent().index();m(a(".fp-section").eq(b))});a(document).on("click touchstart",".fp-slidesNav a",function(b){b.preventDefault();b=a(this).closest(".fp-section").find(".fp-slides");var c=b.find(".fp-slide").eq(a(this).closest("li").index());u(b,c)});a(document).on({mouseenter:function(){var b=a(this).data("tooltip");a('<div class="fp-tooltip '+c.navigationPosition+'">'+b+"</div>").hide().appendTo(a(this)).fadeIn(200)},mouseleave:function(){a(this).find(".fp-tooltip").fadeOut(200,function(){a(this).remove()})}},"#fp-nav li");c.normalScrollElements&&(a(document).on("mouseenter",c.normalScrollElements,function(){a.fn.fullpage.setMouseWheelScrolling(!1)}),a(document).on("mouseleave",c.normalScrollElements,function(){a.fn.fullpage.setMouseWheelScrolling(!0)}));a(".fp-section").on("click touchstart",".fp-controlArrow",function(){a(this).hasClass("fp-prev")?a.fn.fullpage.moveSlideLeft():a.fn.fullpage.moveSlideRight()});a(window).resize(Y);var $;a.fn.fullpage.destroy=function(b){a.fn.fullpage.setAutoScrolling(!1);a.fn.fullpage.setAllowScrolling(!1);a.fn.fullpage.setKeyboardScrolling(!1);a(window).off("scroll",J).off("hashchange",V).off("resize",Y);a(document).off("click","#fp-nav a").off("mouseenter","#fp-nav li").off("mouseleave","#fp-nav li").off("click",".fp-slidesNav a").off("mouseover",c.normalScrollElements).off("mouseout",c.normalScrollElements);a(".fp-section").off("click",".fp-controlArrow");b&&qa()}}})(jQuery);

10
web/public/js/jquery.slimscroll.min.js vendored Normal file
View File

@ -0,0 +1,10 @@
(function(e){e.fn.extend({slimScroll:function(g){var a=e.extend({width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},g);this.each(function(){function u(d){if(r){d=d||window.event;var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&m(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}
function m(d,e,g){k=!1;var f=d,h=b.outerHeight()-c.outerHeight();e&&(f=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),f=Math.min(Math.max(f,0),h),f=0<d?Math.ceil(f):Math.floor(f),c.css({top:f+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=l*(b[0].scrollHeight-b.outerHeight());g&&(f=d,d=f/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),h),c.css({top:d+"px"}));b.scrollTop(f);b.trigger("slimscrolling",~~f);v();p()}
function C(){window.addEventListener?(this.addEventListener("DOMMouseScroll",u,!1),this.addEventListener("mousewheel",u,!1)):document.attachEvent("onmousewheel",u)}
function w(){s=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:s+"px"});var a=s==b.outerHeight()?"none":"block";c.css({display:a})}
function v(){w();clearTimeout(A);l==~~l?(k=a.allowPageScroll,B!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;B=l;s>=b.outerHeight()?k=!0:(c.stop(!0,!0).fadeIn("fast"),a.railVisible&&h.stop(!0,!0).fadeIn("fast"))}
function p(){a.alwaysVisible||(A=setTimeout(function(){a.disableFadeOut&&r||x||y||(c.fadeOut("slow"),h.fadeOut("slow"))},1E3))}
var r,x,y,A,z,s,l,B,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var n=b.scrollTop(),c=b.parent().find("."+a.barClass),h=b.parent().find("."+a.railClass);w();if(e.isPlainObject(g)){if("height"in g&&"auto"==g.height){b.parent().css("height","auto");b.css("height","auto");var q=b.parent().parent().height();b.parent().css("height",q);b.css("height",q)}
if("scrollTo"in g)n=parseInt(a.scrollTo);else if("scrollBy"in g)n+=parseInt(a.scrollBy);else if("destroy"in g){c.remove();h.remove();b.unwrap();return}
m(n,!1,!0)}}else if(!(e.isPlainObject(g)&&"destroy"in g)){a.height="auto"==a.height?b.parent().height():a.height;n=e("<div></div>").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",width:a.width,height:a.height});var h=e("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,WebkitBorderRadius:a.borderRadius,zIndex:99}),q="right"==a.position?{right:a.distance}:{left:a.distance};h.css(q);c.css(q);b.wrap(n);b.parent().append(c);b.parent().append(h);a.railDraggable&&c.bind("mousedown",function(a){var b=e(document);y=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);m(0,c.position().top,!1)});b.bind("mouseup.slimscroll",function(a){y=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",function(a){a.stopPropagation();a.preventDefault();return!1});h.hover(function(){v()},function(){p()});c.hover(function(){x=!0},function(){x=!1});b.hover(function(){r=!0;v();p()},function(){r=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(z=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(m((z-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),z=b.originalEvent.touches[0].pageY)});w();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),m(0,!0)):"top"!==a.start&&(m(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());C()}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);

21
web/public/js/jquery.sticky.min.js vendored Normal file
View File

@ -0,0 +1,21 @@
(function(b){var a={timers:{},queue:{}};b.each([b.fn,b],function(d,e){e.extend({sticky:c})});function c(d,e){if(!d){return}
e=e||{};if(typeof d=="string"){e.body=d}else{e=d}
e=b.extend({icon:"",title:"",body:"",width:300,speed:500,position:"top-right",hideAfter:3000,closeable:true,useAnimateCss:false,animations:{"top-left":["zoomInRight","zoomOutRight"],"top-mid":["zoomInUp","zoomOutUp"],"top-right":["zoomInLeft","zoomOutLeft"],"mid-left":["zoomInRight","zoomOutRight"],"mid-mid":["zoomIn","zoomOut"],"mid-right":["zoomInLeft","zoomOutLeft"],"bottom-left":["zoomInRight","zoomOutRight"],"bottom-mid":["zoomInDown","zoomOutDown"],"bottom-right":["zoomInLeft","zoomOutLeft"]},iconClassName:"sticky-icon",bodyClassName:"sticky-body",titleClassName:"sticky-title",stickyClassName:"sticky",holderClassName:"sticky-holder"},e);if(!e.body){return}
e.animationend="webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend";e.id="sticky-"+Math.random().toString().replace(".","");var h=[["top","mid","bottom"],["left","mid","right"]],i;if(!e.position||(i=e.position.split("-")).length!=2||h[0].indexOf(i[0])<0||h[1].indexOf(i[1])<0){i=["top","right"];e.position=i.join("-")}
var d=b("body").eq(0),f;if((f=d.find(".sticky-holder.sticky-"+e.position)).length==0){f=b("<div />",{"class":"sticky-holder sticky-"+e.position}).css({width:e.width})}
a.queue[e.position]=a.queue[e.position]||[];a.queue[e.position].push(e);if(!f.is(":empty")){return}
(function g(r){var p=b("<div />",{"id":r.id,"class":r.stickyClassName}).css({width:r.width,opacity:0.01});if(r.title){b("<div />",{"class":r.titleClassName}).html(r.title).appendTo(p)}
if(r.icon){r.body='<img src="'+r.icon+'" class="'+r.iconClassName+'" />'+r.body}
b("<p />",{"class":r.bodyClassName}).html(r.body).appendTo(p);b.each(["speed","hideAfter"],function(s,t){p.data(t,r[t])});function n(u){if(u.target){u=b(u.target)}
var w=u.attr("id"),v=a.timers[w];if(v){try{clearTimeout(v)}catch(s){}
delete a.timers[w]}
function t(){var y=b(this).remove().attr("id");r.onHidden&&r.onHidden(y);var x=a.queue[r.position];if(x&&x.length>0){g(x.splice(0,1)[0])}else{f.remove()}}
if(r.useAnimateCss){u.addClass("animated "+r.animations[r.position][1]).one(r.animationend,t)}else{u.stop().dequeue().animate(p.data("anim-exit"),u.data("speed"),t)}}
if(r.closeable){p.append("<span>&times;</span>").one("click",">span",function(){n(b(this).parent())})}
p.appendTo(f);f.appendTo(d);var l={},j={},k={opacity:1},q=p.height()+10,m=(i[1]=="mid"?"top":i[1]);j[m]=({left:-r.width,top:-q-10,right:-r.width})[m];k[m]=0;b.extend(l,({left:{left:5},mid:{left:"50%",marginLeft:-r.width/2},right:{right:5}})[i[1]],{top:5});if(i[0]=="mid"){l.top="50%";l.marginTop=-q/2-10;if(i[1]=="mid"){j.top=0}}else{if(i[0]=="bottom"){delete l.top;l.bottom=q;if(i[1]=="mid"){j.top=q}}}
f.css(l);p.data("anim-exit",j);function o(){var s=b(this).attr("class",r.stickyClassName).attr("id");r.onShown&&r.onShown(s)}
if(!r.useAnimateCss){p.css(j).animate(k,r.speed,o)}else{p.css("opacity",1).addClass("animated "+r.animations[r.position][0]).one(r.animationend,o)}
p.on("dismiss",n);j.opacity=0.01;if(r.hideAfter){a.timers[r.id]=setTimeout(n,p.data("hideAfter"),p)}})(a.queue[e.position].splice(0,1)[0])}
c.dequeue=function(f){if(!f){for(var d in a.timers){try{clearTimeout(a.timers[d])}catch(e){}}
a.timers={};a.queue=[]}else{try{clearTimeout(a.timers[f])}catch(e){}}
f=(f?"#"+f:"div[id^=sticky-]");b(f).trigger("dismiss")}})(jQuery);

222
web/public/js/lodash.min.js vendored Normal file

File diff suppressed because one or more lines are too long

6988
web/public/js/socket.io.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +0,0 @@
'use strict';
$(() => {
moment.locale('zh-CN');
$('.datetime').each(function() {
let ele = $(this);
ele.text(moment(parseFloat(ele.text())).format('MMMM Do YYYY'));
});
});

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
'use strict';

View File

@ -1,25 +0,0 @@
{
"adjoining-classes": false,
"box-sizing": false,
"box-model": false,
"compatible-vendor-prefixes": false,
"floats": false,
"font-sizes": false,
"gradients": false,
"important": false,
"known-properties": false,
"outline-none": false,
"qualified-headings": false,
"regex-selectors": false,
"shorthand": false,
"text-indent": false,
"unique-headings": false,
"universal-selector": false,
"unqualified-attributes": false,
"overqualified-elements": false,
"ids": false,
"fallback-colors": false,
"vendor-prefix": false,
"import": false,
"order-alphabetical": false
}

View File

@ -1,29 +0,0 @@
html,
body {
-webkit-text-size-adjust: none;
-webkit-tap-highlight-color: transparent
}
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.carbon {
background: url(/img/carbon.png) 0 0 repeat;
}
.clearfix {
&:before,
&:after {
content: ' ';
display: table;
}
&:after {
clear: both;
}
}

View File

@ -1,7 +0,0 @@
// pnf-404
@png-404-color: #555;
@png-404-info-color: #666;
@png-404-text-shadow-color: #fff;
// sidebar
// nav
@navbar-user-header-bgcolor: #fff;

View File

@ -1,2 +0,0 @@
@sidebar-width: 270px;
@control-sidebar-width: 320px;

View File

@ -1,12 +0,0 @@
// core
@import "core/variables.less";
@import "core/base.less";
// -> themes
@import "core/themes/default.less";
// mixins
@import "mixins/404_500_errors.less";
// -> adminLTE
@import "mixins/AdminLTE/auth.less";
@import "mixins/AdminLTE/nav.less";
@import "mixins/AdminLTE/sidebar.less";
// components

View File

@ -1,33 +0,0 @@
.pnf-404 {
display: block;
width: 400px;
height: 50px;
top: 50%;
left: 50%;
margin: -100px auto auto -200px;
text-align: left;
position: absolute;
color: @png-404-color;
text-shadow: 2px 2px 2px @png-404-text-shadow-color;
* {
vertical-align: middle;
}
i {
float: left;
font-size: 64px;
margin-top: 25px;
margin-right: 20px;
}
.head {
font-size: 32px;
font-weight: bold;
display: block;
margin-top: 10px;
}
.info {
font-size: 24px;
color: @png-404-info-color;
text-shadow: 1px 1px 1px @png-404-text-shadow-color;
display: block;
}
}

View File

@ -1,16 +0,0 @@
.lockscreen {
.lockscreen-item {
.lockscreen-image {
top: -20px;
}
.lockscreen-credentials {
display: block;
> p {
padding: 10px 0 10px 10px;
}
}
}
.help-block {
font-size: 12px;
}
}

View File

@ -1,35 +0,0 @@
.navbar-text {
.fa.fa-quote-left,
.fa.fa-quote-right {
font-size: 12px;
}
}
.navbar-nav {
i.navbar-menu-logo {
font-size: 32px;
}
.menu {
>li {
>a {
>p {
word-wrap: break-word;
white-space: normal;
}
.ion:before {
font-size: 18px;
vertical-align: middle;
}
}
}
}
.user-menu {
>.dropdown-menu {
>.user-header {
>img {
background-color: @navbar-user-header-bgcolor;
}
}
}
}
}

View File

@ -1,22 +0,0 @@
.control-sidebar,
.control-sidebar-bg {
width: @control-sidebar-width;
right: -@control-sidebar-width;
}
.control-sidebar-open {
.control-sidebar-bg,
.control-sidebar {
right: 0;
}
}
@media (min-width: 768px) {
.control-sidebar-open {
.content-wrapper,
.right-side,
.main-footer {
margin-right: @control-sidebar-width;
}
}
}

View File

@ -1,116 +0,0 @@
'use strict'
var path = require('path')
var fs = require('fs')
var express = require('express')
var _ = require('lodash')
var middleware = require('./middleware')
var router = express.Router()
var routes = []
var namespace = ''
var regRoot = /\/?(index|main|home)$/
var allowedMethods = ['get', 'post', 'delete', 'put']
var cwd = path.resolve(__dirname, './routes')
// bind actions.
global.action = function (method, path, func) {
// fixed parameters
if (typeof method === 'function') {
func = method
method = 'get'
path = func.name
} else if (typeof path === 'function') {
func = path
path = func.name
var methodLower = method.toLowerCase()
if (methodLower === 'all' || !!~allowedMethods.indexOf(methodLower)) { // eslint-disable-line no-extra-boolean-cast
path = func.name
} else {
path = method
method = 'get'
}
}
// verify...
if (!_.isString(method) || !_.isString(path) || !_.isFunction(func)) {
throw new Error('Arguments of action() should be one of `[FUNCTION]` / `[METHOD], [FUNCTION]` / `[METHOD], [PATH], [FUNCTION]`.')
}
// routes
namespace = namespace.replace(regRoot, '')
routes.push({
method: method,
path: '/' + namespace + (path ? '/' + path : ''),
fn: func
})
}
function initRouter () {
// import routes
importRoutes(cwd)
.predicate(function (f) {
return f && /\.js$/i.test(f)
})
.ready(function (rejectedFiles, resolvedFiles) {
// if (rejectedFiles.length > 0) {
// console.log(' [router] rejected files', rejectedFiles.join(', '))
// }
resolvedFiles.forEach(function (f) {
namespace = path.relative(cwd, f).replace(/^[./]+/g, '').replace(/\.js$/, '')
require(path.resolve(cwd, f))
})
routes.forEach(function (route) {
route.path = route.path.replace(/\/+/g, '/')
var params = [route.path, (req, res, next) => {
res.locals.path = route.path
middleware(req, res, next)
}, route.fn]
if (route.method === 'all') {
allowedMethods.forEach(function (method) {
router[method].apply(router, params)
})
} else {
router[route.method].apply(router, params)
}
})
})
return router
}
function importRoutes (cwd) {
var core = {
predicate: function (pred) {
return {
ready: function (fn) {
var out = {
rejected: [],
resolved: []
}
core.read('', cwd, pred, out)
fn(out.rejected, out.resolved)
}
}
},
read: function (prefix, cwd, pred, out) {
fs.readdirSync(cwd)
.forEach(function (f) {
if (pred(f)) {
out.resolved.push(prefix + (prefix ? '/' : '') + f)
} else if (f) {
var dir = path.resolve(cwd, f)
var stat = fs.lstatSync(dir)
if (stat.isDirectory()) {
return core.read(prefix + (prefix ? '/' : '') + f, dir, pred, out)
}
out.rejected.push(f)
}
})
}
}
return core
}
// initialize.
module.exports = initRouter()

View File

@ -1,108 +0,0 @@
'use strict'
var path = require('path')
var fs = require('fs')
var _ = require('lodash')
var pkg = require('../../package')
var contributors
action(function signin (req, res) {
var agent = res.locals.config.agent
if (!agent || (req.session.user && agent.authorization === req.session.user.passwd)) {
return res.redirect('/')
}
res.render('auth/lockscreen', {
title: 'Sign In',
redirectTo: req.query.redirectTo || ''
})
})
action('post', function signin (req, res) {
var agent = res.locals.config.agent
var respParams = {
title: 'Sign In',
redirectTo: req.body.redirectTo || ''
}
var passwd
if (!agent || !agent.authorization) {
respParams.error = 'Fatal error: no need to signin for anonymous users!'
} else if (!req.body || !(passwd = req.body.pwd)) {
respParams.error = 'Fatal error: authorization code is required!'
}
if (respParams.error) {
return res.render('auth/lockscreen', respParams)
}
if (agent && passwd === agent.authorization) {
loadContributors(function (contribs) {
if (Array.isArray(contribs)) {
contributors = contribs
}
var user = contributors[Math.round(Math.random() * 10000) % contributors.length]
req.session.user = _.extend({
activedAt: Date.now(),
passwd: passwd
}, user)
res.redirect(req.body.redirect || '/')
})
return
}
respParams.error = 'Fatal error: authorization code is incorrect.'
return res.render('auth/lockscreen', respParams)
})
action(function signout (req, res) {
if (req.session.user) {
req.session.destroy()
}
res.redirect('/auth/signin')
})
action(function profile (req, res) {
res.render({
title: 'Profile',
profile: _.pick(pkg, 'version', 'description')
})
})
function loadContributors (fn) {
if (Array.isArray(contributors)) {
return fn()
}
var contribs = []
readLines('../THANKS.md', function (data) {
if (data.indexOf('#') !== 0) {
contribs.push(data)
}
}, function () {
contribs = contribs.map(function (contrib) {
let cs = contrib.split(',')
return {
nick: cs[0],
full: cs[1]
}
})
fn(contribs)
})
}
function readLines (file, onEach, onComplete) {
var input = fs.createReadStream(path.resolve(__dirname, '../', file))
var remaining = ''
input.on('data', function (data) {
remaining += data
var index = remaining.indexOf('\n')
while (index > -1) {
var line = remaining.substring(0, index)
remaining = remaining.substring(index + 1)
onEach(line)
index = remaining.indexOf('\n')
}
})
input.on('end', function () {
remaining.length > 0 && onEach(remaining)
onComplete && onComplete()
})
}

View File

@ -1,20 +1,25 @@
'use strict'
var _ = require('lodash')
var Monitor = require('../../lib/monitor')
var Monitor = require('../../libs/monitor')
var conf = require('../../libs/util/conf')
action(function (req, res) {
var config = res.locals.config
var agent = config.agent
if (agent && agent.authorization && (!req.session.user || agent.authorization !== req.session.user.passwd)) {
return res.redirect('/auth/signout')
// Authorization
action(function auth (req, res) {
if (!req._config.agent || (req._config.agent.authorization === req.session['authorization'])) {
return res.redirect('/')
}
var q = Monitor.available(_.extend({
blank: '',
notFormatName: true
}, config))
res.render('auth', {
title: 'Authorization'
})
})
// Index
action(function (req, res) {
if (req._config.agent && (req._config.agent.authorization !== req.session['authorization'])) {
return res.redirect('/auth')
}
var options = _.clone(req._config)
var q = Monitor.available(_.extend(options, {
blank: '&nbsp;'
}))
var connections = []
q.choices.forEach(function (c) {
@ -24,10 +29,30 @@ action(function (req, res) {
res.render('index', {
title: 'Monitor',
connections: connections,
readonly: agent && !!agent.readonly,
socketConfigs: {
events: conf.SOCKET_EVENTS,
namespaces: conf.NSP
}
readonly: !!req._config.readonly
})
})
// API
action(function auth_api (req, res) { // eslint-disable-line camelcase
if (!req._config.agent || !req._config.agent.authorization) {
return res.json({
error: 'Can not found agent[.authorization] config, no need to authorize!'
})
}
if (!req.query || !req.query.authorization) {
return res.json({
error: 'Authorization is required!'
})
}
if (req._config.agent && req.query.authorization === req._config.agent.authorization) {
req.session['authorization'] = req.query.authorization
return res.json({
status: 200
})
}
return res.json({
error: 'Failed, authorization is incorrect.'
})
})

View File

@ -1,16 +0,0 @@
extends ../../layouts/default
block variables
- bodyClassName = 'carbon';
block body
.wrapper.wrapper-static
p.pnf-404
i.fa.fa-warning.text-yellow
span.head.text-yellow 404
span.info
if error
!= error
else
| Oops! Page Not Found.

View File

@ -1,53 +0,0 @@
extends ./master.jade
block headMaster
link(rel='stylesheet', href='/vendor/bootstrap/css/bootstrap.min.css')
link(rel='stylesheet', href='/vendor/font-awesome/css/font-awesome.min.css')
link(rel='stylesheet', href='/vendor/ionicons/css/ionicons.min.css')
link(rel='stylesheet', href='/vendor/animate.css/animate.min.css')
block head
block bodyMaster
.wrapper
include ../partials/header
include ../partials/sidebar
block beforeWrapper
.content-wrapper
section.content-header
h1
- var currentPage = Vars.breadcrumb.pop();
= currentPage.title || currentPage.label
if currentPage.note
small= currentPage.note
ol.breadcrumb.hidden-xs
each crumb in Vars.breadcrumb
li
a(href= crumb.href || 'javascript:;')
if crumb.icon
i(class= crumb.icon)
= crumb.label
li.active
i.margin-r-5(class= currentPage.icon)
!= currentPage.label
section.content
block body
footer.main-footer
strong
include ../partials/copyright
aside.control-sidebar.control-sidebar-light
.control-sidebar-bg
block jsMaster
script(src='/vendor/jquery/jquery.min.js')
script(src='/vendor/bootstrap/js/bootstrap.min.js')
script(src='/vendor/lodash/lodash.min.js')
script(src='/vendor/jquery-slimscroll/jquery.slimscroll.min.js')
script(src='/vendor/moment/moment-with-locales.min.js')
script(src='/vendor/fastclick/fastclick.min.js')
script(src='/vendor/AdminLTE/js/app.min.js')
script(src='/js/dist/adminLTE.min.js')
block js

View File

@ -1,16 +1,26 @@
extends ./master.jade
doctype html
html(lang=en)
head
meta(charset='UTF-8')
title= title + '- PM2 Monitor'
meta(name='viewport', content='width=device-width, initial-scale=1.0, maximum-scale=2.0')
link(rel='stylesheet', href='/css/bootstrap.min.css')
link(rel='stylesheet', href='/css/jquery.sticky.min.css')
link(rel='stylesheet', href='/css/animation.min.css')
link(rel='stylesheet', href='/css/jquery.avgrund.min.css')
link(rel='shortcut icon' href='/img/favicon.ico')
block head
block headMaster
link(rel='stylesheet', href='/vendor/bootstrap/css/bootstrap.min.css')
link(rel='stylesheet', href='/vendor/font-awesome/css/font-awesome.min.css')
link(rel='stylesheet', href='/vendor/ionicons/css/ionicons.min.css')
link(rel='stylesheet', href='/vendor/animate.css/animate.min.css')
block head
- var bodyClassName = '';
block variables
block bodyMaster
block body
body(class=bodyClassName)
block content
block jsMaster
script(src='/vendor/jquery/jquery.min.js')
script(src='/vendor/bootstrap/js/bootstrap.min.js')
script(src='js/jquery-1.11.1.min.js')
script(src='js/jquery.slimscroll.min.js')
script(src='js/jquery.sticky.min.js')
script(src='js/jquery.avgrund.min.js')
script(src='js/bootstrap.min.js')
script(src='js/lodash.min.js')
block js

View File

@ -1,28 +0,0 @@
- var Vars = {};
- Vars.bodyClassName = 'hold-transition skin-black-light sidebar-mini fixed';
- Vars.logo = { full: '<b>PM2</b> GUI', short: 'PM', text: 'PM2 GUI' };
doctype html
html(lang=en)
head
title= (title ? title + ' - ' : '') + Vars.logo.text
meta(charset='UTF-8')
meta(name='viewport', content='width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui')
script.
var GUI = {};
GUI.apis = {};
link(rel='shortcut icon' href='/img/favicon.ico')
block headMaster
link(rel='stylesheet', href='/vendor/PACE/themes/blue/pace-theme-minimal.css')
link(rel='stylesheet', href='/vendor/AdminLTE/css/AdminLTE.min.css')
link(rel='stylesheet', href='/vendor/AdminLTE/css/skins/skin-black-light.min.css')
link(rel='stylesheet', href!= '/css/default.min.css')
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
body(class= Vars.bodyClassName)
block bodyMaster
script(src='/js/dist/common.js')
script(src='/vendor/PACE/pace.min.js')
block jsMaster

View File

@ -1 +0,0 @@
| &copy; 2012~2016,&nbsp;All rights reserved.

View File

@ -1,112 +0,0 @@
header.main-header
a.logo.text-orange(href='/')
span.logo-mini!= Vars.logo.short
span.logo-lg!= Vars.logo.full
nav.navbar.navbar-static-top
a.sidebar-toggle(href='javascript:;', data-toggle='offcanvas', role='button')
span.sr-only Toggle navigation
span.icon-bar
span.icon-bar
span.icon-bar
p.navbar-text.hidden-xs
i.fa.fa-quote-left.text-muted
| &nbsp;A species of Happiness&nbsp;
i.fa.fa-quote-right.text-muted
.navbar-custom-menu
ul.nav.navbar-nav
li.dropdown.messages-menu
a.dropdown-toggle(href='javascript:;', data-toggle='dropdown')
i.fa.fa-envelope-o
span.label.label-success 1
ul.dropdown-menu
li.header
| You have&nbsp;
b.text-yellow 1
| &nbsp;unread nofication
li
ul.menu
li
a(href='javascript:;')
.pull-left
img(src='/img/icon-48.png')
h4
= Vars.logo.text
small
i.fa.fa-clock-o
| &nbsp;1 minutes ago
p
| All in one.
li.footer
a.text-uppercase(href='javascript:;') view all
li.dropdown.notifications-menu
a.dropdown-toggle(href='javascript:;', data-toggle='dropdown')
i.fa.fa-bell-o
span.label.label-warning 2
ul.dropdown-menu
li.header
| You have&nbsp;
b.text-yellow 2
| &nbsp;unread nofications
li
ul.menu
li
a(href='javascript:;')
i.ion.ion-ios-cloud-download-outline.text-aqua
| 3 unstable restarts
li
a(href='javascript:;')
i.ion.ion-ios-cloud-upload-outline.text-aqua
| Succeed to pull and restart 2# on serv1
li.dropdown.tasks-menu
a.dropdown-toggle(href='javascript:;', data-toggle='dropdown')
i.fa.fa-line-chart
span.label.label-danger 2
ul.dropdown-menu
li.header
b.text-red 2
| &nbsp;servers
li
ul.menu
li
a(href='javascript:;')
h3
| SUM
small.pull-right 20%
.progress.xs
.progress-bar.progress-bar-red(style='width: 20%', role='progressbar', aria-valuenow='20', aria-valuemin='0' aria-valuemax='100')
span.sr-only 20% Completed
li
a(href='javascript:;')
h3
| AVG
small.pull-right 110%
.progress.xs
.progress-bar.progress-bar-green(style='width: 100%', role='progressbar', aria-valuenow='100', aria-valuemin='0' aria-valuemax='100')
span.sr-only 110% Completed
li.dropdown.user.user-menu
a.dropdown-toggle(href='javascript:;', data-toggle='dropdown')
img.user-image(src='/img/portrait.png', alt='')
span.hidden-xs= user.nick
ul.dropdown-menu
li.user-header
img.img-circle(src='/img/portrait.png', alt='')
p
span.text-uppercase= user.full
small.datetime
= user.activedAt
li.user-body
.row
.col-sm-12.text-center
.text-fuchsia
i.fa.fa-hand-pointer-o.margin-r-5
| The Important Contributor
li.user-footer
if user.anony
.row
.col-sm-12.text-center
.text-muted Visit as an anonymous user
else
.pull-left
a.btn.btn-default.btn-flat(href='/auth/profile') Profile
.pull-right
a.btn.btn-default.btn-flat.bg-maroon(href='/auth/signout') Signout

View File

@ -1,14 +0,0 @@
mixin boxHeader(icon, title, incollapasable, removable)
.box-header.with-border
h4.box-title
if icon
i(class= icon)
| &nbsp;
= title
.box-tools.pull-right
if !incollapasable
button.btn.btn-box-tool(type='button', data-widget='collapse', data-toggle='tooltip', title='Collapse/Expand')
i.fa.fa-minus
if !!removable
button.btn.btn-box-tool(type='button', data-widget='remove', data-toggle='tooltip', title='Remove')
i.fa.fa-times

View File

@ -1,49 +0,0 @@
mixin renderMenu(menu, hasChild)
a(href= menu.href || 'javascript:;')
i(class= menu.icon)
span.text-capitalize!= menu.label
if hasChild
span.pull-right-container
i.fa.fa-angle-left.pull-right
else if menu.badge
span.pull-right-container
small.pull-right(class= menu.badge.css)!= menu.badge.label
aside.main-sidebar
section.sidebar
.user-panel
.pull-left.image
img.img-circle(src='/img/portrait.png', alt='')
.pull-left.info
p= user.nick
a.text-capitalize(href='/auth/profile')
i.fa.fa-circle.text-success
= user.full
ul.sidebar-menu
- var homeMenu = {icon: 'fa fa-home', label: 'Home', href: '/', note: 'dashboard of all'};
- Vars.breadcrumb = [];
- Vars.sidebar = {'main navigation': [homeMenu], 'servers': [{label: '<i class="fa fa-spin fa-spinner margin-r-5"></i>Loading...'}]}
each menus, menuHeader in Vars.sidebar
li.header.text-uppercase= menuHeader
if Array.isArray(menus) && menus.length > 0
each menu in menus
- var hasChild = Array.isArray(menu.items) && menu.items.length > 0;
- var navPrefix = '/' + menu.label;
- var isActive = Vars.navigator && (Vars.navigator === navPrefix || Vars.navigator.indexOf(navPrefix + '/') === 0);
if isActive
- Vars.breadcrumb.push(menu);
if hasChild
li.treeview(class= isActive ? 'active' : '')
+renderMenu(menu, hasChild)
ul.treeview-menu
each item in menu.items
- var itemNavPrefix = navPrefix + '/' + item.label;
- isActive = Vars.navigator && (Vars.navigator === itemNavPrefix || Vars.navigator.indexOf(itemNavPrefix + '/') === 0);
if isActive
- Vars.breadcrumb.push(item);
li(class= isActive ? 'active' : '')
- item.icon = 'fa fa-circle-o';
+renderMenu(item)
else
li(class= isActive ? 'active' : '')
+renderMenu(menu)

View File

@ -0,0 +1,67 @@
script#sysInfoTmp(type='text/html')
dl
- var props = ['cpu', 'arch', 'uptime', 'memory'];
each prop in props
dt= prop.toUpperCase() + (prop == 'cpu' ? 's' : '')
dd!= '<%- data.' + prop + ' %>'
script#noProcTmp(type='text/html')
.proc.proc-empty
.proc-col.proc-status
i.glyphicon.glyphicon-info-sign
.proc-col.proc-info
ul.proc-title
li.proc-alert(data-pmid!='<%- proc.pm_id %>') Ops...
ul.proc-content
li.proc-file No process found!
script#procTmp(type='text/html')
| <% var mode = proc.pm2_env.exec_mode.replace(/^(cluster|fork)_mode$/, "$1") %>
div(id!='proc_<%- proc.pm_id %>', class!="proc<%- proc.pm2_env.status == 'online' ? '':' proc-stop' %>")
.proc-col.proc-status
i(data-toggle='tooltip', data-placement='left', title!='<%- proc.pm2_env.status %>', class!="glyphicon glyphicon-<%- proc.pm2_env.status == 'online' ? 'ok':'remove' %>-sign")
.proc-col.proc-info
ul.proc-title
li.proc-name(data-pmid!='<%- proc.pm_id %>')!= '<%- proc.name %>'
li
sup!= '<%- proc.pm_id %>'
li.proc-ops
| <% if(!GUI.readonly){ %>
ul
li
i.glyphicon.glyphicon-refresh(data-toggle='tooltip', data-placement!='<%= index == 0 ? "bottom" : "top" %>', title='Restart')
!= '<% if(proc.pm2_env.status == "online"){ %>'
li
i.glyphicon.glyphicon-ban-circle(data-toggle='tooltip', data-placement!='<%= index == 0 ? "bottom" : "top" %>', title='Stop')
!= '<% } %>'
li
i.glyphicon.glyphicon-trash(data-toggle='tooltip', data-placement!='<%= index == 0 ? "bottom" : "top" %>', title='Delete')
| <% } %>
ul.proc-content
li.proc-file!= '<%- (proc.pm2_env.pm_exec_path.length > 35 ? "...":"") + proc.pm2_env.pm_exec_path.slice(-35) %>'
li(class!='proc-mode proc-mode-<%- mode %>')
span!= '<%- mode %>'
li.proc-mem!= '<%- getMem(proc.monit.memory) %>'
li.proc-restart!= '<%- proc.pm2_env.restart_time %>'
li.proc-uptime
| [
span(data-ctime!='<%- proc.pm2_env.pm_uptime %>', data-running!="<%- proc.pm2_env.status == 'online' ? 'YES':'NO' %>") 0s
| ]
| <% if(!noDiv){ %>
.proc-div
| <% } %>
script#popupTmp(type='text/html')
div(role='tabpanel')
- var tabs = {info: {class: 'active'}, monitor: {class: 'graph'}, log: {}};
ul.nav.nav-tabs(role='tablist')
each attrs, tab in tabs
li(class= attrs.class, role='presentation')
a(href= '#' + tab, aria-controls='info', role='tab', data-toggle='tab')= tab[0].toUpperCase() + tab.slice(1)
.tab-content
each attrs, tab in tabs
div(id= tab, class= ('tab-pane ' + (attrs.class || '')), role='tabpanel')
if tab == 'info'
pre!= '<%= info %>'
else
.load

View File

@ -0,0 +1,18 @@
extends ../layouts/default
block head
link(rel='stylesheet', href='css/auth.css')
block variables
- bodyClassName = 'carbon';
block content
.auth-form
#logo(title='PM2 GUI')
input(placeholder='Authorization', type='password', maxlength='20', autocomplete='off')
a(href='#')
span
block js
script(src='js/socket.io.js')
script(src='js/d3.min.js')
script(src='js/auth.html.js')

View File

@ -1,38 +0,0 @@
extends ../../layouts/default
block head
- Vars.bodyClassName = 'hold-transition lockscreen';
block body
.lockscreen-wrapper
.lockscreen-logo
a(href='/')!= Vars.logo.full
if isSignOut
.lockscreen-name.text-yellow.text-capitalize!= user.full
.lockscreen-item
.lockscreen-image
img(src='/img/portrait.png', alt='')
if isSignOut
.lockscreen-credentials
p.text-muted
i.fa.fa-spinner.fa-spin.margin-r-5
| Signing out, please be patient.
else
form.lockscreen-credentials(method='post', action='/auth/signin')
.input-group
input.form-control(type='password', autocomplete='off', name='pwd', maxlength=10, placeholder='Authentication code', required='required')
.input-group-btn
button.btn(type='submit')
i.fa.fa-arrow-right.text-muted
input(type='hidden', name='redirect', value!= redirectTo)
if error
.help-block.text-center.text-red!= error
.lockscreen-footer.text-center.text-muted
include ../../partials/copyright
block js
script(src='/vendor/jquery-slimscroll/jquery.slimscroll.min.js')
script(src='/vendor/AdminLTE/js/app.min.js')

View File

@ -1,40 +0,0 @@
extends ../../layouts/dashboard
include ../../partials/mixin
block head
block beforeWrapper
- Vars.breadcrumb.push({label: 'Profile', note: 'biography', icon: 'fa fa-info-circle'});
block body
.row
.col-md-5
.box.box-primary
.box-body.box-profile
img.profile-user-img.img-responsive.img-circle(src='/img/portrait.png', alt='')
h3.profile-username.text-center= user.nick
p.text-muted.text-center= user.fullname
ul.list-group.list-group-unbordered
li.list-group-item
b Last Actived
span.pull-right.label.bg-green.datetime= user.activedAt
a.btn.btn-danger.btn-block(href='/auth/signout') Sign Out
.col-md-6
.box.box-warning
+boxHeader(false, 'About...', false, false)
.box-body
strong.text-uppercase
i.ion.ion-network.margin-r-5
| branch
p.text-muted
!= Vars.logo.full
| &nbsp;
span.text-maroon= 'v' + profile.version
strong.text-uppercase
i.fa.fa-file-text-o.margin-r-5
| description
p.text-muted
= profile.description

View File

@ -1,63 +1,43 @@
extends ../layouts/dashboard
include ../partials/mixin
extends ../layouts/default
block head
- Vars.navigator = '/Home';
block body
.callout.callout-warning(class= error ? '' : 'hide')
h4 WARNING!!!
p!= error || ''
link(rel='stylesheet', href='/css/jquery.fullPage.css')
link(rel='stylesheet', href='/css/index.css')
.row
.col-md-3.col-sm-6.col-xs-12
.info-box
span.info-box-icon.bg-green
i.fa.fa-server
block content
#fullpage
.section
.repo.bounceInDown
a(href='https://github.com/Tjatse/pm2-gui', target='_blank') Github Repo
span
.polar-usage
.system-info
.procs-hint-container.hide
div
= 'Apps('
span 0
= ')'
.section.moveDown
.procs
#procs_action
.info-box-content
span.info-box-text servers
span.info-box-number 12
.spinner
div
div
div
div
div
input#authorization(type="hidden")= authorization
include ../partials/tmpls
.progress
.progress-bar.bg-green-active(style='width: 20%')
span.progress-description 20% Available
.col-md-3.col-sm-6.col-xs-12
.info-box
span.info-box-icon.bg-yellow
i.ion.ion-network
.info-box-content
span.info-box-text version
span.info-box-number v0.0.0
.info-box-content
.info-box-text.text-muted quering...
.row
.col-xs-12
.box.box-primary
+boxHeader('ion-ios-pulse-strong', 'Stats of servers', true, false)
.box-body
.table-responsive
table.table.no-margin
thead
tr
th NAME
th SOCKET
th STATUS
tbody
each conn in connections
tr
td
a(href= '/server/' + conn.short)= conn.short
td= conn.value
td
span.label.bg-green-active checking...
.box-footer.clearfix
button.btn.btn-sm.btn-primary.btn-flat.pull-right(disabled) Refresh Stats
block js
script.
GUI.socketConfigs = !{JSON.stringify(socketConfigs)}
script(src='/vendor/colorbrewer/colorbrewer.js')
script(src='/vendor/humanize-plus/humanize.min.js')
script(src='/vendor/chart.js/Chart.js')
script(src='/js/dist/libs/jquery.sparkline.min.js')
script(src='/js/dist/views/index.min.js')
var GUI = {};
GUI.connections = !{JSON.stringify(connections)};
GUI.readonly = '#{readonly}' === 'true'
script(src='js/socket.io.js')
script(src='js/d3.min.js')
script(src='js/jquery.fullPage.min.js')
script(src='js/fanavi.min.js')
script(src='js/index.html.js')