Browse Source

Only use one browserify bundle

production
Jack Foltz 5 years ago
parent
commit
f8ddb3924f
Signed by: foltik <jack@foltz.io> GPG Key ID: D1F0331758D1F29A
20 changed files with 429 additions and 776 deletions
  1. +0
    -109
      app/public/css/form.css
  2. +0
    -1
      app/public/css/form.min.css
  3. +0
    -155
      app/public/css/home.css
  4. +0
    -1
      app/public/css/home.min.css
  5. +0
    -45
      app/public/css/index.css
  6. +0
    -1
      app/public/css/index.min.css
  7. +0
    -67
      app/public/css/navbar.css
  8. +0
    -148
      app/public/css/panel.css
  9. +0
    -1
      app/public/css/panel.min.css
  10. +0
    -47
      app/public/css/subpanel/dash.css
  11. +0
    -105
      app/public/css/subpanel/keys.css
  12. +48
    -76
      gulpfile.js
  13. +365
    -3
      package-lock.json
  14. +3
    -1
      package.json
  15. +3
    -6
      public/views/home.html
  16. +2
    -2
      public/views/index.html
  17. +1
    -1
      public/views/login.html
  18. +2
    -2
      public/views/panel.html
  19. +4
    -4
      public/views/panel/dash.html
  20. +1
    -1
      public/views/register.html

+ 0
- 109
app/public/css/form.css View File

@@ -1,109 +0,0 @@
body {
background-color: #000000;
margin: 0;
color: #d3d3d3;
font-family: 'Roboto', sans-serif;
}

::-moz-focus-inner {
border: 0;
}

.form {
margin: 50px auto;
width: 300px;
}

.form h3 {
background-color: #000;
border: 2px solid #2a9fd6;
border-radius: 5px 5px 0 0;
color: #eee;
font-size: 18px;
padding: 20px;
margin: 0;
text-align: center;
text-transform: uppercase;
}

fieldset {
border: 2px solid #2a9fd6;
border-top: none;
margin: 0;
background: #000;
border-radius: 0 0 5px 5px;
padding: 20px;
position: relative;
}

fieldset:before {
border-bottom: 2px solid #2a9fd6;
border-right: 2px solid #2a9fd6;
background-color: #000;
content: "";
width: 8px;
height: 8px;
left: 50%;
margin: -4px 0 0 -4px;
position: absolute;
top: 0;
transform: rotate(45deg) translateY(-2px);
}

.form input {
display: block;
font-size: 14px;
background: #000;
color: #d3d3d3;
border: 1px solid #999;
width: 226px;
padding: 12px 12px;
margin: auto auto 5px;
}

button {
background: #000;
border: 2px solid #2a9fd6;
border-radius: 4px;
color: #d3d3d3;
cursor: pointer;
display: block;
padding: 10px 30px;
margin: 20px auto auto;
transition: background 0.25s, border-color 0.25s;
}

button:hover {
background: #2a9fd6;
color: #fff;
text-decoration: none;
outline: none;
}

button.shake {
background: #ff6666;
border-color: #ff6666;
color: #fff;
animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
perspective: 1000px;
}

@keyframes shake {
10%, 90% {
transform: translate3d(-1px, 0, 0);
}

20%, 80% {
transform: translate3d(2px, 0, 0);
}

30%, 50%, 70% {
transform: translate3d(-4px, 0, 0);
}

40%, 60% {
transform: translate3d(4px, 0, 0);
}
}

+ 0
- 1
app/public/css/form.min.css View File

@@ -1 +0,0 @@
body{background-color:#000;margin:0;color:#d3d3d3;font-family:Roboto,sans-serif}::-moz-focus-inner{border:0}.form{margin:50px auto;width:300px}.form h3{background-color:#000;border:2px solid #2a9fd6;border-radius:5px 5px 0 0;color:#eee;font-size:18px;padding:20px;margin:0;text-align:center;text-transform:uppercase}fieldset{border:2px solid #2a9fd6;border-top:none;margin:0;background:#000;border-radius:0 0 5px 5px;padding:20px;position:relative}fieldset:before{border-bottom:2px solid #2a9fd6;border-right:2px solid #2a9fd6;background-color:#000;content:"";width:8px;height:8px;left:50%;margin:-4px 0 0 -4px;position:absolute;top:0;transform:rotate(45deg) translateY(-2px)}.form input{display:block;font-size:14px;background:#000;color:#d3d3d3;border:1px solid #999;width:226px;padding:12px 12px;margin:auto;margin-bottom:5px}button{background:#000;border:2px solid #2a9fd6;border-radius:4px;color:#d3d3d3;cursor:pointer;display:block;padding:10px 30px;margin:auto;margin-top:20px;transition:background .25s}button:hover{background:#2a9fd6;color:#fff;text-decoration:none;outline:0}

+ 0
- 155
app/public/css/home.css View File

@@ -1,155 +0,0 @@
body {
background-color: #060606;
color: #D3D3D3;
font-family: 'Roboto', sans-serif;
font-size: 14px;
height: 100%;
line-height: 20px;
margin: 0;
padding-top: 20px;
padding-bottom: 40px;
}

#container {
max-width: 700px;
text-align: center;
display: flex;
flex-direction: column;
margin: auto;
}

