Browse Source

client server ok

master
zeus 8 months ago
parent
commit
e4cff54b10
87 changed files with 33358 additions and 0 deletions
  1. +26
    -0
      .gitignore
  2. +70
    -0
      Dockerfile
  3. +2
    -0
      Dockerfile.build
  4. +1
    -0
      dist/css/app.e5c9f9a1.css
  5. +10
    -0
      dist/css/chunk-vendors.f194a2fd.css
  6. BIN
      dist/fonts/themify.2c454669.eot
  7. BIN
      dist/fonts/themify.a1ecc3b8.woff
  8. BIN
      dist/fonts/themify.e23a7dca.ttf
  9. BIN
      dist/img/docker.7b56657d.png
  10. BIN
      dist/img/loading.f4404720.gif
  11. +362
    -0
      dist/img/themify.9c8e96ec.svg
  12. +1
    -0
      dist/index.html
  13. +2
    -0
      dist/js/app.f56fe913.js
  14. +1
    -0
      dist/js/app.f56fe913.js.map
  15. +117
    -0
      dist/js/chunk-vendors.8243ef5d.js
  16. +1
    -0
      dist/js/chunk-vendors.8243ef5d.js.map
  17. +1
    -0
      down.sh
  18. +43
    -0
      ecosystem.config.js
  19. +38
    -0
      hybrid/connect/swarmlab-connect.sh
  20. +2
    -0
      hybrid/join.sh
  21. +1
    -0
      hybrid/privatekey
  22. +1
    -0
      hybrid/publickey
  23. +29
    -0
      hybrid/scripts/add-nic-veth-pair.sh
  24. +26
    -0
      hybrid/scripts/add-nic.sh
  25. +24
    -0
      hybrid/scripts/expose-netns.sh
  26. +3
    -0
      keys/create.sh
  27. +33
    -0
      keys/swarmlab.crt
  28. +52
    -0
      keys/swarmlab.key
  29. +39
    -0
      nginx/swarmlab-stats-proxy-server.conf
  30. +25308
    -0
      package-lock.json
  31. +68
    -0
      package.json
  32. +50
    -0
      run.yml
  33. +8
    -0
      run.yml.sh
  34. +48
    -0
      src-local/llo/bclient.js
  35. +32
    -0
      src-local/llo/client.js
  36. +40
    -0
      src-local/llo/iotclient.js
  37. +381
    -0
      src-local/llo/iotserver.js
  38. +27
    -0
      src-local/llo/new.js
  39. +29
    -0
      src-local/llo/pubsub.js
  40. +11
    -0
      src-local/llo/runconfig.js
  41. +33
    -0
      src-local/llo/swarmlab.crt
  42. +52
    -0
      src-local/llo/swarmlab.key
  43. +11
    -0
      src-local/myconfig/runconfig.js
  44. +2531
    -0
      src-local/package-lock.json
  45. +16
    -0
      src-local/package.json
  46. +132
    -0
      src/App.vue
  47. +250
    -0
      src/assets/css/_cards.scss
  48. +254
    -0
      src/assets/css/_variables.scss
  49. +1153
    -0
      src/assets/css/themify-icons.css
  50. BIN
      src/assets/fonts/glyphicons-halflings-regular.448c34a.woff2
  51. BIN
      src/assets/fonts/glyphicons-halflings-regular.e18bbf6.ttf
  52. BIN
      src/assets/fonts/glyphicons-halflings-regular.f4769f9.eot
  53. BIN
      src/assets/fonts/glyphicons-halflings-regular.fa27723.woff
  54. BIN
      src/assets/fonts/themify.eot
  55. +362
    -0
      src/assets/fonts/themify.svg
  56. BIN
      src/assets/fonts/themify.ttf
  57. BIN
      src/assets/fonts/themify.woff
  58. BIN
      src/assets/img/apple-icon.png
  59. BIN
      src/assets/img/background.jpg
  60. BIN
      src/assets/img/code-128.png
  61. BIN
      src/assets/img/docker.png
  62. +5
    -0
      src/assets/img/docker.svg
  63. BIN
      src/assets/img/faces/face-0.jpg
  64. BIN
      src/assets/img/faces/face-1.jpg
  65. BIN
      src/assets/img/faces/face-2.jpg
  66. BIN
      src/assets/img/faces/face-3.jpg
  67. BIN
      src/assets/img/favicon.png
  68. +288
    -0
      src/assets/img/glyphicons-halflings-regular.8988968.svg
  69. +5
    -0
      src/assets/img/images.svg
  70. BIN
      src/assets/img/new_logo.png
  71. +5
    -0
      src/assets/img/object-group.svg
  72. BIN
      src/assets/img/services/gitea.jpg
  73. BIN
      src/assets/img/services/gitea.png
  74. BIN
      src/assets/img/swarmlab-logo.png
  75. BIN
      src/assets/img/tim_80x80.png
  76. BIN
      src/assets/img/vue-logo.png
  77. BIN
      src/assets/loading.gif
  78. BIN
      src/assets/logo.png
  79. +32
    -0
      src/components/Card.vue
  80. +42
    -0
      src/components/mynetwork.vue
  81. +426
    -0
      src/components/mynetwork/mytable.vue
  82. +462
    -0
      src/components/mynetwork/mytable1.vue
  83. +124
    -0
      src/components/mynetwork/session
  84. +14
    -0
      src/config/index.js
  85. +99
    -0
      src/main.js
  86. +40
    -0
      src/store/index.js
  87. +135
    -0
      src/store/modules/create_pipelineLLO.js

+ 26
- 0
.gitignore View File

@@ -0,0 +1,26 @@
.DS_Store
node_modules
vimsession

swarmlabdoc.js
swarmlabdoc.asciidoc_config


# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

+ 70
- 0
Dockerfile View File

@@ -0,0 +1,70 @@
#FROM alpine:3.11
FROM node:alpine

LABEL MAINTAINERS="Guillaume Scheibel <guillaume.scheibel@gmail.com>, Damien DUPORTAL <damien.duportal@gmail.com>"

# Installing package required for the runtime
RUN apk add --no-cache \
bash \
curl \
ca-certificates \
findutils \
font-bakoma-ttf \
git \
graphviz \
inotify-tools \
make \
python3 \
py3-pillow \
py3-setuptools \
tzdata \
unzip \
build-base \
libxml2-dev \
which \
nginx

# Installing Python dependencies for additional
# functionnalities
RUN apk add --no-cache --virtual .pythonmakedepends \
build-base \
python3-dev \
py3-pip \
&& pip3 install --no-cache-dir \
actdiag \
pip install supervisor supervisor-stdout \
'blockdiag[pdf]' \
nwdiag \
seqdiag \
&& apk del -r --no-cache .pythonmakedepends


COPY dist /home/node/swarmlab-app
COPY src-local/llo /home/node/server/llo
COPY src-local/package.json /home/node/server/package.json

RUN mkdir -p /home/node/run \
&& mkdir -p /home/node/logs \
&& chown -R node.node /home/node \
&& chmod -R 755 /home/node \
&& ln -s /usr/local/bin/node /usr/bin/node \
&& mkdir -p /run/nginx \
&& npm install pm2@latest -g


USER node

WORKDIR /home/node/server
RUN set -uex; \
# npm run build no need it!
npm install; \
npm i async url-exist-sync axios socketio-auth socket.io-client https socket.io bufferutil utf-8-validate --save \
npm audit fix; \
npm cache clean --force;

WORKDIR /home/node/swarmlab-app
VOLUME /home/node/swarmlab-app

EXPOSE 443 8080 3000

CMD ["pm2-runtime", "ecosystem.config.js"]

+ 2
- 0
Dockerfile.build View File

