From 7fbd7423da64ac084261f6d832605bf065fbb5a9 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 15 Jun 2019 16:11:03 +0900 Subject: [PATCH 01/93] Saved on 2019-06-15T07:11:03Z --- README.md | 5 ++++- docs/documentation/index.html | 2 +- docs/documentation/options/index.html | 2 +- docs/index.html | 7 +++++-- docs/sponsor/index.html | 2 +- package.json | 1 + 6 files changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bbea85e7..391a0bae 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,10 @@ const { get, post } = server.router; // Launch server with options and a couple of routes server({ port: 8080 }, [ get('/', ctx => 'Hello world'), - post('/', ctx => console.log(ctx.data)) + post('/', ctx => { + console.log(ctx.data); + return 'ok'; + }) ]); ``` diff --git a/docs/documentation/index.html b/docs/documentation/index.html index 86189dcc..fc2742f8 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -404,4 +404,4 @@

Keep reading

List of all the topics:

+ \ No newline at end of file diff --git a/docs/documentation/options/index.html b/docs/documentation/options/index.html index a86f80a1..dd1958f1 100644 --- a/docs/documentation/options/index.html +++ b/docs/documentation/options/index.html @@ -751,4 +751,4 @@

Keep reading

List of all the topics:

+ \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 8199917b..def43896 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.js for Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

+Server.js

server.js for Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

Subscribe Downloads Status @@ -12,7 +12,10 @@ // Launch server with options and a couple of routes server({ port: 8080 }, [ get('/', ctx => 'Hello world'), - post('/', ctx => console.log(ctx.data)) + post('/', ctx => { + console.log(ctx.data); + return 'ok'; + }) ]);

diff --git a/docs/sponsor/index.html b/docs/sponsor/index.html index 8410fd79..26b15e0e 100644 --- a/docs/sponsor/index.html +++ b/docs/sponsor/index.html @@ -1,4 +1,4 @@ -Sponsor us <3 - server.js

Sponsor

+Sponsor us <3 - server.js

Sponsor

Sponsor

This project is maintained by Francisco Presencia and is part of Francisco IO LTD (UK). It is a lot of work and I'd love if you or your company could help me keep building it and in the process I'll help you with Node.js.

All sponsors will receive an ebook and/or a book for free when released. Besides this, there are some sponsors tiers:

diff --git a/package.json b/package.json index 899a840e..221402e4 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "start": "node .", "dev": "grunt watch", + "build": "grunt", "test": "jest --coverage --forceExit", "kill-comment": "Kill a process running in a specific port: PORT=3000 npm run kill", "kill": "kill $(lsof -t -i:$PORT) && echo '> KILLED!' || echo '> The port was already dead'" From 559878f62f3fdbe0f1b86876a21d5b425a82e668 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 15 Jun 2019 16:15:00 +0900 Subject: [PATCH 02/93] Saved on 2019-06-15T07:15:00Z --- README.md | 11 ----------- docs/index.html | 7 +------ docs/index.html.pug | 15 +++++++-------- 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 391a0bae..4296e272 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,6 @@ server({ port: 8080 }, [ ]); ``` - -

Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.

― Edsger W. Dijkstra @@ -141,15 +139,6 @@ module.exports = [ -## Sponsors - -So far we have one sponsor, [Auth0](https://auth0.com/overview?utm_source=GHsponsor&utm_medium=GHsponsor&utm_campaign=serverjs&utm_content=auth)! Thank you so much ❤. They *are* an awesome service and I'm using it at my job so I was really happy when they reached out. I fully agree with their message: - -If you want to quickly add authentication to Node.js apps, feel free to check out Auth0's Node.js SDK and free plan at [auth0.com/overview](https://auth0.com/overview?utm_source=GHsponsor&utm_medium=GHsponsor&utm_campaign=serverjs&utm_content=auth). - - - - ## Author & support This package was created by [Francisco Presencia](http://francisco.io/) but hopefully developed and maintained by many others. See the [the list of contributors here](https://github.com/franciscop/server/graphs/contributors). diff --git a/docs/index.html b/docs/index.html index def43896..501cf217 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.js for Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

+Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

Subscribe Downloads Status @@ -18,8 +18,6 @@ }) ]); -

-

Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.

― Edsger W. Dijkstra @@ -97,9 +95,6 @@

Real time

socket('disconnect', ctrl.leave) ]; -

Sponsors

-

So far we have one sponsor, Auth0! Thank you so much ❤. They are an awesome service and I'm using it at my job so I was really happy when they reached out. I fully agree with their message:

-

If you want to quickly add authentication to Node.js apps, feel free to check out Auth0's Node.js SDK and free plan at auth0.com/overview.

Author & support

This package was created by Francisco Presencia but hopefully developed and maintained by many others. See the the list of contributors here.

I love using my work and I'm available for contractor work. Freelancing helps maintain server and my other open source projects up to date! I am also on Codementor so if you want to learn more Javascript/Node.js/etc contact me there.

diff --git a/docs/index.html.pug b/docs/index.html.pug index f343502b..8f458c32 100644 --- a/docs/index.html.pug +++ b/docs/index.html.pug @@ -3,8 +3,8 @@ extends _layout/index block content .hero .content - h1 - strong server.js + h1 + strong server.js | for Node div pre.sub npm install server @@ -46,16 +46,15 @@ block content img(src="/img/lego.svg") h2 Extensible p [upcoming in 1.1] - + div.flex.one.three-600 - div.third-600 - a.sponsor(href="https://auth0.com/overview?utm_source=serverjs&utm_medium=devsponsor&utm_campaign=serverjs") - img(src="/img/logo-auth0.png") div a.become-sponsor(href="mailto:public@francisco.io?subject=Sponsor-1st-spot") Become a Sponsor + div + a.become-sponsor(href="mailto:public@francisco.io?subject=Sponsor-2nd-spot") Support Server.js div.none.third-600 - a.become-sponsor(href="mailto:public@francisco.io?subject=Sponsor-2nd-spot") Your logo here - + a.become-sponsor(href="mailto:public@francisco.io?subject=Sponsor-3rd-spot") Your logo here + include:marked:noheader ../README.md From 25358a5aa2b960d056236da19b074eaeb63e2c56 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 15 Jun 2019 16:27:54 +0900 Subject: [PATCH 03/93] Saved on 2019-06-15T07:27:54Z --- docs/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index 501cf217..f1e13665 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

+Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

Subscribe Downloads Status @@ -282,4 +282,4 @@

Author & support

setTimeout(function() { u('a.email').attr('href', 'mailto:public' + '@francisco.i' + 'o?subject=server.js'); }, 2000); - \ No newline at end of file + From 1dafe55af14a0fe7f9e6d47421bedc09ac2fbf1e Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Mon, 23 Sep 2019 19:33:22 +0900 Subject: [PATCH 04/93] Normal font size Normal font size --- docs/assets/style.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/assets/style.scss b/docs/assets/style.scss index 0b6523f1..f202986f 100644 --- a/docs/assets/style.scss +++ b/docs/assets/style.scss @@ -46,7 +46,6 @@ article pre[class*="language-"] { margin-left: 0; width: 100%; padding: .5em .8em; - font-size: 1.2em; line-height: 1.3; } } From d5ae928978892ad3a8975c6dcfe44752308a4c2c Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Mon, 23 Sep 2019 19:35:34 +0900 Subject: [PATCH 05/93] Update style.min.css --- docs/assets/style.min.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/assets/style.min.css b/docs/assets/style.min.css index 7b6cde1a..88f1719a 100644 --- a/docs/assets/style.min.css +++ b/docs/assets/style.min.css @@ -1,2 +1,2 @@ -html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background:transparent;color:#111}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;box-shadow:0 0 transparent inset}button:hover,.button:hover,[type=submit]:hover,.dropimage:hover,button:focus,.button:focus,[type=submit]:focus,.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo[type=submit]:hover,.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo[type=submit]:focus,.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,[type=submit]:active,.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo[type=submit]:active,.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],[disabled].button,[disabled][type=submit],[disabled].dropimage{cursor:default;box-shadow:none;background:#bbb}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #ccc;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #ccc;border-radius:0;cursor:pointer;width:100%;height:2.1em;box-sizing:border-box;padding:.3em .45em;transition:all .3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.3em .45em}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,[type=radio]:focus+.checkable:before,[type=checkbox]:focus+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}[type=radio]:checked+.checkable:after,[type=checkbox]:checked+.checkable:after{background:#555;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}[type=checkbox]:checked+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(0,0,0,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-0.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(17,17,17,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:#111}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(0,0,0,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:0;border-radius:0;border:1px solid #ccc;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#eee}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #eee}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.6);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:0.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;font-size:1.2em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background:transparent;color:#111}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;box-shadow:0 0 transparent inset}button:hover,.button:hover,[type=submit]:hover,.dropimage:hover,button:focus,.button:focus,[type=submit]:focus,.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo[type=submit]:hover,.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo[type=submit]:focus,.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,[type=submit]:active,.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo[type=submit]:active,.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],[disabled].button,[disabled][type=submit],[disabled].dropimage{cursor:default;box-shadow:none;background:#bbb}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #ccc;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #ccc;border-radius:0;cursor:pointer;width:100%;height:2.1em;box-sizing:border-box;padding:.3em .45em;transition:all .3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.3em .45em}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,[type=radio]:focus+.checkable:before,[type=checkbox]:focus+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}[type=radio]:checked+.checkable:after,[type=checkbox]:checked+.checkable:after{background:#555;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}[type=checkbox]:checked+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(0,0,0,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-0.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(17,17,17,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:#111}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(0,0,0,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:0;border-radius:0;border:1px solid #ccc;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#eee}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #eee}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.6);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:0.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} /*# sourceMappingURL=style.min.css.map */ From 3a9e5c6caf1ccc3c157148ff4a27a6927529160c Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 27 Sep 2019 01:18:32 +0900 Subject: [PATCH 06/93] Update index.html --- docs/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.html b/docs/index.html index f1e13665..c6a3aa3b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

+Server.js

server.js for Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

Subscribe Downloads Status From bae3c69b998633bd671433a380ba35bd560dab96 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 28 Sep 2019 11:39:17 +0900 Subject: [PATCH 07/93] Upgraded dependencies --- appveyor.yml | 2 +- package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 921cb25e..f6f8b022 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ environment: matrix: - - nodejs_version: "8.0" + - nodejs_version: "10.0" cache: - node_modules install: diff --git a/package.json b/package.json index 221402e4..cd470077 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "kill": "kill $(lsof -t -i:$PORT) && echo '> KILLED!' || echo '> The port was already dead'" }, "engines": { - "node": ">=7.6.0" + "node": ">=10.0.0" }, "engineStrict": true, "directories": { @@ -39,7 +39,7 @@ "express-data-parser": "^1.2.0", "express-session": "^1.14.2", "extend": "^3.0.0", - "hbs": "^4.0.1", + "hbs": "^4.0.5", "helmet": "^3.9.0", "loadware": "^2.0.0", "log": "^1.4.0", @@ -62,7 +62,7 @@ "grunt-contrib-pug": "^1.0.0", "grunt-contrib-sass": "^1.0.0", "grunt-contrib-watch": "^1.0.0", - "jest": "^21.2.1", + "jest": "^25.0.0", "jstransformer-marked": "^1.0.2", "picnic": "^6.4.0", "request-promises": "^1.0.1", From 338f104210b54a3000ff431a26da67770b0daa3a Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 28 Sep 2019 12:11:01 +0900 Subject: [PATCH 08/93] Added jest config for testing --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index cd470077..ba710c37 100644 --- a/package.json +++ b/package.json @@ -67,5 +67,10 @@ "picnic": "^6.4.0", "request-promises": "^1.0.1", "supertest": "^3.0.0" + }, + "jest": { + "transformIgnorePatterns": [ + "/node_modules/" + ] } } From 3fdbfd5f956c80c60700b2e0e3a35563add027f5 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 18 Oct 2019 18:37:15 +0900 Subject: [PATCH 09/93] Upgraded Jest --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index f6f8b022..64fcc77c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,7 @@ install: - if exist node_modules npm prune - if exist node_modules npm rebuild - npm install - - npm install jest-cli@21.2.1 --save-dev + - npm install jest-cli@25 --save-dev build: off test_script: - node --version From c40ada2b3bcb2c2314c53433e6d9109363d000c5 Mon Sep 17 00:00:00 2001 From: Ridwan Mulyadi Date: Thu, 21 Nov 2019 08:22:33 +0700 Subject: [PATCH 10/93] Update unit.test.js --- plugins/static/unit.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/static/unit.test.js b/plugins/static/unit.test.js index 6d1c9441..0d426148 100644 --- a/plugins/static/unit.test.js +++ b/plugins/static/unit.test.js @@ -24,4 +24,9 @@ describe('static plugin', () => { expect(res.statusCode).toBe(404); expect(out.log).toMatch(/did not return anything/); }); + + it('does not serve if set to false', async () => { + const res = await run({ public: false }).get('/logo.png'); + expect(res.statusCode).toBe(404); + }); }); From 62327a45dbeb3faca5dfbfcf9da49036d815e422 Mon Sep 17 00:00:00 2001 From: Ridwan Mulyadi Date: Thu, 21 Nov 2019 08:31:16 +0700 Subject: [PATCH 11/93] Update index.js --- plugins/static/index.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/static/index.js b/plugins/static/index.js index 54737124..396e8216 100644 --- a/plugins/static/index.js +++ b/plugins/static/index.js @@ -11,8 +11,7 @@ module.exports = { } }, init: ctx => { - module.exports.before = [ - modern(ctx.express.static(ctx.options.static.public)) - ]; + module.exports.before = ctx.options.static.public ? + [modern(ctx.express.static(ctx.options.static.public))] : []; } }; From a2906b50b638af13714383191b77d66a26f68be3 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Thu, 21 Nov 2019 19:06:40 +0900 Subject: [PATCH 12/93] Added another test --- plugins/static/index.js | 6 ++++-- plugins/static/unit.test.js | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/static/index.js b/plugins/static/index.js index 396e8216..bc2c4e9f 100644 --- a/plugins/static/index.js +++ b/plugins/static/index.js @@ -11,7 +11,9 @@ module.exports = { } }, init: ctx => { - module.exports.before = ctx.options.static.public ? - [modern(ctx.express.static(ctx.options.static.public))] : []; + if (!ctx.options.static.public) return; + module.exports.before = [ + modern(ctx.express.static(ctx.options.static.public)) + ]; } }; diff --git a/plugins/static/unit.test.js b/plugins/static/unit.test.js index 0d426148..ad6959dd 100644 --- a/plugins/static/unit.test.js +++ b/plugins/static/unit.test.js @@ -24,9 +24,14 @@ describe('static plugin', () => { expect(res.statusCode).toBe(404); expect(out.log).toMatch(/did not return anything/); }); - + it('does not serve if set to false', async () => { const res = await run({ public: false }).get('/logo.png'); expect(res.statusCode).toBe(404); }); + + it('does not serve if set to false', async () => { + const res = await run({ public: '' }).get('/logo.png'); + expect(res.statusCode).toBe(404); + }); }); From db88c790c95bb37a6b55d632771e9f0728fdfcb2 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Thu, 21 Nov 2019 19:10:26 +0900 Subject: [PATCH 13/93] Logging the log --- plugins/static/unit.test.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/static/unit.test.js b/plugins/static/unit.test.js index ad6959dd..462989c5 100644 --- a/plugins/static/unit.test.js +++ b/plugins/static/unit.test.js @@ -26,12 +26,20 @@ describe('static plugin', () => { }); it('does not serve if set to false', async () => { + let out = {}; + const log = storeLog(out); const res = await run({ public: false }).get('/logo.png'); + expect(res.statusCode).toBe(404); + expect(out.log).toMatch(/did not return anything/); }); it('does not serve if set to false', async () => { + let out = {}; + const log = storeLog(out); const res = await run({ public: '' }).get('/logo.png'); + expect(res.statusCode).toBe(404); + expect(out.log).toMatch(/did not return anything/); }); }); From 79610aed5dbec410c93c0239b552a47404ea258c Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Thu, 21 Nov 2019 19:10:54 +0900 Subject: [PATCH 14/93] Passing the log options to run() --- plugins/static/unit.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/static/unit.test.js b/plugins/static/unit.test.js index 462989c5..fafd8ce0 100644 --- a/plugins/static/unit.test.js +++ b/plugins/static/unit.test.js @@ -28,7 +28,7 @@ describe('static plugin', () => { it('does not serve if set to false', async () => { let out = {}; const log = storeLog(out); - const res = await run({ public: false }).get('/logo.png'); + const res = await run({ public: false, log }).get('/logo.png'); expect(res.statusCode).toBe(404); expect(out.log).toMatch(/did not return anything/); @@ -37,7 +37,7 @@ describe('static plugin', () => { it('does not serve if set to false', async () => { let out = {}; const log = storeLog(out); - const res = await run({ public: '' }).get('/logo.png'); + const res = await run({ public: '', log }).get('/logo.png'); expect(res.statusCode).toBe(404); expect(out.log).toMatch(/did not return anything/); From 8419c84a972934a26d6e3edda038c218c494aa03 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Thu, 21 Nov 2019 19:18:08 +0900 Subject: [PATCH 15/93] 1.0.20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba710c37..d4d4ce9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.19", + "version": "1.0.20", "description": "A modern and powerful server for Node.js", "main": "server.js", "scripts": { From 46216dfafc3608c05dddb697275fa94caebb2ec7 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 30 Nov 2019 19:08:36 +0900 Subject: [PATCH 16/93] Add empty request fallback for socket.io. Fixes #122 --- plugins/session/index.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/plugins/session/index.js b/plugins/session/index.js index ca63d5b2..15d38b29 100644 --- a/plugins/session/index.js +++ b/plugins/session/index.js @@ -1,14 +1,14 @@ -const modern = require('../../src/modern'); -const server = require('../../server'); -const session = require('express-session'); +const modern = require("../../src/modern"); +const server = require("../../server"); +const session = require("express-session"); server.session = session; -const RedisStore = require('connect-redis')(server.session); +const RedisStore = require("connect-redis")(server.session); let sessionMiddleware; module.exports = { - name: 'session', + name: "session", options: { - __root: 'secret', + __root: "secret", resave: { default: false }, @@ -20,8 +20,8 @@ module.exports = { }, secret: { type: String, - inherit: 'secret', - env: 'SESSION_SECRET' + inherit: "secret", + env: "SESSION_SECRET" }, store: { env: false @@ -29,19 +29,21 @@ module.exports = { redis: { type: String, inherit: true, - env: 'REDIS_URL' + env: "REDIS_URL" } }, init: ctx => { if (!ctx.options.session.store && ctx.options.session.redis) { - ctx.options.session.store = new RedisStore({ url: ctx.options.session.redis }); + ctx.options.session.store = new RedisStore({ + url: ctx.options.session.redis + }); } sessionMiddleware = session(ctx.options.session); }, before: ctx => modern(sessionMiddleware)(ctx), launch: ctx => { - ctx.io.use(function (socket, next) { - sessionMiddleware(socket.request, socket.request.res, next); + ctx.io.use(function(socket, next) { + sessionMiddleware(socket.request, socket.request.res || {}, next); }); } }; From f1a6cfad7bc054cbbb9624c08e757d210ce8c78a Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 30 Nov 2019 19:09:07 +0900 Subject: [PATCH 17/93] 1.0.21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4d4ce9d..3ab7b953 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.20", + "version": "1.0.21", "description": "A modern and powerful server for Node.js", "main": "server.js", "scripts": { From ddf11164ded2435e380f7a635346acff1d12dae9 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sat, 30 Nov 2019 20:14:51 +0900 Subject: [PATCH 18/93] Single quotes --- plugins/session/index.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/session/index.js b/plugins/session/index.js index 15d38b29..798ed107 100644 --- a/plugins/session/index.js +++ b/plugins/session/index.js @@ -1,14 +1,14 @@ -const modern = require("../../src/modern"); -const server = require("../../server"); -const session = require("express-session"); +const modern = require('../../src/modern'); +const server = require('../../server'); +const session = require('express-session'); server.session = session; -const RedisStore = require("connect-redis")(server.session); +const RedisStore = require('connect-redis')(server.session); let sessionMiddleware; module.exports = { - name: "session", + name: 'session', options: { - __root: "secret", + __root: 'secret', resave: { default: false }, @@ -20,8 +20,8 @@ module.exports = { }, secret: { type: String, - inherit: "secret", - env: "SESSION_SECRET" + inherit: 'secret', + env: 'SESSION_SECRET' }, store: { env: false @@ -29,7 +29,7 @@ module.exports = { redis: { type: String, inherit: true, - env: "REDIS_URL" + env: 'REDIS_URL' } }, init: ctx => { From 68f4921d29dc39aa4c32b6ba0c8a283a7d59f1bd Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Mon, 13 Jan 2020 17:48:53 +0900 Subject: [PATCH 19/93] Cleaned up package.json --- .github/FUNDING.yml | 1 + .gitignore | 41 ++++++++++++++++++++++++++++++++++------- package.json | 29 ++++++++++++++++++----------- 3 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..4e132447 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: https://www.paypal.me/franciscopresencia/19 diff --git a/.gitignore b/.gitignore index 0f39d12c..086fa865 100644 --- a/.gitignore +++ b/.gitignore @@ -2,12 +2,23 @@ logs *.log npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Temporary folder +/temp + +# Mac temporal file +.DS_Store + +# SASS Cache +.sass-cache # Runtime data pids *.pid *.seed -.tmp +*.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov @@ -21,26 +32,42 @@ coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt +# Bower dependency directory (https://bower.io/) +bower_components + # node-waf configuration .lock-wscript -# Compiled binary addons (http://nodejs.org/api/addons.html) +# Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directories -node_modules -.env -jspm_packages +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ # Optional npm cache directory .npm +# Optional eslint cache +.eslintcache + # Optional REPL history .node_repl_history +# Output of 'npm pack' +*.tgz -# SASS -.sass-cache +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +# next.js build output +.next +# This is a library so don't include it package-lock.json diff --git a/package.json b/package.json index 3ab7b953..a3e4cb96 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,12 @@ "name": "server", "version": "1.0.21", "description": "A modern and powerful server for Node.js", - "main": "server.js", + "homepage": "https://serverjs.io/", + "repository": "https://github.com/franciscop/server.git", + "bugs": "https://github.com/franciscop/server/issues", + "funding": "https://www.paypal.me/franciscopresencia/19", + "author": "Francisco Presencia (https://francisco.io/)", + "license": "MIT", "scripts": { "start": "node .", "dev": "grunt watch", @@ -11,23 +16,25 @@ "kill-comment": "Kill a process running in a specific port: PORT=3000 npm run kill", "kill": "kill $(lsof -t -i:$PORT) && echo '> KILLED!' || echo '> The port was already dead'" }, - "engines": { - "node": ">=10.0.0" - }, - "engineStrict": true, + "keywords": [ + "server", + "node.js", + "http", + "websocket", + "socket", + "async" + ], + "main": "server.js", "directories": { "Documentation": "./docs/documentation", "Code": "./src", "Plugins": "./plugins", "Examples": "./examples" }, - "repository": { - "type": "git", - "url": "git+https://github.com/franciscop/server" + "engines": { + "node": ">=10.0.0" }, - "author": "Francisco Presencia ", - "license": "MIT", - "homepage": "https://serverjs.io/", + "engineStrict": true, "dependencies": { "body-parser": "^1.15.2", "compression": "^1.6.2", From a113cfb8d52d91fed236d86bcd2c5967b78cccf6 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Mon, 13 Jan 2020 17:49:12 +0900 Subject: [PATCH 20/93] 1.0.22 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a3e4cb96..37a43f23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.21", + "version": "1.0.22", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From a4ee6be0940feb8b1322157d969b1b334ba3bb51 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sun, 16 Feb 2020 19:59:46 +0900 Subject: [PATCH 21/93] Upgraded grunt to use node-sass --- Gruntfile.js | 96 ++++++++++++++++++++------------------- docs/assets/style.min.css | 3 +- docs/index.html | 4 +- package.json | 3 +- 4 files changed, 54 insertions(+), 52 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 3784c4b0..029484f5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,14 +1,20 @@ -const filters = require('./docs/filters.js'); -const files = require('./docs/files.js'); +const filters = require("./docs/filters.js"); +const files = require("./docs/files.js"); +const sass = require("node-sass"); -const fs = require('fs') +const fs = require("fs"); function extract(src) { const data = {}; - const readme = fs.readFileSync(src + 'README.md', 'utf-8'); - data.title = (readme.match(/^\#\s(.+)/mg) || []).map(one => one.replace(/^\#\s/, ''))[0]; - if (!data.title) throw new Error('Your file ' + file + '/README.md has no h1 in markdown'); - data.sections = (readme.match(/^\#\#[\s](.+)/gm) || []).map(one => one.replace(/^\#\#\s/, '')); + const readme = fs.readFileSync(src + "README.md", "utf-8"); + data.title = (readme.match(/^\#\s(.+)/gm) || []).map(one => + one.replace(/^\#\s/, "") + )[0]; + if (!data.title) + throw new Error("Your file " + file + "/README.md has no h1 in markdown"); + data.sections = (readme.match(/^\#\#[\s](.+)/gm) || []).map(one => + one.replace(/^\#\#\s/, "") + ); return data; } @@ -16,40 +22,36 @@ function getInfo(src) { delete require.cache[require.resolve(src)]; const info = {}; if (/documentation/.test(src)) { - const base = { title: 'Introduction', url: '/documentation/' }; + const base = { title: "Introduction", url: "/documentation/" }; info.introduction = Object.assign({}, extract(src), base); } return require(src).reduce((obj, one) => { - return Object.assign({}, obj, { [one]: extract(src + one + '/') }); + return Object.assign({}, obj, { [one]: extract(src + one + "/") }); }, info); } // Generate the documentation final:origin pairs -const transform = dir => files(__dirname + '/' + dir) - .filter(str => /\.html\.pug$/.test(str)) - .reduce((docs, one) => { - docs[one.replace(/\.pug$/, '')] = one; - return docs; - }, {}); +const transform = dir => + files(__dirname + "/" + dir) + .filter(str => /\.html\.pug$/.test(str)) + .reduce((docs, one) => { + docs[one.replace(/\.pug$/, "")] = one; + return docs; + }, {}); // This builds the library itself -module.exports = function (grunt) { - +module.exports = function(grunt) { // Configuration grunt.initConfig({ - bytesize: { all: { - src: [ - 'docs/assets/style.min.css', - 'docs/assets/javascript.js' - ] + src: ["docs/assets/style.min.css", "docs/assets/javascript.js"] } }, jshint: { options: { esversion: 6 }, - src: ['Gruntfile.js', 'server.js', 'src'] + src: ["Gruntfile.js", "server.js", "src"] }, // Launch a small static server @@ -57,8 +59,8 @@ module.exports = function (grunt) { server: { options: { port: 3000, - hostname: '*', - base: 'docs', + hostname: "*", + base: "docs", livereload: true, useAvailablePort: false } @@ -67,8 +69,8 @@ module.exports = function (grunt) { sass: { dist: { - options: { style: 'compressed' }, - files: { 'docs/assets/style.min.css': 'docs/assets/style.scss' } + options: { implementation: sass, outputStyle: "compressed" }, + files: { "docs/assets/style.min.css": "docs/assets/style.scss" } } }, @@ -80,34 +82,34 @@ module.exports = function (grunt) { return { require, file, - tutorials: getInfo('./docs/tutorials/'), - documentation: getInfo('./docs/documentation/'), - slug: str => str.toLowerCase().replace(/[^\w]+/g, '-') + tutorials: getInfo("./docs/tutorials/"), + documentation: getInfo("./docs/documentation/"), + slug: str => str.toLowerCase().replace(/[^\w]+/g, "-") }; }, filters: filters }, - files: transform('docs') + files: transform("docs") } }, watch: { scripts: { files: [ - 'Gruntfile.js', + "Gruntfile.js", // Docs - 'docs/**/*.*', - 'README.md', + "docs/**/*.*", + "README.md", // For testing: - 'server.js', - 'src/**/*.js', + "server.js", + "src/**/*.js", // To bump versions - 'package.js' + "package.js" ], - tasks: ['default'], + tasks: ["default"], options: { spawn: false, livereload: true @@ -116,14 +118,14 @@ module.exports = function (grunt) { } }); - grunt.loadNpmTasks('grunt-contrib-connect'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-pug'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-bytesize'); - grunt.loadNpmTasks('grunt-contrib-sass'); + grunt.loadNpmTasks("grunt-contrib-connect"); + grunt.loadNpmTasks("grunt-contrib-jshint"); + grunt.loadNpmTasks("grunt-contrib-pug"); + grunt.loadNpmTasks("grunt-contrib-watch"); + grunt.loadNpmTasks("grunt-bytesize"); + grunt.loadNpmTasks("grunt-sass"); - grunt.registerTask('build', ['sass', 'pug']); - grunt.registerTask('test', ['bytesize']); - grunt.registerTask('default', ['build', 'test', 'connect']); + grunt.registerTask("build", ["sass", "pug"]); + grunt.registerTask("test", ["bytesize"]); + grunt.registerTask("default", ["build", "test", "connect"]); }; diff --git a/docs/assets/style.min.css b/docs/assets/style.min.css index 88f1719a..3c0170a3 100644 --- a/docs/assets/style.min.css +++ b/docs/assets/style.min.css @@ -1,2 +1 @@ -html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background:transparent;color:#111}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;box-shadow:0 0 transparent inset}button:hover,.button:hover,[type=submit]:hover,.dropimage:hover,button:focus,.button:focus,[type=submit]:focus,.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo[type=submit]:hover,.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo[type=submit]:focus,.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,[type=submit]:active,.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo[type=submit]:active,.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],[disabled].button,[disabled][type=submit],[disabled].dropimage{cursor:default;box-shadow:none;background:#bbb}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #ccc;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #ccc;border-radius:0;cursor:pointer;width:100%;height:2.1em;box-sizing:border-box;padding:.3em .45em;transition:all .3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.3em .45em}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,[type=radio]:focus+.checkable:before,[type=checkbox]:focus+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}[type=radio]:checked+.checkable:after,[type=checkbox]:checked+.checkable:after{background:#555;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}[type=checkbox]:checked+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(0,0,0,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-0.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(17,17,17,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:#111}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(0,0,0,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:0;border-radius:0;border:1px solid #ccc;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#eee}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #eee}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.6);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:0.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} -/*# sourceMappingURL=style.min.css.map */ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;letter-spacing:inherit;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background-color:transparent;color:inherit}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;vertical-align:baseline;box-shadow:0 0 rgba(0,0,0,0) inset}button:hover,.button:hover,:hover[type=submit],.dropimage:hover,button:focus,.button:focus,:focus[type=submit],.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo:hover[type=submit],.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo:focus[type=submit],.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,:active[type=submit],.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo:active[type=submit],.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],.button[disabled],[disabled][type=submit],.dropimage[disabled]{cursor:default;box-shadow:none;background:#bbb}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #ccc;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #ccc;border-radius:0;cursor:pointer;width:100%;height:2.2em;box-sizing:border-box;padding:.3em .45em;transition:all 0.3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.45em}select[multiple]{height:auto;background:none;padding:0}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,:focus[type=radio]+.checkable:before,:focus[type=checkbox]+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}:checked[type=radio]+.checkable:after,:checked[type=checkbox]+.checkable:after{background:#555;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}:checked[type=checkbox]+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(0,0,0,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(17,17,17,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:inherit}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(0,0,0,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:0;border-radius:0;border:1px solid #ccc;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#eee}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #eee}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.6);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} diff --git a/docs/index.html b/docs/index.html index c6a3aa3b..501cf217 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.js for Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

+Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

Subscribe Downloads Status @@ -282,4 +282,4 @@

Author & support

setTimeout(function() { u('a.email').attr('href', 'mailto:public' + '@francisco.i' + 'o?subject=server.js'); }, 2000); - + \ No newline at end of file diff --git a/package.json b/package.json index 37a43f23..836feb35 100644 --- a/package.json +++ b/package.json @@ -67,10 +67,11 @@ "grunt-contrib-connect": "^1.0.2", "grunt-contrib-jshint": "^1.1.0", "grunt-contrib-pug": "^1.0.0", - "grunt-contrib-sass": "^1.0.0", "grunt-contrib-watch": "^1.0.0", + "grunt-sass": "^3.1.0", "jest": "^25.0.0", "jstransformer-marked": "^1.0.2", + "node-sass": "^4.13.1", "picnic": "^6.4.0", "request-promises": "^1.0.1", "supertest": "^3.0.0" From 534e674ee090d42153ad50411c70baf23576c7b0 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sun, 16 Feb 2020 20:07:46 +0900 Subject: [PATCH 22/93] Upgraded to fix dep issue --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 836feb35..45feb76e 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "express-data-parser": "^1.2.0", "express-session": "^1.14.2", "extend": "^3.0.0", - "hbs": "^4.0.5", + "hbs": "^4.1.0", "helmet": "^3.9.0", "loadware": "^2.0.0", "log": "^1.4.0", From b4c9268fbb34da7fe238da682c9ac67681e08ee7 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sun, 16 Feb 2020 20:09:13 +0900 Subject: [PATCH 23/93] 1.0.23 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 45feb76e..46fbd252 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.22", + "version": "1.0.23", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From c4e1bc19988d74cf631ee1804e9ff4b63cb63903 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sun, 16 Feb 2020 20:10:28 +0900 Subject: [PATCH 24/93] Added workflow --- .github/workflows/tests.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..b845b407 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,24 @@ +name: tests + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [8.x, 10.x, 12.x] + + steps: + - uses: actions/checkout@v1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: install dependencies + run: npm install + - name: npm test + run: npm test + env: + CI: true From b3e39570a712dbd3fb5003f0c94943b2bad46930 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Tue, 18 Feb 2020 09:57:41 +0900 Subject: [PATCH 25/93] Added socket.io options and fixed testing --- examples/websocket/index.js | 6 +++++- examples/websocket/views/index.html | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/websocket/index.js b/examples/websocket/index.js index decbdf9a..211662df 100644 --- a/examples/websocket/index.js +++ b/examples/websocket/index.js @@ -2,7 +2,11 @@ const server = require('../../server'); const { get, socket } = server.router; const { render } = server.reply; -server( +server({ + socket: { + path: '/custompath' + } +}, get('/', ctx => { ctx.session.counter = ctx.session.counter || 0; return render('index.html'); diff --git a/examples/websocket/views/index.html b/examples/websocket/views/index.html index b69f9d88..84fcd0b5 100644 --- a/examples/websocket/views/index.html +++ b/examples/websocket/views/index.html @@ -11,7 +11,9 @@

Hello world!

\ No newline at end of file + From 6e444a7ad374674a31e9afc1ff3152a6f89ec12b Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Wed, 1 Apr 2020 01:49:22 +0200 Subject: [PATCH 37/93] Updated streaming example --- examples/stream/index.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/stream/index.js b/examples/stream/index.js index 988235cd..413c76cf 100644 --- a/examples/stream/index.js +++ b/examples/stream/index.js @@ -1,9 +1,16 @@ -const server = require('../../server'); -const fs = require('fs'); -const path = require('path'); +const server = require("../../server"); +const fs = require("fs"); +const path = require("path"); -const img = path.resolve('../../test/logo.png'); +const img = path.resolve("../../test/logo.png"); +const stream = (read, write) => + new Promise((resolve, reject) => { + read + .pipe(write) + .on("error", reject) + .on("end", resolve); + }); -server(ctx => new Promise(resolve => { - fs.createReadStream(img).pipe(ctx.res).on('end', resolve); -})); +server(ctx => { + return stream(fs.createReadStream(img), ctx.res); +}); From 39f2728a591277809c986866b129b5489b6058f6 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Sun, 24 May 2020 16:20:36 +0200 Subject: [PATCH 38/93] Removed sponsors --- docs/index.html | 4 ++-- docs/index.html.pug | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/index.html b/docs/index.html index c45b8228..11e85d6b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

+Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

Subscribe Downloads Status @@ -282,4 +282,4 @@

Author & support

setTimeout(function() { u('a.email').attr('href', 'mailto:public' + '@francisco.i' + 'o?subject=server.js'); }, 2000); - \ No newline at end of file + diff --git a/docs/index.html.pug b/docs/index.html.pug index 8f458c32..ef10f9cd 100644 --- a/docs/index.html.pug +++ b/docs/index.html.pug @@ -47,14 +47,6 @@ block content h2 Extensible p [upcoming in 1.1] - div.flex.one.three-600 - div - a.become-sponsor(href="mailto:public@francisco.io?subject=Sponsor-1st-spot") Become a Sponsor - div - a.become-sponsor(href="mailto:public@francisco.io?subject=Sponsor-2nd-spot") Support Server.js - div.none.third-600 - a.become-sponsor(href="mailto:public@francisco.io?subject=Sponsor-3rd-spot") Your logo here - include:marked:noheader ../README.md From db8f14bb1ecb3f72cb714ceb1b088e8cb9406df9 Mon Sep 17 00:00:00 2001 From: Teymour Aldridge <42674621+teymour-aldridge@users.noreply.github.com> Date: Sun, 31 May 2020 21:07:46 +0100 Subject: [PATCH 39/93] Remove if conditions which are always true. (#126) --- examples/bug44/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/bug44/index.js b/examples/bug44/index.js index 5a337def..900d2153 100644 --- a/examples/bug44/index.js +++ b/examples/bug44/index.js @@ -6,8 +6,8 @@ const CustomError = require('./custom-error'); const homePageRouter = get('/', // Validation and checks ctx => { - if (1 < 2) throw new CustomError('Some custom error', 400); - if (2 < 3) throw new CustomError('Some other custom error', 402); + throw new CustomError('Some custom error', 400); + throw new CustomError('Some other custom error', 402); }, // Normal middleware here From 21d8c4ad71a5c8d78de8ac9a463d983f1b79ac5d Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 12 Jun 2020 20:07:31 +0200 Subject: [PATCH 40/93] Added windows tests to Github Actions --- .github/workflows/tests.yml | 7 ++++--- README.md | 4 +--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b845b407..3f995225 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,8 @@ jobs: strategy: matrix: - node-version: [8.x, 10.x, 12.x] + platform: [ubuntu-latest, macos-latest, windows-latest] + node-version: [8.x, 10.x, 12.x, 14.x] steps: - uses: actions/checkout@v1 @@ -16,9 +17,9 @@ jobs: uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - - name: install dependencies + - name: Installing run: npm install - - name: npm test + - name: Testing run: npm test env: CI: true diff --git a/README.md b/README.md index f270dcb4..354a6d8c 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,7 @@ [![Subscribe](https://img.shields.io/badge/%20subscribe%20-%20mailchimp%20-blue.svg )](http://eepurl.com/cGRggH) [![Downloads](https://img.shields.io/npm/dm/server.svg)](https://npm-stat.com/charts.html?package=server) -[![Status](https://github.com/franciscop/server/workflows/tests/badge.svg)](https://github.com/franciscop/server/actions) -[![Windows Build](https://img.shields.io/appveyor/ci/franciscop/server.svg?label=windows)](https://ci.appveyor.com/project/franciscop/server) -[![Dependencies status](https://david-dm.org/franciscop/server/status.svg)](https://david-dm.org/franciscop/server) +[![Status](https://github.com/franciscop/server/workflows/tests/badge.svg)](https://github.com/franciscop/server/actions) [![Dependencies status](https://david-dm.org/franciscop/server/status.svg)](https://david-dm.org/franciscop/server) Powerful server for Node.js that just works so **you can focus on your awesome project**: From dffb40c555ce8479f267e69293aafd21447cf113 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 12 Jun 2020 20:09:57 +0200 Subject: [PATCH 41/93] Rebuilt files --- docs/index.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/index.html b/docs/index.html index 11e85d6b..49f5bd07 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,9 +1,7 @@ Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

Subscribe Downloads -Status -Windows Build -Dependencies status

+Status Dependencies status

Powerful server for Node.js that just works so you can focus on your awesome project:

// Include it and extract some methods for convenience
 const server = require('server');
@@ -282,4 +280,4 @@ 

Author & support

setTimeout(function() { u('a.email').attr('href', 'mailto:public' + '@francisco.i' + 'o?subject=server.js'); }, 2000); - + \ No newline at end of file From 48084af15bab074c5878be226df15338dac0f661 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 12 Jun 2020 20:12:18 +0200 Subject: [PATCH 42/93] Rebuilt files --- docs/index.html | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/index.html b/docs/index.html index e84a957e..49f5bd07 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,8 +1,4 @@ -<<<<<<< HEAD Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

-======= -Server.js

server.js for Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

->>>>>>> db8f14bb1ecb3f72cb714ceb1b088e8cb9406df9

Subscribe Downloads Status Dependencies status

@@ -284,4 +280,4 @@

Author & support

setTimeout(function() { u('a.email').attr('href', 'mailto:public' + '@francisco.i' + 'o?subject=server.js'); }, 2000); - + \ No newline at end of file From 1e26ffbb290c0dfd4719222ff595c3286246d7b9 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 12 Jun 2020 20:12:43 +0200 Subject: [PATCH 43/93] 1.0.28 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 08f62676..ae5b1b6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.27", + "version": "1.0.28", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From 2a09d865284e008326e3417c7dafb9dedd273952 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 12 Jun 2020 20:24:33 +0200 Subject: [PATCH 44/93] Fixed tests --- router/integration.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/integration.test.js b/router/integration.test.js index 9c76ae5d..28257cf8 100644 --- a/router/integration.test.js +++ b/router/integration.test.js @@ -182,7 +182,7 @@ describe('Ends where it should end', () => { // A bug shifted the router's middleware on each request so now we test for // multiple request to make sure the middleware remains the same it('does not modify the router', async () => { - const inst = run(get('/', hello)).alive(async api => { + await run(get('/', hello)).alive(async api => { for (let url of [0, 1, 2]) { const res = await api.get('/'); expect(res.body).toBe('Hello 世界'); From 1dab54856b77e8ab54b84e1882a8bcfe02cc5587 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 12 Jun 2020 20:59:30 +0200 Subject: [PATCH 45/93] Upgraded dependencies and removed unneeded code. Except for breaking 'log' and 'redis-connect' which needs more work --- package.json | 8 ++--- router/error.js | 10 ++++-- router/generic.js | 9 ++++-- router/path-to-regexp-wrap.js | 57 ----------------------------------- 4 files changed, 17 insertions(+), 67 deletions(-) delete mode 100644 router/path-to-regexp-wrap.js diff --git a/package.json b/package.json index ae5b1b6f..60c91c79 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "connect-redis": "^3.3.0", "cookie-parser": "^1.4.3", "csurf": "^1.9.0", - "dotenv": "^4.0.0", + "dotenv": "^8.2.0", "express": "^4.14.0", "express-data-parser": "^1.2.0", "express-session": "^1.14.2", @@ -51,10 +51,10 @@ "helmet": "^3.9.0", "loadware": "^2.0.0", "log": "^1.4.0", - "method-override": "^2.3.10", + "method-override": "^3.0.0", "mz": "^2.6.0", - "path-to-regexp": "^0.1.7", - "pug": "^2.0.0-rc.4", + "path-to-regexp": "^6.1.0", + "pug": "^3.0.0", "response-time": "^2.3.2", "serve-favicon": "^2.3.2", "serve-index": "^1.8.0", diff --git a/router/error.js b/router/error.js index 61ed0566..97e22d76 100644 --- a/router/error.js +++ b/router/error.js @@ -1,18 +1,22 @@ const join = require('../src/join'); const parse = require('./parse'); -const params = require('./path-to-regexp-wrap')(); +const { match } = require('path-to-regexp'); + +const decode = decodeURIComponent; module.exports = (...all) => { // Extracted or otherwise it'd shift once per call; also more performant const { path, middle } = parse(all); - const match = params(path || ''); + + // Convert to the proper path, since the new ones use `(.*)` instead of `*` + const parsePath = match(path.replace(/\*/g, '(.*)'), { decode: decode }); const generic = () => {}; generic.error = async ctx => { // Only do this if the correct path ctx.error.code = ctx.error.code || ''; - ctx.error.params = match(ctx.error.code); + ctx.error.params = parsePath(ctx.error.code).params; // Add an extra-allowing initial matching if (!ctx.error.params && ctx.error.code.slice(0, path.length) !== path) return; diff --git a/router/generic.js b/router/generic.js index 6112fad6..694e4c50 100644 --- a/router/generic.js +++ b/router/generic.js @@ -1,6 +1,8 @@ const join = require('../src/join'); const parse = require('./parse'); -const params = require('./path-to-regexp-wrap')(); +const { match } = require('path-to-regexp'); + +const decode = decodeURIComponent; // Generic request handler module.exports = (method, ...all) => { @@ -8,7 +10,8 @@ module.exports = (method, ...all) => { // Extracted or otherwise it'd shift once per call; also more performant const { path, middle } = parse(all); - const match = params(path || ''); + // Convert to the proper path, since the new ones use `(.*)` instead of `*` + const parsePath = match(path.replace(/\*/g, '(.*)'), { decode: decode }); return async ctx => { @@ -19,7 +22,7 @@ module.exports = (method, ...all) => { if (method !== ctx.req.method) return; // Only do this if the correct path - ctx.req.params = match(ctx.req.path); + ctx.req.params = parsePath(ctx.req.path).params; if (!ctx.req.params) return; ctx.params = ctx.req.params; diff --git a/router/path-to-regexp-wrap.js b/router/path-to-regexp-wrap.js deleted file mode 100644 index c902bae2..00000000 --- a/router/path-to-regexp-wrap.js +++ /dev/null @@ -1,57 +0,0 @@ -// This comes from https://github.com/teologov/path-to-regexp-wrap -// because of this bug: https://github.com/franciscop/server/issues/43 - -/** - * Path to regexp lib wrapper - * @author Andrey Teologov - * @date 16.04.14 - */ - -"use strict"; - -const path = require('path-to-regexp'); - -/** - * Routes lib - * @type {exports} - */ -module.exports = function(options) { - options = options || {}; - - /** - * String decoder - * @param {String} str - * @returns {*} - */ - function decodeUri(str) { - try { - str = decodeURIComponent(str); - } catch(e) { - throw new Error(`Cannot decodeURIComponent: ${str}` ); - } - return str; - } - - return function(route) { - const keys = []; - const reg = path.apply(this, [route, keys, options]); - - return function(route, config) { - const res = reg.exec(route); - const params = config || {}; - - if (!res) { - return false; - } - - for (let i = 1, l = res.length; i < l; i++) { - if (!res[i]) { - continue; - } - params[keys[i - 1].name] = decodeUri(res[i]); - } - - return params; - } - } -}; From 705d63255f628c4ca5b86afe359d1c773d3e4feb Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 12 Jun 2020 20:59:49 +0200 Subject: [PATCH 46/93] 1.0.29 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60c91c79..4b786fb8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.28", + "version": "1.0.29", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From bf47bb316d5f8f666c8f55a8a6a8cb0580b5405b Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Wed, 24 Jun 2020 01:48:29 +0200 Subject: [PATCH 47/93] Improved code and homepage feature --- docs/index.html | 2 +- docs/index.html.pug | 2 +- examples/file-upload/index.js | 31 ++++++++++++++++++++-------- examples/file-upload/views/index.pug | 13 ------------ examples/handlebars/index.js | 9 ++++---- examples/session/index.js | 8 +++---- examples/template/index.js | 6 +++--- 7 files changed, 36 insertions(+), 35 deletions(-) delete mode 100644 examples/file-upload/views/index.pug diff --git a/docs/index.html b/docs/index.html index 49f5bd07..f5d82496 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

[upcoming in 1.1]

server.js for Node.js

+Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

Fully compatible with Express middleware

server.js for Node.js

Subscribe Downloads Status Dependencies status

diff --git a/docs/index.html.pug b/docs/index.html.pug index ef10f9cd..62b58f0b 100644 --- a/docs/index.html.pug +++ b/docs/index.html.pug @@ -45,7 +45,7 @@ block content div img(src="/img/lego.svg") h2 Extensible - p [upcoming in 1.1] + p Fully compatible with Express middleware include:marked:noheader ../README.md diff --git a/examples/file-upload/index.js b/examples/file-upload/index.js index 3b4e357a..324243f3 100644 --- a/examples/file-upload/index.js +++ b/examples/file-upload/index.js @@ -1,15 +1,28 @@ -const server = require('../../server'); +const server = require("../../server"); const { get, post } = server.router; -const { render, redirect } = server.reply; -server(3000, - get('/', ctx => render('index')), - post('/upload', ctx => { +const form = ` + + + File Upload Demo + +
+ + + + + + +`; - // Here is your file, "userimage" as in name="userimage" in the form: - console.log(ctx.req.files.userimage); - console.log("Path:", ctx.req.files.userimage.path); +server( + { security: { csrf: false } }, + get("/", () => form), + post("/", (ctx) => { + // Here is your file, "picture" as in name="picture" in the form: + console.log(ctx.files.picture); + console.log("Path:", ctx.files.picture.path); - redirect('/#goodjob'); + return ctx.files.picture; }) ); diff --git a/examples/file-upload/views/index.pug b/examples/file-upload/views/index.pug deleted file mode 100644 index c3ae887c..00000000 --- a/examples/file-upload/views/index.pug +++ /dev/null @@ -1,13 +0,0 @@ -doctype html -html - head - body - form(action="/upload" method="post" enctype="multipart/form-data") - input(type="file" name="userimage") - input(type="submit" value="Upload image") - - script. - if (location.hash.match(/goodjob/)) { - alert("Good job!"); - location.hash = ''; - } diff --git a/examples/handlebars/index.js b/examples/handlebars/index.js index 87f47961..624cb817 100644 --- a/examples/handlebars/index.js +++ b/examples/handlebars/index.js @@ -1,8 +1,9 @@ -const server = require('../../server'); +const server = require("../../server"); const { get, post } = server.router; const { render } = server.reply; -server(//{ engine: 'hbs' }, - get('/', ctx => render('index.hbs')), - get('/:id', ctx => render('page.hbs', { page: ctx.req.params.id })) +server( + //{ engine: 'hbs' }, + get("/", (ctx) => render("index.hbs")), + get("/:id", (ctx) => render("page.hbs", { page: ctx.params.id })) ); diff --git a/examples/session/index.js b/examples/session/index.js index fa2fa79c..57185de4 100644 --- a/examples/session/index.js +++ b/examples/session/index.js @@ -1,8 +1,8 @@ // Simple visit counter for the main page -const server = require('../../server'); -const counter = ctx => { - const session = ctx.req.session; +const server = require("../../server"); +const counter = (ctx) => { + const session = ctx.session; session.views = (session.views || 0) + 1; - ctx.res.send('' + session.views); + return `Session: ${session.views}`; }; server(counter); diff --git a/examples/template/index.js b/examples/template/index.js index db453f0c..fffe5075 100644 --- a/examples/template/index.js +++ b/examples/template/index.js @@ -1,8 +1,8 @@ -const server = require('../../server'); +const server = require("../../server"); const { get, post } = server.router; const { render } = server.reply; server( - get('/', ctx => render('index')), - get('/:id', ctx => render('page', { page: ctx.req.params.id })) + get("/", (ctx) => render("index")), + get("/:id", (ctx) => render("page", { page: ctx.params.id })) ); From f54388c9560d020e7e341844fe37107d6b320e93 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Wed, 24 Jun 2020 02:56:06 +0200 Subject: [PATCH 48/93] Title --- docs/index.html | 2 +- docs/index.html.pug | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index f5d82496..34b35c4a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -Server.js

server.jsfor Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

Fully compatible with Express middleware

server.js for Node.js

+Server.js

server.js for Node

npm install server
DocumentationTutorials

Batteries on

Everything you need is loaded by default

socket.io

Realtime channels in a couple of lines

Modern ES7+

Use async/await and forget Callback Hell

Documented

Many tutorials and docs for productivity

Secure

Sane defaults & great libraries underneath

Extensible

Fully compatible with Express middleware

server.js for Node.js

Subscribe Downloads Status Dependencies status

diff --git a/docs/index.html.pug b/docs/index.html.pug index 62b58f0b..6e9e60bf 100644 --- a/docs/index.html.pug +++ b/docs/index.html.pug @@ -4,7 +4,7 @@ block content .hero .content h1 - strong server.js + strong server.js | for Node div pre.sub npm install server From 39d6940e5fa5e9085c9101424c26df11d54231a4 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Thu, 6 Aug 2020 14:59:07 +0200 Subject: [PATCH 49/93] Fixed bug that stopped devs from disabling the socket plugin --- docs/assets/javascript.js | 216 +++++++++++------- docs/documentation/context/index.html | 216 +++++++++++------- docs/documentation/errors/index.html | 214 ++++++++++------- docs/documentation/index.html | 214 ++++++++++------- docs/documentation/options/index.html | 214 ++++++++++------- docs/documentation/plugins/index.html | 214 ++++++++++------- docs/documentation/reply/index.html | 216 +++++++++++------- docs/documentation/router/index.html | 214 ++++++++++------- docs/documentation/testing/index.html | 214 ++++++++++------- docs/index.html | 214 ++++++++++------- docs/sponsor/index.html | 214 ++++++++++------- docs/tutorials/chat/index.html | 216 +++++++++++------- docs/tutorials/getting-started/index.html | 214 ++++++++++------- docs/tutorials/index.html | 216 +++++++++++------- docs/tutorials/sessions-production/index.html | 214 ++++++++++------- docs/tutorials/spreadsheet/index.html | 214 ++++++++++------- docs/tutorials/todo/index.html | 216 +++++++++++------- plugins/session/index.js | 2 + 18 files changed, 2167 insertions(+), 1485 deletions(-) diff --git a/docs/assets/javascript.js b/docs/assets/javascript.js index a095fab8..430d84f4 100644 --- a/docs/assets/javascript.js +++ b/docs/assets/javascript.js @@ -1,124 +1,149 @@ // Some super simple heuristics const is = { - mobile: 'ontouchstart' in document.documentElement && window.innerWidth < 900, - desktop: !('ontouchstart' in document.documentElement) && window.innerWidth > 900 + mobile: "ontouchstart" in document.documentElement && window.innerWidth < 900, + desktop: + !("ontouchstart" in document.documentElement) && window.innerWidth > 900, }; // Add language tag to the code for print const regName = /lang(uage)?\-/; -const hasName = name => regName.test(name); -const map = { js: 'javascript', jade: 'pug' }; -[].slice.call(document.querySelectorAll('pre code')).forEach(function(pre){ +const hasName = (name) => regName.test(name); +const map = { js: "javascript", jade: "pug" }; +[].slice.call(document.querySelectorAll("pre code")).forEach(function (pre) { if (!regName.test(pre.className)) return; - let name = pre.className.split(/\s+/).filter(hasName)[0].replace(regName, ''); - pre.parentNode.setAttribute('data-language', name in map ? map[name] : name); + let name = pre.className.split(/\s+/).filter(hasName)[0].replace(regName, ""); + pre.parentNode.setAttribute("data-language", name in map ? map[name] : name); }); // Display the proper part in the TOC -const tocLinks = u('.toc [href]'); +const tocLinks = u(".toc [href]"); if (is.desktop) { - tocLinks.filter(el => { - return u(el).attr('href').split('#')[0] === window.location.pathname; - }).parent().addClass('active'); + tocLinks + .filter((el) => { + return u(el).attr("href").split("#")[0] === window.location.pathname; + }) + .parent() + .addClass("active"); } // Build the search -if (u('article.documentation').length) { - const base = el => u(el).attr('href').split('#')[0]; +if (u("article.documentation").length) { + const base = (el) => u(el).attr("href").split("#")[0]; const unique = (value, i, all) => all.indexOf(value) === i; const searchLinks = tocLinks.nodes.map(base).filter(unique); const all = {}; const headings = {}; - Promise.all(searchLinks.map(link => fetch(link).then(res => res.text()).then(html => { - u('
').html(html).find('article.documentation h1, article.documentation h2, article.documentation h3, article.documentation h4').each(el => { - if (el.id) { - if (el.nodeName === 'H1') { - headings[`${link}`] = u(el).text(); - } else { - headings[`${link}#${el.id}`] = u(el).text(); - } - } - }); - all[link] = u('
').html(html).find('article.documentation .main').text().toLowerCase(); - }))).then(() => { - - const search = term => { + Promise.all( + searchLinks.map((link) => + fetch(link) + .then((res) => res.text()) + .then((html) => { + u("
") + .html(html) + .find( + "article.documentation h1, article.documentation h2, article.documentation h3, article.documentation h4" + ) + .each((el) => { + if (el.id) { + if (el.nodeName === "H1") { + headings[`${link}`] = u(el).text(); + } else { + headings[`${link}#${el.id}`] = u(el).text(); + } + } + }); + all[link] = u("
") + .html(html) + .find("article.documentation .main") + .text() + .toLowerCase(); + }) + ) + ).then(() => { + const search = (term) => { if (!term) { - u('.search').removeClass('active'); - u('.searchbox').html('
    '); - u('.toc > ul').removeClass('hidden'); + u(".search").removeClass("active"); + u(".searchbox").html("
      "); + u(".toc > ul").removeClass("hidden"); return; } - u('.toc > ul').addClass('hidden'); - u('.search').addClass('active'); + u(".toc > ul").addClass("hidden"); + u(".search").addClass("active"); const value = term.toLowerCase(); - u('.searchbox').html('
        '); + u(".searchbox").html("
          "); const found = []; for (let link in headings) { if (headings[link].toLowerCase().includes(value)) { - found.push(link.split('#')[0]); - u('.searchbox ul').append(`
        • ★ ${headings[link]}
        • `); + found.push(link.split("#")[0]); + u(".searchbox ul").append( + `
        • ★ ${headings[link]}
        • ` + ); } } let extra = false; for (let link in all) { if (all[link].includes(value) && !found.includes(link)) { if (!extra) { - u('.searchbox ul').append('
        • Also mentioned here:
        • '); + u(".searchbox ul").append( + '
        • Also mentioned here:
        • ' + ); } extra = true; - u('.searchbox ul').append(`
        • ${link}
        • `); + u(".searchbox ul").append(`
        • ${link}
        • `); } } - u('.searchbox a').on('click', e => { - u('.search').removeClass('active'); - u('.search').first().value = ''; - u('.searchbox').html('
            '); - u('.toc > ul').removeClass('hidden'); + u(".searchbox a").on("click", (e) => { + u(".search").removeClass("active"); + u(".search").first().value = ""; + u(".searchbox").html("
              "); + u(".toc > ul").removeClass("hidden"); }); }; - const initial = u('.search').first().value; + const initial = u(".search").first().value; if (initial) { search(initial); } // Autofocus only on desktop if (is.desktop) { - u('.search').first().focus(); + u(".search").first().focus(); } - u('.search').on('input', e => { + u(".search").on("input", (e) => { search(e.target.value); }); - u('.searchform').handle('submit', e => { - search(u('.search').first().value); - u('.searchbox a').first().click(); + u(".searchform").handle("submit", (e) => { + search(u(".search").first().value); + u(".searchbox a").first().click(); }); }); } -u('.main h2, .main h3, .main h4, .main h5').each(el => { - const path = `${window.location.pathname.split('#')[0]}#${el.id}`; - u(el).html(`#${u(el).html()}`); +u(".main h2, .main h3, .main h4, .main h5").each((el) => { + const path = `${window.location.pathname.split("#")[0]}#${el.id}`; + u(el).html( + `#${u(el).html()}` + ); }); - - // Remove an incorrect "get" that there was highlighted -Prism.hooks.add('after-highlight', function(env){ - u('span.token.keyword').each(el => { - if (el.innerHTML === 'get') { - if (el.nextElementSibling && el.nextElementSibling.innerHTML === '(') { +Prism.hooks.add("after-highlight", function (env) { + u("span.token.keyword").each((el) => { + if (el.innerHTML === "get") { + if (el.nextElementSibling && el.nextElementSibling.innerHTML === "(") { u(el).replace('get'); } else { - u(el).replace('get'); + u(el).replace("get"); } } - if (el.innerHTML === 'delete') { - if (el.previousElementSibling && el.previousElementSibling.innerHTML === '.') { - u(el).replace('delete'); + if (el.innerHTML === "delete") { + if ( + el.previousElementSibling && + el.previousElementSibling.innerHTML === "." + ) { + u(el).replace("delete"); } } - if (el.innerHTML === 'public') u(el).replace('public'); + if (el.innerHTML === "public") u(el).replace("public"); }); }); @@ -130,51 +155,66 @@ if (hash && u(hash).length) { } // Show more/less when clicking the chevron -u('.toc .more').handle('click', e => { - const container = u(e.currentTarget).closest('li'); - const child = container.find('ul').nodes[0]; - const height = container.hasClass('active') ? 0 : child.scrollHeight; - child.style.maxHeight = height + 'px'; - container.toggleClass('active'); +u(".toc .more").handle("click", (e) => { + const container = u(e.currentTarget).closest("li"); + const child = container.find("ul").nodes[0]; + const height = container.hasClass("active") ? 0 : child.scrollHeight; + child.style.maxHeight = height + "px"; + container.toggleClass("active"); }); // Go to the appropriate part of the page when clicking an internal link // Manual event delegation -u('article').on('click', e => { - if (e.target.nodeName !== 'A') return; - const href = u(e.target).attr('href'); +u("article").on("click", (e) => { + if (e.target.nodeName !== "A") return; + const href = u(e.target).attr("href"); if (!href) return; - const [url, hash] = href.split('#'); + const [url, hash] = href.split("#"); // If it is the current URL just go to the top if (url === window.location.pathname && !hash) { e.preventDefault(); - u('body').scroll(); + u("body").scroll(); history.replaceState(null, null, window.location.pathname); return; } // If it is an internal link go to that part - if ((!url || url === window.location.pathname) && u('#' + hash).length) { + if ((!url || url === window.location.pathname) && u("#" + hash).length) { e.preventDefault(); - u('#' + hash).scroll(); - history.replaceState(null, null, '#' + hash); + u("#" + hash).scroll(); + history.replaceState(null, null, "#" + hash); } }); - - // Google analytics -(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ -(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), -m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) -})(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); - -ga('create', 'UA-63739359-2', 'auto'); -ga('send', 'pageview'); - +(function (i, s, o, g, r, a, m) { + i["GoogleAnalyticsObject"] = r; + (i[r] = + i[r] || + function () { + (i[r].q = i[r].q || []).push(arguments); + }), + (i[r].l = 1 * new Date()); + (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m); +})( + window, + document, + "script", + "https://www.google-analytics.com/analytics.js", + "ga" +); + +ga("create", "UA-63739359-2", "auto"); +ga("send", "pageview"); // Hopefully avoid email scrapping -setTimeout(function() { - u('a.email').attr('href', 'mailto:public' + '@francisco.i' + 'o?subject=server.js'); +setTimeout(function () { + u("a.email").attr( + "href", + "mailto:public" + "@francisco.i" + "o?subject=server.js" + ); }, 2000); diff --git a/docs/documentation/context/index.html b/docs/documentation/context/index.html index 9c436490..8818a501 100644 --- a/docs/documentation/context/index.html +++ b/docs/documentation/context/index.html @@ -280,125 +280,150 @@

              .xhr

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/documentation/errors/index.html b/docs/documentation/errors/index.html index 43c90e30..704ee5db 100644 --- a/docs/documentation/errors/index.html +++ b/docs/documentation/errors/index.html @@ -106,125 +106,150 @@

              /server/core/invalidmiddleware

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/documentation/index.html b/docs/documentation/index.html index 7095f4cf..33610719 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -226,125 +226,150 @@

              Advanced topics

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/documentation/options/index.html b/docs/documentation/options/index.html index fd774a7b..75a79bbb 100644 --- a/docs/documentation/options/index.html +++ b/docs/documentation/options/index.html @@ -591,125 +591,150 @@

              Advanced logging

              This allows you for instance to handle some specific errors in a different way. It is also useful for testing that the correct data is printed on the console in certain situations.

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/documentation/plugins/index.html b/docs/documentation/plugins/index.html index 1cce67f6..624a10ae 100644 --- a/docs/documentation/plugins/index.html +++ b/docs/documentation/plugins/index.html @@ -203,125 +203,150 @@

              Routes for Plugins

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html index 4e2fd58d..560de175 100644 --- a/docs/documentation/reply/index.html +++ b/docs/documentation/reply/index.html @@ -315,125 +315,150 @@

              type()

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/documentation/router/index.html b/docs/documentation/router/index.html index cf2cc4cb..232a4f4c 100644 --- a/docs/documentation/router/index.html +++ b/docs/documentation/router/index.html @@ -303,125 +303,150 @@

              socket()

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/documentation/testing/index.html b/docs/documentation/testing/index.html index 5eab5045..01f6a01f 100644 --- a/docs/documentation/testing/index.html +++ b/docs/documentation/testing/index.html @@ -63,125 +63,150 @@

              Disable CSRF

              Keep reading

              List of all the topics:

              \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 34b35c4a..017e635b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -102,125 +102,150 @@

              Author & support

              $('body').classList.toggle('liftoff'); } \ No newline at end of file diff --git a/docs/sponsor/index.html b/docs/sponsor/index.html index 26b15e0e..f82b1392 100644 --- a/docs/sponsor/index.html +++ b/docs/sponsor/index.html @@ -37,125 +37,150 @@

              Notes and conditions

              Paypal me

              \ No newline at end of file diff --git a/docs/tutorials/chat/index.html b/docs/tutorials/chat/index.html index ea0c6269..7bb0aeb8 100644 --- a/docs/tutorials/chat/index.html +++ b/docs/tutorials/chat/index.html @@ -309,125 +309,150 @@

              XSS Protection

              Extra: did you fix the visitor writing the same code in their username? Make sure this is also sanitized.

              Keep reading

              Subscribe to our Mailchimp list to receive more tutorials when released:

              Get Great Tutorials
              \ No newline at end of file diff --git a/docs/tutorials/getting-started/index.html b/docs/tutorials/getting-started/index.html index 9d0dbf3b..72a289fd 100644 --- a/docs/tutorials/getting-started/index.html +++ b/docs/tutorials/getting-started/index.html @@ -62,125 +62,150 @@

              Make awesome things!

              Keep reading

              Subscribe to our Mailchimp list to receive more tutorials when released:

              Get Great Tutorials \ No newline at end of file diff --git a/docs/tutorials/index.html b/docs/tutorials/index.html index 29d7ad3d..1cce90d3 100644 --- a/docs/tutorials/index.html +++ b/docs/tutorials/index.html @@ -1,124 +1,149 @@ Tutorials - server.js

              Tutorials

              Tutorials

              Create awesome things with server.js. A collection of practical examples, from small tweaks to server.js to fully working webapps. Tutorials available:

              Getting started

              Get started by creating a Node.js project from scratch and get started.

              Read tutorial

              Sessions in production

              Learn how to set-up the session for production using Redis or other available datastores so there's persistence even after a server restart.

              Read tutorial

              TO-DO list

              Simple TO-DO website using jQuery for the AJAX. Define an API to create, read, update and delete items from a MongoDB database.

              Read tutorial Source code

              Spreadsheets data

              Realtime chat

              Create a realtime chat with socket.io. You will choose a username on launch and then write to everyone reading the chat.

              Read tutorial Source code

              Keep reading

              Subscribe to our Mailchimp list to receive more tutorials when released:

              Get Great Tutorials
              \ No newline at end of file diff --git a/docs/tutorials/sessions-production/index.html b/docs/tutorials/sessions-production/index.html index 523d13d1..47776cde 100644 --- a/docs/tutorials/sessions-production/index.html +++ b/docs/tutorials/sessions-production/index.html @@ -59,125 +59,150 @@

              Alternatives

              Keep reading

              Subscribe to our Mailchimp list to receive more tutorials when released:

              Get Great Tutorials \ No newline at end of file diff --git a/docs/tutorials/spreadsheet/index.html b/docs/tutorials/spreadsheet/index.html index 43f145e7..a7d9f841 100644 --- a/docs/tutorials/spreadsheet/index.html +++ b/docs/tutorials/spreadsheet/index.html @@ -207,125 +207,150 @@

              Demographics by location

              This will call the function initMap() when the script is loaded, and effectively create your map with all of the markers.

              Keep reading

              Subscribe to our Mailchimp list to receive more tutorials when released:

              Get Great Tutorials \ No newline at end of file diff --git a/docs/tutorials/todo/index.html b/docs/tutorials/todo/index.html index 4a7d2533..d1a331a2 100644 --- a/docs/tutorials/todo/index.html +++ b/docs/tutorials/todo/index.html @@ -144,125 +144,150 @@

              Testing

              Keep reading

              Subscribe to our Mailchimp list to receive more tutorials when released:

              Get Great Tutorials \ No newline at end of file diff --git a/plugins/session/index.js b/plugins/session/index.js index 798ed107..c7191b5c 100644 --- a/plugins/session/index.js +++ b/plugins/session/index.js @@ -42,6 +42,8 @@ module.exports = { }, before: ctx => modern(sessionMiddleware)(ctx), launch: ctx => { + // Return early if the Socket plugin is not enabled + if (!ctx.io || !ctx.io.use) return; ctx.io.use(function(socket, next) { sessionMiddleware(socket.request, socket.request.res || {}, next); }); From a6fd40e770d08aaa6b9e54ed459efe31130b9477 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Thu, 6 Aug 2020 14:59:24 +0200 Subject: [PATCH 50/93] 1.0.30 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b786fb8..01919767 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.29", + "version": "1.0.30", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From 106197ff57245e8e4f5e3a784884f95ae8295852 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Mon, 2 Nov 2020 15:41:49 +0900 Subject: [PATCH 51/93] Fixed including also the partials for handlebars --- examples/handlebars/index.js | 1 - examples/handlebars/views/index.hbs | 1 + examples/handlebars/views/partials/nav.hbs | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 examples/handlebars/views/partials/nav.hbs diff --git a/examples/handlebars/index.js b/examples/handlebars/index.js index 624cb817..82c6adbd 100644 --- a/examples/handlebars/index.js +++ b/examples/handlebars/index.js @@ -3,7 +3,6 @@ const { get, post } = server.router; const { render } = server.reply; server( - //{ engine: 'hbs' }, get("/", (ctx) => render("index.hbs")), get("/:id", (ctx) => render("page.hbs", { page: ctx.params.id })) ); diff --git a/examples/handlebars/views/index.hbs b/examples/handlebars/views/index.hbs index b68910c9..12c864f6 100644 --- a/examples/handlebars/views/index.hbs +++ b/examples/handlebars/views/index.hbs @@ -2,3 +2,4 @@

              Visit some pages:

              /hithere

              /dynamic

              +{{> partials/nav}} diff --git a/examples/handlebars/views/partials/nav.hbs b/examples/handlebars/views/partials/nav.hbs new file mode 100644 index 00000000..c146d64c --- /dev/null +++ b/examples/handlebars/views/partials/nav.hbs @@ -0,0 +1 @@ +This is a partial view! From 6aef5486de6394404e1f1ba26c5e39cbb77223fa Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Mon, 2 Nov 2020 18:48:18 +0900 Subject: [PATCH 52/93] Allowed views option to load the partials --- docs/assets/style.min.css | 2 +- docs/documentation/options/README.md | 28 +++++++++++++++++++++++---- docs/documentation/options/index.html | 22 +++++++++++++++++---- package.json | 4 +++- plugins/express/index.js | 19 ++++++++++++++++-- test/examples/test-6.test.js | 5 +++-- 6 files changed, 66 insertions(+), 14 deletions(-) diff --git a/docs/assets/style.min.css b/docs/assets/style.min.css index 3c0170a3..bef291c7 100644 --- a/docs/assets/style.min.css +++ b/docs/assets/style.min.css @@ -1 +1 @@ -html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;letter-spacing:inherit;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background-color:transparent;color:inherit}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;vertical-align:baseline;box-shadow:0 0 rgba(0,0,0,0) inset}button:hover,.button:hover,:hover[type=submit],.dropimage:hover,button:focus,.button:focus,:focus[type=submit],.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo:hover[type=submit],.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo:focus[type=submit],.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,:active[type=submit],.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo:active[type=submit],.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],.button[disabled],[disabled][type=submit],.dropimage[disabled]{cursor:default;box-shadow:none;background:#bbb}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #ccc;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #ccc;border-radius:0;cursor:pointer;width:100%;height:2.2em;box-sizing:border-box;padding:.3em .45em;transition:all 0.3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.45em}select[multiple]{height:auto;background:none;padding:0}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,:focus[type=radio]+.checkable:before,:focus[type=checkbox]+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}:checked[type=radio]+.checkable:after,:checked[type=checkbox]+.checkable:after{background:#555;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}:checked[type=checkbox]+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(0,0,0,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(17,17,17,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:inherit}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(0,0,0,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:0;border-radius:0;border:1px solid #ccc;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#eee}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #eee}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.6);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#fff;color:#111}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;letter-spacing:inherit;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background-color:transparent;color:inherit}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;vertical-align:baseline;box-shadow:0 0 rgba(17,17,17,0) inset}button:hover,.button:hover,:hover[type=submit],.dropimage:hover,button:focus,.button:focus,:focus[type=submit],.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo:hover[type=submit],.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo:focus[type=submit],.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,:active[type=submit],.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo:active[type=submit],.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],.button[disabled],[disabled][type=submit],.dropimage[disabled]{cursor:default;box-shadow:none;background:#aaa}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #aaa;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #aaa;border-radius:0;cursor:pointer;width:100%;height:2.2em;box-sizing:border-box;padding:.3em .45em;transition:all 0.3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.45em}select[multiple]{height:auto;background:none;padding:0}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,:focus[type=radio]+.checkable:before,:focus[type=checkbox]+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}:checked[type=radio]+.checkable:after,:checked[type=checkbox]+.checkable:after{background:#111;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}:checked[type=checkbox]+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(17,17,17,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(170,170,170,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:inherit}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(17,17,17,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:0;border-radius:0;border:1px solid #aaa;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#aaa}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #aaa}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.2);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} diff --git a/docs/documentation/options/README.md b/docs/documentation/options/README.md index ddb3e0ae..df3c2767 100644 --- a/docs/documentation/options/README.md +++ b/docs/documentation/options/README.md @@ -224,7 +224,9 @@ server({ public: '' }); |---------|---------|---------------------|-------|------------| |`views` |`views` |`VIEWS=views` |String |Folder path | -The folder where you put your view files and templates. These are the files used by the [`render()` method](/documentation/reply/#render-). You can set it to any folder within your project. +The folder where you put your view files, partials and templates. These are the files used by the [`render()` method](/documentation/reply/#render-). You can set it to any folder within your project. + +It walks the given directory so please make sure not to include the e.g. root directory since then it'll attempt to walk `node_modules` and that might delay the time to to launch the server significantly. To set the views folder in the environment add this to [your `.env`](#environment): @@ -245,17 +247,18 @@ const res = await run(options, same).get('/'); expect(res.body.views).toBe(path.join(process.cwd(), 'views') + path.sep); ``` -To set the root folder specify it as `'./'`: +You can set it to any folder, like `./templates`: ```js const options = { - views: './' + views: './templates' }; /* test */ +options.views = './test/views'; const same = ctx => ({ views: ctx.options.views }); const res = await run(options, same).get('/'); -expect(res.body.views).toBe(process.cwd() + path.sep); +expect(res.body.views).toBe(process.cwd() + path.sep + 'test/views' + path.sep); ``` If you don't have any view file you don't have to create the folder. The files within `views` should all have an extension such as `.hbs`, `.pug`, etc. To see how to install and use those keep reading. @@ -297,6 +300,23 @@ Or through the corresponding option in javascript: server({ engine: 'pug' }, ctx => render('index')); ``` +The files will be relative to your `views` folder. When using `hbs`, the `views` folder will also be used to load your partials, so you can write them like this: + +```html + + + + {{> head title="Hello world" }} + + + {{> partials/nav }} + ... + + +``` + + + ### Writing your own engine Engines are really easy to write with server.js. They must be a function that receives the file path and the options (or locals) and returns the text to render from the engine. It can be either sync or async. To configure it for handling a specific extension, just put that as the key in an object for `engine`. diff --git a/docs/documentation/options/index.html b/docs/documentation/options/index.html index 75a79bbb..ee978cba 100644 --- a/docs/documentation/options/index.html +++ b/docs/documentation/options/index.html @@ -245,7 +245,8 @@

              Views

              -

              The folder where you put your view files and templates. These are the files used by the render() method. You can set it to any folder within your project.

              +

              The folder where you put your view files, partials and templates. These are the files used by the render() method. You can set it to any folder within your project.

              +

              It walks the given directory so please make sure not to include the e.g. root directory since then it'll attempt to walk node_modules and that might delay the time to to launch the server significantly.

              To set the views folder in the environment add this to your .env:

              VIEWS=views
               

              Or pass it as another option:

              @@ -258,15 +259,16 @@

              Views

              const res = await run(options, same).get('/'); expect(res.body.views).toBe(path.join(process.cwd(), 'views') + path.sep); -

              To set the root folder specify it as './':

              +

              You can set it to any folder, like ./templates:

              const options = {
              -  views: './'
              +  views: './templates'
               };
               
               /* test */
              +options.views = './test/views';
               const same = ctx => ({ views: ctx.options.views });
               const res = await run(options, same).get('/');
              -expect(res.body.views).toBe(process.cwd() + path.sep);
              +expect(res.body.views).toBe(process.cwd() + path.sep + 'test/views' + path.sep);
               

              If you don't have any view file you don't have to create the folder. The files within views should all have an extension such as .hbs, .pug, etc. To see how to install and use those keep reading.

              Engine

              @@ -306,6 +308,18 @@

              Engine

              Or through the corresponding option in javascript:

              server({ engine: 'pug' }, ctx => render('index'));
               
              +

              The files will be relative to your views folder. When using hbs, the views folder will also be used to load your partials, so you can write them like this:

              +
              <!-- `views/index.hbs` -->
              +<html>
              +  <!-- This file is in `views/head.hbs`. Note how we also pass a variable -->
              +  {{> head title="Hello world" }}
              +  <body>
              +    <!-- This file is in `views/partials/nav.hbs` -->
              +    {{> partials/nav }}
              +    ...
              +  </body>
              +</html>
              +

              Writing your own engine

              Engines are really easy to write with server.js. They must be a function that receives the file path and the options (or locals) and returns the text to render from the engine. It can be either sync or async. To configure it for handling a specific extension, just put that as the key in an object for engine.

              As an example of how to handle nunjucks, in a single file for it:

              diff --git a/package.json b/package.json index 01919767..68d2881c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", "bugs": "https://github.com/franciscop/server/issues", - "funding": "https://www.paypal.me/franciscopresencia/19", + "funding": { + "url": "https://www.paypal.me/franciscopresencia/19" + }, "author": "Francisco Presencia (https://francisco.io/)", "license": "MIT", "scripts": { diff --git a/plugins/express/index.js b/plugins/express/index.js index 78f2a384..603d7162 100644 --- a/plugins/express/index.js +++ b/plugins/express/index.js @@ -1,4 +1,6 @@ const express = require('express'); +const hbs = require('hbs'); +const path = require('path'); module.exports = { name: 'express', @@ -28,7 +30,7 @@ module.exports = { }, 'x-powered-by': {} }, - init: ctx => { + init: async ctx => { ctx.express = express; ctx.app = ctx.express(); @@ -40,8 +42,21 @@ module.exports = { } } + // Add the views into the core + if (path.resolve(ctx.options.views) === path.resolve(process.cwd())) { + throw new Error( + 'The "views" option should point to a subfolder of the project and not the root of it' + ); + } + await new Promise(function(resolve, reject) { + hbs.registerPartials(ctx.options.views, function(err) { + if (err) reject(err); + resolve(); + }); + }); + // Accept HTML as a render extension - ctx.app.engine('html', require('hbs').__express); + ctx.app.engine('html', hbs.__express); if (ctx.options.engine) { // If it's an object, expect a { engine: { engineName: engineFN } } diff --git a/test/examples/test-6.test.js b/test/examples/test-6.test.js index 395a969a..e03dd74a 100644 --- a/test/examples/test-6.test.js +++ b/test/examples/test-6.test.js @@ -10,13 +10,14 @@ describe('Automatic test from content 6', () => { it('works', async () => { // START const options = { - views: './' + views: './templates' }; /* test */ + options.views = './test/views'; const same = ctx => ({ views: ctx.options.views }); const res = await run(options, same).get('/'); - expect(res.body.views).toBe(process.cwd() + path.sep); + expect(res.body.views).toBe(process.cwd() + path.sep + 'test/views' + path.sep); // END }); }); From a03e8a7eaf8624e2cd77e6a01d360100ed6c6914 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Mon, 2 Nov 2020 18:49:02 +0900 Subject: [PATCH 53/93] 1.0.31 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68d2881c..ddf6183a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.30", + "version": "1.0.31", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From 4fa2b414cfe27deac616b845c31b4202b2f67e90 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 6 Nov 2020 23:30:07 +0900 Subject: [PATCH 54/93] Added PDF download example --- examples/download-pdf/index.js | 23 +++++++++++++++++++++++ examples/download-pdf/sample.pdf | Bin 0 -> 3028 bytes 2 files changed, 23 insertions(+) create mode 100644 examples/download-pdf/index.js create mode 100644 examples/download-pdf/sample.pdf diff --git a/examples/download-pdf/index.js b/examples/download-pdf/index.js new file mode 100644 index 00000000..8c81c21c --- /dev/null +++ b/examples/download-pdf/index.js @@ -0,0 +1,23 @@ +const fs = require("fs"); +const util = require("util"); +const server = require("../../server"); +const { header } = server.reply; + +// Read it and store it in a variable, emulating a pdf generated on-the-fly +const read = util.promisify(fs.readFile); +const generatePdf = () => read("./sample.pdf", "utf-8"); + +// Trigger the download with server.js +const downloadPdf = (data, name) => { + return header({ "Content-Disposition": `attachment;filename="${name}"` }) + .type("application/pdf") + .send(new Buffer(data)); +}; + +server(async () => { + // It can be created manually, file read, or other ways + const pdf = await generatePdf(); + + // Prompt the browser to download it with a new name + return downloadPdf(pdf, "test.pdf"); +}); diff --git a/examples/download-pdf/sample.pdf b/examples/download-pdf/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dbf091df9a607221e000593a8b5a97b5ea5fb073 GIT binary patch literal 3028 zcmd5;+iK%D7``|79sZj_3mw^3d>n>>rft|$r=<Gl zWIx$CH11?D%do5oLHZ^AN9p^&qnnG-8;=ca>*%k)|M=6kY|A5;iigj(_3oW*IpgQ0 zB;?N?G}O?F~e-o&fdSbEveGxxNVs&T}_+wIC);wN|S3_`=^Ym z?y1Je_6W!5=Pa%0o_u4M!sh=IbybO>E+wq5{dR6;Rn+AKku*_{3aqswkCH}v ztJ}FLi^-kT6dU1Mb|uqH42vhacOeZu&Rl#HCGFr-xBWM-|+e^~95C3kuyCa8Nz&=d3 zPw9GoO7mhx4-J@*eqI7o0NLmbm9D2#M#EZ@Dl~~|vk9Y>(382@*~jiaPA^4vloGW^${BO z&|L0&$FyZ34q1)S0TXjiAeyzye;HJqPhX+oj`M@hIuz@m%ZWTgO?gR!qsqvQPqV zVBwTl{djT$Lm)?KJ&`!^p- zB?yU29^x`|s{JSof_pN9Oqel#YyZFw~B0kRS*9GB0?&&kJAg z<34|7m-_(#cV8b5!0fg%+X9aQc`Db0`!4$;o1mTB0`JJMabTnKqnZ}rgzd~^$`C_Q S>NZV0@_bPEqs!}&ZT$n`rwj1_ literal 0 HcmV?d00001 From 7db2058bfb89ff5a7036a314e7c0cd0cb650185b Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 6 Nov 2020 23:38:44 +0900 Subject: [PATCH 55/93] Improved example for header() --- docs/documentation/reply/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/documentation/reply/README.md b/docs/documentation/reply/README.md index 7dbd2e3e..ed6e9023 100644 --- a/docs/documentation/reply/README.md +++ b/docs/documentation/reply/README.md @@ -202,6 +202,17 @@ const mid = ctx => header({ }); ``` +This [can be chained](#chainable) with other methods to e.g. prompt for a download: + +```js +const mid = async ctx => { + const data = await readFileAsync('./hello.pdf', 'utf-8prettier'); + return header({ "Content-Disposition": `filename="welcome.pdf"` }) + .type("application/pdf") + .send(new Buffer(data)); +}; +``` + ## json() From dc6bd278ce5153ecff845deeb329af32229bd898 Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Fri, 6 Nov 2020 23:39:19 +0900 Subject: [PATCH 56/93] Improved example for header() --- docs/documentation/reply/index.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html index 560de175..48a2678b 100644 --- a/docs/documentation/reply/index.html +++ b/docs/documentation/reply/index.html @@ -231,6 +231,14 @@

              header()

              'Content-Length': '123' }); +

              This can be chained with other methods to e.g. prompt for a download:

              +
              const mid = async ctx => {
              +  const data = await readFileAsync('./hello.pdf', 'utf-8prettier');
              +  return header({ "Content-Disposition": `filename="welcome.pdf"` })
              +    .type("application/pdf")
              +    .send(new Buffer(data));
              +};
              +

              json()

              Sends a JSON response. It accepts a plain object or an array that will be stringified with JSON.stringify. Sets the correct Content-Type headers as well:

              const mid = ctx => json({ foo: 'bar' });
              
              From 28ceeb8ba219f54be00936840ae30bfaa6e70866 Mon Sep 17 00:00:00 2001
              From: Francisco Presencia 
              Date: Fri, 6 Nov 2020 23:39:51 +0900
              Subject: [PATCH 57/93] Improved example for header()
              
              ---
               docs/documentation/reply/README.md  | 6 +++---
               docs/documentation/reply/index.html | 6 +++---
               2 files changed, 6 insertions(+), 6 deletions(-)
              
              diff --git a/docs/documentation/reply/README.md b/docs/documentation/reply/README.md
              index ed6e9023..963d5ae1 100644
              --- a/docs/documentation/reply/README.md
              +++ b/docs/documentation/reply/README.md
              @@ -206,9 +206,9 @@ This [can be chained](#chainable) with other methods to e.g. prompt for a downlo
               
               ```js
               const mid = async ctx => {
              -  const data = await readFileAsync('./hello.pdf', 'utf-8prettier');
              -  return header({ "Content-Disposition": `filename="welcome.pdf"` })
              -    .type("application/pdf")
              +  const data = await readFileAsync('./hello.pdf', 'utf-8');
              +  return header({ 'Content-Disposition': `filename='welcome.pdf'` })
              +    .type('application/pdf')
                   .send(new Buffer(data));
               };
               ```
              diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html
              index 48a2678b..1b62ee5e 100644
              --- a/docs/documentation/reply/index.html
              +++ b/docs/documentation/reply/index.html
              @@ -233,9 +233,9 @@ 

              header()

              This can be chained with other methods to e.g. prompt for a download:

              const mid = async ctx => {
              -  const data = await readFileAsync('./hello.pdf', 'utf-8prettier');
              -  return header({ "Content-Disposition": `filename="welcome.pdf"` })
              -    .type("application/pdf")
              +  const data = await readFileAsync('./hello.pdf', 'utf-8');
              +  return header({ 'Content-Disposition': `filename='welcome.pdf'` })
              +    .type('application/pdf')
                   .send(new Buffer(data));
               };
               
              From 55cd53031facd6603ea29916dbba181ddb474444 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 19 Feb 2021 20:54:16 +0900 Subject: [PATCH 58/93] Avoid middleware leaking to the next middleware if it's already done. Except status() for retro-compat --- docs/assets/style.min.css | 2 +- plugins/final/final.test.js | 7 ++++--- router/integration.test.js | 13 ++++++++++++- src/join/index.js | 12 ++++++++++-- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/docs/assets/style.min.css b/docs/assets/style.min.css index bef291c7..1a8e69a0 100644 --- a/docs/assets/style.min.css +++ b/docs/assets/style.min.css @@ -1 +1 @@ -html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#fff;color:#111}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;letter-spacing:inherit;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background-color:transparent;color:inherit}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;vertical-align:baseline;box-shadow:0 0 rgba(17,17,17,0) inset}button:hover,.button:hover,:hover[type=submit],.dropimage:hover,button:focus,.button:focus,:focus[type=submit],.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo:hover[type=submit],.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo:focus[type=submit],.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,:active[type=submit],.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo:active[type=submit],.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],.button[disabled],[disabled][type=submit],.dropimage[disabled]{cursor:default;box-shadow:none;background:#aaa}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #aaa;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #aaa;border-radius:0;cursor:pointer;width:100%;height:2.2em;box-sizing:border-box;padding:.3em .45em;transition:all 0.3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.45em}select[multiple]{height:auto;background:none;padding:0}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,:focus[type=radio]+.checkable:before,:focus[type=checkbox]+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}:checked[type=radio]+.checkable:after,:checked[type=checkbox]+.checkable:after{background:#111;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}:checked[type=checkbox]+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(17,17,17,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(170,170,170,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:inherit}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(17,17,17,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:0;border-radius:0;border:1px solid #aaa;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#aaa}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #aaa}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.2);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#fff;color:#111}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;letter-spacing:inherit;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background-color:transparent;color:inherit}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;vertical-align:baseline;box-shadow:0 0 rgba(17,17,17,0) inset}button:hover,.button:hover,:hover[type=submit],.dropimage:hover,button:focus,.button:focus,:focus[type=submit],.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo:hover[type=submit],.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo:focus[type=submit],.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,:active[type=submit],.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo:active[type=submit],.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],.button[disabled],[disabled][type=submit],.dropimage[disabled]{cursor:default;box-shadow:none;background:#aaa}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #aaa;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #aaa;border-radius:0;cursor:pointer;width:100%;height:2.2em;box-sizing:border-box;padding:.3em .45em;transition:all 0.3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.45em}select[multiple]{height:auto;background:none;padding:0}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,:focus[type=radio]+.checkable:before,:focus[type=checkbox]+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}:checked[type=radio]+.checkable:after,:checked[type=checkbox]+.checkable:after{background:#111;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}:checked[type=checkbox]+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(17,17,17,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(170,170,170,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:inherit}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(17,17,17,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:none;border-radius:0;border:1px solid #aaa;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#aaa}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #aaa}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.2);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} diff --git a/plugins/final/final.test.js b/plugins/final/final.test.js index 3f860368..22f03d10 100644 --- a/plugins/final/final.test.js +++ b/plugins/final/final.test.js @@ -14,13 +14,14 @@ describe('final', () => { expect(out.log).toMatch('Hello Error'); }); - it('just logs it if the headers were already sent', async () => { - const simple = () => { throw new Error('Hello Error'); }; + it('is not called if the previous one finishes', async () => { + let called = false; + const simple = () => { called = true; }; const out = {}; const res = await run({ raw: true, log: storeLog(out) }, () => 'Hello world', simple).get('/'); expect(res.statusCode).toBe(200); expect(res.body).toBe('Hello world'); - expect(out.log).toMatch('Hello Error'); + expect(called).toBe(false); }); it('displays the appropriate error to the public', async () => { diff --git a/router/integration.test.js b/router/integration.test.js index 28257cf8..e7e1d9fd 100644 --- a/router/integration.test.js +++ b/router/integration.test.js @@ -2,7 +2,7 @@ const server = require('server'); const run = require('server/test/run'); const { get, post, put, del, sub, error } = server.router; - +const { status } = server.reply; // Mock middlewares and data: @@ -28,6 +28,17 @@ describe('Basic router types', () => { expect(res).toMatchObject({ status: 200, body: 'Hello 世界' }); }); + it('can skip a request', async () => { + let called = false; + const notCalled = ctx => { + called = true; + }; + const mid = get('/', () => status(200).send('Done'), notCalled); + + await run(mid).get('/'); + expect(called).toBe(false); + }); + it('can do a POST request', async () => { const mid = post('/', ctx => ctx.data); diff --git a/src/join/index.js b/src/join/index.js index 4142899f..168aa329 100644 --- a/src/join/index.js +++ b/src/join/index.js @@ -28,19 +28,27 @@ module.exports = (...middles) => { return async ctx => { for (const mid of middle) { try { + if (ctx.req.solved) return; + // DO NOT MERGE; the else is relevant only for ctx.error if (ctx.error) { // See if this middleware can fix it if (mid.error) { assert(mid.error instanceof Function, 'Error handler should be a function'); - let ret = await mid.error(ctx); + const ret = await mid.error(ctx); await processReturn(ctx, ret); + if (ctx.res.headersSent) { + ctx.req.solved = true; + } } } // No error, call next middleware. Skips middleware if there's an error else { - let ret = await mid(ctx); + const ret = await mid(ctx); await processReturn(ctx, ret); + if (ctx.res.headersSent) { + ctx.req.solved = true; + } } } catch (err) { ctx.error = err; From 59c1399d10b19bf86e33dc91a04db2ce9bbbdd1d Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 19 Feb 2021 20:54:39 +0900 Subject: [PATCH 59/93] 1.0.32 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ddf6183a..04489376 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.31", + "version": "1.0.32", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From 52aa9c9c17105311e5931bd0eb4ac579a2edac14 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 19 Feb 2021 21:07:56 +0900 Subject: [PATCH 60/93] Added files docs --- docs/documentation/context/index.html | 2 +- docs/documentation/errors/index.html | 2 +- docs/documentation/index.html | 2 +- docs/documentation/options/index.html | 2 +- docs/documentation/plugins/index.html | 2 +- docs/documentation/reply/README.md | 23 +++++++++++++++++++++++ docs/documentation/reply/index.html | 18 +++++++++++++++++- docs/documentation/router/index.html | 2 +- docs/documentation/testing/index.html | 2 +- 9 files changed, 47 insertions(+), 8 deletions(-) diff --git a/docs/documentation/context/index.html b/docs/documentation/context/index.html index 8818a501..6705f32e 100644 --- a/docs/documentation/context/index.html +++ b/docs/documentation/context/index.html @@ -1,4 +1,4 @@ -Context documentation - server.js

              Documentation

              Context

              +Context documentation - server.js

              Documentation

              Context

              Context is the only parameter that middleware receives and contains all the information available at this point of the request:

              diff --git a/docs/documentation/errors/index.html b/docs/documentation/errors/index.html index 704ee5db..762fc7c6 100644 --- a/docs/documentation/errors/index.html +++ b/docs/documentation/errors/index.html @@ -1,4 +1,4 @@ -Errors - server.js

              Documentation

              Errors

              +Errors - server.js

              Documentation

              Errors

              If you happen to stumble here, this bit of the documentation is outdated and follows some old code. Please help us improve the project and the docs so we can make it into the official release.
              diff --git a/docs/documentation/index.html b/docs/documentation/index.html index 33610719..f73edd6a 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -1,4 +1,4 @@ -Documentation - server.js

              Documentation

              Documentation

              +Documentation - server.js

              Documentation

              Documentation

              Conceptually server is a function that accepts options and other functions. The heavy lifting is already implemented so you can focus on your project:

              // Import the variable into the file
               const server = require('server');
              diff --git a/docs/documentation/options/index.html b/docs/documentation/options/index.html
              index ee978cba..556da1f7 100644
              --- a/docs/documentation/options/index.html
              +++ b/docs/documentation/options/index.html
              @@ -1,4 +1,4 @@
              -Options documentation - server.js
              diff --git a/docs/documentation/plugins/index.html b/docs/documentation/plugins/index.html index 624a10ae..73bf9a6f 100644 --- a/docs/documentation/plugins/index.html +++ b/docs/documentation/plugins/index.html @@ -1,4 +1,4 @@ -Plugins documentation - server.js

              Documentation

              Plugins

              +Plugins documentation - server.js

              Documentation

              Plugins

              If you happen to stumble here, this bit of the documentation is under active construction and should not be used at all. Please help us improve the project and the docs.
              diff --git a/docs/documentation/reply/README.md b/docs/documentation/reply/README.md index 963d5ae1..7e7b4895 100644 --- a/docs/documentation/reply/README.md +++ b/docs/documentation/reply/README.md @@ -6,6 +6,7 @@ A reply is a method **returned from a middleware** that creates the response. Th |-------------------------------------------|----------------------------|-----| |[`cookie(name, value, opts)`](#cookie-) |cookie('name', 'Francisco') |false| |[`download(path[, filename])`](#download-) |download('resume.pdf') |true | +|[`file(path)`](#file-) |file('resume.pdf') |true | |[`header(field[, value])`](#header-) |header('ETag': '12345') |false| |[`json([data])`](#json-) |json({ hello: 'world' }) |true | |[`jsonp([data])`](#jsonp-) |jsonp({ hello: 'world' }) |true | @@ -187,6 +188,28 @@ server([ ``` + +## file() + +Send a file to the browser with the correct mime type: + +```js +server(ctx => file('user-profile-5674354.png')); +``` + +It does not accept a name since the user is not prompted for download. It will stream the file, so that no files are read fully into memory. + +You can handle errors for this method downstream: + +```js +server([ + ctx => file('user-profile-5674354.png'), + error(ctx => { console.log(ctx.error); }) +]); +``` + + + ## header() Set a header to be sent with the response. It accepts two strings as key and value or an object to set multiple headers: diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html index 1b62ee5e..8496aa67 100644 --- a/docs/documentation/reply/index.html +++ b/docs/documentation/reply/index.html @@ -1,4 +1,4 @@ -Reply documentation - server.js
              @@ -20,6 +20,11 @@ + + + + + @@ -220,6 +225,17 @@

              download()

              error(ctx => { console.log(ctx.error); }) ]);
              +

              file()

              +

              Send a file to the browser with the correct mime type:

              +
              server(ctx => file('user-profile-5674354.png'));
              +
              +

              It does not accept a name since the user is not prompted for download. It will stream the file, so that no files are read fully into memory.

              +

              You can handle errors for this method downstream:

              +
              server([
              +  ctx => file('user-profile-5674354.png'),
              +  error(ctx => { console.log(ctx.error); })
              +]);
              +

              header()

              Set a header to be sent with the response. It accepts two strings as key and value or an object to set multiple headers:

              const mid = ctx => header('Content-Type', 'text/plain');
              diff --git a/docs/documentation/router/index.html b/docs/documentation/router/index.html
              index 232a4f4c..52174688 100644
              --- a/docs/documentation/router/index.html
              +++ b/docs/documentation/router/index.html
              @@ -1,4 +1,4 @@
              -Router documentation - server.js
              true
              file(path)file('resume.pdf')true
              header(field[, value]) header('ETag': '12345') false
              diff --git a/docs/documentation/testing/index.html b/docs/documentation/testing/index.html index 01f6a01f..4f96dcb9 100644 --- a/docs/documentation/testing/index.html +++ b/docs/documentation/testing/index.html @@ -1,4 +1,4 @@ -Testing documentation - server.js

              Documentation

              Testing

              +Testing documentation - server.js

              Documentation

              Testing

              If you happen to stumble here, this bit of the documentation is outdated and follows some old code. Please help us improve the project and the docs so we can make it into the official release.
              From 13610f430581efa46eeb85ca254462b9bbd79521 Mon Sep 17 00:00:00 2001 From: Francisco Date: Sat, 13 Mar 2021 06:03:38 +0900 Subject: [PATCH 61/93] Added docs for multiple headers --- docs/documentation/reply/README.md | 8 ++++++++ docs/documentation/reply/index.html | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/docs/documentation/reply/README.md b/docs/documentation/reply/README.md index 7e7b4895..99469ba0 100644 --- a/docs/documentation/reply/README.md +++ b/docs/documentation/reply/README.md @@ -225,6 +225,14 @@ const mid = ctx => header({ }); ``` +You can also send multiple headers with the same name by passing an array as the second parameter: + +```js +const mid = ctx => header({ + 'Link': ['Fake Value', 'Another Fake Value'] +}); +``` + This [can be chained](#chainable) with other methods to e.g. prompt for a download: ```js diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html index 8496aa67..1e7c8e8c 100644 --- a/docs/documentation/reply/index.html +++ b/docs/documentation/reply/index.html @@ -247,6 +247,11 @@

              header()

              'Content-Length': '123' });
              +

              You can also send multiple headers with the same name by passing an array as the second parameter:

              +
              const mid = ctx => header({
              +  'Link': ['Fake Value', 'Another Fake Value']
              +});
              +

              This can be chained with other methods to e.g. prompt for a download:

              const mid = async ctx => {
                 const data = await readFileAsync('./hello.pdf', 'utf-8');
              
              From 239464621969c01dbc40e5fa52bdc678a55170dc Mon Sep 17 00:00:00 2001
              From: aong 
              Date: Wed, 21 Apr 2021 12:25:28 +0800
              Subject: [PATCH 62/93] Update index.js (#131)
              
              * Update index.js
              
              remove invalid code
              
              * Update index.js
              
              remove the async
              ---
               src/join/index.js | 6 +++---
               1 file changed, 3 insertions(+), 3 deletions(-)
              
              diff --git a/src/join/index.js b/src/join/index.js
              index 168aa329..5bfc7daa 100644
              --- a/src/join/index.js
              +++ b/src/join/index.js
              @@ -3,19 +3,19 @@ const assert = require('assert');
               const reply = require('../../reply');
               
               // Recursively resolve possible function returns
              -const processReturn = async (ctx, ret) => {
              +const processReturn = (ctx, ret) => {
                 if (!ret) return;
               
                 // Use the returned reply instance
                 if (ret.constructor.name === 'Reply') {
              -    return await ret.exec(ctx);
              +    return ret.exec(ctx);
                 }
               
                 // TODO: make a check for only accepting the right types of return values
               
                 // Create a whole new reply thing
                 const fn = typeof ret === 'number' ? 'status' : 'send';
              -  return await reply[fn](ret).exec(ctx);
              +  return reply[fn](ret).exec(ctx);
               };
               
               // Pass an array of modern middleware and return a single modern middleware
              
              From 374e1bd048e737d33d56d2a0357715691cd00bee Mon Sep 17 00:00:00 2001
              From: Francisco Presencia 
              Date: Thu, 6 May 2021 23:42:19 +0900
              Subject: [PATCH 63/93] Fixed 132 by making sure the routers send the reply
               (#133)
              
              * Fixed 132 by making sure the routers send the reply
              
              * Fixed 132 by making sure the routers send the reply
              ---
               examples/bug132/index.js | 6 ++++++
               router/generic.js        | 3 +++
               router/sub.js            | 3 +++
               router/unit.test.js      | 2 +-
               4 files changed, 13 insertions(+), 1 deletion(-)
               create mode 100644 examples/bug132/index.js
              
              diff --git a/examples/bug132/index.js b/examples/bug132/index.js
              new file mode 100644
              index 00000000..a277cf67
              --- /dev/null
              +++ b/examples/bug132/index.js
              @@ -0,0 +1,6 @@
              +const server = require('../../');
              +
              +const { get } = server.router;
              +const { status } = server.reply;
              +
              +server([get(ctx => status(404))]);
              diff --git a/router/generic.js b/router/generic.js
              index 694e4c50..461bb941 100644
              --- a/router/generic.js
              +++ b/router/generic.js
              @@ -30,5 +30,8 @@ module.exports = (method, ...all) => {
                   await join(middle)(ctx);
               
                   ctx.req.solved = true;
              +    if (!ctx.res.headersSent) {
              +      ctx.res.end();
              +    }
                 };
               };
              diff --git a/router/sub.js b/router/sub.js
              index 2c0020dd..b07da3a9 100644
              --- a/router/sub.js
              +++ b/router/sub.js
              @@ -6,5 +6,8 @@ module.exports = (path, ...middle) => async ctx => {
                     (path instanceof RegExp && path.test(full))) {
                   await join(middle)(ctx);
                   ctx.req.solved = true;
              +    if (!ctx.res.headersSent) {
              +      ctx.res.end();
              +    }
                 }
               };
              diff --git a/router/unit.test.js b/router/unit.test.js
              index 14c17dc5..c9ece5ba 100644
              --- a/router/unit.test.js
              +++ b/router/unit.test.js
              @@ -9,7 +9,7 @@ const run = require('server/test/run');
               
               const createCtx = ({ url = '/', path = '/', method = 'GET' } = {}) => extend({
                 req: { url, path, method },
              -  res: { send: () => {} },
              +  res: { send: () => {}, end: () => {} },
                 options: {}
               });
               
              
              From 4ae78f63c8a820c98527fbe8c44fc556ac1b1dc4 Mon Sep 17 00:00:00 2001
              From: Francisco 
              Date: Thu, 6 May 2021 23:47:35 +0900
              Subject: [PATCH 64/93] 1.0.33
              
              ---
               package.json | 2 +-
               1 file changed, 1 insertion(+), 1 deletion(-)
              
              diff --git a/package.json b/package.json
              index 04489376..2db0e108 100644
              --- a/package.json
              +++ b/package.json
              @@ -1,6 +1,6 @@
               {
                 "name": "server",
              -  "version": "1.0.32",
              +  "version": "1.0.33",
                 "description": "A modern and powerful server for Node.js",
                 "homepage": "https://serverjs.io/",
                 "repository": "https://github.com/franciscop/server.git",
              
              From 8dca56802066f0aa0666548917d0349613a17c0d Mon Sep 17 00:00:00 2001
              From: Francisco 
              Date: Wed, 2 Jun 2021 16:34:39 +0900
              Subject: [PATCH 65/93] Added example for testing with supertest
              
              ---
               examples/supertest/index.js      |  4 ++++
               examples/supertest/index.test.js | 24 ++++++++++++++++++++++++
               examples/supertest/package.json  | 12 ++++++++++++
               package.json                     |  2 +-
               4 files changed, 41 insertions(+), 1 deletion(-)
               create mode 100644 examples/supertest/index.js
               create mode 100644 examples/supertest/index.test.js
               create mode 100644 examples/supertest/package.json
              
              diff --git a/examples/supertest/index.js b/examples/supertest/index.js
              new file mode 100644
              index 00000000..440fb6f9
              --- /dev/null
              +++ b/examples/supertest/index.js
              @@ -0,0 +1,4 @@
              +const server = require('../../server');
              +const { get } = server.router;
              +
              +module.exports = server(get('/user', () => ({ name: 'john' })));
              diff --git a/examples/supertest/index.test.js b/examples/supertest/index.test.js
              new file mode 100644
              index 00000000..dc7ea1c5
              --- /dev/null
              +++ b/examples/supertest/index.test.js
              @@ -0,0 +1,24 @@
              +const request = require('supertest');
              +
              +// The promise exported from your index
              +const serverPromise = require('./index.js');
              +
              +// This will be populated after the server has launched. You can call it
              +// anything you want; server, runtime, ctx, instance, etc. are all valid names
              +let server;
              +
              +describe('user', () => {
              +  beforeAll(async () => {
              +    server = await serverPromise;
              +  });
              +  afterAll(async () => {
              +    await server.close();
              +  });
              +  it('tests the user endpoint', async () => {
              +    await request(server.app)
              +      .get('/user')
              +      .expect('Content-Type', /json/)
              +      .expect('Content-Length', '15')
              +      .expect(200);
              +  });
              +});
              diff --git a/examples/supertest/package.json b/examples/supertest/package.json
              new file mode 100644
              index 00000000..8c81a60b
              --- /dev/null
              +++ b/examples/supertest/package.json
              @@ -0,0 +1,12 @@
              +{
              +  "name": "@server/supertest",
              +  "version": "1.0.0",
              +  "main": "index.js",
              +  "scripts": {
              +    "test": "jest"
              +  },
              +  "devDependencies": {
              +    "jest": "^27.0.3",
              +    "supertest": "^6.1.3"
              +  }
              +}
              diff --git a/package.json b/package.json
              index 2db0e108..ed2ffaff 100644
              --- a/package.json
              +++ b/package.json
              @@ -77,7 +77,7 @@
                   "node-sass": "^4.13.1",
                   "picnic": "^6.4.0",
                   "request-promises": "^1.0.1",
              -    "supertest": "^3.0.0"
              +    "supertest": "^3.4.2"
                 },
                 "jest": {
                   "transformIgnorePatterns": [
              
              From 262ffd8a138386c8c0c448cc99bbed13fa381f9a Mon Sep 17 00:00:00 2001
              From: Francisco 
              Date: Wed, 2 Jun 2021 16:50:00 +0900
              Subject: [PATCH 66/93] Improved docs for cookies
              
              ---
               docs/documentation/reply/README.md  | 21 ++++++++++++++++++++-
               docs/documentation/reply/index.html | 14 +++++++++++++-
               2 files changed, 33 insertions(+), 2 deletions(-)
              
              diff --git a/docs/documentation/reply/README.md b/docs/documentation/reply/README.md
              index 99469ba0..51192dd1 100644
              --- a/docs/documentation/reply/README.md
              +++ b/docs/documentation/reply/README.md
              @@ -141,7 +141,22 @@ Then each of those URLs will use a different language.
               
               ## cookie()
               
              -Set a cookie on the browser. It will send the Set-Cookie headers:
              +Send one or multiple cookies to the browser:
              +
              +```js
              +cookie(name, value, [options])
              +```
              +
              +By default it will _just_ set a cookie and not finish the request, so if you want to also send the body you need to do it explicitly:
              +
              +```js
              +server(
              +  ctx => cookie('foo', 'bar'),  // Set a cookie
              +  ctx => cookie('xyz', { obj: 'okay' }), // Stringify the object
              +  ctx => cookie('abc', 'def', { maxAge: 100000 }),  // Pass some options
              +  ctx => cookie('fizz', 'buzz').send(), // Set the cookie AND finish the request
              +);
              +```
               
               ```js
               const { cookie } = server.reply;
              @@ -153,6 +168,10 @@ run(setCookie).get('/').then(res => {
               });
               ```
               
              +### Cookie Options
              +
              +The options is an optional object with these keys/values:
              +
               | Key         | Default                |  Type             |
               |-------------|------------------------|-------------------|
               | `domain`    | Current domain         | String            |
              diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html
              index 1e7c8e8c..0b6a466a 100644
              --- a/docs/documentation/reply/index.html
              +++ b/docs/documentation/reply/index.html
              @@ -148,7 +148,17 @@ 

              Multiple replies

              Then each of those URLs will use a different language.

              -

              Set a cookie on the browser. It will send the Set-Cookie headers:

              +

              Send one or multiple cookies to the browser:

              +
              cookie(name, value, [options])
              +
              +

              By default it will just set a cookie and not finish the request, so if you want to also send the body you need to do it explicitly:

              +
              server(
              +  ctx => cookie('foo', 'bar'),  // Set a cookie
              +  ctx => cookie('xyz', { obj: 'okay' }), // Stringify the object
              +  ctx => cookie('abc', 'def', { maxAge: 100000 }),  // Pass some options
              +  ctx => cookie('fizz', 'buzz').send(), // Set the cookie AND finish the request
              +);
              +
              const { cookie } = server.reply;
               const setCookie = ctx => cookie('foo', 'bar').send();
               
              @@ -157,6 +167,8 @@ 
                 expect(res.headers['Set-Cookie:']).toMatch(/foo\=bar/);
               });
               
              + +

              The options is an optional object with these keys/values:

              From 02bd2c1a47e85450ba5d291b2c17d6f55e21a58a Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 2 Jun 2021 16:52:35 +0900 Subject: [PATCH 67/93] Improved docs for cookies --- docs/documentation/reply/README.md | 2 +- docs/documentation/reply/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/documentation/reply/README.md b/docs/documentation/reply/README.md index 51192dd1..7d3d97db 100644 --- a/docs/documentation/reply/README.md +++ b/docs/documentation/reply/README.md @@ -154,7 +154,7 @@ server( ctx => cookie('foo', 'bar'), // Set a cookie ctx => cookie('xyz', { obj: 'okay' }), // Stringify the object ctx => cookie('abc', 'def', { maxAge: 100000 }), // Pass some options - ctx => cookie('fizz', 'buzz').send(), // Set the cookie AND finish the request + ctx => cookie('fizz', 'buzz').send(), // Set cookie AND finish the request ); ``` diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html index 0b6a466a..062b3f40 100644 --- a/docs/documentation/reply/index.html +++ b/docs/documentation/reply/index.html @@ -156,7 +156,7 @@ ctx => cookie('foo', 'bar'), // Set a cookie ctx => cookie('xyz', { obj: 'okay' }), // Stringify the object ctx => cookie('abc', 'def', { maxAge: 100000 }), // Pass some options - ctx => cookie('fizz', 'buzz').send(), // Set the cookie AND finish the request + ctx => cookie('fizz', 'buzz').send(), // Set cookie AND finish the request );
              const { cookie } = server.reply;
              
              From 21547aec1fbfeb689af2e7782daf95d78e66204b Mon Sep 17 00:00:00 2001
              From: Francisco 
              Date: Thu, 24 Jun 2021 18:41:44 +0900
              Subject: [PATCH 68/93] Fixed dependencies
              
              ---
               router/generic.js | 15 +++++++--------
               router/sub.js     | 17 ++++++++++-------
               2 files changed, 17 insertions(+), 15 deletions(-)
              
              diff --git a/router/generic.js b/router/generic.js
              index 461bb941..ea520e78 100644
              --- a/router/generic.js
              +++ b/router/generic.js
              @@ -6,7 +6,6 @@ const decode = decodeURIComponent;
               
               // Generic request handler
               module.exports = (method, ...all) => {
              -
                 // Extracted or otherwise it'd shift once per call; also more performant
                 const { path, middle } = parse(all);
               
              @@ -14,7 +13,6 @@ module.exports = (method, ...all) => {
                 const parsePath = match(path.replace(/\*/g, '(.*)'), { decode: decode });
               
                 return async ctx => {
              -
                   // A route should be solved only once per request
                   if (ctx.req.solved) return;
               
              @@ -27,11 +25,12 @@ module.exports = (method, ...all) => {
                   ctx.params = ctx.req.params;
               
                   // Perform this promise chain
              -    await join(middle)(ctx);
              -
              -    ctx.req.solved = true;
              -    if (!ctx.res.headersSent) {
              -      ctx.res.end();
              -    }
              +    await join(middle, ctx => {
              +      // Only solve it if all the previous middleware succeeded
              +      ctx.req.solved = true;
              +      if (!ctx.res.headersSent) {
              +        ctx.res.end();
              +      }
              +    })(ctx);
                 };
               };
              diff --git a/router/sub.js b/router/sub.js
              index b07da3a9..348f7ab0 100644
              --- a/router/sub.js
              +++ b/router/sub.js
              @@ -2,12 +2,15 @@ const join = require('../src/join');
               
               module.exports = (path, ...middle) => async ctx => {
                 const full = ctx.req.subdomains.reverse().join('.');
              -  if ((typeof path === 'string' && path === full) ||
              -      (path instanceof RegExp && path.test(full))) {
              -    await join(middle)(ctx);
              -    ctx.req.solved = true;
              -    if (!ctx.res.headersSent) {
              -      ctx.res.end();
              -    }
              +  if (
              +    (typeof path === 'string' && path === full) ||
              +    (path instanceof RegExp && path.test(full))
              +  ) {
              +    await join(middle, ctx => {
              +      ctx.req.solved = true;
              +      if (!ctx.res.headersSent) {
              +        ctx.res.end();
              +      }
              +    })(ctx);
                 }
               };
              
              From 26cbf773c57d131016d0803876cf5e97880bcbc7 Mon Sep 17 00:00:00 2001
              From: Francisco 
              Date: Thu, 24 Jun 2021 18:45:35 +0900
              Subject: [PATCH 69/93] Upgraded dependencies
              
              ---
               package.json | 4 ++--
               1 file changed, 2 insertions(+), 2 deletions(-)
              
              diff --git a/package.json b/package.json
              index ed2ffaff..d3e16635 100644
              --- a/package.json
              +++ b/package.json
              @@ -69,12 +69,12 @@
                   "grunt-bytesize": "^0.2.0",
                   "grunt-contrib-connect": "^1.0.2",
                   "grunt-contrib-jshint": "^1.1.0",
              -    "grunt-contrib-pug": "^1.0.0",
              +    "grunt-contrib-pug": "^3.0.0",
                   "grunt-contrib-watch": "^1.0.0",
                   "grunt-sass": "^3.1.0",
                   "jest": "^25.0.0",
                   "jstransformer-marked": "^1.0.2",
              -    "node-sass": "^4.13.1",
              +    "node-sass": "^6.0.1",
                   "picnic": "^6.4.0",
                   "request-promises": "^1.0.1",
                   "supertest": "^3.4.2"
              
              From 9e554e0fbb4ab80d0496b3d83dc7b6950c9d3dbe Mon Sep 17 00:00:00 2001
              From: Francisco 
              Date: Thu, 24 Jun 2021 18:45:56 +0900
              Subject: [PATCH 70/93] 1.0.34
              
              ---
               package.json | 2 +-
               1 file changed, 1 insertion(+), 1 deletion(-)
              
              diff --git a/package.json b/package.json
              index d3e16635..6de8b3cc 100644
              --- a/package.json
              +++ b/package.json
              @@ -1,6 +1,6 @@
               {
                 "name": "server",
              -  "version": "1.0.33",
              +  "version": "1.0.34",
                 "description": "A modern and powerful server for Node.js",
                 "homepage": "https://serverjs.io/",
                 "repository": "https://github.com/franciscop/server.git",
              
              From e1b99a64ae07e0371ac8edd0a1ee41fb4ab88c69 Mon Sep 17 00:00:00 2001
              From: Arpit Goyal <50814175+Arpitgoyalgg@users.noreply.github.com>
              Date: Wed, 14 Jul 2021 17:38:58 +0530
              Subject: [PATCH 71/93] Fix some words (#138)
              
              ---
               docs/tutorials/getting-started/README.md | 6 +++---
               1 file changed, 3 insertions(+), 3 deletions(-)
              
              diff --git a/docs/tutorials/getting-started/README.md b/docs/tutorials/getting-started/README.md
              index a1376bcf..efc63aa1 100644
              --- a/docs/tutorials/getting-started/README.md
              +++ b/docs/tutorials/getting-started/README.md
              @@ -2,7 +2,7 @@
               
               In this tutorial you will learn how to get started with Node.js development and create a project from scratch. While there are many ways of doing it, this guide is focused first on making it easy and second on using common tools.
               
              -You will need some basic tools like having a git and a code editor ([we recommend Atom](https://atom.io/)) as well as some basic knowledge around your operative system and the terminal/command line.
              +You will need some basic tools like having git and a code editor ([we recommend Atom](https://atom.io/)) as well as some basic knowledge around your operative system and the terminal/command line.
               
               
               
              @@ -66,13 +66,13 @@ node_modules
               
               This is because we want these files and places to only be accessible from our computer, but we don't want to deploy them along the rest of the code.
               
              -Finally we will start our npm package by doing init in the terminal:
              +Finally we will initialize our project by doing init in the terminal:
               
               ```bash
               npm init
               ```
               
              -It will ask some questions, just answer them or press "enter" to accept the default (set the "main" to "index.js"). After answering everything you should have a `package.json` file, so now you can edit the part where it says "scripts" to add this:
              +It will ask some questions, just answer them or press the "enter" key to accept the default (set the "main" to "index.js"). After answering everything you should have a `package.json` file, so now you can edit the part where it says "scripts" to add this:
               
               ```json
                 "scripts": {
              
              From 10d0bb02aec165f6bafdacc201b242c2033e6a2a Mon Sep 17 00:00:00 2001
              From: Francisco 
              Date: Wed, 11 Aug 2021 13:51:31 +0200
              Subject: [PATCH 72/93] Fixed persistent data in socket bug. Added socket.io
               example and improved code readability. Added warning for 'ping' since it can
               yield unwanted results
              
              ---
               docs/tutorials/getting-started/index.html |  6 +-
               examples/socket/index.js                  | 23 +++++++
               examples/socket/views/index.html          | 40 ++++++++++++
               plugins/socket/index.js                   | 23 ++++---
               router/unit.test.js                       | 74 +++++++++++++----------
               5 files changed, 124 insertions(+), 42 deletions(-)
               create mode 100644 examples/socket/index.js
               create mode 100644 examples/socket/views/index.html
              
              diff --git a/docs/tutorials/getting-started/index.html b/docs/tutorials/getting-started/index.html
              index 72a289fd..8376d20c 100644
              --- a/docs/tutorials/getting-started/index.html
              +++ b/docs/tutorials/getting-started/index.html
              @@ -1,6 +1,6 @@
               Getting started - server.js

              Tutorials

              Getting started

              In this tutorial you will learn how to get started with Node.js development and create a project from scratch. While there are many ways of doing it, this guide is focused first on making it easy and second on using common tools.

              -

              You will need some basic tools like having a git and a code editor (we recommend Atom) as well as some basic knowledge around your operative system and the terminal/command line.

              +

              You will need some basic tools like having git and a code editor (we recommend Atom) as well as some basic knowledge around your operative system and the terminal/command line.

              Install Node.js

              This will largely depend on your platform and while you can just download the binary program from the official page I would recommend using Node Version Manager for mac or Linux:

              curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
              @@ -33,10 +33,10 @@ 

              Initialize Git and npm

              node_modules .env

              This is because we want these files and places to only be accessible from our computer, but we don't want to deploy them along the rest of the code.

              -

              Finally we will start our npm package by doing init in the terminal:

              +

              Finally we will initialize our project by doing init in the terminal:

              npm init
               
              -

              It will ask some questions, just answer them or press "enter" to accept the default (set the "main" to "index.js"). After answering everything you should have a package.json file, so now you can edit the part where it says "scripts" to add this:

              +

              It will ask some questions, just answer them or press the "enter" key to accept the default (set the "main" to "index.js"). After answering everything you should have a package.json file, so now you can edit the part where it says "scripts" to add this:

                "scripts": {
                   "start": "node index.js",
                   "test": "jest --coverage --forceExit"
              diff --git a/examples/socket/index.js b/examples/socket/index.js
              new file mode 100644
              index 00000000..349db525
              --- /dev/null
              +++ b/examples/socket/index.js
              @@ -0,0 +1,23 @@
              +const server = require('../../server');
              +
              +const { get, socket } = server.router;
              +const { render } = server.reply;
              +
              +module.exports = server([
              +  get('/', ctx => render('index.html')),
              +
              +  socket('connect', ctx => {
              +    console.log('Connected');
              +  }),
              +
              +  socket('disconnect', ctx => {
              +    console.log('Disconnected');
              +  }),
              +
              +  socket('hello', ctx => {
              +    console.log('Ping;', ctx.data);
              +    ctx.io.emit('there');
              +  }),
              +
              +  get('/favicon.ico', () => 404)
              +]);
              diff --git a/examples/socket/views/index.html b/examples/socket/views/index.html
              new file mode 100644
              index 00000000..619780b9
              --- /dev/null
              +++ b/examples/socket/views/index.html
              @@ -0,0 +1,40 @@
              +
              +
              +  
              +    
              +    
              +    
              +    Document
              +    
              +    
              +  
              +  
              +    

              Ping Pong

              +
                + + + + diff --git a/plugins/socket/index.js b/plugins/socket/index.js index acb3b55e..78f4f2cc 100644 --- a/plugins/socket/index.js +++ b/plugins/socket/index.js @@ -1,6 +1,5 @@ // Create a socket plugin const socketIO = require('socket.io'); -const extend = require('extend'); const listeners = {}; @@ -34,22 +33,30 @@ module.exports = { }, launch: ctx => { if (!ctx.options.socket) return; + if (listeners.ping) { + ctx.log.warning('socket("ping") has a special meaning, please avoid it'); + } ctx.io = socketIO(ctx.server, ctx.options.socket); ctx.io.on('connect', socket => { - // console.log(socket.client.request.session); + // Create a new context assigned to each connected socket + const createContext = extra => { + return Object.assign({}, socket.client.request, ctx, extra); + }; + + // Attach a `socket.on('name', cb)` to each of the callbacks for (let path in listeners) { if (path !== 'connect') { listeners[path].forEach(cb => { - socket.on(path, data => { - cb(extend(socket.client.request, ctx, { path, socket, data })); - }); + socket.on(path, data => cb(createContext({ path, socket, data }))); }); } } + + // This is not a callback and should be called straight away since we are + // already inside `io.on('connect')` + const path = 'connect'; if (listeners['connect']) { - listeners['connect'].forEach(cb => { - cb(extend(socket.client.request, ctx, { path: 'connect', socket })); - }); + listeners[path].forEach(cb => cb(createContext({ path, socket }))); } }); } diff --git a/router/unit.test.js b/router/unit.test.js index c9ece5ba..1ed8e601 100644 --- a/router/unit.test.js +++ b/router/unit.test.js @@ -1,5 +1,4 @@ // Unit - test the router on its own -const extend = require('extend'); const loadware = require('loadware'); const join = require('server/src/join'); const { get, error } = require('server/router'); @@ -7,16 +6,14 @@ const RouterError = require('./errors'); const run = require('server/test/run'); -const createCtx = ({ url = '/', path = '/', method = 'GET' } = {}) => extend({ +const createCtx = ({ url = '/', path = '/', method = 'GET' } = {}) => ({ req: { url, path, method }, res: { send: () => {}, end: () => {} }, options: {} }); - const router = require('.'); - describe('server/router definition', () => { it('loads the main router', () => { expect(router).toEqual(require('server').router); @@ -24,22 +21,22 @@ describe('server/router definition', () => { }); it('has the right methods defined', () => { - expect(router.get ).toEqual(jasmine.any(Function)); - expect(router.get ).toEqual(jasmine.any(Function)); - expect(router.post ).toEqual(jasmine.any(Function)); - expect(router.put ).toEqual(jasmine.any(Function)); - expect(router.del ).toEqual(jasmine.any(Function)); - expect(router.sub ).toEqual(jasmine.any(Function)); + expect(router.get).toEqual(jasmine.any(Function)); + expect(router.get).toEqual(jasmine.any(Function)); + expect(router.post).toEqual(jasmine.any(Function)); + expect(router.put).toEqual(jasmine.any(Function)); + expect(router.del).toEqual(jasmine.any(Function)); + expect(router.sub).toEqual(jasmine.any(Function)); expect(router.error).toEqual(jasmine.any(Function)); }); it('can load all the methods manually', () => { - expect(require('server/router/get' )).toEqual(jasmine.any(Function)); - expect(require('server/router/get' )).toEqual(jasmine.any(Function)); - expect(require('server/router/post' )).toEqual(jasmine.any(Function)); - expect(require('server/router/put' )).toEqual(jasmine.any(Function)); - expect(require('server/router/del' )).toEqual(jasmine.any(Function)); - expect(require('server/router/sub' )).toEqual(jasmine.any(Function)); + expect(require('server/router/get')).toEqual(jasmine.any(Function)); + expect(require('server/router/get')).toEqual(jasmine.any(Function)); + expect(require('server/router/post')).toEqual(jasmine.any(Function)); + expect(require('server/router/put')).toEqual(jasmine.any(Function)); + expect(require('server/router/del')).toEqual(jasmine.any(Function)); + expect(require('server/router/sub')).toEqual(jasmine.any(Function)); expect(require('server/router/error')).toEqual(jasmine.any(Function)); }); }); @@ -47,11 +44,17 @@ describe('server/router definition', () => { describe('server/router works', () => { it('works', async () => { const mid = [ - () => new Promise((resolve) => resolve()), - get('/aaa', () => { throw new Error(); }), + () => new Promise(resolve => resolve()), + get('/aaa', () => { + throw new Error(); + }), get('/', () => 'Hello 世界'), - get('/sth', () => { throw new Error(); }), - get('/', () => { throw new Error(); }) + get('/sth', () => { + throw new Error(); + }), + get('/', () => { + throw new Error(); + }) ]; const ctx = createCtx(); @@ -61,11 +64,17 @@ describe('server/router works', () => { it('works even when wrapped with join() and loadware()', async () => { const middles = [ - () => new Promise((resolve) => resolve()), - get('/aaa', () => { throw new Error(); }), + () => new Promise(resolve => resolve()), + get('/aaa', () => { + throw new Error(); + }), join(loadware(get('/', () => 'Hello 世界'))), - get('/sth', () => { throw new Error(); }), - get('/', () => { throw new Error(); }) + get('/sth', () => { + throw new Error(); + }), + get('/', () => { + throw new Error(); + }) ]; // Returns the promise to be handled async @@ -74,7 +83,6 @@ describe('server/router works', () => { expect(ctx.req.solved).toBe(true); }); - it('works with parameters', async () => { const ctx = createCtx({ path: '/test/francisco/presencia/bla' }); await get('/test/:name/:lastname/bla')(ctx); @@ -84,11 +92,11 @@ describe('server/router works', () => { }); }); - - describe('Error routes', () => { it('can catch errors', async () => { - const generate = () => { throw new Error('Should be caught'); }; + const generate = () => { + throw new Error('Should be caught'); + }; const handle = error(() => 'Error 世界'); const res = await run([generate, handle]).get('/'); @@ -96,7 +104,9 @@ describe('Error routes', () => { }); it('can catch errors with full path', async () => { - const generate = ctx => { throw new RouterError('router'); }; + const generate = ctx => { + throw new RouterError('router'); + }; const handle = error('/server/test/router', ctx => { return ctx.error.code; }); @@ -105,7 +115,9 @@ describe('Error routes', () => { }); it('can catch errors with partial path', async () => { - const generate = ctx => { throw new RouterError('router'); }; + const generate = ctx => { + throw new RouterError('router'); + }; const handle = error('/server/test', ctx => { return ctx.error.code; }); @@ -141,6 +153,6 @@ describe('Error routes', () => { }); const res = await run({ errors }, [generate, handle]).get('/'); - expect(res.body).toBe(`Simple message: ABC`); + expect(res.body).toBe('Simple message: ABC'); }); }); From 1f94d48f4d67fcddcf968a759a768d0eb5ee5c62 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 11 Aug 2021 13:51:42 +0200 Subject: [PATCH 73/93] 1.0.35 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6de8b3cc..337c4920 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.34", + "version": "1.0.35", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From 61b04c9130055d07bd5c8bccb6e5515d76f028fb Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 11 Aug 2021 14:10:16 +0200 Subject: [PATCH 74/93] Downgraded dependencies for Github Actions --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 337c4920..51c47766 100644 --- a/package.json +++ b/package.json @@ -71,10 +71,10 @@ "grunt-contrib-jshint": "^1.1.0", "grunt-contrib-pug": "^3.0.0", "grunt-contrib-watch": "^1.0.0", - "grunt-sass": "^3.1.0", + "grunt-sass": "^1.0.0", "jest": "^25.0.0", "jstransformer-marked": "^1.0.2", - "node-sass": "^6.0.1", + "node-sass": "^4.13.1", "picnic": "^6.4.0", "request-promises": "^1.0.1", "supertest": "^3.4.2" From f86b315361573bfc7dbc0df6268591c459f92a8f Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 11 Aug 2021 14:15:14 +0200 Subject: [PATCH 75/93] Fixed downgrading --- .github/workflows/tests.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3f995225..818246a6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: platform: [ubuntu-latest, macos-latest, windows-latest] - node-version: [8.x, 10.x, 12.x, 14.x] + node-version: [12.x, 14.x] steps: - uses: actions/checkout@v1 diff --git a/package.json b/package.json index 51c47766..2fb0b20d 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "grunt-contrib-jshint": "^1.1.0", "grunt-contrib-pug": "^3.0.0", "grunt-contrib-watch": "^1.0.0", - "grunt-sass": "^1.0.0", + "grunt-sass": "^3.1.0", "jest": "^25.0.0", "jstransformer-marked": "^1.0.2", "node-sass": "^4.13.1", From f5f7d122c25816015db76e7b77da29eebf632596 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 11 Aug 2021 14:18:37 +0200 Subject: [PATCH 76/93] Moved from node-sass to sass --- Gruntfile.js | 2 +- docs/assets/style.min.css | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 029484f5..2e2f8eb9 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,6 +1,6 @@ const filters = require("./docs/filters.js"); const files = require("./docs/files.js"); -const sass = require("node-sass"); +const sass = require("sass"); const fs = require("fs"); diff --git a/docs/assets/style.min.css b/docs/assets/style.min.css index 1a8e69a0..faa8edab 100644 --- a/docs/assets/style.min.css +++ b/docs/assets/style.min.css @@ -1 +1 @@ -html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#fff;color:#111}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial, Helvetica, sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all 0.3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,0.3)}label{cursor:pointer}[class^="icon-"]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^="icon-"]:before,i[class*=" icon-"]:before{margin:0}.label,[data-tooltip]:after,button,.button,[type=submit],.dropimage{display:inline-block;text-align:center;letter-spacing:inherit;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.label,.success[data-tooltip]:after,button.success,.success.button,.success[type=submit],.success.dropimage{background:#2ecc40}.warning.label,.warning[data-tooltip]:after,button.warning,.warning.button,.warning[type=submit],.warning.dropimage{background:#ff851b}.error.label,.error[data-tooltip]:after,button.error,.error.button,.error[type=submit],.error.dropimage{background:#ff4136}.pseudo.label,.pseudo[data-tooltip]:after,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.dropimage{background-color:transparent;color:inherit}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}button,.button,[type=submit],.dropimage{margin:.3em 0;cursor:pointer;transition:all 0.3s;border-radius:0;height:auto;vertical-align:baseline;box-shadow:0 0 rgba(17,17,17,0) inset}button:hover,.button:hover,:hover[type=submit],.dropimage:hover,button:focus,.button:focus,:focus[type=submit],.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,0.2);border:0}button.pseudo:hover,.pseudo.button:hover,.pseudo:hover[type=submit],.pseudo.dropimage:hover,button.pseudo:focus,.pseudo.button:focus,.pseudo:focus[type=submit],.pseudo.dropimage:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.1)}button.active,.active.button,.active[type=submit],.active.dropimage,button:active,.button:active,:active[type=submit],.dropimage:active,button.pseudo:active,.pseudo.button:active,.pseudo:active[type=submit],.pseudo.dropimage:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}button[disabled],.button[disabled],[disabled][type=submit],.dropimage[disabled]{cursor:default;box-shadow:none;background:#aaa}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,0.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #aaa;background-color:#fff;border-radius:0;transition:all 0.3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #aaa;border-radius:0;cursor:pointer;width:100%;height:2.2em;box-sizing:border-box;padding:.3em .45em;transition:all 0.3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.45em}select[multiple]{height:auto;background:none;padding:0}[type=radio],[type=checkbox]{opacity:0;width:0;position:absolute;display:inline-block}[type=radio]+.checkable:hover:before,[type=checkbox]+.checkable:hover:before,:focus[type=radio]+.checkable:before,:focus[type=checkbox]+.checkable:before{border:1px solid #0074d9}[type=radio]+.checkable,[type=checkbox]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before,[type=radio]+.checkable:after,[type=checkbox]+.checkable:after{content:'';position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all 0.3s}[type=radio]+.checkable:before,[type=checkbox]+.checkable:before{border:1px solid #aaa}:checked[type=radio]+.checkable:after,:checked[type=checkbox]+.checkable:after{background:#111;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}:checked[type=checkbox]+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all 0.3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(17,17,17,0.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-.6em;width:calc(100% + .6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*="one"]>*,.flex[class*="two"]>*,.flex[class*="three"]>*,.flex[class*="four"]>*,.flex[class*="five"]>*,.flex[class*="six"]>*,.flex[class*="seven"]>*,.flex[class*="eight"]>*,.flex[class*="nine"]>*,.flex[class*="ten"]>*,.flex[class*="eleven"]>*,.flex[class*="twelve"]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 0.2em rgba(170,170,170,0.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:inherit}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0}nav .burger ~ .menu,nav .show:checked ~ .burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger ~ .menu{z-index:11}nav .show:checked ~ .burger{color:transparent;width:100%;border-radius:0;background:rgba(17,17,17,0.2);transition:all .5s ease}nav .show ~ .menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show ~ .menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked ~ .menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked ~ .menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked ~ .menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked ~ .menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked ~ .menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked ~ .menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked ~ .menu{transform:scaleX(1)}nav .show:checked ~ .menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger ~ .menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - .6em)}nav .burger ~ .menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.card,.modal .overlay ~ *{position:relative;box-shadow:none;border-radius:0;border:1px solid #aaa;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.hidden.card,.modal .overlay ~ .hidden,:checked+.card,.modal .overlay ~ :checked+*,.modal .overlay:checked+*{font-size:0;padding:0;margin:0;border:0}.card>*,.modal .overlay ~ *>*{max-width:100%;display:block}.card>*:last-child,.modal .overlay ~ *>*:last-child{margin-bottom:0}.card header,.modal .overlay ~ * header,.card section,.modal .overlay ~ * section,.card>p,.modal .overlay ~ *>p{padding:.6em .8em}.card section,.modal .overlay ~ * section{padding:.6em .8em 0}.card hr,.modal .overlay ~ * hr{border:none;height:1px;background-color:#aaa}.card header,.modal .overlay ~ * header{font-weight:bold;position:relative;border-bottom:1px solid #aaa}.card header h1,.modal .overlay ~ * header h1,.card header h2,.modal .overlay ~ * header h2,.card header h3,.modal .overlay ~ * header h3,.card header h4,.modal .overlay ~ * header h4,.card header h5,.modal .overlay ~ * header h5,.card header h6,.modal .overlay ~ * header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.card header:last-child,.modal .overlay ~ * header:last-child{border-bottom:0}.card footer,.modal .overlay ~ * footer{padding:.8em}.card p,.modal .overlay ~ * p{margin:.3em 0}.card p:first-child,.modal .overlay ~ * p:first-child{margin-top:0}.card p:last-child,.modal .overlay ~ * p:last-child{margin-bottom:0}.card>p,.modal .overlay ~ *>p{margin:0;padding-right:2.5em}.card .close,.modal .overlay ~ * .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.card .close:hover,.modal .overlay ~ * .close:hover{color:#ff4136}.card h1+.close,.modal .overlay ~ * h1+.close{margin:.2em}.card h2+.close,.modal .overlay ~ * h2+.close{margin:.1em}.card .dangerous,.modal .overlay ~ * .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input ~ *{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,0.2);transition:all 0.3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay ~ *{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all 0.3s}.modal>input:checked ~ *{display:block;opacity:1;max-height:10000px;transition:all 0.3s}.modal>input:checked ~ .overlay ~ *{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media (max-width: 700px){.modal .overlay ~ *{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked ~ .row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked ~ .row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked ~ .row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked ~ .row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked ~ .row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked ~ .row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease, height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:'';width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:'';background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:0.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:0.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more ~ ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more ~ ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs) ~ nav.transparent{background:none;box-shadow:none}:not(.extra.docs) ~ nav.transparent a,:not(.extra.docs) ~ nav.transparent a.pseudo,:not(.extra.docs) ~ nav.transparent .burger{color:#fff}.width-500 ~ nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500 ~ article{max-width:500px}.width-600 ~ nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600 ~ article{max-width:600px}.width-700 ~ nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700 ~ article{max-width:700px}.width-800 ~ nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800 ~ article{max-width:800px}.width-900 ~ nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900 ~ article{max-width:900px}.width-1000 ~ nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000 ~ article{max-width:1000px}.width-1100 ~ nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100 ~ article{max-width:1100px}.width-1200 ~ nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200 ~ article{max-width:1200px}.width-1300 ~ nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300 ~ article{max-width:1300px}.width-1400 ~ nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400 ~ article{max-width:1400px}.width-1500 ~ nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500 ~ article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:'“';font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*="language-"]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*="language-"]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s, height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,0.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading ~ *{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*="language-"]{position:relative;overflow:visible;margin-top:30px}pre[class*="language-"]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:0.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,0.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,0.15);box-shadow:inset 5px 0 rgba(46,204,64,0.3)}blockquote.warning{background:rgba(255,133,27,0.15);box-shadow:inset 5px 0 rgba(255,133,27,0.3)}blockquote.error{background:rgba(255,65,54,0.15);box-shadow:inset 5px 0 rgba(255,65,54,0.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,0.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,0.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,0.5);color:rgba(0,0,0,0.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#fff;color:#111}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:0;padding:0}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:inherit}html,body{font-family:Arial,Helvetica,sans-serif;box-sizing:border-box;height:100%}body{color:#111;font-size:1.1em;line-height:1.5;background:#fff}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;padding:.6em 0}li{margin:0 0 .3em}a{color:#0074d9;text-decoration:none;box-shadow:none;transition:all .3s}code{padding:.3em .6em;font-size:.8em;background:#f5f5f5}pre{text-align:left;padding:.3em .6em;background:#f5f5f5;border-radius:0}pre code{padding:0}blockquote{padding:0 0 0 1em;margin:0 0 0 .1em;box-shadow:inset 5px 0 rgba(17,17,17,.3)}label{cursor:pointer}[class^=icon-]:before,[class*=" icon-"]:before{margin:0 .6em 0 0}i[class^=icon-]:before,i[class*=" icon-"]:before{margin:0}.dropimage,button,.button,[type=submit],.label,[data-tooltip]:after{display:inline-block;text-align:center;letter-spacing:inherit;margin:0;padding:.3em .9em;vertical-align:middle;background:#0074d9;color:#fff;border:0;border-radius:0;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.success.dropimage,button.success,.success.button,.success[type=submit],.success.label,.success[data-tooltip]:after{background:#2ecc40}.warning.dropimage,button.warning,.warning.button,.warning[type=submit],.warning.label,.warning[data-tooltip]:after{background:#ff851b}.error.dropimage,button.error,.error.button,.error[type=submit],.error.label,.error[data-tooltip]:after{background:#ff4136}.pseudo.dropimage,button.pseudo,.pseudo.button,.pseudo[type=submit],.pseudo.label,.pseudo[data-tooltip]:after{background-color:transparent;color:inherit}.label,[data-tooltip]:after{font-size:.6em;padding:.4em .6em;margin-left:1em;line-height:1}.dropimage,button,.button,[type=submit]{margin:.3em 0;cursor:pointer;transition:all .3s;border-radius:0;height:auto;vertical-align:baseline;box-shadow:0 0 rgba(17,17,17,0) inset}.dropimage:hover,button:hover,.button:hover,[type=submit]:hover,.dropimage:focus,button:focus,.button:focus,[type=submit]:focus{box-shadow:inset 0 0 0 99em rgba(255,255,255,.2);border:0}.pseudo.dropimage:hover,button.pseudo:hover,.pseudo.button:hover,.pseudo[type=submit]:hover,.pseudo.dropimage:focus,button.pseudo:focus,.pseudo.button:focus,.pseudo[type=submit]:focus{box-shadow:inset 0 0 0 99em rgba(17,17,17,.1)}.active.dropimage,button.active,.active.button,.active[type=submit],.dropimage:active,button:active,.button:active,[type=submit]:active{box-shadow:inset 0 0 0 99em rgba(17,17,17,.2)}[disabled].dropimage,button[disabled],[disabled].button,[disabled][type=submit]{cursor:default;box-shadow:none;background:#aaa}:checked+.toggle,:checked+.toggle:hover{box-shadow:inset 0 0 0 99em rgba(17,17,17,.2)}[type]+.toggle{padding:.3em .9em;margin-right:0}[type]+.toggle:after,[type]+.toggle:before{display:none}input,textarea,.select select{line-height:1.5;margin:0;height:2.1em;padding:.3em .6em;border:1px solid #aaa;background-color:#fff;border-radius:0;transition:all .3s;width:100%}input:focus,textarea:focus,.select select:focus{border:1px solid #0074d9;outline:0}textarea{height:auto}[type=file],[type=color]{cursor:pointer}[type=file]{height:auto}select{background:#fff url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0gMCwxIDEsMiAxLC0yIHoiLz48L3N2Zz4=) no-repeat scroll 95% center/10px 15px;background-position:calc(100% - 15px) center;border:1px solid #aaa;border-radius:0;cursor:pointer;width:100%;height:2.2em;box-sizing:border-box;padding:.3em .45em;transition:all .3s;-moz-appearance:none;-webkit-appearance:none;appearance:none}select::-ms-expand{display:none}select:focus,select:active{border:1px solid #0074d9;transition:outline 0s}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #111}select option{font-size:inherit;padding:.45em}select[multiple]{height:auto;background:none;padding:0}[type=checkbox],[type=radio]{opacity:0;width:0;position:absolute;display:inline-block}[type=checkbox]+.checkable:hover:before,[type=radio]+.checkable:hover:before,[type=checkbox]:focus+.checkable:before,[type=radio]:focus+.checkable:before{border:1px solid #0074d9}[type=checkbox]+.checkable,[type=radio]+.checkable{position:relative;cursor:pointer;padding-left:1.5em;margin-right:.6em}[type=checkbox]+.checkable:before,[type=radio]+.checkable:before,[type=checkbox]+.checkable:after,[type=radio]+.checkable:after{content:"";position:absolute;display:inline-block;left:0;top:50%;transform:translateY(-50%);font-size:1em;line-height:1em;color:transparent;font-family:sans;text-align:center;box-sizing:border-box;width:1em;height:1em;border-radius:50%;transition:all .3s}[type=checkbox]+.checkable:before,[type=radio]+.checkable:before{border:1px solid #aaa}[type=checkbox]:checked+.checkable:after,[type=radio]:checked+.checkable:after{background:#111;transform:scale(0.5) translateY(-100%)}[type=checkbox]+.checkable:before{border-radius:0}[type=checkbox]+.checkable:after{content:"✔";background:none;transform:scale(2) translateY(-25%);visibility:hidden;opacity:0}[type=checkbox]:checked+.checkable:after{color:#111;background:none;transform:translateY(-50%);transition:all .3s;visibility:visible;opacity:1}table{text-align:left}td,th{padding:.3em 2.4em .3em .6em}th{text-align:left;font-weight:900;color:#fff;background-color:#0074d9}.success th{background-color:#2ecc40}.warning th{background-color:#ff851b}.error th{background-color:#ff4136}.dull th{background-color:#aaa}tr:nth-child(even){background:rgba(17,17,17,.05)}.flex{display:-ms-flexbox;display:flex;margin-left:-0.6em;width:calc(100% + 0.6em);flex-wrap:wrap;transition:all .3s ease}.flex>*{box-sizing:border-box;flex:1 1 auto;padding-left:.6em;padding-bottom:.6em}.flex[class*=one]>*,.flex[class*=two]>*,.flex[class*=three]>*,.flex[class*=four]>*,.flex[class*=five]>*,.flex[class*=six]>*,.flex[class*=seven]>*,.flex[class*=eight]>*,.flex[class*=nine]>*,.flex[class*=ten]>*,.flex[class*=eleven]>*,.flex[class*=twelve]>*{flex-grow:0}.flex.grow>*{flex-grow:1}.center{justify-content:center}.one>*{width:100%}.two>*{width:50%}.three>*{width:33.33333%}.four>*{width:25%}.five>*{width:20%}.six>*{width:16.66666%}.seven>*{width:14.28571%}.eight>*{width:12.5%}.nine>*{width:11.11111%}.ten>*{width:10%}.eleven>*{width:9.09091%}.twelve>*{width:8.33333%}@media all and (min-width: 500px){.one-500>*{width:100%}.two-500>*{width:50%}.three-500>*{width:33.33333%}.four-500>*{width:25%}.five-500>*{width:20%}.six-500>*{width:16.66666%}.seven-500>*{width:14.28571%}.eight-500>*{width:12.5%}.nine-500>*{width:11.11111%}.ten-500>*{width:10%}.eleven-500>*{width:9.09091%}.twelve-500>*{width:8.33333%}}@media all and (min-width: 600px){.one-600>*{width:100%}.two-600>*{width:50%}.three-600>*{width:33.33333%}.four-600>*{width:25%}.five-600>*{width:20%}.six-600>*{width:16.66666%}.seven-600>*{width:14.28571%}.eight-600>*{width:12.5%}.nine-600>*{width:11.11111%}.ten-600>*{width:10%}.eleven-600>*{width:9.09091%}.twelve-600>*{width:8.33333%}}@media all and (min-width: 700px){.one-700>*{width:100%}.two-700>*{width:50%}.three-700>*{width:33.33333%}.four-700>*{width:25%}.five-700>*{width:20%}.six-700>*{width:16.66666%}.seven-700>*{width:14.28571%}.eight-700>*{width:12.5%}.nine-700>*{width:11.11111%}.ten-700>*{width:10%}.eleven-700>*{width:9.09091%}.twelve-700>*{width:8.33333%}}@media all and (min-width: 800px){.one-800>*{width:100%}.two-800>*{width:50%}.three-800>*{width:33.33333%}.four-800>*{width:25%}.five-800>*{width:20%}.six-800>*{width:16.66666%}.seven-800>*{width:14.28571%}.eight-800>*{width:12.5%}.nine-800>*{width:11.11111%}.ten-800>*{width:10%}.eleven-800>*{width:9.09091%}.twelve-800>*{width:8.33333%}}@media all and (min-width: 900px){.one-900>*{width:100%}.two-900>*{width:50%}.three-900>*{width:33.33333%}.four-900>*{width:25%}.five-900>*{width:20%}.six-900>*{width:16.66666%}.seven-900>*{width:14.28571%}.eight-900>*{width:12.5%}.nine-900>*{width:11.11111%}.ten-900>*{width:10%}.eleven-900>*{width:9.09091%}.twelve-900>*{width:8.33333%}}@media all and (min-width: 1000px){.one-1000>*{width:100%}.two-1000>*{width:50%}.three-1000>*{width:33.33333%}.four-1000>*{width:25%}.five-1000>*{width:20%}.six-1000>*{width:16.66666%}.seven-1000>*{width:14.28571%}.eight-1000>*{width:12.5%}.nine-1000>*{width:11.11111%}.ten-1000>*{width:10%}.eleven-1000>*{width:9.09091%}.twelve-1000>*{width:8.33333%}}@media all and (min-width: 1100px){.one-1100>*{width:100%}.two-1100>*{width:50%}.three-1100>*{width:33.33333%}.four-1100>*{width:25%}.five-1100>*{width:20%}.six-1100>*{width:16.66666%}.seven-1100>*{width:14.28571%}.eight-1100>*{width:12.5%}.nine-1100>*{width:11.11111%}.ten-1100>*{width:10%}.eleven-1100>*{width:9.09091%}.twelve-1100>*{width:8.33333%}}@media all and (min-width: 1200px){.one-1200>*{width:100%}.two-1200>*{width:50%}.three-1200>*{width:33.33333%}.four-1200>*{width:25%}.five-1200>*{width:20%}.six-1200>*{width:16.66666%}.seven-1200>*{width:14.28571%}.eight-1200>*{width:12.5%}.nine-1200>*{width:11.11111%}.ten-1200>*{width:10%}.eleven-1200>*{width:9.09091%}.twelve-1200>*{width:8.33333%}}@media all and (min-width: 1300px){.one-1300>*{width:100%}.two-1300>*{width:50%}.three-1300>*{width:33.33333%}.four-1300>*{width:25%}.five-1300>*{width:20%}.six-1300>*{width:16.66666%}.seven-1300>*{width:14.28571%}.eight-1300>*{width:12.5%}.nine-1300>*{width:11.11111%}.ten-1300>*{width:10%}.eleven-1300>*{width:9.09091%}.twelve-1300>*{width:8.33333%}}@media all and (min-width: 1400px){.one-1400>*{width:100%}.two-1400>*{width:50%}.three-1400>*{width:33.33333%}.four-1400>*{width:25%}.five-1400>*{width:20%}.six-1400>*{width:16.66666%}.seven-1400>*{width:14.28571%}.eight-1400>*{width:12.5%}.nine-1400>*{width:11.11111%}.ten-1400>*{width:10%}.eleven-1400>*{width:9.09091%}.twelve-1400>*{width:8.33333%}}@media all and (min-width: 1500px){.one-1500>*{width:100%}.two-1500>*{width:50%}.three-1500>*{width:33.33333%}.four-1500>*{width:25%}.five-1500>*{width:20%}.six-1500>*{width:16.66666%}.seven-1500>*{width:14.28571%}.eight-1500>*{width:12.5%}.nine-1500>*{width:11.11111%}.ten-1500>*{width:10%}.eleven-1500>*{width:9.09091%}.twelve-1500>*{width:8.33333%}}@media all and (min-width: 1600px){.one-1600>*{width:100%}.two-1600>*{width:50%}.three-1600>*{width:33.33333%}.four-1600>*{width:25%}.five-1600>*{width:20%}.six-1600>*{width:16.66666%}.seven-1600>*{width:14.28571%}.eight-1600>*{width:12.5%}.nine-1600>*{width:11.11111%}.ten-1600>*{width:10%}.eleven-1600>*{width:9.09091%}.twelve-1600>*{width:8.33333%}}@media all and (min-width: 1700px){.one-1700>*{width:100%}.two-1700>*{width:50%}.three-1700>*{width:33.33333%}.four-1700>*{width:25%}.five-1700>*{width:20%}.six-1700>*{width:16.66666%}.seven-1700>*{width:14.28571%}.eight-1700>*{width:12.5%}.nine-1700>*{width:11.11111%}.ten-1700>*{width:10%}.eleven-1700>*{width:9.09091%}.twelve-1700>*{width:8.33333%}}@media all and (min-width: 1800px){.one-1800>*{width:100%}.two-1800>*{width:50%}.three-1800>*{width:33.33333%}.four-1800>*{width:25%}.five-1800>*{width:20%}.six-1800>*{width:16.66666%}.seven-1800>*{width:14.28571%}.eight-1800>*{width:12.5%}.nine-1800>*{width:11.11111%}.ten-1800>*{width:10%}.eleven-1800>*{width:9.09091%}.twelve-1800>*{width:8.33333%}}@media all and (min-width: 1900px){.one-1900>*{width:100%}.two-1900>*{width:50%}.three-1900>*{width:33.33333%}.four-1900>*{width:25%}.five-1900>*{width:20%}.six-1900>*{width:16.66666%}.seven-1900>*{width:14.28571%}.eight-1900>*{width:12.5%}.nine-1900>*{width:11.11111%}.ten-1900>*{width:10%}.eleven-1900>*{width:9.09091%}.twelve-1900>*{width:8.33333%}}@media all and (min-width: 2000px){.one-2000>*{width:100%}.two-2000>*{width:50%}.three-2000>*{width:33.33333%}.four-2000>*{width:25%}.five-2000>*{width:20%}.six-2000>*{width:16.66666%}.seven-2000>*{width:14.28571%}.eight-2000>*{width:12.5%}.nine-2000>*{width:11.11111%}.ten-2000>*{width:10%}.eleven-2000>*{width:9.09091%}.twelve-2000>*{width:8.33333%}}.full{width:100%}.half{width:50%}.third{width:33.33333%}.two-third{width:66.66666%}.fourth{width:25%}.three-fourth{width:75%}.fifth{width:20%}.two-fifth{width:40%}.three-fifth{width:60%}.four-fifth{width:80%}.sixth{width:16.66666%}.none{display:none}@media all and (min-width: 500px){.full-500{width:100%;display:block}.half-500{width:50%;display:block}.third-500{width:33.33333%;display:block}.two-third-500{width:66.66666%;display:block}.fourth-500{width:25%;display:block}.three-fourth-500{width:75%;display:block}.fifth-500{width:20%;display:block}.two-fifth-500{width:40%;display:block}.three-fifth-500{width:60%;display:block}.four-fifth-500{width:80%;display:block}.sixth-500{width:16.66666%;display:block}}@media all and (min-width: 600px){.full-600{width:100%;display:block}.half-600{width:50%;display:block}.third-600{width:33.33333%;display:block}.two-third-600{width:66.66666%;display:block}.fourth-600{width:25%;display:block}.three-fourth-600{width:75%;display:block}.fifth-600{width:20%;display:block}.two-fifth-600{width:40%;display:block}.three-fifth-600{width:60%;display:block}.four-fifth-600{width:80%;display:block}.sixth-600{width:16.66666%;display:block}}@media all and (min-width: 700px){.full-700{width:100%;display:block}.half-700{width:50%;display:block}.third-700{width:33.33333%;display:block}.two-third-700{width:66.66666%;display:block}.fourth-700{width:25%;display:block}.three-fourth-700{width:75%;display:block}.fifth-700{width:20%;display:block}.two-fifth-700{width:40%;display:block}.three-fifth-700{width:60%;display:block}.four-fifth-700{width:80%;display:block}.sixth-700{width:16.66666%;display:block}}@media all and (min-width: 800px){.full-800{width:100%;display:block}.half-800{width:50%;display:block}.third-800{width:33.33333%;display:block}.two-third-800{width:66.66666%;display:block}.fourth-800{width:25%;display:block}.three-fourth-800{width:75%;display:block}.fifth-800{width:20%;display:block}.two-fifth-800{width:40%;display:block}.three-fifth-800{width:60%;display:block}.four-fifth-800{width:80%;display:block}.sixth-800{width:16.66666%;display:block}}@media all and (min-width: 900px){.full-900{width:100%;display:block}.half-900{width:50%;display:block}.third-900{width:33.33333%;display:block}.two-third-900{width:66.66666%;display:block}.fourth-900{width:25%;display:block}.three-fourth-900{width:75%;display:block}.fifth-900{width:20%;display:block}.two-fifth-900{width:40%;display:block}.three-fifth-900{width:60%;display:block}.four-fifth-900{width:80%;display:block}.sixth-900{width:16.66666%;display:block}}@media all and (min-width: 1000px){.full-1000{width:100%;display:block}.half-1000{width:50%;display:block}.third-1000{width:33.33333%;display:block}.two-third-1000{width:66.66666%;display:block}.fourth-1000{width:25%;display:block}.three-fourth-1000{width:75%;display:block}.fifth-1000{width:20%;display:block}.two-fifth-1000{width:40%;display:block}.three-fifth-1000{width:60%;display:block}.four-fifth-1000{width:80%;display:block}.sixth-1000{width:16.66666%;display:block}}@media all and (min-width: 1100px){.full-1100{width:100%;display:block}.half-1100{width:50%;display:block}.third-1100{width:33.33333%;display:block}.two-third-1100{width:66.66666%;display:block}.fourth-1100{width:25%;display:block}.three-fourth-1100{width:75%;display:block}.fifth-1100{width:20%;display:block}.two-fifth-1100{width:40%;display:block}.three-fifth-1100{width:60%;display:block}.four-fifth-1100{width:80%;display:block}.sixth-1100{width:16.66666%;display:block}}@media all and (min-width: 1200px){.full-1200{width:100%;display:block}.half-1200{width:50%;display:block}.third-1200{width:33.33333%;display:block}.two-third-1200{width:66.66666%;display:block}.fourth-1200{width:25%;display:block}.three-fourth-1200{width:75%;display:block}.fifth-1200{width:20%;display:block}.two-fifth-1200{width:40%;display:block}.three-fifth-1200{width:60%;display:block}.four-fifth-1200{width:80%;display:block}.sixth-1200{width:16.66666%;display:block}}@media all and (min-width: 1300px){.full-1300{width:100%;display:block}.half-1300{width:50%;display:block}.third-1300{width:33.33333%;display:block}.two-third-1300{width:66.66666%;display:block}.fourth-1300{width:25%;display:block}.three-fourth-1300{width:75%;display:block}.fifth-1300{width:20%;display:block}.two-fifth-1300{width:40%;display:block}.three-fifth-1300{width:60%;display:block}.four-fifth-1300{width:80%;display:block}.sixth-1300{width:16.66666%;display:block}}@media all and (min-width: 1400px){.full-1400{width:100%;display:block}.half-1400{width:50%;display:block}.third-1400{width:33.33333%;display:block}.two-third-1400{width:66.66666%;display:block}.fourth-1400{width:25%;display:block}.three-fourth-1400{width:75%;display:block}.fifth-1400{width:20%;display:block}.two-fifth-1400{width:40%;display:block}.three-fifth-1400{width:60%;display:block}.four-fifth-1400{width:80%;display:block}.sixth-1400{width:16.66666%;display:block}}@media all and (min-width: 1500px){.full-1500{width:100%;display:block}.half-1500{width:50%;display:block}.third-1500{width:33.33333%;display:block}.two-third-1500{width:66.66666%;display:block}.fourth-1500{width:25%;display:block}.three-fourth-1500{width:75%;display:block}.fifth-1500{width:20%;display:block}.two-fifth-1500{width:40%;display:block}.three-fifth-1500{width:60%;display:block}.four-fifth-1500{width:80%;display:block}.sixth-1500{width:16.66666%;display:block}}@media all and (min-width: 1600px){.full-1600{width:100%;display:block}.half-1600{width:50%;display:block}.third-1600{width:33.33333%;display:block}.two-third-1600{width:66.66666%;display:block}.fourth-1600{width:25%;display:block}.three-fourth-1600{width:75%;display:block}.fifth-1600{width:20%;display:block}.two-fifth-1600{width:40%;display:block}.three-fifth-1600{width:60%;display:block}.four-fifth-1600{width:80%;display:block}.sixth-1600{width:16.66666%;display:block}}@media all and (min-width: 1700px){.full-1700{width:100%;display:block}.half-1700{width:50%;display:block}.third-1700{width:33.33333%;display:block}.two-third-1700{width:66.66666%;display:block}.fourth-1700{width:25%;display:block}.three-fourth-1700{width:75%;display:block}.fifth-1700{width:20%;display:block}.two-fifth-1700{width:40%;display:block}.three-fifth-1700{width:60%;display:block}.four-fifth-1700{width:80%;display:block}.sixth-1700{width:16.66666%;display:block}}@media all and (min-width: 1800px){.full-1800{width:100%;display:block}.half-1800{width:50%;display:block}.third-1800{width:33.33333%;display:block}.two-third-1800{width:66.66666%;display:block}.fourth-1800{width:25%;display:block}.three-fourth-1800{width:75%;display:block}.fifth-1800{width:20%;display:block}.two-fifth-1800{width:40%;display:block}.three-fifth-1800{width:60%;display:block}.four-fifth-1800{width:80%;display:block}.sixth-1800{width:16.66666%;display:block}}@media all and (min-width: 1900px){.full-1900{width:100%;display:block}.half-1900{width:50%;display:block}.third-1900{width:33.33333%;display:block}.two-third-1900{width:66.66666%;display:block}.fourth-1900{width:25%;display:block}.three-fourth-1900{width:75%;display:block}.fifth-1900{width:20%;display:block}.two-fifth-1900{width:40%;display:block}.three-fifth-1900{width:60%;display:block}.four-fifth-1900{width:80%;display:block}.sixth-1900{width:16.66666%;display:block}}@media all and (min-width: 2000px){.full-2000{width:100%;display:block}.half-2000{width:50%;display:block}.third-2000{width:33.33333%;display:block}.two-third-2000{width:66.66666%;display:block}.fourth-2000{width:25%;display:block}.three-fourth-2000{width:75%;display:block}.fifth-2000{width:20%;display:block}.two-fifth-2000{width:40%;display:block}.three-fifth-2000{width:60%;display:block}.four-fifth-2000{width:80%;display:block}.sixth-2000{width:16.66666%;display:block}}@media all and (min-width: 500px){.none-500{display:none}}@media all and (min-width: 600px){.none-600{display:none}}@media all and (min-width: 700px){.none-700{display:none}}@media all and (min-width: 800px){.none-800{display:none}}@media all and (min-width: 900px){.none-900{display:none}}@media all and (min-width: 1000px){.none-1000{display:none}}@media all and (min-width: 1100px){.none-1100{display:none}}@media all and (min-width: 1200px){.none-1200{display:none}}@media all and (min-width: 1300px){.none-1300{display:none}}@media all and (min-width: 1400px){.none-1400{display:none}}@media all and (min-width: 1500px){.none-1500{display:none}}@media all and (min-width: 1600px){.none-1600{display:none}}@media all and (min-width: 1700px){.none-1700{display:none}}@media all and (min-width: 1800px){.none-1800{display:none}}@media all and (min-width: 1900px){.none-1900{display:none}}@media all and (min-width: 2000px){.none-2000{display:none}}.off-none{margin-left:0}.off-half{margin-left:50%}.off-third{margin-left:33.33333%}.off-two-third{margin-left:66.66666%}.off-fourth{margin-left:25%}.off-three-fourth{margin-left:75%}.off-fifth{margin-left:20%}.off-two-fifth{margin-left:40%}.off-three-fifth{margin-left:60%}.off-four-fifth{margin-left:80%}.off-sixth{margin-left:16.66666%}@media all and (min-width: 500px){.off-none-500{margin-left:0}.off-half-500{margin-left:50%}.off-third-500{margin-left:33.33333%}.off-two-third-500{margin-left:66.66666%}.off-fourth-500{margin-left:25%}.off-three-fourth-500{margin-left:75%}.off-fifth-500{margin-left:20%}.off-two-fifth-500{margin-left:40%}.off-three-fifth-500{margin-left:60%}.off-four-fifth-500{margin-left:80%}.off-sixth-500{margin-left:16.66666%}}@media all and (min-width: 600px){.off-none-600{margin-left:0}.off-half-600{margin-left:50%}.off-third-600{margin-left:33.33333%}.off-two-third-600{margin-left:66.66666%}.off-fourth-600{margin-left:25%}.off-three-fourth-600{margin-left:75%}.off-fifth-600{margin-left:20%}.off-two-fifth-600{margin-left:40%}.off-three-fifth-600{margin-left:60%}.off-four-fifth-600{margin-left:80%}.off-sixth-600{margin-left:16.66666%}}@media all and (min-width: 700px){.off-none-700{margin-left:0}.off-half-700{margin-left:50%}.off-third-700{margin-left:33.33333%}.off-two-third-700{margin-left:66.66666%}.off-fourth-700{margin-left:25%}.off-three-fourth-700{margin-left:75%}.off-fifth-700{margin-left:20%}.off-two-fifth-700{margin-left:40%}.off-three-fifth-700{margin-left:60%}.off-four-fifth-700{margin-left:80%}.off-sixth-700{margin-left:16.66666%}}@media all and (min-width: 800px){.off-none-800{margin-left:0}.off-half-800{margin-left:50%}.off-third-800{margin-left:33.33333%}.off-two-third-800{margin-left:66.66666%}.off-fourth-800{margin-left:25%}.off-three-fourth-800{margin-left:75%}.off-fifth-800{margin-left:20%}.off-two-fifth-800{margin-left:40%}.off-three-fifth-800{margin-left:60%}.off-four-fifth-800{margin-left:80%}.off-sixth-800{margin-left:16.66666%}}@media all and (min-width: 900px){.off-none-900{margin-left:0}.off-half-900{margin-left:50%}.off-third-900{margin-left:33.33333%}.off-two-third-900{margin-left:66.66666%}.off-fourth-900{margin-left:25%}.off-three-fourth-900{margin-left:75%}.off-fifth-900{margin-left:20%}.off-two-fifth-900{margin-left:40%}.off-three-fifth-900{margin-left:60%}.off-four-fifth-900{margin-left:80%}.off-sixth-900{margin-left:16.66666%}}@media all and (min-width: 1000px){.off-none-1000{margin-left:0}.off-half-1000{margin-left:50%}.off-third-1000{margin-left:33.33333%}.off-two-third-1000{margin-left:66.66666%}.off-fourth-1000{margin-left:25%}.off-three-fourth-1000{margin-left:75%}.off-fifth-1000{margin-left:20%}.off-two-fifth-1000{margin-left:40%}.off-three-fifth-1000{margin-left:60%}.off-four-fifth-1000{margin-left:80%}.off-sixth-1000{margin-left:16.66666%}}@media all and (min-width: 1100px){.off-none-1100{margin-left:0}.off-half-1100{margin-left:50%}.off-third-1100{margin-left:33.33333%}.off-two-third-1100{margin-left:66.66666%}.off-fourth-1100{margin-left:25%}.off-three-fourth-1100{margin-left:75%}.off-fifth-1100{margin-left:20%}.off-two-fifth-1100{margin-left:40%}.off-three-fifth-1100{margin-left:60%}.off-four-fifth-1100{margin-left:80%}.off-sixth-1100{margin-left:16.66666%}}@media all and (min-width: 1200px){.off-none-1200{margin-left:0}.off-half-1200{margin-left:50%}.off-third-1200{margin-left:33.33333%}.off-two-third-1200{margin-left:66.66666%}.off-fourth-1200{margin-left:25%}.off-three-fourth-1200{margin-left:75%}.off-fifth-1200{margin-left:20%}.off-two-fifth-1200{margin-left:40%}.off-three-fifth-1200{margin-left:60%}.off-four-fifth-1200{margin-left:80%}.off-sixth-1200{margin-left:16.66666%}}@media all and (min-width: 1300px){.off-none-1300{margin-left:0}.off-half-1300{margin-left:50%}.off-third-1300{margin-left:33.33333%}.off-two-third-1300{margin-left:66.66666%}.off-fourth-1300{margin-left:25%}.off-three-fourth-1300{margin-left:75%}.off-fifth-1300{margin-left:20%}.off-two-fifth-1300{margin-left:40%}.off-three-fifth-1300{margin-left:60%}.off-four-fifth-1300{margin-left:80%}.off-sixth-1300{margin-left:16.66666%}}@media all and (min-width: 1400px){.off-none-1400{margin-left:0}.off-half-1400{margin-left:50%}.off-third-1400{margin-left:33.33333%}.off-two-third-1400{margin-left:66.66666%}.off-fourth-1400{margin-left:25%}.off-three-fourth-1400{margin-left:75%}.off-fifth-1400{margin-left:20%}.off-two-fifth-1400{margin-left:40%}.off-three-fifth-1400{margin-left:60%}.off-four-fifth-1400{margin-left:80%}.off-sixth-1400{margin-left:16.66666%}}@media all and (min-width: 1500px){.off-none-1500{margin-left:0}.off-half-1500{margin-left:50%}.off-third-1500{margin-left:33.33333%}.off-two-third-1500{margin-left:66.66666%}.off-fourth-1500{margin-left:25%}.off-three-fourth-1500{margin-left:75%}.off-fifth-1500{margin-left:20%}.off-two-fifth-1500{margin-left:40%}.off-three-fifth-1500{margin-left:60%}.off-four-fifth-1500{margin-left:80%}.off-sixth-1500{margin-left:16.66666%}}@media all and (min-width: 1600px){.off-none-1600{margin-left:0}.off-half-1600{margin-left:50%}.off-third-1600{margin-left:33.33333%}.off-two-third-1600{margin-left:66.66666%}.off-fourth-1600{margin-left:25%}.off-three-fourth-1600{margin-left:75%}.off-fifth-1600{margin-left:20%}.off-two-fifth-1600{margin-left:40%}.off-three-fifth-1600{margin-left:60%}.off-four-fifth-1600{margin-left:80%}.off-sixth-1600{margin-left:16.66666%}}@media all and (min-width: 1700px){.off-none-1700{margin-left:0}.off-half-1700{margin-left:50%}.off-third-1700{margin-left:33.33333%}.off-two-third-1700{margin-left:66.66666%}.off-fourth-1700{margin-left:25%}.off-three-fourth-1700{margin-left:75%}.off-fifth-1700{margin-left:20%}.off-two-fifth-1700{margin-left:40%}.off-three-fifth-1700{margin-left:60%}.off-four-fifth-1700{margin-left:80%}.off-sixth-1700{margin-left:16.66666%}}@media all and (min-width: 1800px){.off-none-1800{margin-left:0}.off-half-1800{margin-left:50%}.off-third-1800{margin-left:33.33333%}.off-two-third-1800{margin-left:66.66666%}.off-fourth-1800{margin-left:25%}.off-three-fourth-1800{margin-left:75%}.off-fifth-1800{margin-left:20%}.off-two-fifth-1800{margin-left:40%}.off-three-fifth-1800{margin-left:60%}.off-four-fifth-1800{margin-left:80%}.off-sixth-1800{margin-left:16.66666%}}@media all and (min-width: 1900px){.off-none-1900{margin-left:0}.off-half-1900{margin-left:50%}.off-third-1900{margin-left:33.33333%}.off-two-third-1900{margin-left:66.66666%}.off-fourth-1900{margin-left:25%}.off-three-fourth-1900{margin-left:75%}.off-fifth-1900{margin-left:20%}.off-two-fifth-1900{margin-left:40%}.off-three-fifth-1900{margin-left:60%}.off-four-fifth-1900{margin-left:80%}.off-sixth-1900{margin-left:16.66666%}}@media all and (min-width: 2000px){.off-none-2000{margin-left:0}.off-half-2000{margin-left:50%}.off-third-2000{margin-left:33.33333%}.off-two-third-2000{margin-left:66.66666%}.off-fourth-2000{margin-left:25%}.off-three-fourth-2000{margin-left:75%}.off-fifth-2000{margin-left:20%}.off-two-fifth-2000{margin-left:40%}.off-three-fifth-2000{margin-left:60%}.off-four-fifth-2000{margin-left:80%}.off-sixth-2000{margin-left:16.66666%}}nav{position:fixed;top:0;left:0;right:0;height:3em;padding:0 .6em;background:#fff;box-shadow:0 0 .2em rgba(170,170,170,.2);z-index:10000;transition:all .3s;transform-style:preserve-3d}nav .brand,nav .menu,nav .burger{float:right;position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}nav .brand{font-weight:700;float:left;padding:0 .6em;max-width:50%;white-space:nowrap;color:inherit}nav .brand *{vertical-align:middle}nav .logo{height:2em;margin-right:.3em}nav .select::after{height:calc(100% - 1px);padding:0;line-height:2.4em}nav .menu>*{margin-right:.6em}nav .burger{display:none}@media all and (max-width: 700px){nav .burger{display:inline-block;cursor:pointer;bottom:-1000em;margin:0;-webkit-tap-highlight-color:transparent}nav .burger~.menu,nav .show:checked~.burger{position:fixed;min-height:100%;top:0;right:0;bottom:-1000em;margin:0;background:#fff;transition:all .5s ease;transform:none}nav .burger~.menu{z-index:11}nav .show:checked~.burger{color:transparent;width:100%;border-radius:0;background:rgba(17,17,17,.2);transition:all .5s ease}nav .show~.menu{width:70%;max-width:300px;transform-origin:center right;transition:all .25s ease;transform:scaleX(0)}nav .show~.menu>*{transform:translateX(100%);transition:all 0s ease .5s}nav .show:checked~.menu>*:nth-child(1){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) 0s}nav .show:checked~.menu>*:nth-child(2){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .1s}nav .show:checked~.menu>*:nth-child(3){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .2s}nav .show:checked~.menu>*:nth-child(4){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .3s}nav .show:checked~.menu>*:nth-child(5){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .4s}nav .show:checked~.menu>*:nth-child(6){transition:all .5s cubic-bezier(0.645, 0.045, 0.355, 1) .5s}nav .show:checked~.menu{transform:scaleX(1)}nav .show:checked~.menu>*{transform:translateX(0);transition:all .5s ease-in-out .6s}nav .burger~.menu>*{display:block;margin:.3em;text-align:left;max-width:calc(100% - 0.6em)}nav .burger~.menu>a{padding:.3em .9em}}.stack,.stack .toggle{margin-top:0;margin-bottom:0;display:block;width:100%;text-align:left;border-radius:0}.stack:first-child,.stack:first-child .toggle{border-top-left-radius:0;border-top-right-radius:0}.stack:last-child,.stack:last-child .toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}input.stack,textarea.stack,select.stack{transition:border-bottom 0 ease 0;border-bottom-width:0}input.stack:last-child,textarea.stack:last-child,select.stack:last-child{border-bottom-width:1px}input.stack:focus+input,input.stack:focus+textarea,input.stack:focus+select,textarea.stack:focus+input,textarea.stack:focus+textarea,textarea.stack:focus+select,select.stack:focus+input,select.stack:focus+textarea,select.stack:focus+select{border-top-color:#0074d9}.modal .overlay~*,.card{position:relative;box-shadow:none;border-radius:0;border:1px solid #aaa;overflow:hidden;text-align:left;background:#fff;margin-bottom:.6em;padding:0;transition:all .3s ease}.modal .overlay~.hidden,.hidden.card,.modal .overlay~:checked+*,.modal .overlay:checked+*,:checked+.card{font-size:0;padding:0;margin:0;border:0}.modal .overlay~*>*,.card>*{max-width:100%;display:block}.modal .overlay~*>*:last-child,.card>*:last-child{margin-bottom:0}.modal .overlay~* header,.card header,.modal .overlay~* section,.card section,.modal .overlay~*>p,.card>p{padding:.6em .8em}.modal .overlay~* section,.card section{padding:.6em .8em 0}.modal .overlay~* hr,.card hr{border:none;height:1px;background-color:#aaa}.modal .overlay~* header,.card header{font-weight:bold;position:relative;border-bottom:1px solid #aaa}.modal .overlay~* header h1,.card header h1,.modal .overlay~* header h2,.card header h2,.modal .overlay~* header h3,.card header h3,.modal .overlay~* header h4,.card header h4,.modal .overlay~* header h5,.card header h5,.modal .overlay~* header h6,.card header h6{padding:0;margin:0 2em 0 0;line-height:1;display:inline-block;vertical-align:text-bottom}.modal .overlay~* header:last-child,.card header:last-child{border-bottom:0}.modal .overlay~* footer,.card footer{padding:.8em}.modal .overlay~* p,.card p{margin:.3em 0}.modal .overlay~* p:first-child,.card p:first-child{margin-top:0}.modal .overlay~* p:last-child,.card p:last-child{margin-bottom:0}.modal .overlay~*>p,.card>p{margin:0;padding-right:2.5em}.modal .overlay~* .close,.card .close{position:absolute;top:.4em;right:.3em;font-size:1.2em;padding:0 .5em;cursor:pointer;width:auto}.modal .overlay~* .close:hover,.card .close:hover{color:#ff4136}.modal .overlay~* h1+.close,.card h1+.close{margin:.2em}.modal .overlay~* h2+.close,.card h2+.close{margin:.1em}.modal .overlay~* .dangerous,.card .dangerous{background:#ff4136;float:right}.modal{text-align:center}.modal>input{display:none}.modal>input~*{opacity:0;max-height:0;overflow:hidden}.modal .overlay{top:0;left:0;bottom:0;right:0;position:fixed;margin:0;border-radius:0;background:rgba(17,17,17,.2);transition:all .3s;z-index:100000}.modal .overlay:before,.modal .overlay:after{display:none}.modal .overlay~*{border:0;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%) scale(0.2, 0.2);z-index:1000000;transition:all .3s}.modal>input:checked~*{display:block;opacity:1;max-height:10000px;transition:all .3s}.modal>input:checked~.overlay~*{max-height:90%;overflow:auto;-webkit-transform:translateX(-50%) translateY(-50%) scale(1, 1);transform:translateX(-50%) translateY(-50%) scale(1, 1)}@media(max-width: 700px){.modal .overlay~*{min-width:90%}}.dropimage{position:relative;display:block;padding:0;padding-bottom:56.25%;overflow:hidden;cursor:pointer;border:0;margin:.3em 0;border-radius:0;background-color:#ddd;background-size:cover;background-position:center center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2ZXJzaW9uPSIxLjEiPjxnIHN0eWxlPSJmaWxsOiMzMzMiPjxwYXRoIGQ9Ik0gMTg3IDIzMCBDIDE3NSAyMzAgMTY1IDI0MCAxNjUgMjUyIEwgMTY1IDMwMCBMIDE2NSA0MDggQyAxNjUgNDIwIDE3NSA0MzAgMTg3IDQzMCBMIDQ2MyA0MzAgQyA0NzUgNDMwIDQ4NSA0MjAgNDg1IDQwOCBMIDQ4NSAzMDAgTCA0ODUgMjUyIEMgNDg1IDI0MCA0NzUgMjMwIDQ2MyAyMzAgTCAxODcgMjMwIHogTSAzNjAgMjU2IEEgNzAgNzIgMCAwIDEgNDMwIDMyOCBBIDcwIDcyIDAgMCAxIDM2MCA0MDAgQSA3MCA3MiAwIDAgMSAyOTAgMzI4IEEgNzAgNzIgMCAwIDEgMzYwIDI1NiB6Ii8+PGNpcmNsZSBjeD0iMzYwIiBjeT0iMzMwIiByPSI0MSIvPjxwYXRoIGQ9Im0yMDUgMjI1IDUtMTAgMjAgMCA1IDEwLTMwIDAiLz48cGF0aCBkPSJNMjg1IDIwMEwyNzAgMjI1IDM3NiAyMjUgMzYxIDIwMCAyODUgMjAwek0zMTAgMjA1TDMzNyAyMDUgMzM3IDIxOCAzMTAgMjE4IDMxMCAyMDV6Ii8+PHBhdGggZD0ibTQwNSAyMjUgNS0xMCAyMCAwIDUgMTAtMzAgMCIvPjwvZz48L3N2Zz4=)}.dropimage input{left:0;width:100%;height:100%;border:0;margin:0;padding:0;opacity:0;cursor:pointer;position:absolute}.tabs{position:relative;overflow:hidden}.tabs>label img{float:left;margin-left:.6em}.tabs>.row{width:calc(100% + 2 * .6em);display:table;table-layout:fixed;position:relative;padding-left:0;transition:all .3s;border-spacing:0;margin:0}.tabs>.row:before,.tabs>.row:after{display:none}.tabs>.row>*,.tabs>.row img{display:table-cell;vertical-align:top;margin:0;width:100%}.tabs>input{display:none}.tabs>input+*{width:100%}.tabs>input+label{width:auto}.two.tabs>.row{width:200%;left:-100%}.two.tabs>input:nth-of-type(1):checked~.row{margin-left:100%}.two.tabs>label img{width:48%;margin:4% 0 4% 4%}.three.tabs>.row{width:300%;left:-200%}.three.tabs>input:nth-of-type(1):checked~.row{margin-left:200%}.three.tabs>input:nth-of-type(2):checked~.row{margin-left:100%}.three.tabs>label img{width:30%;margin:5% 0 5% 5%}.four.tabs>.row{width:400%;left:-300%}.four.tabs>input:nth-of-type(1):checked~.row{margin-left:300%}.four.tabs>input:nth-of-type(2):checked~.row{margin-left:200%}.four.tabs>input:nth-of-type(3):checked~.row{margin-left:100%}.four.tabs>label img{width:22%;margin:4% 0 4% 4%}.tabs>label:first-of-type img{margin-left:0}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{position:absolute;z-index:10;opacity:0;border-width:0;height:0;padding:0;overflow:hidden;transition:opacity .6s ease,height 0s ease .6s;top:calc(100% - 6px);left:0;margin-top:12px}[data-tooltip]:after{margin-left:0;font-size:.8em;background:#111;content:attr(data-tooltip);white-space:nowrap}[data-tooltip]:before{content:"";width:0;height:0;border-width:0;border-style:solid;border-color:transparent transparent #111;margin-top:0;left:10px}[data-tooltip]:hover:after,[data-tooltip]:focus:after,[data-tooltip]:hover:before,[data-tooltip]:focus:before{opacity:1;border-width:6px;height:auto}[data-tooltip]:hover:after,[data-tooltip]:focus:after{padding:.45em .9em}.tooltip-top:after,.tooltip-top:before{top:auto;bottom:calc(100% - 6px);left:0;margin-bottom:12px}.tooltip-top:before{border-color:#111 transparent transparent;margin-bottom:0;left:10px}.tooltip-right:after,.tooltip-right:before{left:100%;margin-left:6px;margin-top:0;top:0}.tooltip-right:before{border-color:transparent #111 transparent transparent;margin-left:-6px;left:100%;top:7px}.tooltip-left:after,.tooltip-left:before{right:100%;margin-right:6px;left:auto;margin-top:0;top:0}.tooltip-left:before{border-color:transparent transparent transparent #111;margin-right:-6px;right:100%;top:7px}pre code{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code ::-moz-selection,code::-moz-selection,pre ::-moz-selection,pre::-moz-selection{text-shadow:none;background:#b3d4fc}code ::selection,code::selection,pre ::selection,pre::selection{text-shadow:none;background:#b3d4fc}@media print{code,pre{text-shadow:none}}pre{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code,pre{background:#f5f2f0}:not(pre)>code{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:rgba(255,255,255,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.toc{background:#fff;overflow-y:auto;margin:-3px 0 0 -3px;max-height:calc(100vh - 50px);top:30px}.toc .search{width:calc(100% - 10px);margin:5px 0 5px 10px;border-color:#ccc}.toc .search.active{border-color:#f55}.toc .searchbox ul{width:calc(100% - 10px);margin-left:10px}.toc .searchbox .tip{color:#888;font-size:.8em}.toc .searchbox li a{flex:0 0 100%}@media all and (min-width: 700px){.toc{padding:0 10px 0 0;position:sticky}}.toc h2{font-size:1.25em;margin-left:0;padding:0;margin-top:0}.toc h2>*,.toc a{display:block;color:inherit;padding:0 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.toc .label,.toc [data-tooltip]:after{float:right;margin-top:9px;margin-right:2px}.toc a{flex:0 0 calc(100% - 35px)}.toc a.good::after,.toc a.mid::after,.toc a.bad::after{content:"";background:#2ecc40;width:10px;height:10px;border-radius:50%;float:right;margin:10px 0 0 0;opacity:.4;position:absolute;right:10px}@media all and (min-width: 800px){.toc a.good::after,.toc a.mid::after,.toc a.bad::after{margin:12px 0 0 0}}.toc li ul a.good::after,.toc li ul a.mid::after,.toc li ul a.bad::after{opacity:.2}.toc a.mid::after{background:#ff851b}.toc a.bad::after{background:#f55}.toc a:hover{color:#0074d9;background:#eee}.toc ul{padding:0;margin:0;list-style:none;position:relative}.toc ul.hidden{display:none}.toc>ul{margin-bottom:50px}.toc li{display:flex;align-items:center;justify-content:space-between;line-height:1.8;margin:.1em 0;flex-wrap:wrap}.toc li li{margin-left:45px}.toc li li a{flex:0 0 100%}.toc .more{flex:0 0 30px;display:block;transition:all .3s ease;font-size:30px;line-height:24px;height:30px;text-align:center;width:30px;cursor:pointer;border-radius:50%;transform-origin:50% 50% 0;background-image:url("/img/chevron.svg");background-size:18px 18px;background-repeat:no-repeat;background-position:7px 6px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toc .more:hover{color:#0074d9;background-color:#eee}.toc .active>.more{transform:rotateZ(90deg)}.toc .more~ul{flex:0 0 100%;max-height:0;overflow:hidden;transition:all .3s ease}.toc .active>.more~ul{max-height:1000px}nav .menu>*{margin:0}@media all and (min-width: 700px){nav .menu{padding-right:.6em}}nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);margin:0 auto}:not(.extra.docs)~nav.transparent{background:none;box-shadow:none}:not(.extra.docs)~nav.transparent a,:not(.extra.docs)~nav.transparent a.pseudo,:not(.extra.docs)~nav.transparent .burger{color:#fff}.width-500~nav{padding-left:calc(50% - 250px);padding-right:calc(50% - 250px);position:absolute}.width-500~article{max-width:500px}.width-600~nav{padding-left:calc(50% - 300px);padding-right:calc(50% - 300px);position:absolute}.width-600~article{max-width:600px}.width-700~nav{padding-left:calc(50% - 350px);padding-right:calc(50% - 350px);position:absolute}.width-700~article{max-width:700px}.width-800~nav{padding-left:calc(50% - 400px);padding-right:calc(50% - 400px);position:absolute}.width-800~article{max-width:800px}.width-900~nav{padding-left:calc(50% - 450px);padding-right:calc(50% - 450px);position:absolute}.width-900~article{max-width:900px}.width-1000~nav{padding-left:calc(50% - 500px);padding-right:calc(50% - 500px);position:absolute}.width-1000~article{max-width:1000px}.width-1100~nav{padding-left:calc(50% - 550px);padding-right:calc(50% - 550px);position:absolute}.width-1100~article{max-width:1100px}.width-1200~nav{padding-left:calc(50% - 600px);padding-right:calc(50% - 600px);position:absolute}.width-1200~article{max-width:1200px}.width-1300~nav{padding-left:calc(50% - 650px);padding-right:calc(50% - 650px);position:absolute}.width-1300~article{max-width:1300px}.width-1400~nav{padding-left:calc(50% - 700px);padding-right:calc(50% - 700px);position:absolute}.width-1400~article{max-width:1400px}.width-1500~nav{padding-left:calc(50% - 750px);padding-right:calc(50% - 750px);position:absolute}.width-1500~article{max-width:1500px}nav .brand{padding:0 .5em}nav .burger{margin-right:.5em}nav .brand .logo{margin-right:.75em}nav .pseudo{margin-right:5px}@media all and (max-width: 700px){nav.transparent .menu a.pseudo{color:#333}}.external{box-shadow:none;padding-left:35px;margin-top:35px;position:relative;background:none}.external::before{content:"“";font-size:3.5em;font-family:serif;line-height:20px;height:20px;position:absolute;top:10px;left:0}article pre,article pre[class*=language-]{font-size:1.1em;margin-left:-15px;padding:10px 15px;width:calc(100% + 30px)}@media all and (min-width: 900px){article pre,article pre[class*=language-]{font-size:1em;margin-top:0;margin-left:0;width:100%;padding:.5em .8em;line-height:1.3}}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}body{font-size:1em;background-image:linear-gradient(135deg, #81c, #18c);background-size:cover;background-attachment:fixed;padding-top:3em}.hero{position:relative;width:100%;height:50%;min-height:300px;margin:0;text-align:center;color:#fff;padding:1px 0;transition:min-height 999999s,height 999999s}.hero .content{padding:10px;width:100%;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);margin:0 auto}.hero .arrow{font-size:.7em;font-weight:100000;transform:scaleX(1.3);display:inline-block;margin:0 0 0 10px}.hero .button .arrow{transform:scaleX(1.3) translateY(-1px)}.hero .arrow.left{margin:0 10px 0 0}article{width:100%;max-width:900px;margin:20px auto 30vh;background:#fff;padding:2em}article.documentation .main,article.tutorial .main{max-width:100%}article.documentation .source,article.tutorial .source{float:right;margin:-5px}@media all and (min-width: 700px){article.documentation,article.tutorial{margin-top:50px}article.documentation .flex,article.tutorial .flex{width:100%;margin:0}article.documentation .toc,article.tutorial .toc{width:28%;margin-right:2%}article.documentation .main,article.tutorial .main{width:70%}}article .features{margin:20px 0 30px;text-align:center}article .features img{margin:10px auto -5px;width:90px;display:block;filter:opacity(0.8)}article .features h2{padding-top:0}article .features p{margin:0 auto}@media all and (min-width: 600px){article .features img{margin:0 auto;width:100px}article .features p{width:90%;margin:0 auto}}article img{max-width:100%}article>p:first-child{margin-top:0}article h1,article h2,article h3{margin:0;padding-top:25px;padding-bottom:0}article h1 a,article h2 a,article h3 a{color:inherit}article h1 a:hover,article h2 a:hover,article h3 a:hover{color:#0074d9}article .self{float:right;margin-right:5px}article h1{margin-top:-106px;padding-top:100px;line-height:1.1}article h1+*,article h2+*,article h3+*{margin-top:.6em}article table{margin:1.5em 0 .5em;width:100%;max-width:100%}article table td,article table th{padding:.3em .6em}article table th{background:none;color:#333}article table tr:nth-child(2n){background:none}article table th,article table td{border:2px solid #ddd}article .pages{text-align:left}@media all and (max-width: 900px){article{padding:15px;width:100%;border-radius:0}article table{display:block;overflow-x:auto}}.hero h1{font-weight:normal;padding:0;margin:0}.sub{margin:0}pre.sub{display:inline-block;padding:5px 15px;text-align:left;font-size:1.4em;font-family:monospace;font-weight:300;border-radius:0;background:rgba(255,255,255,.1)}@media print{body{padding:0}nav{display:none}.hero,.hero .content{position:static;height:auto;min-height:0;top:auto;left:auto;transform:none}.hero .button{display:none}pre{border:2px solid #ddd}#keep-reading,#keep-reading~*{display:none}h1::after{content:"Tutorial for server.js: https://serverjs.io/";display:block;font-size:1rem}pre[class*=language-]{position:relative;overflow:visible;margin-top:30px}pre[class*=language-]::before{content:attr(data-language);position:absolute;top:0;right:0;font-size:.6em;padding:1px 5px;border:2px solid #ddd;border-radius:0 .4em;border-width:0 0 2px 2px}}blockquote{padding:.3em .3em .3em 1em;margin:1em 0;box-shadow:inset 5px 0 rgba(191,166,0,.3);background:#fdfbc8}blockquote.success{background:rgba(46,204,64,.15);box-shadow:inset 5px 0 rgba(46,204,64,.3)}blockquote.warning{background:rgba(255,133,27,.15);box-shadow:inset 5px 0 rgba(255,133,27,.3)}blockquote.error{background:rgba(255,65,54,.15);box-shadow:inset 5px 0 rgba(255,65,54,.3)}blockquote *:first-child{margin-top:0}blockquote *:last-child{margin-bottom:0}.ad.inline{display:none}button.secret{display:none}@media all and (min-width: 800px){body{font-size:1.15em}.hero .content{width:auto;max-width:100%}.hero h1{font-size:2.3em}.hero p,.sub{font-size:1.2em;margin:5px 0}button.secret{display:block;background:none;color:rgba(255,255,255,.03);margin:0 auto -50px;cursor:inherit}button.secret:focus{box-shadow:none;color:rgba(255,255,255,.05)}button.secret:hover{box-shadow:none;background:rgba(255,255,255,.5);color:rgba(0,0,0,.5);transition:all .3s ease .3s}body.liftoff{background:#000 url("/img/lanterns.jpg") no-repeat center center scroll;background-size:cover;transition:all 1s ease}body.liftoff .hero{background:none}.docs{padding:.4em 1em}}.button{background:#f55}.hero .button{font-weight:bold;margin:0 5px 5px 0;background:#f55}.pages{text-align:center;margin:10px auto 0}.pages .button{margin-right:.3em}#keep-reading{margin-top:1em}.become-sponsor{display:block;background:#eee;text-align:center;color:#666;padding:20px 0} \ No newline at end of file diff --git a/package.json b/package.json index 2fb0b20d..95def580 100644 --- a/package.json +++ b/package.json @@ -74,9 +74,9 @@ "grunt-sass": "^3.1.0", "jest": "^25.0.0", "jstransformer-marked": "^1.0.2", - "node-sass": "^4.13.1", "picnic": "^6.4.0", "request-promises": "^1.0.1", + "sass": "^1.37.5", "supertest": "^3.4.2" }, "jest": { From 51fce00e7a51307ff306435270a9ebba3f1e74e5 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 10 Sep 2021 16:37:33 +0200 Subject: [PATCH 77/93] Added missing head() method --- docs/documentation/context/index.html | 2 +- docs/documentation/errors/index.html | 2 +- docs/documentation/index.html | 2 +- docs/documentation/options/index.html | 2 +- docs/documentation/plugins/index.html | 2 +- docs/documentation/reply/index.html | 2 +- docs/documentation/router/README.md | 18 ++++++++ docs/documentation/router/index.html | 17 +++++++- docs/documentation/testing/index.html | 2 +- router/head.js | 7 +++ router/index.js | 18 ++++---- router/integration.test.js | 63 ++++++++++++++------------- router/unit.test.js | 4 +- test/run.js | 44 ++++++++++--------- 14 files changed, 116 insertions(+), 69 deletions(-) create mode 100644 router/head.js diff --git a/docs/documentation/context/index.html b/docs/documentation/context/index.html index 6705f32e..24454870 100644 --- a/docs/documentation/context/index.html +++ b/docs/documentation/context/index.html @@ -1,4 +1,4 @@ -Context documentation - server.js
                diff --git a/docs/documentation/errors/index.html b/docs/documentation/errors/index.html index 762fc7c6..243317bc 100644 --- a/docs/documentation/errors/index.html +++ b/docs/documentation/errors/index.html @@ -1,4 +1,4 @@ -Errors - server.js

                Documentation

                Errors

                +Errors - server.js

                Documentation

                Errors

                If you happen to stumble here, this bit of the documentation is outdated and follows some old code. Please help us improve the project and the docs so we can make it into the official release.
                diff --git a/docs/documentation/index.html b/docs/documentation/index.html index f73edd6a..a9585be2 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -1,4 +1,4 @@ -Documentation - server.js

                Documentation

                Documentation

                +Documentation - server.js

                Documentation

                Documentation

                Conceptually server is a function that accepts options and other functions. The heavy lifting is already implemented so you can focus on your project:

                // Import the variable into the file
                 const server = require('server');
                diff --git a/docs/documentation/options/index.html b/docs/documentation/options/index.html
                index 556da1f7..7387b29b 100644
                --- a/docs/documentation/options/index.html
                +++ b/docs/documentation/options/index.html
                @@ -1,4 +1,4 @@
                -Options documentation - server.js
                diff --git a/docs/documentation/plugins/index.html b/docs/documentation/plugins/index.html index 73bf9a6f..4b236196 100644 --- a/docs/documentation/plugins/index.html +++ b/docs/documentation/plugins/index.html @@ -1,4 +1,4 @@ -Plugins documentation - server.js

                Documentation

                Plugins

                +Plugins documentation - server.js

                Documentation

                Plugins

                If you happen to stumble here, this bit of the documentation is under active construction and should not be used at all. Please help us improve the project and the docs.
                diff --git a/docs/documentation/reply/index.html b/docs/documentation/reply/index.html index 062b3f40..9078572f 100644 --- a/docs/documentation/reply/index.html +++ b/docs/documentation/reply/index.html @@ -1,4 +1,4 @@ -Reply documentation - server.js
                diff --git a/docs/documentation/router/README.md b/docs/documentation/router/README.md index b2b66267..9fea981f 100644 --- a/docs/documentation/router/README.md +++ b/docs/documentation/router/README.md @@ -5,6 +5,7 @@ Available methods and their parameters for `server.router`: |route name |example | |-------------------------------------------|---------------------------------| |[`get(PATH, FN1, FN2, ...)`](#get-) |`get('/', ctx => { ... })` | +|[`head(PATH, FN1, FN2, ...)`](#head-) |`head('/', ctx => { ... })` | |[`post(PATH, FN1, FN2, ...)`](#post-) |`post('/', ctx => { ... })` | |[`put(PATH, FN1, FN2, ...)`](#put-) |`put('/', ctx => { ... })` | |[`del(PATH, FN1, FN2, ...)`](#del-) |`del('/', ctx => { ... })` | @@ -153,6 +154,23 @@ run(route).get('/hello?name=Francisco').then(res => { +## head() + +Handle requests of the type `HEAD`, which never contain a body: + +```js +// Create a single route for GET / +const route = head('/', ctx => 'Hello 世界'); + +// Testing that it actually works +run(route).head('/').then(res => { + // Body is empty + expect(res.body).toBe(''); +}); +``` + + + ## post() diff --git a/docs/documentation/router/index.html b/docs/documentation/router/index.html index 52174688..c9459655 100644 --- a/docs/documentation/router/index.html +++ b/docs/documentation/router/index.html @@ -1,4 +1,4 @@ -Router documentation - server.js
                @@ -13,6 +13,10 @@ + + + + @@ -135,6 +139,17 @@

                get()

                expect(res.body).toEqual({ page: 'hello', name: 'Francisco' }); });
                +

                head()

                +

                Handle requests of the type HEAD, which never contain a body:

                +
                // Create a single route for GET /
                +const route = head('/', ctx => 'Hello 世界');
                +
                +// Testing that it actually works
                +run(route).head('/').then(res => {
                +  // Body is empty
                +  expect(res.body).toBe('');
                +});
                +

                post()

                Handle requests of the type POST. It needs a csrf token to be provided:

                // Create a single route for POST /
                diff --git a/docs/documentation/testing/index.html b/docs/documentation/testing/index.html
                index 4f96dcb9..abe0590d 100644
                --- a/docs/documentation/testing/index.html
                +++ b/docs/documentation/testing/index.html
                @@ -1,4 +1,4 @@
                -Testing documentation - server.js

                Documentation

                Testing

                +Testing documentation - server.js

                Documentation

                Testing

                If you happen to stumble here, this bit of the documentation is outdated and follows some old code. Please help us improve the project and the docs so we can make it into the official release.
                diff --git a/router/head.js b/router/head.js new file mode 100644 index 00000000..246b6770 --- /dev/null +++ b/router/head.js @@ -0,0 +1,7 @@ +// Import the generic REST handler +const generic = require('./generic'); + +// Defined the actual method +module.exports = (...middle) => { + return generic('HEAD', ...middle); +}; diff --git a/router/index.js b/router/index.js index 9d78c669..68d68943 100644 --- a/router/index.js +++ b/router/index.js @@ -6,16 +6,16 @@ // Perform the routing required module.exports = { - // REST - get : require('./get'), - post : require('./post'), - put : require('./put'), - del : require('./del'), + get: require('./get'), + head: require('./head'), + post: require('./post'), + put: require('./put'), + del: require('./del'), // Special cases - sub : require('./sub'), - error : require('./error'), - join : require('../src/join'), - socket : require('../plugins/socket').router + sub: require('./sub'), + error: require('./error'), + join: require('../src/join'), + socket: require('../plugins/socket').router }; diff --git a/router/integration.test.js b/router/integration.test.js index e7e1d9fd..a5366dd8 100644 --- a/router/integration.test.js +++ b/router/integration.test.js @@ -1,10 +1,9 @@ // Integration - test the router within the whole server functionality const server = require('server'); const run = require('server/test/run'); -const { get, post, put, del, sub, error } = server.router; +const { get, head, post, put, del, sub, error } = server.router; const { status } = server.reply; - // Mock middlewares and data: const question = { answer: 42 }; const mirror = ctx => ctx.data; @@ -15,8 +14,6 @@ const throwError = () => { throw err; }; - - // CSRF validation is checked in another place; disable it for these tests run.options = { security: false }; @@ -39,6 +36,13 @@ describe('Basic router types', () => { expect(called).toBe(false); }); + it('can do a HEAD request', async () => { + const mid = head('/', hello); + + const res = await run(mid).head('/'); + expect(res).toMatchObject({ status: 200, body: '' }); + }); + it('can do a POST request', async () => { const mid = post('/', ctx => ctx.data); @@ -64,7 +68,6 @@ describe('Basic router types', () => { }); }); - describe('Generic paths', () => { it('can do a GET request', async () => { const mid = get(hello); @@ -105,12 +108,11 @@ describe('Generic paths', () => { // }); }); - describe('Subdomain router', () => { it('can do a request to a subdomain', async () => { const mid = sub('api', get('/', hello)); - const res = await run((ctx) => { + const res = await run(ctx => { ctx.headers.host = 'api.example.com'; }, mid).get('/'); expect(res).toMatchObject({ status: 200, body: 'Hello 世界' }); @@ -119,7 +121,7 @@ describe('Subdomain router', () => { it('can handle regex', async () => { const mid = sub(/^api$/, get('/', hello)); - const res = await run((ctx) => { + const res = await run(ctx => { ctx.headers.host = 'api.example.com'; }, mid).get('/'); expect(res).toMatchObject({ status: 200, body: 'Hello 世界' }); @@ -128,25 +130,27 @@ describe('Subdomain router', () => { it('does not do partial match', async () => { const mid = sub(/^api$/, get('/', hello)); - const res = await run((ctx) => { - ctx.headers.host = 'bla.api.example.com'; - }, mid, () => 'Did not match').get('/'); + const res = await run( + ctx => { + ctx.headers.host = 'bla.api.example.com'; + }, + mid, + () => 'Did not match' + ).get('/'); expect(res).toMatchObject({ status: 200, body: 'Did not match' }); }); it('can do a request to a multi-level subdomain', async () => { const mid = sub('api.local', get('/', hello)); - const res = await run((ctx) => { + const res = await run(ctx => { ctx.headers.host = 'api.local.example.com'; }, mid).get('/'); expect(res).toMatchObject({ status: 200, body: 'Hello 世界' }); }); }); - describe('Ends where it should end', () => { - it('uses the matching method', async () => { const mid = [ post('/', throwError), @@ -159,7 +163,6 @@ describe('Ends where it should end', () => { expect(res).toMatchObject({ status: 200, body: 'Hello 世界' }); }); - it('uses the matching path', async () => { const mid = [ get('/bla', throwError), @@ -171,18 +174,13 @@ describe('Ends where it should end', () => { expect(res).toMatchObject({ status: 200, body: 'Hello 世界' }); }); - it('uses a route only once', async () => { - const mid = [ - get('/', hello), - get('/', throwError) - ]; + const mid = [get('/', hello), get('/', throwError)]; const res = await run(mid).get('/'); expect(res).toMatchObject({ status: 200, body: 'Hello 世界' }); }); - it('parses params correctly', async () => { const mid = get('/:id', ctx => ctx.params.id); @@ -201,23 +199,28 @@ describe('Ends where it should end', () => { }); }); - it('does generic error matching', async () => { let err; - const res = await run(throwError, error(ctx => { - err = ctx.error; - return 'Hello world'; - })).get('/'); + const res = await run( + throwError, + error(ctx => { + err = ctx.error; + return 'Hello world'; + }) + ).get('/'); expect(res.body).toBe('Hello world'); expect(err.message).toMatch(/MockError/); }); it('does path error matching', async () => { let err; - const res = await run(throwError, error('test', ctx => { - err = ctx.error; - return 'Hello world'; - })).get('/'); + const res = await run( + throwError, + error('test', ctx => { + err = ctx.error; + return 'Hello world'; + }) + ).get('/'); expect(res.body).toBe('Hello world'); expect(err.message).toMatch(/MockError/); }); diff --git a/router/unit.test.js b/router/unit.test.js index 1ed8e601..6e24e4fd 100644 --- a/router/unit.test.js +++ b/router/unit.test.js @@ -22,7 +22,7 @@ describe('server/router definition', () => { it('has the right methods defined', () => { expect(router.get).toEqual(jasmine.any(Function)); - expect(router.get).toEqual(jasmine.any(Function)); + expect(router.head).toEqual(jasmine.any(Function)); expect(router.post).toEqual(jasmine.any(Function)); expect(router.put).toEqual(jasmine.any(Function)); expect(router.del).toEqual(jasmine.any(Function)); @@ -32,7 +32,7 @@ describe('server/router definition', () => { it('can load all the methods manually', () => { expect(require('server/router/get')).toEqual(jasmine.any(Function)); - expect(require('server/router/get')).toEqual(jasmine.any(Function)); + expect(require('server/router/head')).toEqual(jasmine.any(Function)); expect(require('server/router/post')).toEqual(jasmine.any(Function)); expect(require('server/router/put')).toEqual(jasmine.any(Function)); expect(require('server/router/del')).toEqual(jasmine.any(Function)); diff --git a/test/run.js b/test/run.js index 65e3625a..7763fa21 100644 --- a/test/run.js +++ b/test/run.js @@ -4,7 +4,6 @@ const port = require('./port'); // Make an object with the options as expected by request() const normalize = (method, url, port, options) => { - // Make sure it's a simple object if (typeof options === 'string') options = { url: options }; @@ -25,21 +24,20 @@ const normalize = (method, url, port, options) => { return options; }; - - // Parse the server options const serverOptions = async middle => { // First parameter can be: // - options: Number || Object (cannot be ID'd) // - middleware: undefined || null || Boolean || Function || Array - let opts = ( + let opts = typeof middle[0] === 'undefined' || typeof middle[0] === 'boolean' || typeof middle[0] === 'string' || middle[0] === null || middle[0] instanceof Function || middle[0] instanceof Array - ) ? {} : middle.shift(); + ? {} + : middle.shift(); // In case the port is the defaults one let synthetic = !opts || !opts.port; @@ -57,17 +55,13 @@ const serverOptions = async middle => { return opts; }; - - -module.exports = function (...middle) { - +module.exports = function(...middle) { // Make sure we are working with an instance - if (!(this instanceof (module.exports))) { - return new (module.exports)(...middle); + if (!(this instanceof module.exports)) { + return new module.exports(...middle); } const launch = async (method, url, reqOpts) => { - // Parse the server options const opts = await serverOptions(middle); @@ -79,16 +73,22 @@ module.exports = function (...middle) { const ctx = await server(opts, middle, opts.raw ? false : error); - ctx.close = () => new Promise((resolve, reject) => { - ctx.server.close(err => err ? reject(err) : resolve()); - }); + ctx.close = () => + new Promise((resolve, reject) => { + ctx.server.close(err => (err ? reject(err) : resolve())); + }); if (!method) return ctx; - const res = await request(normalize(method, url, ctx.options.port, reqOpts)); + const res = await request( + normalize(method, url, ctx.options.port, reqOpts) + ); // Fix small bug. TODO: report it res.method = res.request.method; res.status = res.statusCode; res.options = ctx.options; - if (/application\/json/.test(res.headers['content-type']) && typeof res.body === 'string') { + if ( + /application\/json/.test(res.headers['content-type']) && + typeof res.body === 'string' + ) { res.rawBody = res.body; res.body = JSON.parse(res.body); } @@ -99,7 +99,7 @@ module.exports = function (...middle) { // Return the response that happened from the server return res; - } + }; this.alive = async cb => { let instance; @@ -111,7 +111,10 @@ module.exports = function (...middle) { const res = await requestApi(normalize(method, url, port, options)); res.method = res.request.method; res.status = res.statusCode; - if (/application\/json/.test(res.headers['content-type']) && typeof res.body === 'string') { + if ( + /application\/json/.test(res.headers['content-type']) && + typeof res.body === 'string' + ) { res.rawBody = res.body; res.body = JSON.parse(res.body); } @@ -121,6 +124,7 @@ module.exports = function (...middle) { }; const api = { get: generic('GET'), + head: generic('HEAD'), post: generic('POST'), put: generic('PUT'), del: generic('DELETE'), @@ -137,11 +141,11 @@ module.exports = function (...middle) { } }; this.get = (url, options) => launch('GET', url, options); + this.head = (url, options) => launch('HEAD', url, options); this.post = (url, options) => launch('POST', url, options); this.put = (url, options) => launch('PUT', url, options); this.del = (url, options) => launch('DELETE', url, options); return this; }; - module.exports.options = {}; From 98053224a2d016556b654e5ba91064a8dcb8c7c4 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 10 Sep 2021 16:37:44 +0200 Subject: [PATCH 78/93] 1.0.36 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 95def580..cf0bbd52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "1.0.35", + "version": "1.0.36", "description": "A modern and powerful server for Node.js", "homepage": "https://serverjs.io/", "repository": "https://github.com/franciscop/server.git", From 0c146643ae2dbc4115ba1a8e93158b6cd2233dbe Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 10 Sep 2021 16:39:47 +0200 Subject: [PATCH 79/93] Testing now happens on Github --- appveyor.yml | 21 --------------------- circle.yml | 7 ------- 2 files changed, 28 deletions(-) delete mode 100644 appveyor.yml delete mode 100644 circle.yml diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 64fcc77c..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,21 +0,0 @@ -environment: - matrix: - - nodejs_version: "10.0" -cache: - - node_modules -install: - - ps: Install-Product node $env:nodejs_version - - node -v - - npm -v - - npm cache verify - - rm -rf node_modules/ - - if exist node_modules npm prune - - if exist node_modules npm rebuild - - npm install - - npm install jest-cli@25 --save-dev -build: off -test_script: - - node --version - - npm --version - - npm test -version: "{build}" diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 3d68b0d3..00000000 --- a/circle.yml +++ /dev/null @@ -1,7 +0,0 @@ -machine: - node: - version: 8.0.0 - -general: - artifacts: - - ./coverage From 2d99403ec7a17d532d1a5079d074ced35ab4d2ba Mon Sep 17 00:00:00 2001 From: Francisco Date: Sat, 18 Sep 2021 13:06:39 +0900 Subject: [PATCH 80/93] Added a small note in Advanced about app.close() --- docs/documentation/README.md | 14 ++++++++++++-- docs/documentation/index.html | 11 +++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/docs/documentation/README.md b/docs/documentation/README.md index a34a0d4f..68ca6c2a 100644 --- a/docs/documentation/README.md +++ b/docs/documentation/README.md @@ -316,7 +316,17 @@ There is a lot of basic to mid-difficulty documentation to do until we even get The main function returns a promise that will be fulfilled when the server is running and can be accessed. It will receive a more primitive context. So this is perfectly valid: ```js -server(ctx => 'Hello world').then(ctx => { - console.log(`Server launched on http://localhost:${ctx.options.port}/`); +server(ctx => 'Hello world').then(app => { + console.log(`Server launched on http://localhost:${app.options.port}/`); +}); +``` + +If you need to stop the server manually, you can do so by invoking the `.close()` function: + +```js +server(ctx => 'Hello world').then(async app => { + console.log('Launched'); + await app.close(); + console.log('Closed'); }); ``` diff --git a/docs/documentation/index.html b/docs/documentation/index.html index a9585be2..2c061855 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -220,8 +220,15 @@

                Routing

                Advanced topics

                There is a lot of basic to mid-difficulty documentation to do until we even get here. Just a quick note so far:

                The main function returns a promise that will be fulfilled when the server is running and can be accessed. It will receive a more primitive context. So this is perfectly valid:

                -
                server(ctx => 'Hello world').then(ctx => {
                -  console.log(`Server launched on http://localhost:${ctx.options.port}/`);
                +
                server(ctx => 'Hello world').then(app => {
                +  console.log(`Server launched on http://localhost:${app.options.port}/`);
                +});
                +
                +

                If you need to stop the server manually, you can do so by invoking the .close() function:

                +
                server(ctx => 'Hello world').then(async app => {
                +  console.log('Launched');
                +  await app.close();
                +  console.log('Closed');
                 });
                 

                Keep reading

                List of all the topics:

                get('/', ctx => { ... })
                head(PATH, FN1, FN2, ...)head('/', ctx => { ... })
                post(PATH, FN1, FN2, ...) post('/', ctx => { ... })