a {
color: #0078B4;
text-decoration: none;
transition: color 0.25s;
}

a:hover,
a:focus,
a:active {
color: #005580;
}


h1 {
font-size: 72px;
font-weight: bold;
}
.upload {
margin: 60px 0;
}
.btn {
font-family: 'Roboto', sans-serif;
background: #000000;
border: 2px solid #2A9FD6;
border-radius: 4px;
color: #D3D3D3;
cursor: pointer;
display: inline-block;
font-size: 24px;
padding: 28px 48px;
transition: background-color 0.25s, width 0.5s, height 0.5s;
}
.btn:hover {
background-color: #2A9FD6;
color: #FFFFFF;
text-decoration: none;
outline: none;
}

:focus {
outline: none;
}
::-moz-focus-inner {border: 0;}

#upload-filelist {
list-style-type: none;
margin: 20px 50px;
padding: 0;
text-align: left;
}



#upload-filelist > li {
margin-top: 5px;
overflow: hidden;
display: flex;
}

.list-name {
margin-top: 6px;
overflow: hidden;
max-width: 70%;
text-overflow: ellipsis;
white-space: nowrap;
}

.list-url {
font-family: 'Roboto Mono', monospace;
margin-left: auto;
}

.list-progress {
margin: 10px 30px 10px 30px;
flex-grow: 2;
}


.list-url a {
vertical-align: super;
color: #5C5C5C;
}
.list-url a:hover {
color: #D3D3D3;
}

.list-url-clipboard-btn {
border: 2px solid #222222;
height: 32px;
margin-left: 5px;
border-radius: 3px;
cursor: pointer;
background-color: #5C5C5C;
transition: background-color 0.25s;
}
.list-url-clipboard-btn:hover,
.list-url-clipboard-btn:focus {
background-color: #ABABAB;
outline: none;
}

.list-err {
font-family: 'Roboto Mono', monospace;
margin-left: auto;
color: #ff6666;
vertical-align: super;
}



nav > ul,
nav a {
color: #32809F;
list-style: none;
margin: 0;
padding: 0;
text-align: center;
}

nav > ul > li {
display: inline-block;
margin: 0;
padding: 0;
cursor: default;
}

nav > ul > li:after {
content: "|";
margin: 0 8px;
opacity: 0.3;
}
nav > ul > li:last-child:after {
content: "";
margin: 0;
}

+ 0
- 1
app/public/css/home.min.css View File