@@ -0,0 +1,2 @@
#!/bin/bash
docker build -f Dockerfile -t hub.swarmlab.io:5443/playground-hybrid-agent .

+ 1
- 0
dist/css/app.e5c9f9a1.css
File diff suppressed because it is too large
View File


+ 10
- 0
dist/css/chunk-vendors.f194a2fd.css
File diff suppressed because it is too large
View File


BIN
dist/fonts/themify.2c454669.eot View File


BIN
dist/fonts/themify.a1ecc3b8.woff View File


BIN
dist/fonts/themify.e23a7dca.ttf View File


BIN
dist/img/docker.7b56657d.png View File

Before After
Width: 200  |  Height: 200  |  Size: 16KB

BIN
dist/img/loading.f4404720.gif View File

Before After
Width: 441  |  Height: 291  |  Size: 17KB

+ 362
- 0
dist/img/themify.9c8e96ec.svg
File diff suppressed because it is too large
View File


+ 1
- 0
dist/index.html View File

@@ -0,0 +1 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Vue App</title><link href="/css/app.e5c9f9a1.css" rel="preload" as="style"><link href="/css/chunk-vendors.f194a2fd.css" rel="preload" as="style"><link href="/js/app.f56fe913.js" rel="preload" as="script"><link href="/js/chunk-vendors.8243ef5d.js" rel="preload" as="script"><link href="/css/chunk-vendors.f194a2fd.css" rel="stylesheet"><link href="/css/app.e5c9f9a1.css" rel="stylesheet"></head><body><div id="app"></div><script src="/js/chunk-vendors.8243ef5d.js"></script><script src="/js/app.f56fe913.js"></script></body></html>

+ 2
- 0
dist/js/app.f56fe913.js
File diff suppressed because it is too large
View File


+ 1
- 0
dist/js/app.f56fe913.js.map
File diff suppressed because it is too large
View File


+ 117
- 0
dist/js/chunk-vendors.8243ef5d.js
File diff suppressed because it is too large
View File


+ 1
- 0
dist/js/chunk-vendors.8243ef5d.js.map
File diff suppressed because it is too large
View File


+ 1
- 0
down.sh View File

@@ -0,0 +1 @@
docker-compose -f run.yml down

+ 43
- 0
ecosystem.config.js View File

@@ -0,0 +1,43 @@
module.exports = {
"apps": [
{
"name" : "www",
"autorestart" : true,
"watch" : true,
"cwd" : "/home/node/swarmlab-app",
"script" : "nginx -g 'daemon off;'",
"exec_interpreter" : "none",
"log_type" : "json",
"log_file" : "/home/node/logs/logfilenginx",
"error_file" : "/home/node/logs/errorfilenginx",
"out_file" : "/home/node/logs/outfilenginx",
"log_date_format": "YYYY-MM-DD HH:mm Z",
"merge_logs" : true,
"exec_mode" : "fork_mode",
"max_restarts": 10,
"max_memory_restart": "500M",
"restart_delay" : 1000
},
{
"name" : "server",
"autorestart" : true,
"watch" : true,
"cwd" : "/home/node/server",
"script" : "llo/new.js",
"run_as_user" : "node",
"args" : "start",
"pid_file" : "/home/node/pid.pid",
"log_type" : "json",
"log_file" : "/home/node/logs/logfile",
"error_file" : "/home/node/logs/errorfile",
"out_file" : "/home/node/logs/outfile",
"log_date_format": "YYYY-MM-DD HH:mm Z",
"merge_logs" : true,
"exec_mode" : "fork",
"max_restarts": 10,
"max_memory_restart": "500M",
"restart_delay": 1000
},
]
}


+ 38
- 0
hybrid/connect/swarmlab-connect.sh View File

@@ -0,0 +1,38 @@

DEV_NAME=wg0
#INTERFACE_IP=10.13.13.2/24
INTERFACE_IP=10.13.13.2/16
INTERFACE_IProute=10.13.13.2
ENDPOINT_IP=`grep Endpoint /etc/wireguard/$DEV_NAME.conf | awk '{print $3}' | cut -d: -f1`

echo "ip $INTERFACE_IP"

ip link set $DEV_NAME down
ip link del $DEV_NAME
# add wireguard interface
ip link add $DEV_NAME type wireguard

# set wireguard conf
wg setconf $DEV_NAME /etc/wireguard/$DEV_NAME.conf


# assign ip to wireguard interface
ip addr add $INTERFACE_IP dev $DEV_NAME

# set sysctl
sysctl -w net.ipv4.conf.all.rp_filter=2

# set mtu for wireguard interface
ip link set mtu 1420 up dev $DEV_NAME

# bring wireguard interface up
ip link set up dev $DEV_NAME

# add route
ip route add default via $INTERFACE_IProute metric 2 table 200
ip route show table 200 | grep -w $INTERFACE_IProute

# add local lan route
ip rule add table main suppress_prefixlength 0
ip rule show | grep -w "suppress_prefixlength"


+ 2
- 0
hybrid/join.sh View File

@@ -0,0 +1,2 @@
docker swarm join --token SWMTKN-1-3099nls9my5ns1s0mnmwkx41mhpawl80hwjjbskbll7nghqhgn-asu68y4lhd1qlbpxr6oosk6wl 10.13.13.1:2377


+ 1
- 0
hybrid/privatekey View File

@@ -0,0 +1 @@
6CdrILpdZcm1OfOecSQSgaI90sLNOTVW9zO9Dac5b0w=

+ 1
- 0
hybrid/publickey View File

@@ -0,0 +1 @@
fEirlFuleXLeY2pgsCVb8G16DEVXJVGJuXdifX1+/wY=

+ 29
- 0
hybrid/scripts/add-nic-veth-pair.sh View File

@@ -0,0 +1,29 @@
#!/bin/sh