@@ -1 +0,0 @@
body{background-color:#060606;color:#d3d3d3;font-family:Roboto,sans-serif;font-size:14px;height:100%;line-height:20px;margin:0;padding-top:20px;padding-bottom:40px}#container{max-width:700px;text-align:center;display:flex;flex-direction:column;margin:auto}a{color:#0078b4;text-decoration:none;transition:color .25s}a:active,a:focus,a:hover{color:#005580}h1{font-size:72px;font-weight:700}.upload{margin:60px 0}.btn{font-family:Roboto,sans-serif;background:#000;border:2px solid #2a9fd6;border-radius:4px;color:#d3d3d3;cursor:pointer;display:inline-block;font-size:24px;padding:28px 48px;transition:background-color .25s,width .5s,height .5s}.btn:hover{background-color:#2a9fd6;color:#fff;text-decoration:none;outline:0}:focus{outline:0}::-moz-focus-inner{border:0}#upload-filelist{list-style-type:none;margin:20px 50px;padding:0;text-align:left}#upload-filelist>li{margin-top:5px;overflow:hidden;display:flex}.list-name{margin-top:6px;overflow:hidden;max-width:70%;text-overflow:ellipsis;white-space:nowrap}.list-url{font-family:'Roboto Mono',monospace;margin-left:auto}.list-progress{margin:10px 30px 10px 30px;flex-grow:2}.list-url a{vertical-align:super;color:#5c5c5c}.list-url a:hover{color:#d3d3d3}.list-url-clipboard-btn{border:2px solid #222;height:32px;margin-left:5px;border-radius:3px;cursor:pointer;background-color:#5c5c5c;transition:background-color .25s}.list-url-clipboard-btn:focus,.list-url-clipboard-btn:hover{background-color:#ababab;outline:0}.list-err{font-family:'Roboto Mono',monospace;margin-left:auto;color:#f66;vertical-align:super}nav a,nav>ul{color:#32809f;list-style:none;margin:0;padding:0;text-align:center}nav>ul>li{display:inline-block;margin:0;padding:0;cursor:default}nav>ul>li:after{content:"|";margin:0 8px;opacity:.3}nav>ul>li:last-child:after{content:"";margin:0}

+ 0
- 45
app/public/css/index.css View File

@@ -1,45 +0,0 @@
* {
margin: 0;
}

body {
background: #000;
}

a {
position: absolute;
top: 40px;
left: 48%;
opacity: 0.1;
height: 30px;
width: 30px;
z-index: 100;
cursor: default;
}

a img {
width: 30px;
height: 30px;
}

canvas {
position: absolute;
top: 0;
left: 0;
}

video {
position: fixed;
top: 50%;
left: 50%;
min-width: 100%;
min-height: 100%;
z-index: -100;
transform: translateX(-50%) translateY(-50%);
background-size: cover;
transition: 1s opacity;
}

#buffer {
display: none;
}

+ 0
- 1
app/public/css/index.min.css View File