if [ $# -lt 3 ]; then
echo "This script will create a veth pair, attach one end to an OVS bridge,"
echo "and another end to the specified container as a virtual NIC."
echo ""
echo "Usage: $0 <CONTAINER> <VETH> <PEER> <OVS BRIDGE>"
echo "Example: $0 test-container-1 veth-1 peer-1 br-int"
exit 1
fi

CONTAINER=$1
VETH=$2
PEER=$3
OVS_BR=$4
NETNS=`sudo docker inspect -f '{{.State.Pid}}' $CONTAINER`

echo "add veth pair[$VETH <--> $PEER] to container[$CONTAINER] in netns[$NETNS]"
ip link delete $VETH || true
ip link add $VETH type veth peer name $PEER

echo "add port to ovs bridge $OVS_BR"
ovs-vsctl add-port $OVS_BR $VETH

echo "move $PEER to netns $NETNS"
ip link set $PEER netns $NETNS
ip netns exec $NETNS ip link set dev $PEER up

echo "done"

+ 26
- 0
hybrid/scripts/add-nic.sh View File

@@ -0,0 +1,26 @@
#!/bin/sh

if [ $# -lt 3 ]; then
echo "This script will add an OVS internal port to an OVS bridge,"
echo "then assign the port to the specified container as a virtual NIC."
echo ""
echo "Usage: $0 <CONTAINER> <NIC NAME> <OVS BRIDGE>"
echo "Example: $0 test-container-1 vnic-1 br-int"
exit 1
fi

CONTAINER=$1
PORT=$2
OVS_BR=$3
NETNS=`sudo docker inspect -f '{{.State.Pid}}' $CONTAINER`
echo "add port[$PORT] to container[$CONTAINER] in netns[$NETNS]"

echo "add port to ovs bridge $OVS_BR"
ovs-vsctl add-port $OVS_BR $PORT -- set Interface $PORT type=internal
#ovs-vsctl add-port br-int vnic-1 -- set Interface vnic-1 type=internal

echo "move $PORT to netns $NETNS"
ip link set $PORT netns $NETNS
ip netns exec $NETNS ip link set dev $PORT up

echo "done"

+ 24
- 0
hybrid/scripts/expose-netns.sh View File

@@ -0,0 +1,24 @@
#!/bin/bash

if [ $# -ne 1 ]; then
echo "Usage: $0 <container id or name>"
exit 1
fi

echo "expose container $1 netns"
NETNS=`sudo docker inspect -f '{{.State.Pid}}' $1`

if [ ! -d /var/run/netns ]; then
mkdir /var/run/netns
fi
if [ -f /var/run/netns/$NETNS ]; then
rm -rf /var/run/netns/$NETNS
fi

ln -s /proc/$NETNS/ns/net /var/run/netns/$NETNS
echo "done. netns: $NETNS"

echo "============================="
echo "current network namespaces: "
echo "============================="
ip netns

+ 3
- 0
keys/create.sh View File

@@ -0,0 +1,3 @@
openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
-subj "/C=GR/ST=ATTICA/L=Athens/O=swarmlab/CN=hybrid-local.swarmlab.io" \
-keyout swarmlab.key -out swarmlab.crt

+ 33
- 0
keys/swarmlab.crt View File

@@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFqzCCA5OgAwIBAgIUL0lHp+0sOfYgkUXnsDkEwiUdPCIwDQYJKoZIhvcNAQEL
BQAwZTELMAkGA1UEBhMCR1IxDzANBgNVBAgMBkFUVElDQTEPMA0GA1UEBwwGQXRo
ZW5zMREwDwYDVQQKDAhzd2FybWxhYjEhMB8GA1UEAwwYaHlicmlkLWxvY2FsLnN3
YXJtbGFiLmlvMB4XDTIwMTIyNTE5MTU0NloXDTIxMTIyNTE5MTU0NlowZTELMAkG
A1UEBhMCR1IxDzANBgNVBAgMBkFUVElDQTEPMA0GA1UEBwwGQXRoZW5zMREwDwYD
VQQKDAhzd2FybWxhYjEhMB8GA1UEAwwYaHlicmlkLWxvY2FsLnN3YXJtbGFiLmlv
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0raMBeIQWyvEzTRnV6vq
Nfuq74LyCGLAiywwsSSgQ+UasVDWDKIuzHY87F/eS5+D3u/GiCRwOgW2XovS8prR
FZATt8/Qe2pCIvf0QTb8K5Y6raqgeBGVpB7kcleC2+UsGX0cQMmeUoIZnBR9vXOY
mrIE9Lf3AeGx8omFmcuW07b7RICcRE508flmpcN0gkCARr99JI59O1BwueOlhpKe
fdg7kHgL3XTpoIUimdaEp+wqIjqNytiD3mlCKazVjHdHlQ0aiBpUahiLKmMPLpJS
dejmdxHAidDsVCkOdTZbC+JHWFCnL8hiJ3JwQjRd2dzhMIGAqqjuFQ7ZnUx20r8b
IBKXBOvzfHrNx+SmSJE/xldxBycrDu3hcaZINaR+aWk9TUQnUC1pQ+JfDw8z/BSo
YOWBSy/4qnrYcYp9zRQA/92Oaf9lKmrAKbq2jOnaRF8KtXZ7eotiaoeAZuSAg6ps
es42tFwa5MenY5thVzZzhsC0+ko/yo34hv3tUNbbcZWW5p5PHQxIQBOZGKAD518V
aCbPIaFzSCnG+ybO9Y9Xo7Ow1gpaq3OGvuEoUh/BTCbTnuNF8G4dr/TX5v4pM+l8
MmoWONaC75xHJqbWoJM1gJZ/E8B+ZwlbqGrpfVZK7aCDldbDSXLpB8jTkVhpW2T/
6YWp95ggOTtHa/LN2xXQiYMCAwEAAaNTMFEwHQYDVR0OBBYEFBlHSKfFzhQmEbI3
6RFL6uJgkxCyMB8GA1UdIwQYMBaAFBlHSKfFzhQmEbI36RFL6uJgkxCyMA8GA1Ud
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAJnwaDyeacNIT8mW1llQx1Af
XLUeiyoCOzh1VQpMXBIvXTiRa30LNLAgN+2bj1z3AccsAvaUYuYq+VOIsshEoiYn
1V7iWUs5QvnCQs/6XmcMBvR99aumTUROs8lw1D27l+baysEElcEHHT8t41Omh8Wt
oSTyGL4t55OZBRdvbDdx0EgjFekx3m6rPDzYg/NsGFub2BQFJtRCzxmSlXcNA3L2
tuYOqouZz550DEB1zJvkrjKjT42vjJ/sCox9PrXyFb5UVxJDjfmJ/NwYTrlWi+TI
4nwm982DFTR0Q2Jc0R43HZSavKglypOOda3tAzOwzXR1P8xoUUnG1cA8ZCRt0kZ6
MQkLHgnx4CoHclu0cGxFyYQNs+P37rGupJNaARgJNhsBl+Sc+nzEKHijoBaBjwly
nYiendESj+fyUlYYGq2lCZ39D++xyn1diOxcIM0gchPZFlhUTUgInpUZaszzTp2a
+C114D8NK9vl07xKe2VAO8KWm4k/I+52dCDQ0oFO5T0Yvg2rRX2ffln2C7vAmHe7
Zd/wfKEGe2gkiVrs9M8Merp6k3eG+MwKAEtWxEwWishIxXGJHmhA9YiGtrxddwZE
dEgm+jKE93+mVE4ko86TjEN10Cfy/3jVLr1t8SA5lyMQ7FDbEFVW6wmuga4u/jgL
Bb/FRHnahLPywvkzeita
-----END CERTIFICATE-----

+ 52
- 0
keys/swarmlab.key View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
lHniiVatSmynsipyyn6L7yXUElS7FaW5
-----END PRIVATE KEY-----

+ 39
- 0
nginx/swarmlab-stats-proxy-server.conf View File

@@ -0,0 +1,39 @@

proxy_cache_path /var/tmp levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
resolver_timeout 5s;
server {
listen 80;
listen [::]:80 ipv6only=on;
#server_name hybrid-local.swarmlab.io;
server_name localhost;
return 301 https://hybrid-local.swarmlab.io$request_uri;
}

server {
listen [::]:443 ssl ipv6only=off;
#server_name hybrid-local.swarmlab.io;
server_name localhost;
root /home/node/swarmlab-app/dist;

# To allow special characters in headers
ignore_invalid_headers off;

# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;

ssl_certificate /etc/nginx/swarmlab.crt;
ssl_certificate_key /etc/nginx/swarmlab.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;




location / {
index index.html;
}


}

+ 25308
- 0
package-lock.json
File diff suppressed because it is too large
View File


+ 68
- 0
package.json View File

@@ -0,0 +1,68 @@
{
"name": "bootstrap-vue-example",
"version": "0.1.0",
"private": true,
"scripts": {
"docs:build": "documentation build src/** -f html -o public/docs",
"docs:serve": "documentation build src/** -c jsdoc.conf.json -f html -o public/docs",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^1.2.32",
"@fortawesome/free-brands-svg-icons": "^5.15.1",
"@fortawesome/free-solid-svg-icons": "^5.15.1",
"@fortawesome/vue-fontawesome": "^2.0.0",
"axios": "^0.21.0",
"bootstrap-vue": "^2.19.0",
"express": "^4.17.1",
"file-saver": "^2.0.5",
"import": "^0.0.6",
"jszip": "^3.5.0",
"luxon": "^1.25.0",
"mkdirp": "^0.5.5",
"multilang-extract-comments": "^0.3.3",
"sass": "^1.30.0",
"sass-loader": "^10.1.0",
"socket.io-client": "^3.0.3",
"vee-validate": "^3.4.5",
"vue": "^2.6.12",
"vue-codemirror": "^4.0.6",
"vue-socket.io-extended": "^4.0.5",
"vue-sweetalert2": "^4.1.1",
"vue-template-compiler": "^2.6.12",
"vue-wait": "^1.4.8",
"vue2-datepicker": "^3.8.2",
"vuetable-2": "^1.7.5",
"vuex": "^3.6.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.5.7",
"@vue/cli-service": "^4.5.7"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"rules": {},
"parserOptions": {
"parser": "babel-eslint"
}
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}

+ 50
- 0
run.yml View File

@@ -0,0 +1,50 @@
version: "3.8"

services:
swarmlabclient:
image: hub.swarmlab.io:5443/playground-hybrid-agent:latest
user: root
environment:
- NODENAME={{.Node.Hostname}}
- NODEID={{.Node.ID}}
deploy:
replicas: 1
placement:
max_replicas_per_node: 1
#constraints:
#- node.id==${noderead}
#- node.labels.region==okeanos
resources:
limits:
cpus: '0.50'
memory: 250M
reservations:
cpus: '1'
memory: 750M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 5
window: 120s
update_config:
parallelism: 2
delay: 10s
order: stop-first
ports:
- "55543:443"
- "3000:3000"
networks:
hybrid-net:
volumes:
- ${nodepath}/ecosystem.config.js:/home/node/swarmlab-app/ecosystem.config.js
- ${nodepath}/dist:/home/node/swarmlab-app/dist
- ${nodepath}/src-local/llo/new.js:/home/node/server/llo/new.js
# proxy
- ${nodepath}/nginx/swarmlab-stats-proxy-server.conf:/etc/nginx/conf.d/default.conf
- ${nodepath}/keys/swarmlab.crt:/etc/nginx/swarmlab.crt
- ${nodepath}/keys/swarmlab.key:/etc/nginx/swarmlab.key


networks:
hybrid-net:


+ 8
- 0
run.yml.sh View File

@@ -0,0 +1,8 @@
#docker service rm ondemand_playground_swarmlabclient
#env node7=636656brviohbzo5dhdggba0q \
#env node7=qpszok5px74lqpvidoeq2wyyc \
#docker stack deploy -c run.yml ondemand_playground
env nodepath=$PWD \
docker-compose -f run.yml up -d



+ 48
- 0
src-local/llo/bclient.js View File

@@ -0,0 +1,48 @@
var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

const socketAuth = require('socketio-auth');

socketoptions = {
secure:true,
reconnect: true,
rejectUnauthorized : false
};


// Client
var io2 = require('socket.io-client');
var socket = io2.connect('https://83.212.78.17:3088', socketoptions);

socket.on('connection', s => {
console.error('socket2 connection');
var id = s.id


var roomiot = 'iot'
socket.emit('iot', roomiot);

socket.emit('subscribe', roomiot);

socket.emit('pingServerEmit', roomiot);


s.on('message', function (data) {
console.log('from room1 '+data);
});
s.on('iot', function (data) {
console.log('from room1 '+data);
});
});

var roomiot = 'iot'
socket.emit('action', roomiot);

socket.on('message', function (data) {
console.log('from room '+data);
});




+ 32
- 0
src-local/llo/client.js View File

@@ -0,0 +1,32 @@
options = {
secure:true,
reconnect: true,
rejectUnauthorized : false
};

// Client
var io2 = require('socket.io-client');
var socket = io2.connect('http://localhost:8084', options);
//var socket = io2.connect('https://service.swarmlab.io:55583');

var msg2 = "hello";
socket.emit('pingServer', msg2);



//var socket = require('socket.io-client')('httpis://localhost:8099');
socket.on('connect', function(){
console.error('connect ...');
//socket.emit("adhoc", 'Hallo World!')
});
socket.on('customEmit', function(data){
console.error('customEmit '+data);
//socket.emit("adhoc", 'Hallo World!')

});
socket.on('disconnect', function(){
console.error('disconnect');

});
//socket.emit("adhoc", 'Hallo World!')


+ 40
- 0
src-local/llo/iotclient.js View File

@@ -0,0 +1,40 @@

var fs = require( 'fs' );
var app = require('express')();
var https = require('https');
var server = https.createServer({
key: fs.readFileSync('./llo/swarmlab.key'),
cert: fs.readFileSync('./llo/swarmlab.crt'),
//ca: fs.readFileSync('./test_ca.crt'),
requestCert: false,
rejectUnauthorized: false
},app);


server.listen(3000, () => console.error('listening on https://localhost:3000/'));
var io = require('socket.io').listen(server);
console.error('socket.io example');



io.on('connection', s => {
if( typeof s !== "undefined" ){
console.error('socket connection');
}

s.on('actionstart', obj => {
console.error('fromclient '+obj);
socket.emit("log", obj)
});
/*
s.on('s1', function(room) {
console.log('leaving room', room);
})
*/
s.on('s1', () => {
console.log('hi from server');
}); // listen to the event


});


+ 381
- 0
src-local/llo/iotserver.js View File

@@ -0,0 +1,381 @@
"use strict"

var pathmodule = require('path');
var app = require('express')();
var http = require('http').Server(app);
var https = require('https');
var CONFIG = require( pathmodule.resolve( __dirname, "runconfig.js" ) );
const io = require("socket.io")(http, {
// pingTimeout: 30000,
// allowUpgrades: false,
// serveClient: false,
// pingInterval: 10000,
// //transports: [ 'websocket', 'polling' ],
// transports: [ 'polling', 'websocket' ],
cors: {
origin: "http://localhost:8080",
methods: ["GET", "POST"],
allowedHeaders: ["my-custom-header"],
credentials: true
},
cookie: {
name: "test",
httpOnly: false,
path: "/custom"
}
});

const { DateTime } = require("luxon");


var async = require("async");
const { check, validationResult } = require('express-validator');
const urlExistSync = require("url-exist-sync");

var express = require('express');
app.use(express.json());

const axios = require('axios');
axios.defaults.timeout = 30000

const helmet = require('helmet');
app.use(helmet());

const cors = require('cors')
const whitelist = [
'http://localhost:8080',
'http://localhost:3080',
'http://localhost:3081',
'http://localhost:3082'
]
const corsOptions = {
credentials: true,
methods: ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS'],
optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
allowedHeaders: [
'Content-Type',
'Authorization',
'X-Requested-With',
'device-remember-token',
'Access-Control-Allow-Origin',
'Access-Control-Allow-Headers',
'Origin',
'Accept'
],
origin: function(origin, callback) {
if (whitelist.indexOf(origin) !== -1) {
callback(null, true)
} else {
callback(null, true)
//callback(new Error('Not allowed by CORS'))
}
}
}
app.use(cors)



// ***************************************************
// checktoken
// ***************************************************

async function checkToken(token) {
const agent = new https.Agent({
rejectUnauthorized: false,
});
const instance = axios.create({
baseURL: 'https://api.swarmlab.io',
withCredentials: true,
rejectUnauthorized: false,
crossdomain: true,
httpsAgent: agent,
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data',
'Authorization': 'Bearer '+token
}
})
try {
var pipelines = {
"source":'ssologin'
}
var params = {
pipeline: pipelines
}

var options = {
headers: { 'content-type': 'application/x-www-form-urlencoded',Authorization: `Bearer ${token}` },
};

instance.defaults.timeout = 30000;
const res = await instance.post('/istokenvalidsso',params,options);
if(res.status == 200){
//console.log("check " +JSON.stringify(res.data))
return res.data
}else{
console.log("noerror: " + res)
return res.status

}
}
catch (err) {
console.error("error: "+err);
var error = new Object();
error.action = '401'
return error
}
}


function convertDateToUTC(date) {
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(),date.getUTCMilliseconds());
}

// ***************************************************
// get pipelines
// ***************************************************

async function getpipelines(token,pipelinename) {
const agent = new https.Agent({
rejectUnauthorized: false,
});
const instance = axios.create({
baseURL: 'https://api.swarmlab.io',
withCredentials: true,
rejectUnauthorized: false,
crossdomain: true,
httpsAgent: agent,
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data',
'Authorization': 'Bearer '+token
}
})
/*
var params = {
playbook: value
}
var options = {
params: params,
headers: { 'content-type': 'application/x-www-form-urlencoded',Authorization: `Bearer ${token}` },
};

const playbook = await api.GET('playbookCode',options);
return playbook
*/
try {

var pipelines = {
"querytokenFilter":CONFIG.api.token,
"filter":pipelinename
}
//var params = {
// pipeline: pipelines
// }
var params = {
querytokenFilter:CONFIG.api.token,
filter:pipelinename
}

var options = {
params: params,
headers: { 'content-type': 'application/x-www-form-urlencoded',Authorization: `Bearer ${token}` },
};

//https://api.swarmlab.io/gettutorlabrooms?sort=pipelinename%7Casc&page=1&per_page=5&filter=&type=scripts&tutor=yes
instance.defaults.timeout = 30000;
//const res = await instance.get('/getplaygrounds',params,options);
const res = await instance.get('/getplaygrounds',options);
if(res.status == 200){
return res.data
}else{
console.log("noerror: " + res)
return await res.status

}
}
catch (err) {
console.error("error: "+err);
var error = new Object();
error.action = '401'
return await error
}
}

// ***************************************************
// get user pipelines
// ***************************************************

async function getuserpipelines(token,user,swarmlabname) {
var pipelinename = user
const agent = new https.Agent({
rejectUnauthorized: false,
});
const instance = axios.create({
baseURL: 'https://api.swarmlab.io',
withCredentials: true,
rejectUnauthorized: false,
crossdomain: true,
httpsAgent: agent,
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data',
'Authorization': 'Bearer '+token
}
})
try {

var pipelines = {
"querytokenFilter":CONFIG.api.token,
"filter":pipelinename,
swarmlabname:swarmlabname
}
//var params = {
// pipeline: pipelines
// }
var params = {
querytokenFilter:CONFIG.api.token,
filter:pipelinename,
swarmlabname:swarmlabname
}

var options = {
params: params,
headers: { 'content-type': 'application/x-www-form-urlencoded',Authorization: `Bearer ${token}` },
};

instance.defaults.timeout = 30000;
const res = await instance.get('/getuserplaygrounds',options);
if(res.status == 200){
return res.data
}else{
console.log("noerror: " + res)
return await res.status

}
}
catch (err) {
console.error("error: "+err);
var error = new Object();
error.action = '401'
error.error = err
return await error
}
}


global.online='ob';
global.pipelines=[];


// ***************************************************
// rest get
// ***************************************************




app.get('/run', (req, res, next) => {

(async() => {

var RES = new Object();
RES.code = req.query["action"]
RES.token = req.query["token"]
RES.error = false
RES.error_msg = "ok"
res.json(RES)
})()

});


// ***************************************************
// socket
// ***************************************************

//function getSHA256ofJSON(input){
// return require("crypto").createHash("sha256").update(JSON.stringify(input)).digest("hex");
//}

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

function getSHA256ofJSON(data, inputEncoding, encoding){
if (!data) {
return '';
}
inputEncoding = inputEncoding || 'utf-8';
encoding = encoding || 'hex';
const hash = require("crypto").createHash('md5');
return hash.update(JSON.stringify(data), inputEncoding).digest(encoding);
}





io.on('connection', s => {
console.error('socket connection');

// ------------------------------
// --- set
// ------------------------------
var usersession = new Object();
usersession.SOCKET = {};
usersession.SOCKET.error = {};
console.error('socket ...');
//s.auth = false;
s.auth = true;

// ------------------------------
// --- authenticate
// ------------------------------
s.on('authenticate', function(data){
const token = data
//console.log('invalid 1 ' + token);
console.log("check " +JSON.stringify(data))
(async() => {
//var isvalid = await checkToken(token);
//
/*
if(isvalid.action == 'ok'){
console.log("Authserver ok ", s.id + ' - ' + token);
usersession.SOCKET.user = isvalid.user
usersession.SOCKET.scope = isvalid.scope // space delimeter
usersession.SOCKET.token = isvalid.token
s.auth = true;
}else{
console.log("Authserver no ", s.id + ' - ' + token);
s.auth = false;
}
*/
s.auth = true;
})()
});
/*
setTimeout(function(){
if (!s.auth) {
console.log("Disconnecting timeout socket ", s.id);
//s.disconnect('unauthorized');
}else{
var room = usersession.SOCKET.user
//s.on("subscribe", function (room) {
s.join(room);
console.log("joining rooom", s.rooms);
console.log(room + ' created ')
// });
}
}, 30000);
*/

var id = s.id
s.on('action', obj => {
console.error('from client '+ s.id + ' obj ' + obj);
});
});