@@ -1 +0,0 @@
*{margin:0}body{background:#000}a{position:absolute;top:5px;left:48%;opacity:.1;height:30px;width:30px;z-index:100;cursor:default}a img{width:30px;height:30px}canvas{position:absolute;top:0;left:0}video{position:fixed;top:50%;left:50%;min-width:100%;min-height:100%;width:1920px;height:760px;z-index:-100;transform:translateX(-50%) translateY(-50%);background-size:cover;transition:1s opacity}#buffer{display:none}

+ 0
- 67
app/public/css/navbar.css View File

@@ -1,67 +0,0 @@
/* SHIMAPAN title */
.sidebar-title {
grid-row-start: 1;
grid-row-end: 1;
place-self: center;

cursor: pointer;

display: flex;
justify-content: center;
align-items: center;

width: 200px;
height: 60px;
/*border-bottom: 1px solid #999;*/
}
.sidebar-title span {
color: #2a9fd6;
font-size: 20px;
text-transform: uppercase;
letter-spacing: 6px;
}

/* Nav Container */
.sidebar {
grid-row-start: 2;
grid-row-end: 2;
}

/* Nav Elements */
.nav li {
cursor: pointer;
display: flex;
align-items: center;
}
.nav li a {
flex: 1;
outline: none;
padding: 20px 0 20px;
margin-left: 20px;
font-size: 14px;
color: #666;
text-decoration: none;
}
.nav li span {
background: #0d0d0d;
width: 35px;
height: 35px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-left: 20px;
}
.nav-icon {
font: 14px fontawesome;
color: #fff;
}
.nav li a:hover {
color: #fff;
}
.nav li a.active {
color: #fff;
}

/* Prevent annoying outline on firefox */
::-moz-focus-inner {border: 0;}

+ 0
- 148
app/public/css/panel.css View File

@@ -1,148 +0,0 @@
@import url('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css');
@import url('https://fonts.googleapis.com/css?family=Roboto');
@import url('https://fonts.googleapis.com/css?family=Roboto+Mono');

@import "navbar.css";

/* Subpanels */
@import "subpanel/dash.css";
@import "subpanel/keys.css";

*, *:before, *:after {
margin: 0;
padding: 0;
box-sizing: border-box;
}

body {
font: 12px 'Roboto', sans-serif;
color: #eeeeee;
background: #020202;
}

.container {
display: grid;
grid-template-columns: 240px auto;
grid-template-rows: 60px auto;
width: 100vw;
height: 100vh;
}

.view {
grid-row-start: 2;
grid-column-start: 2;
background: #121212;
padding: 20px;
border-left: 1px solid #2a9fd6;
border-top: 1px solid #2a9fd6;
}


.inner {
display: flex;
flex-direction: column;
}

.modal,
.modal-box {
z-index: 900;
}

.modal-sandbox {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: transparent;
}

.modal {
display: none;
position: fixed;
width: 100%;
height: 100%;
left: 0;
top: 0;
background: rgb(0,0,0);
background: rgba(0,0,0,.8);
overflow: auto;
}

.modal-box {
position: relative;
width: 80%;
max-width: 700px;
margin: 60px auto;
animation-name: modalbox;
animation-duration: .3s;
animation-timing-function: ease;
}

.modal-header {
border: 1px solid #2a9fd6;
border-radius: 8px 8px 0 0;
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 20px 40px;
background: #000;
color: #ffffff;
overflow: hidden;
}

.modal-body {
border: 1px solid #2a9fd6;
border-top: none;
background: #000;
padding: 30px;
}

.modal-footer {
display: flex;
justify-content: flex-end;
border: 1px solid #2a9fd6;
border-radius: 0 0 8px 8px;
border-top: none;
background: #000;
padding: 20px;
}

.close-modal {
text-align: right;
font-size: 24px;
cursor: pointer;
}

@keyframes modalbox {
0% {
top: -250px;
opacity: 0;
}
100% {
top: 0;
opacity: 1;
}
}

button {
margin-left: 20px;
color: #d3d3d3;
background: #000;
border: 2px solid #2a9fd6;
border-radius: 5px;
padding: 10px;
cursor: pointer;
transition: background-color 0.25s;
}

button:hover {
color: #fff;
background-color: #2a9fd6;
text-decoration: none;
outline: none;
}

::-moz-focus-inner {
outline: none;
}

+ 0
- 1
app/public/css/panel.min.css View File

@@ -1 +0,0 @@
@import url(https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css);@import url(https://fonts.googleapis.com/css?family=Roboto);@import url(https://fonts.googleapis.com/css?family=Roboto+Mono);*,:after,:before{margin:0;padding:0;box-sizing:border-box}body,html{height:100vh}body{font:600 14px Roboto,sans-serif;color:#000;background:#000;overflow-x:hidden}.container{display:flex;min-height:100%}.sidebar{position:absolute;width:220px}.content{flex:1;padding:30px;background:#444;box-shadow:0 0 5px rgba(0,0,0,1);transform:translate3d(0,0,0);transition:transform .3s;color:#ccc}.content.isOpen{transform:translate3d(220px,0,0)}.button{position:relative;width:120px;height:40px;cursor:pointer;margin:10px 0 40px 0;padding:15px;transition-property:opacity,filter;transition-duration:.15s;text-transform:none}.button-inner{left:0;top:50%;display:inline-block;margin-top:-2px}.button-inner,.button-inner::after,.button-inner::before{background-color:#fff;position:absolute;width:40px;height:4px;transition:transform .15s ease;border-radius:4px}.button-inner::after,.button-inner::before{content:"";display:block}.button-inner::before{top:-10px}.button-inner::after{bottom:-10px}.button.isOpen .button-inner::before{transform:translate3d(-8px,0,0) rotate(-45deg) scale(.7,1)}.button.isOpen .button-inner::after{transform:translate3d(-8px,0,0) rotate(45deg) scale(.7,1)}.button-label{position:absolute;top:6px;left:50px;font-size:24px;color:#fff}.sidebar-title{color:#2a9fd6;cursor:pointer;font-size:16px;line-height:50px;text-align:center;text-transform:uppercase;letter-spacing:7px;border-bottom:1px solid #222;background:#2a2a2a}.nav li a{outline:0;position:relative;display:block;padding:20px 0 20px 50px;font-size:14px;color:#eee;background:#333;border-bottom:1px solid #222;text-decoration:none}.nav li a:before{font:14px fontawesome;position:absolute;top:19px;left:20px}.nav li:nth-child(1) a:before{content:'\f00a'}.nav li:nth-child(2) a:before{content:'\f002'}.nav li:nth-child(3) a:before{content:'\f084'}.nav li:nth-child(4) a:before{content:'\f0e0'}.nav li:nth-child(5) a:before{content:'\f0c0'}.nav li:nth-child(6) a:before{content:'\f233'}.nav li:nth-child(7) a:before{content:'\f023';left:23px}.nav li a:hover{background:#444}::-moz-focus-inner{border:0}.nav li a.active{box-shadow:inset 5px 0 0 #2a9fd6,inset 6px 0 0 #222;background:#444}.inner{display:flex;flex-direction:column}.keys{display:flex;flex-direction:row;flex-wrap:wrap}.key{background:#555;border:3px solid #2a9fd6;border-radius:5px;box-shadow:5px 5px 10px #000;margin:20px;width:300px;height:100px;cursor:pointer;display:flex;justify-content:flex-start;flex-direction:row;transition:box-shadow .2s}.key:hover{box-shadow:0 0 10px #eee}.key i{font-size:48px;margin:auto 0 auto 20px}.key span{font-size:16px;vertical-align:center;margin:auto;-moz-user-select:none;user-select:none}.modal{display:block;position:fixed;z-index:1;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgba(0,0,0,.4)}.modal-header{margin:15% auto;padding:20px;border:1px solid #888;width:80%}.modal-body{margin:auto;padding:20px;border:1px solid #888;width:80%}.modal-footer{margin:auto;padding:20px;border:1px solid #888;width:80%}

+ 0
- 47
app/public/css/subpanel/dash.css View File

@@ -1,47 +0,0 @@
.dash-row {
display: flex;
flex-wrap: nowrap;
align-items: center;
}

.dash-card {
background: #020202;
border-radius: 4px;
padding: 30px;
margin: 5px;
flex-grow: 1;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #2a9fd6;
}

#dash-singlestats {
flex-grow: 1;
}
.dash-card.dash-card-singlestat {
justify-content: space-between;
}
.dash-stat {
align-self: flex-start;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-start;
}
.dash-stat-title {
font-size: 18px;
}
.dash-stat-value {
font-size: 48px;
}
.dash-stat-icon {
color: #2a9fd6;
}

#dash-historical {

}
.dash-card.dash-card-graph {
width: 100px;
}