http.listen(3000, () => console.error('listening on http://localhost:3000/'));
console.error('socket.io example');

+ 27
- 0
src-local/llo/new.js View File

@@ -0,0 +1,27 @@

var fs = require('fs');
var https = require('https');

var express = require('express');
var app = express();

var options = {
key: fs.readFileSync('./llo/swarmlab.key'),
cert: fs.readFileSync('./llo/swarmlab.crt')
};
var serverPort = 3000;

var server = https.createServer(options, app);
var io = require('socket.io')(server);

io.on('connection', function(socket) {
console.log('new connection');
socket.on('s1', () => {
console.log('hi from server');
});
//socket.emit('message', 'This is a message from the dark side.');
});

server.listen(serverPort, function() {
console.log('server up and running at %s port', serverPort);
});

+ 29
- 0
src-local/llo/pubsub.js View File

@@ -0,0 +1,29 @@
var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

/*
// server side code
io.sockets.on('connection', function(socket) {
socket.on('create', function(room) {
socket.join(room);
});
});

*/


io.on('connection', s => {

s.on("iot", function (room) {
s.join(room);
console.error('hi');
s.to(room).emit('message', 'hi from server');
io.emit('iotdata', 'hi from server');
});

});


http.listen(8084, () => console.error('listening on http://localhost:8084/'));

+ 11
- 0
src-local/llo/runconfig.js View File

@@ -0,0 +1,11 @@
var config = {};

config.mongo = {};
config.redis = {};

config.mongo.user = 'user1'
config.mongo.password= 'pass1'
config.redis.host = 'redisserver';
config.redis.port = 6379;

module.exports = config;

+ 33
- 0
src-local/llo/swarmlab.crt View File