+ 0
- 105
app/public/css/subpanel/keys.css View File

@@ -1,105 +0,0 @@
.keys {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}

.key {
background: #000;
border: 1px solid #2a9fd6;
border-radius: 4px;
box-shadow: 5px 5px 10px #000;
margin: 20px;
width: 300px;
height: 100px;
cursor: pointer;
display: flex;
justify-content: flex-start;
flex-direction: row;
transition: box-shadow 0.2s;
overflow: hidden;
}

.key:hover {
box-shadow: 0 0 5px #eee;
}

.key i {
font-size: 48px;
margin: auto 0 auto 20px;
}

.key span {
font-size: 16px;
vertical-align: center;
margin: auto;
-moz-user-select: none;
user-select: none;
}

.key-name {
color: #2a9fd6;
font-family: 'Roboto Mono', monospace;
}

pre {
overflow: auto;
line-height: 1.7em;
font-family: 'Roboto Mono', monospace;
border: 1px solid #666;
border-radius: 4px;
display: block;
padding: 10px;
font-size: 14px;
margin: 10px 0;
background: #222;
color: #2a9fd6;
}

#createKey {
max-width: 920px;
}

.btn-del {
text-transform: uppercase;
border: 2px solid #ff6666;
color: #ccc;
}

.btn-del:hover {
background-color: #ff6666;
}

#identifier {
font-size: 14px;
background: #222;
color: #d3d3d3;
border: 1px solid #666;
border-radius: 4px;
padding: 10px;
margin: 10px 0;
}

th {
text-transform: uppercase;
font-weight: bold;
padding: 10px;
}

td {
padding: 10px;
}

td input {
vertical-align: middle;
}

td label {
margin-bottom: 2px;
padding-left: 3px;
}

em {
text-transform: uppercase;
font-weight: bold;
}

+ 48
- 76
gulpfile.js View File

@@ -1,11 +1,16 @@
'use strict';

const gulp = require('gulp');
const rename = require('gulp-rename');
const uglify = require('gulp-uglify-es').default;
const gutil = require('gutil');

const watchify = require('watchify');
const browserify = require('browserify');

const source = require('vinyl-source-stream');
const buffer = require('vinyl-buffer');
const browserify = require('browserify');

const rename = require('gulp-rename');
const uglify = require('gulp-uglify-es').default;
const es = require('event-stream');
const cleanCSS = require('gulp-clean-css');
const nodemon = require('gulp-nodemon');
@@ -13,91 +18,58 @@ const sourcemaps = require('gulp-sourcemaps');
const path = require('path');
const glob = require('glob');

gulp.task('start', done => {
nodemon({
script: 'server.js',
ignore: '*.*'
});
done();
});
let jsFiles = {
src: [
glob.sync('app/public/services/*.js'),
glob.sync('app/public/panel/**/*.js'),
glob.sync('app/public/shimapan/**/*.js'),
],
dest: 'shimapan.bundle.js'
};

gulp.task('watch', () => {
const fileTasks = new Map([
['.js', 'BuildJS'],
['.css', 'BuildCSS']
]);
let staticJs = [{
src: 'app/public/index/typegraph.js',
dest: 'typegraph.min.js'
}];

nodemon({
script: 'server.js',
ext: 'js css',
env: {'NODE_ENV': 'dev'},
watch: [
'app/',
'config/'
],
tasks: changedFiles =>
changedFiles
.map(file => fileTasks.get(path.extname(file)))
.filter((value, index, self) => self.indexOf(value) === index)
}).on('restart?', 'default')
});
const bundler = () =>
browserify({
entries: jsFiles.src,
debug: true,
cache: {},
packageCache: {}
});

gulp.task('BuildCSS', () => {
const files = [{
src: 'app/public/css/form.css',
dest: 'form.min.css'
}, {
src: 'app/public/css/home.css',
dest: 'home.min.css'
}, {
src: 'app/public/css/panel.css',
dest: 'panel.min.css'
}, {
src: 'app/public/css/index.css',
dest: 'index.min.css'
}];
const watcher = watchify(bundler());
watcher.on('log', gutil.log);

const tasks = files.map(file =>
gulp.src(file.src)
.pipe(cleanCSS())
.pipe(rename(file.dest)));
const bundle = pkg =>
pkg.bundle()
.pipe(source(jsFiles.dest))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true}))
.pipe(uglify())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('public/js'));

return es.merge(tasks)
.pipe(gulp.dest('public/css'));
});
gulp.task('build', () => bundle(bundler()));

gulp.task('BuildJS', () => {
const files = [{
src: [
'app/public/services/*.js',
'app/public/panel/**/*.js'
],
dest: 'panel.bundle.js'
}, {
src: [
'app/public/services/*.js',
'app/public/shimapan/**/*.js'
],
dest: 'shimapan.bundle.js'
}, {
src: [
'app/public/index/*.js'
],
dest: 'index.bundle.js'
}];
gulp.task('watch', () => {
bundle(watcher);
watcher.on('update', () => bundle(watcher));
});

const tasks = files.map(file =>
browserify({entries: file.src.map(g => glob.sync(g)), debug: true})
.bundle()
.pipe(source(file.dest))
gulp.task('minify', () => {
const tasks = staticJs.map(file =>
gulp.src(file.src)
.pipe(rename(file.dest))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true}))
.pipe(uglify())
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('public/js')));
.pipe(sourcemaps.write('./')));

return es.merge(tasks)
.pipe(gulp.dest('public/js'));
});

gulp.task('default', gulp.parallel('BuildJS', 'BuildCSS'));
gulp.task('default', gulp.parallel('build', 'minify'));

+ 365
- 3
package-lock.json View File

@@ -2603,6 +2603,54 @@
}
}
},
"expand-range": {
"version": "1.8.2",
"resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"dev": true,
"requires": {
"fill-range": "^2.1.0"
},
"dependencies": {
"fill-range": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
"integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
"dev": true,
"requires": {
"is-number": "^2.1.0",
"isobject": "^2.0.0",
"randomatic": "^3.0.0",
"repeat-element": "^1.1.2",
"repeat-string": "^1.5.2"
}
},
"is-number": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"dev": true,
"requires": {
"kind-of": "^3.0.2"
}
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"isobject": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
"dev": true,
"requires": {
"isarray": "1.0.0"
}
}
}
},
"expand-tilde": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
@@ -2801,6 +2849,12 @@
"resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.2.0.tgz",
"integrity": "sha512-2hGrlv6efG4hscYVZeaYjpzpT6I2OZgYqE2yDUzeAcKj2D1SH0AsEzqJNXzdoglEddcIXQQYop3lD97XpG75Jw=="
},
"filename-regex": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
"integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
"dev": true
},
"fileset": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
@@ -3201,6 +3255,15 @@
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
},
"for-own": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"dev": true,
"requires": {
"for-in": "^1.0.1"
}
},
"foreach": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
@@ -3778,6 +3841,42 @@
"path-is-absolute": "^1.0.0"
}
},
"glob-base": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"dev": true,
"requires": {
"glob-parent": "^2.0.0",
"is-glob": "^2.0.0"
},
"dependencies": {
"glob-parent": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
"requires": {
"is-glob": "^2.0.0"
}
},
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
"dev": true
},
"is-glob": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
"is-extglob": "^1.0.0"
}
}
}
},
"glob-parent": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
@@ -4229,9 +4328,9 @@
"dev": true
},
"glogg": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz",
"integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
"integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
"requires": {
"sparkles": "^1.0.0"
}
@@ -4479,6 +4578,15 @@
"glogg": "^1.0.0"
}
},
"gutil": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/gutil/-/gutil-1.6.4.tgz",
"integrity": "sha1-d8+fqgWMBHbWO506xfvgTgcvbNI=",
"dev": true,
"requires": {
"sliced": "*"
}
},
"handlebars": {
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
@@ -5027,6 +5135,21 @@
}
}
},
"is-dotfile": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
"integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
"dev": true
},
"is-equal-shallow": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"dev": true,
"requires": {
"is-primitive": "^2.0.0"
}
},
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
@@ -5123,6 +5246,18 @@
}
}
},
"is-posix-bracket": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
"integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
"dev": true
},
"is-primitive": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
"integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
"dev": true
},
"is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
@@ -5949,6 +6084,12 @@
}
}
},
"math-random": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
"integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
"dev": true
},
"md5.js": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@@ -12620,6 +12761,16 @@
}
}
},
"object.omit": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"dev": true,
"requires": {
"for-own": "^0.1.4",
"is-extendable": "^0.1.1"
}
},
"object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
@@ -12755,6 +12906,15 @@
"lcid": "^1.0.0"
}
},
"outpipe": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
"integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=",
"dev": true,
"requires": {
"shell-quote": "^1.4.2"
}
},
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -12809,6 +12969,35 @@
"path-root": "^0.1.1"
}
},
"parse-glob": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"dev": true,
"requires": {
"glob-base": "^0.3.0",
"is-dotfile": "^1.0.0",
"is-extglob": "^1.0.0",
"is-glob": "^2.0.0"
},
"dependencies": {
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
"dev": true
},
"is-glob": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
"is-extglob": "^1.0.0"
}
}
}
},
"parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@@ -13026,6 +13215,12 @@
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
"integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
},
"preserve": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
"integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
"dev": true
},
"pretty-hrtime": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
@@ -13131,6 +13326,31 @@
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
"integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
},
"randomatic": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
"integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
"dev": true,
"requires": {
"is-number": "^4.0.0",
"kind-of": "^6.0.0",
"math-random": "^1.0.1"
},
"dependencies": {
"is-number": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
"integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
"dev": true
},
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
"dev": true
}
}
},
"randombytes": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
@@ -13318,6 +13538,15 @@
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
"dev": true
},
"regex-cache": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
"integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
"dev": true,
"requires": {
"is-equal-shallow": "^0.1.3"
}
},
"regex-not": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
@@ -15146,6 +15375,139 @@
"integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
"dev": true
},
"watchify": {
"version": "3.11.0",
"resolved": "http://registry.npmjs.org/watchify/-/watchify-3.11.0.tgz",
"integrity": "sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA==",
"dev": true,
"requires": {
"anymatch": "^1.3.0",
"browserify": "^16.1.0",
"chokidar": "^1.0.0",
"defined": "^1.0.0",
"outpipe": "^1.1.0",
"through2": "^2.0.0",
"xtend": "^4.0.0"
},
"dependencies": {
"anymatch": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
"integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
"dev": true,
"requires": {
"micromatch": "^2.1.5",
"normalize-path": "^2.0.0"
}
},
"arr-diff": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"dev": true,
"requires": {
"arr-flatten": "^1.0.1"
}
},
"array-unique": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
"integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
"dev": true
},
"braces": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"dev": true,
"requires": {
"expand-range": "^1.8.1",
"preserve": "^0.2.0",
"repeat-element": "^1.1.2"
}
},
"chokidar": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true,
"requires": {
"anymatch": "^1.3.0",
"async-each": "^1.0.0",
"fsevents": "^1.0.0",
"glob-parent": "^2.0.0",
"inherits": "^2.0.1",
"is-binary-path": "^1.0.0",
"is-glob": "^2.0.0",
"path-is-absolute": "^1.0.0",
"readdirp": "^2.0.0"
}
},
"expand-brackets": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"dev": true,
"requires": {
"is-posix-bracket": "^0.1.0"
}
},
"extglob": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"dev": true,
"requires": {
"is-extglob": "^1.0.0"
}
},
"glob-parent": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
"requires": {
"is-glob": "^2.0.0"
}
},
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
"dev": true
},
"is-glob": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
"is-extglob": "^1.0.0"
}
},
"micromatch": {
"version": "2.3.11",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"dev": true,
"requires": {
"arr-diff": "^2.0.0",
"array-unique": "^0.2.1",
"braces": "^1.8.2",
"expand-brackets": "^0.1.4",
"extglob": "^0.3.1",
"filename-regex": "^2.0.0",
"is-extglob": "^1.0.0",
"is-glob": "^2.0.1",
"kind-of": "^3.0.2",
"normalize-path": "^2.0.1",
"object.omit": "^2.0.0",
"parse-glob": "^3.0.4",
"regex-cache": "^0.4.2"
}
}
}
},
"which": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",


+ 3
- 1
package.json View File

@@ -45,6 +45,7 @@
"gulp-concat": "^2.6.1",
"gulp-rename": "^1.4.0",
"gulp-uglify": "^3.0.1",
"gutil": "^1.6.4",
"istanbul": "^1.1.0-alpha.1",
"minimatch": "^3.0.4",
"mocha": "^5.2.0",
@@ -52,7 +53,8 @@
"npx": "^10.2.0",
"nyc": "^12.0.2",
"uglify-es": "^3.3.9",
"vinyl-buffer": "^1.0.1"
"vinyl-buffer": "^1.0.1",
"watchify": "^3.11.0"
},
"author": "Jack Foltz",
"license": "MIT",


+ 3
- 6
public/views/home.html View File

@@ -1,16 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<base href="/"/>
<meta charset="UTF-8"/>
<title>Shimapan</title>
<link rel="stylesheet" href="/css/home.min.css"/>
<base href="/"/>
<link rel="stylesheet" href="/css/home.css"/>
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css?family=Roboto+Mono" rel="stylesheet"/>

<script src="/js/shimapan.bundle.js"></script>

</head>
<body ng-app="shimapan">
<div id="container">


+ 2
- 2
public/views/index.html View File

@@ -2,9 +2,9 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<link href="/css/index.min.css" type="text/css" rel="stylesheet"/>
<script src="/js/index.min.js" defer></script>
<title>「shimapan.rocks」</title>
<link href="/css/index.css" type="text/css" rel="stylesheet"/>
<script src="/js/typegraph.min.js" defer></script>
</head>
<body>
<a href="/login"><img src="/img/flower.png"/></a>


+ 1
- 1
public/views/login.html View File

@@ -4,7 +4,7 @@
<meta charset="utf-8"/>
<title>Login</title>

<link href="/css/form.min.css" type="text/css" rel="stylesheet"/>
<link href="/css/form.css" type="text/css" rel="stylesheet"/>

<script src="/js/shimapan.bundle.js"></script>
</head>


+ 2
- 2
public/views/panel.html View File

@@ -4,10 +4,10 @@
<meta charset="utf-8">
<base href="/panel"/>
<title>Panel</title>
<link rel="stylesheet" href="/css/panel.min.css"/>
<link rel="stylesheet" href="/css/panel.css"/>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css"
integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<script src="/js/panel.bundle.js"></script>
<script src="/js/shimapan.bundle.js"></script>
</head>
<body ng-app="shimapan-panel">
<div class="container">


+ 4
- 4
public/views/panel/dash.html View File

@@ -15,25 +15,25 @@
chart-colors="viewColors"></canvas>
</div>
</div>
<div id="dash-singlestats" class="dash-row" ng-init="statUploads=0;statUploadSize=0;statViews=0;">
<div id="dash-singlestats" class="dash-row">
<div class="dash-card dash-card-singlestat">
<div class="dash-stat">
<span class="dash-stat-title">Week Uploads</span>
<span class="dash-stat-value" ng-bind="statUploads"></span>
<span class="dash-stat-value" ng-bind="statWeekUploads"></span>
</div>
<i class="dash-stat-icon fa fa-file fa-3x"></i>
</div>
<div class="dash-card dash-card-singlestat">
<div class="dash-stat">
<span class="dash-stat-title">Week Uploaded Size</span>
<span class="dash-stat-value" ng-bind="statUploadSize"></span>
<span class="dash-stat-value" ng-bind="statWeekUploadSize"></span>
</div>
<i class="dash-stat-icon fa fa-database fa-3x"></i>
</div>
<div class="dash-card dash-card-singlestat">
<div class="dash-stat">
<span class="dash-stat-title">Week Views</span>
<span class="dash-stat-value" ng-bind="statViews"></span>
<span class="dash-stat-value" ng-bind="statWeekViews"></span>
</div>
<i class="dash-stat-icon fa fa-eye fa-3x"></i>
</div>


+ 1
- 1
public/views/register.html View File

@@ -4,7 +4,7 @@
<meta charset="utf-8"/>
<title>Register</title>

<link href="/css/form.min.css" type="text/css" rel="stylesheet"/>
<link href="/css/form.css" type="text/css" rel="stylesheet"/>

<script src="/js/shimapan.bundle.js"></script>
</head>


Loading…
Cancel
Save