@@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFqzCCA5OgAwIBAgIUL0lHp+0sOfYgkUXnsDkEwiUdPCIwDQYJKoZIhvcNAQEL
BQAwZTELMAkGA1UEBhMCR1IxDzANBgNVBAgMBkFUVElDQTEPMA0GA1UEBwwGQXRo
ZW5zMREwDwYDVQQKDAhzd2FybWxhYjEhMB8GA1UEAwwYaHlicmlkLWxvY2FsLnN3
YXJtbGFiLmlvMB4XDTIwMTIyNTE5MTU0NloXDTIxMTIyNTE5MTU0NlowZTELMAkG
A1UEBhMCR1IxDzANBgNVBAgMBkFUVElDQTEPMA0GA1UEBwwGQXRoZW5zMREwDwYD
VQQKDAhzd2FybWxhYjEhMB8GA1UEAwwYaHlicmlkLWxvY2FsLnN3YXJtbGFiLmlv
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0raMBeIQWyvEzTRnV6vq
Nfuq74LyCGLAiywwsSSgQ+UasVDWDKIuzHY87F/eS5+D3u/GiCRwOgW2XovS8prR
FZATt8/Qe2pCIvf0QTb8K5Y6raqgeBGVpB7kcleC2+UsGX0cQMmeUoIZnBR9vXOY
mrIE9Lf3AeGx8omFmcuW07b7RICcRE508flmpcN0gkCARr99JI59O1BwueOlhpKe
fdg7kHgL3XTpoIUimdaEp+wqIjqNytiD3mlCKazVjHdHlQ0aiBpUahiLKmMPLpJS
dejmdxHAidDsVCkOdTZbC+JHWFCnL8hiJ3JwQjRd2dzhMIGAqqjuFQ7ZnUx20r8b
IBKXBOvzfHrNx+SmSJE/xldxBycrDu3hcaZINaR+aWk9TUQnUC1pQ+JfDw8z/BSo
YOWBSy/4qnrYcYp9zRQA/92Oaf9lKmrAKbq2jOnaRF8KtXZ7eotiaoeAZuSAg6ps
es42tFwa5MenY5thVzZzhsC0+ko/yo34hv3tUNbbcZWW5p5PHQxIQBOZGKAD518V
aCbPIaFzSCnG+ybO9Y9Xo7Ow1gpaq3OGvuEoUh/BTCbTnuNF8G4dr/TX5v4pM+l8
MmoWONaC75xHJqbWoJM1gJZ/E8B+ZwlbqGrpfVZK7aCDldbDSXLpB8jTkVhpW2T/
6YWp95ggOTtHa/LN2xXQiYMCAwEAAaNTMFEwHQYDVR0OBBYEFBlHSKfFzhQmEbI3
6RFL6uJgkxCyMB8GA1UdIwQYMBaAFBlHSKfFzhQmEbI36RFL6uJgkxCyMA8GA1Ud
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAJnwaDyeacNIT8mW1llQx1Af
XLUeiyoCOzh1VQpMXBIvXTiRa30LNLAgN+2bj1z3AccsAvaUYuYq+VOIsshEoiYn
1V7iWUs5QvnCQs/6XmcMBvR99aumTUROs8lw1D27l+baysEElcEHHT8t41Omh8Wt
oSTyGL4t55OZBRdvbDdx0EgjFekx3m6rPDzYg/NsGFub2BQFJtRCzxmSlXcNA3L2
tuYOqouZz550DEB1zJvkrjKjT42vjJ/sCox9PrXyFb5UVxJDjfmJ/NwYTrlWi+TI
4nwm982DFTR0Q2Jc0R43HZSavKglypOOda3tAzOwzXR1P8xoUUnG1cA8ZCRt0kZ6
MQkLHgnx4CoHclu0cGxFyYQNs+P37rGupJNaARgJNhsBl+Sc+nzEKHijoBaBjwly
nYiendESj+fyUlYYGq2lCZ39D++xyn1diOxcIM0gchPZFlhUTUgInpUZaszzTp2a
+C114D8NK9vl07xKe2VAO8KWm4k/I+52dCDQ0oFO5T0Yvg2rRX2ffln2C7vAmHe7
Zd/wfKEGe2gkiVrs9M8Merp6k3eG+MwKAEtWxEwWishIxXGJHmhA9YiGtrxddwZE
dEgm+jKE93+mVE4ko86TjEN10Cfy/3jVLr1t8SA5lyMQ7FDbEFVW6wmuga4u/jgL
Bb/FRHnahLPywvkzeita
-----END CERTIFICATE-----

+ 52
- 0
src-local/llo/swarmlab.key View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
lHniiVatSmynsipyyn6L7yXUElS7FaW5
-----END PRIVATE KEY-----

+ 11
- 0
src-local/myconfig/runconfig.js View File

@@ -0,0 +1,11 @@
var config = {};

config.mongo = {};
config.redis = {};

config.mongo.user = 'user1'
config.mongo.password= 'pass1'
config.redis.host = 'redisserver';
config.redis.port = 6379;

module.exports = config;

+ 2531
- 0
src-local/package-lock.json
File diff suppressed because it is too large
View File


+ 16
- 0
src-local/package.json View File

@@ -0,0 +1,16 @@
{
"name": "swarmlab-agent",
"version": "1.0.0",
"description": "swarmlab on node",
"main": "server.js",
"scripts": {
"start": "node ./llo/server.js"
},
"dependencies": {
"async": "^3.2.0",
"chai": "^4.2.0",
"express": "^4.17.1",
"helmet": "^4.1.1",
"url-exist-sync": "^1.0.2"
}
}

+ 132
- 0
src/App.vue View File

@@ -0,0 +1,132 @@
<template>
<div id="app">

<nav class="navbar navbar-light navbar-expand-md bg-light justify-content-md-center justify-content-start">
<b-navbar-brand class="logo simple-text ti-swarmlab text-secondary">
Swarmlab.io
</b-navbar-brand>
<div class="navbar-collapse collapse justify-content-between align-items-center w-100" id="collapsingNavbar2">
<ul class="navbar-nav mx-auto text-md-center text-left">
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"
@click="hybrid('bootstrap')"
>myNetwork</a>
</li>
<li class="nav-item my-auto">
<a class="nav-link navbar-brand mx-0 d-none d-md-inline" href="">Hybrid</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
</ul>
<ul class="nav navbar-nav flex-row justify-content-md-center justify-content-start flex-nowrap">
<b-nav-item href="https://git.swarmlab.io:3000" target="_swarmlabgit"> Swarmlab_git </b-nav-item>
<b-nav-item > | </b-nav-item>
<b-nav-item :href="'https://api-client.swarmlab.io:8088/?token='+ token" target="_swarmlab"> Lab_onDemand </b-nav-item>
<b-nav-item > </b-nav-item>
</ul>
</div>
</nav>


<!-- ***************** container items ****************** -->
<b-row>
<b-col cols="12">


<network-table
style="background-color: #f8f9fa"
>
</network-table>


</b-col>
</b-row>
<b-row>
<b-col cols="12">
<!--
<doc-grep
style="background-color: #f8f9fa"
>
</doc-grep>

-->
</b-col>
</b-row>




</div>
</template>

<script>
import "@/assets/css/themify-icons.css";

//import NetworkTable from "./components/mynetwork/mytable.vue";
import NetworkTable from "./components/mynetwork.vue";

export default {
name: 'app',
components: {
NetworkTable
},
data() {
return {
show: true,
token: '',
SwarmabAsciiLabTemplate:''
}
},
mounted() {
},
created() {
},
methods: {
hybrid(action) {
console.log(action)
}

}
}
</script>

<style>
@import url('https://fonts.googleapis.com/css?family=Lato:400,700');


body {
background: #EEF1F4 !important;
}

.nav-background {
background: #353535;
}

.ti-swarmlab:before {
position: relative;
top:-5px;
right:-8px;
font-size: 1.5em;
font-weight: 300;
content: "\e606";
color: #222;
color: #74B3C8;
border-color: #c60000;
}

.ti-themify-logo:before {
content: "\e6d1";
}

.menoutext {
font-family: 'Lato', sans-serif !important;
}

</style>

+ 250
- 0
src/assets/css/_cards.scss View File

@@ -0,0 +1,250 @@
@import "@/assets/css/_variables.scss";
.card {
border-radius: $border-radius-extreme;
box-shadow: 0 2px 2px rgba(204, 197, 185, 0.5);
background-color: #FFFFFF;
color: $card-black-color;
margin-bottom: 20px;
position: relative;
z-index: 1;
border: none;

.card-image {
width: 100%;
overflow: hidden;
height: 260px;
border-radius: $border-radius-extreme $border-radius-extreme 0 0;
position: relative;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;

img {
width: 100%;
}
}
.card-body {
padding: 15px 15px 10px 15px;
}
.card-header {
padding: 20px 20px 0;
border-bottom: 0;
background-color: transparent;
}
.description {
font-size: $font-paragraph;
color: $font-color;
}

h6 {
font-size: $font-size-small;
margin: 0;
}
.card-category,
label {
font-size: $font-size-base;
font-weight: $font-weight-normal;
color: $dark-gray;
margin-bottom: 0px;
i {
font-size: $font-paragraph;
}
}

label {
font-size: 15px;
margin-bottom: 5px;
}

.card-title {
margin: $none;
color: $card-black-color;
font-weight: $font-weight-light;
}
.avatar {
width: 50px;
height: 50px;
overflow: hidden;
border-radius: 50%;
margin-right: 5px;
}
.footer {
padding: 0;
line-height: 30px;

.legend {
padding: 5px 0;
}

hr {
margin-top: 5px;
margin-bottom: 5px;
}
}
.stats {
color: #a9a9a9;
font-weight: 300;
i {
margin-right: 2px;
min-width: 15px;
display: inline-block;
}
}
.footer div {
display: inline-block;
}

.author {
font-size: $font-size-small;
font-weight: $font-weight-bold;
text-transform: uppercase;
}
.author i {
font-size: $font-size-base;
}

&.card-separator:after {
height: 100%;
right: -15px;
top: 0;
width: 1px;
background-color: $medium-gray;
content: "";
position: absolute;
}

.ct-chart {
margin: 30px 0 30px;
height: 245px;
}

.table {
tbody td:first-child,
thead th:first-child {
padding-left: 15px;
}

tbody td:last-child,
thead th:last-child {
padding-right: 15px;
}
}

.alert {
border-radius: $border-radius-base;
position: relative;

&.alert-with-icon {
padding-left: 65px;
}
}
.icon-big {
font-size: 3em;
min-height: 64px;
}
.numbers {
font-size: 2em;
text-align: right;
p {
margin: 0;
}
}
ul.team-members {
li {
padding: 10px 0px;
&:not(:last-child) {
border-bottom: 1px solid $medium-pale-bg;
}
}
}
}

.card-user {
.image {
border-radius: 8px 8px 0 0;
height: 150px;
position: relative;
overflow: hidden;

img {
width: 100%;
}
}
.image-plain {
height: 0;
margin-top: 110px;
}
.author {
text-align: center;
text-transform: none;
margin-top: -65px;
.title {
color: $default-states-color;
small {
color: $card-muted-color;
}
}
}
.avatar {
width: 100px;
height: 100px;
border-radius: 50%;
position: relative;
margin-bottom: 15px;

&.border-white {
border: 5px solid $white-color;
}
&.border-gray {
border: 5px solid $card-muted-color;
}
}
.card-title {
font-weight: 600;
line-height: 24px;
}
.description {
margin-top: 10px;
}
.card-body {
min-height: 200px;
}

&.card-plain {
.avatar {
height: 190px;
width: 190px;
}
}
}

.card-map {
.map {
height: 500px;
padding-top: 20px;

> div {
height: 100%;
}
}
}

.card-user,
.card-price {
.card-footer {
padding: 5px 15px 10px;
}
hr {
margin: 5px 15px;
}
}

.card-plain {
background-color: transparent;
box-shadow: none;
border-radius: 0;

.image {
border-radius: 4px;
}
}

+ 254
- 0
src/assets/css/_variables.scss View File

@@ -0,0 +1,254 @@
$font-color: #66615b !default;
$fill-font-color: rgba(255, 255, 255, 0.7);

$none: 0 !default;
$border-thin: 1px !default;
$border-thick: 2px !default;

$white-color: #FFFFFF !default;
$white-bg: #FFFFFF !default;

$smoke-bg: #F5F5F5 !default;
$pale-bg: #FFFCF5 !default;
$medium-pale-bg: #F1EAE0 !default;

$table-line-color: #CCC5B9 !default;
$muted-color: #a49e93 !default;

$black-bg: rgba(30, 30, 30, .97) !default;

$black-color: #333333 !default;
$black-hr: #444444 !default;

$white-background-color: #FFFFFF !default;
$black-background-color: #212120 !default;
$darkblue-background-color: #35495E !default; // this is the dark blue color from Vue.js branding

$light-gray: #E3E3E3 !default;
$medium-gray: #DDDDDD !default;
$dark-gray: #9A9A9A !default;

$gray-input-bg: #fffcf5 !default;
$danger-input-bg: #FFC0A4 !default;
$success-input-bg: #ABF3CB !default;
$other-medium-gray: #A49E93 !default;
$transparent-bg: transparent !default;

$default-color: #66615B !default;
$default-bg: #66615B !default;
$default-states-color: #403D39 !default;

$primary-color: #7A9E9F !default;
$primary-bg: #7A9E9F !default;
$primary-states-color: #427C89 !default;

$success-color: #41B883 !default; // this is the green color from Vue.js branding
$success-bg: #41B883 !default;
$success-states-color: #229863 !default;

$info-color: #68B3C8 !default;
$info-bg: #68B3C8 !default;
$info-states-color: #3091B2 !default;

$warning-color: #F3BB45 !default;
$warning-bg: #F3BB45 !default;
$warning-states-color: #BB992F !default;

$danger-color: #EB5E28 !default;
$danger-bg: #EB5E28 !default;
$danger-states-color: #B33C12 !default;

$link-disabled-color: #666666 !default;

/* light colors - used for select dropdown */

$light-blue: rgba($primary-color, .2);
$light-azure: rgba($info-color, .2);
$light-green: rgba($success-color, .2);
$light-orange: rgba($warning-color, .2);
$light-red: rgba($danger-color, .2);

//== Components
//
$padding-base-vertical: 7px !default;
$padding-base-horizontal: 18px !default;

$padding-round-vertical: 9px !default;
$padding-round-horizontal: 18px !default;

$padding-simple-vertical: 10px !default;
$padding-simple-horizontal: 18px !default;

$padding-large-vertical: 11px !default;
$padding-large-horizontal: 30px !default;

$padding-small-vertical: 4px !default;
$padding-small-horizontal: 10px !default;

$padding-xs-vertical: 2px !default;
$padding-xs-horizontal: 5px !default;

$padding-label-vertical: 2px !default;
$padding-label-horizontal: 12px !default;

// padding for links inside dropdown menu
$padding-dropdown-vertical: 10px !default;
$padding-dropdown-horizontal: 15px !default;

$margin-large-vertical: 30px !default;
$margin-base-vertical: 15px !default;

// border radius for buttons
$border-radius-btn-small: 26px !default;
$border-radius-btn-base: 20px !default;
$border-radius-btn-large: 50px !default;

// Cristina: am schimbat aici si s-au modificat inputurile
$margin-bottom: 0 0 10px 0 !default;
$border-radius-small: 3px !default;
$border-radius-base: 4px !default;
$border-radius-large: 6px !default;
$border-radius-extreme: 6px !default;

$border-radius-large-top: $border-radius-large $border-radius-large 0 0 !default;
$border-radius-large-bottom: 0 0 $border-radius-large $border-radius-large !default;

$btn-round-radius: 30px !default;

$height-base: 40px !default;

$font-size-base: 14px !default;
$font-size-xs: 12px !default;
$font-size-small: 12px !default;
$font-size-medium: 16px !default;
$font-size-large: 18px !default;
$font-size-large-navbar: 20px !default;

$font-size-h1: 3.2em !default;
$font-size-h2: 2.6em !default;
$font-size-h3: 1.825em !default;
$font-size-h4: 1.5em !default;
$font-size-h5: 1.25em !default;
$font-size-h6: 0.9em !default;
$font-paragraph: 16px !default;
$font-size-navbar: 16px !default;
$font-size-small: 12px !default;

$font-weight-light: 300 !default;
$font-weight-normal: 400 !default;
$font-weight-semi: 500 !default;
$font-weight-bold: 600 !default;

$line-height-small: 20px !default;
$line-height-general: 1.4em !default;
$line-height: 36px !default;
$line-height-lg: 54px !default;

$border-radius-top: 10px 10px 0 0 !default;
$border-radius-bottom: 0 0 10px 10px !default;

$dropdown-shadow: 0 2px rgba(17, 16, 15, 0.1), 0 2px 10px rgba(17, 16, 15, 0.1);

$general-transition-time: 300ms !default;

$slow-transition-time: 300ms !default;
$dropdown-coordinates: 29px -50px !default;

$fast-transition-time: 150ms !default;
$select-coordinates: 50% -40px !default;

$transition-linear: linear !default;
$transition-bezier: cubic-bezier(0.34, 1.61, 0.7, 1) !default;
$transition-ease: ease 0s;

$navbar-padding-a: 10px 15px;
$navbar-margin-a: 15px 0px;

$padding-social-a: 10px 5px;

$navbar-margin-a-btn: 15px 3px;
$navbar-margin-a-btn-round: 16px 3px;

$navbar-padding-brand: 20px 15px;
$navbar-margin-brand: 5px 0px;

$navbar-margin-brand-icons: 12px auto;

$navbar-margin-btn: 15px 3px;

$height-icon: 64px !default;
$width-icon: 64px !default;
$padding-icon: 12px !default;
$border-radius-icon: 15px !default;

$white-navbar: rgba(#FFFFFF, .96);
$blue-navbar: rgba(#34ACDC, .98);
$azure-navbar: rgba(#5BCAFF, .98);
$green-navbar: rgba(#4CD964, .98);
$orange-navbar: rgba(#FF9500, .98);
$red-navbar: rgba(#FF4C40, .98);

$bg-nude: #f4f3ef !default;
$bg-primary: #8ECFD5 !default;
$bg-info: #7CE4FE !default;
$bg-success: #8EF3C5 !default;
$bg-warning: #FFE28C !default;
$bg-danger: #FF8F5E !default;

$topbar-x: topbar-x !default;
$topbar-back: topbar-back !default;
$bottombar-x: bottombar-x !default;
$bottombar-back: bottombar-back !default;

$transition-linear: linear !default;
$transition-bezier: cubic-bezier(0.34, 1.61, 0.7, 1) !default;
$transition-ease: ease 0s;
$transition-ease-in: ease-in !default;
$transition-ease-out: ease-out !default;

$general-transition-time: 300ms !default;

$slow-transition-time: 370ms !default;
$dropdown-coordinates: 29px -50px !default;

$fast-transition-time: 150ms !default;

$ultra-fast-transition-time: 100ms !default;

$select-coordinates: 50% -40px !default;

$padding-zero: 0px !default;

$sidebar-width: calc(100% - 260px) !default;
$medium-dark-gray: #AAAAAA !default;

//variables used in cards
$card-black-color: #252422 !default;
$card-muted-color: #ccc5b9 !default;

//variables used for sidebar
$sidebar-background-dark-blue: #506367;

$sidebar-background-blue: #b8d8d8 !default;
$sidebar-font-blue: #506568 !default;
$sidebar-subtitle-blue: #7a9e9f !default;

$sidebar-background-green: #d5e5a3 !default;
$sidebar-font-green: #60773d !default;
$sidebar-subtitle-green: #92ac56 !default;

$sidebar-background-yellow: #ffe28c !default;
$sidebar-font-yellow: #b25825 !default;
$sidebar-subtitle-yellow: #d88715 !default;

$sidebar-background-brown: #d6c1ab !default;
$sidebar-font-brown: #75442e !default;
$sidebar-subtitle-brown: #a47e65 !default;

$sidebar-background-purple: #baa9ba !default;
$sidebar-font-purple: #3a283d !default;
$sidebar-subtitle-purple: #5a283d !default;

$sidebar-background-orange: #ff8f5e !default;
$sidebar-font-orange: #772510 !default;
$sidebar-subtitle-orange: #e95e37 !default;

+ 1153
- 0
src/assets/css/themify-icons.css
File diff suppressed because it is too large
View File


BIN
src/assets/fonts/glyphicons-halflings-regular.448c34a.woff2 View File


BIN
src/assets/fonts/glyphicons-halflings-regular.e18bbf6.ttf View File


BIN
src/assets/fonts/glyphicons-halflings-regular.f4769f9.eot View File


BIN
src/assets/fonts/glyphicons-halflings-regular.fa27723.woff View File


BIN
src/assets/fonts/themify.eot View File


+ 362
- 0
src/assets/fonts/themify.svg
File diff suppressed because it is too large
View File


BIN
src/assets/fonts/themify.ttf View File


BIN
src/assets/fonts/themify.woff View File


BIN
src/assets/img/apple-icon.png View File

Before After
Width: 76  |  Height: 76  |  Size: 2.4KB

BIN
src/assets/img/background.jpg View File

Before After
Width: 356  |  Height: 265  |  Size: 38KB

BIN
src/assets/img/code-128.png View File

Before After
Width: 128  |  Height: 128  |  Size: 1.6KB

BIN
src/assets/img/docker.png View File

Before After
Width: 200  |  Height: 200  |  Size: 16KB

+ 5
- 0
src/assets/img/docker.svg View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4.4 67.6.1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z"/></svg>
<!--
Font Awesome Free 5.5.0 by @fontawesome - https://fontawesome.com
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
-->

BIN
src/assets/img/faces/face-0.jpg View File

Before After
Width: 200  |  Height: 200  |  Size: 18KB

BIN
src/assets/img/faces/face-1.jpg View File

Before After
Width: 120  |  Height: 120  |  Size: 20KB

BIN
src/assets/img/faces/face-2.jpg View File

Before After
Width: 300  |  Height: 301  |  Size: 55KB

BIN
src/assets/img/faces/face-3.jpg View File

Before After
Width: 200  |  Height: 200  |  Size: 41KB

BIN
src/assets/img/favicon.png View File

Before After
Width: 96  |  Height: 96  |  Size: 2.7KB

+ 288
- 0
src/assets/img/glyphicons-halflings-regular.8988968.svg View File

@@ -0,0 +1,288 @@
<?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 horiz-adv-x="0" />
<glyph horiz-adv-x="400" />
<glyph unicode=" " />
<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
<glyph unicode="&#x2000;" horiz-adv-x="650" />
<glyph unicode="&#x2001;" horiz-adv-x="1300" />
<glyph unicode="&#x2002;" horiz-adv-x="650" />
<glyph unicode="&#x2003;" horiz-adv-x="1300" />
<glyph unicode="&#x2004;" horiz-adv-x="433" />
<glyph unicode="&#x2005;" horiz-adv-x="325" />
<glyph unicode="&#x2006;" horiz-adv-x="216" />
<glyph unicode="&#x2007;" horiz-adv-x="216" />
<glyph unicode="&#x2008;" horiz-adv-x="162" />
<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="325" />
<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.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-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
<glyph unicode="&#xe010;" d="M50 1100h400q21 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.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 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.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 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.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 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.5v400q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe011;" d="M50 1100h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 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.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 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.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 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.5v200q0 21 14.5 35.5 t35.5 14.5z" />
<glyph unicode="&#xe012;" d="M50 1100h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 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.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 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.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />