├── public ├── robots.txt ├── sha1.png ├── cicada.jpg ├── favicon.png ├── link-64.png ├── red-lock.png ├── chrome-warnings.png ├── fake_cryptography.jpg ├── fonts │ ├── average-1892553368b79a42a9f31632c9f37feb15a868cb.eot │ ├── average-f28ac3fb6d82bf010b6ad1b6ec8b6898e31d5566.ttf │ ├── opensans-1395a31469a458f6e2069017b504be065ff44897.ttf │ ├── opensans-3954f1cc512d376e366c33802aecc5e80c1a1f33.ttf │ ├── opensans-3e193feab52524db86cd1508693f2e5086102669.ttf │ ├── opensans-926612b6b077ab82a2aed764299292f6a8363dd2.ttf │ ├── opensans-f0cc9c782f41b44a31392230103f5b4e101a944a.eot │ └── average-978fe73639fdbea7f62f3e268fb1f00032127166.svg ├── css │ ├── html5-reset.css │ ├── main.css │ └── pure-min-0.5.0.css └── js │ └── main.js ├── .gitignore ├── CONTRIBUTING.md ├── routes.js ├── package.json ├── app.js ├── LICENSE ├── bin └── shaaaaaaaaaaaaa ├── fabfile.py ├── fingerprints.json ├── snapshot ├── index_files │ ├── main.css │ ├── main.js │ ├── pure-min-0.5.0.css │ └── analytics.js └── index.html ├── test └── shaaaaa.js ├── README.md ├── shaaaaa.js └── views └── index.html /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | -------------------------------------------------------------------------------- /public/sha1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/sha1.png -------------------------------------------------------------------------------- /public/cicada.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/cicada.jpg -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/favicon.png -------------------------------------------------------------------------------- /public/link-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/link-64.png -------------------------------------------------------------------------------- /public/red-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/red-lock.png -------------------------------------------------------------------------------- /public/chrome-warnings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/chrome-warnings.png -------------------------------------------------------------------------------- /public/fake_cryptography.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fake_cryptography.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | config.js 3 | /node_modules 4 | /*.txt 5 | /data 6 | *.pyc 7 | .python-version 8 | npm-debug.log 9 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ### Contributing to shaaaaaaaaaaaaa 2 | 3 | By contributing to this project, you agree to license your contributions under the [MIT License](LICENSE). -------------------------------------------------------------------------------- /public/fonts/average-1892553368b79a42a9f31632c9f37feb15a868cb.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fonts/average-1892553368b79a42a9f31632c9f37feb15a868cb.eot -------------------------------------------------------------------------------- /public/fonts/average-f28ac3fb6d82bf010b6ad1b6ec8b6898e31d5566.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fonts/average-f28ac3fb6d82bf010b6ad1b6ec8b6898e31d5566.ttf -------------------------------------------------------------------------------- /public/fonts/opensans-1395a31469a458f6e2069017b504be065ff44897.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fonts/opensans-1395a31469a458f6e2069017b504be065ff44897.ttf -------------------------------------------------------------------------------- /public/fonts/opensans-3954f1cc512d376e366c33802aecc5e80c1a1f33.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fonts/opensans-3954f1cc512d376e366c33802aecc5e80c1a1f33.ttf -------------------------------------------------------------------------------- /public/fonts/opensans-3e193feab52524db86cd1508693f2e5086102669.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fonts/opensans-3e193feab52524db86cd1508693f2e5086102669.ttf -------------------------------------------------------------------------------- /public/fonts/opensans-926612b6b077ab82a2aed764299292f6a8363dd2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fonts/opensans-926612b6b077ab82a2aed764299292f6a8363dd2.ttf -------------------------------------------------------------------------------- /public/fonts/opensans-f0cc9c782f41b44a31392230103f5b4e101a944a.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/konklone/shaaaaaaaaaaaaa/HEAD/public/fonts/opensans-f0cc9c782f41b44a31392230103f5b4e101a944a.eot -------------------------------------------------------------------------------- /routes.js: -------------------------------------------------------------------------------- 1 | var shaaaaa = require("./shaaaaa"); 2 | 3 | module.exports = function(app) { 4 | 5 | app.get('/', function(req, res) { 6 | res.render("index.html", {domain: null}); 7 | }); 8 | 9 | app.get('/check/:domain', function(req, res) { 10 | res.render("index.html", {domain: req.params.domain}); 11 | }); 12 | 13 | app.get('/api/check/:domain', function(req, res) { 14 | var domain = req.params.domain; 15 | if (!domain) return res.status(500); 16 | 17 | // remove any protocol prefix 18 | var escaped = domain.replace(/^https?:\/\//i, ''); 19 | 20 | console.log("Checking domain: " + domain + ", " + escaped); 21 | 22 | shaaaaa.from(domain, function(err, data) { 23 | if (err) return res.status(400).send({error: err, message: err.message}); 24 | res.send(data); 25 | }) 26 | 27 | }); 28 | 29 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shaaaaaaaaaaaaa", 3 | "version": "0.1.0", 4 | "description": "Do you have the latest SHA???", 5 | "main": "app.js", 6 | "private": true, 7 | "scripts": { 8 | "test": "./node_modules/faucet/bin/cmd.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/konklone/shaaaaaaaaaaaaa" 13 | }, 14 | "author": { 15 | "name": "Eric Mill", 16 | "email": "eric@konklone.com", 17 | "url": "https://konklone.com" 18 | }, 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/konklone/shaaaaaaaaaaaaa/issues" 22 | }, 23 | "homepage": "https://github.com/konklone/shaaaaaaaaaaaaa", 24 | "dependencies": { 25 | "express": "4.x", 26 | "ejs": "*", 27 | "body-parser": "*", 28 | "method-override": "*", 29 | "errorhandler": "*", 30 | "x509": "*", 31 | "minimist": "*", 32 | "faucet": "*", 33 | "tls": "*" 34 | }, 35 | "keywords": [ 36 | "sha", 37 | "ssl", 38 | "tls", 39 | "certificate", 40 | "crypto", 41 | "cryptography", 42 | "security", 43 | "https" 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | // this is an Express app 2 | var express = require('express'); 3 | var app = express(); 4 | 5 | // environment and port 6 | var env = process.env.NODE_ENV || 'development'; 7 | var port = parseInt(process.argv[2], 10); 8 | if (isNaN(port)) port = 3000; 9 | 10 | // app middleware/settings 11 | app.engine('.html', require('ejs').__express); 12 | app.enable('trust proxy') 13 | .use(require('body-parser').json()) 14 | .use(require('body-parser').urlencoded({extended: false})) 15 | .use(require('method-override')()) 16 | .use(function(req,res,next){ 17 | res.locals.req = req; 18 | next(); 19 | }) 20 | .use(express.static(__dirname + '/public')); 21 | 22 | // development vs production 23 | if (env == "development") 24 | app.use(require('errorhandler')({dumpExceptions: true, showStack: true})) 25 | else 26 | app.use(require('errorhandler')()) 27 | 28 | app.locals.helpers = { 29 | escape_attribute: function(text) { 30 | return text.replace(/\"/g, """); 31 | } 32 | }; 33 | var routes = require("./routes")(app); 34 | 35 | // boot it up! 36 | app.listen(port, function() { 37 | console.log("Express server listening on port %s in %s mode", port, env); 38 | }); 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) Eric Mill 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | * Neither the name of Eric Mill nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /bin/shaaaaaaaaaaaaa: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /* 4 | * Check a domain name for what SHA algorithm it uses. 5 | * 6 | * Usage: shaaaaaaaaaaaaa domain [options] 7 | * 8 | * Options: 9 | * --compact: Display in native Node toString() format, instead of JSON. 10 | */ 11 | 12 | var shaaaaa = require("../shaaaaa"); 13 | 14 | var run = function(domain, options) { 15 | if (!domain) { 16 | console.log("Usage: shaaaaaaaaaaaaa domain.com") 17 | process.exit(1); 18 | } 19 | 20 | shaaaaa.from(domain, function(err, data) { 21 | if (err) { 22 | 23 | var message = "Unexpected error"; 24 | if (err.message.indexOf("gethostbyname") >= 0) 25 | message = "Couldn't lookup hostname."; 26 | else if (err.message.indexOf("Connection refused") >= 0) 27 | message = "Couldn't connect to that domain."; 28 | else if (err.message.indexOf("Command failed") >= 0) 29 | message = "Couldn't connect to that domain."; 30 | 31 | var error = { 32 | error: true, 33 | domain: domain, 34 | message: message 35 | }; 36 | 37 | if (options.compact) 38 | output = error; 39 | else 40 | output = JSON.stringify(error, null, 2); 41 | 42 | console.error(output); 43 | process.exit(1); 44 | } 45 | 46 | var output; 47 | if (options.compact) 48 | output = data; 49 | else 50 | output = JSON.stringify(data, null, 2); 51 | 52 | console.log(output); 53 | process.exit(0); 54 | }, options); 55 | 56 | } 57 | 58 | var options = require('minimist')(process.argv.slice(2)); 59 | // console.log(options); 60 | run(options._[0], options); 61 | -------------------------------------------------------------------------------- /fabfile.py: -------------------------------------------------------------------------------- 1 | import time 2 | from fabric.api import run, execute, env 3 | 4 | environment = "production" 5 | 6 | env.use_ssh_config = True 7 | env.hosts = ["shaaaaa"] 8 | 9 | branch = "master" 10 | repo = "git@github.com:konklone/shaaaaaaaaaaaaa.git" 11 | 12 | username = "shaaaaa" 13 | home = "/home/%s/%s" % (username, username) 14 | shared_path = "%s/shared" % home 15 | versions_path = "%s/versions" % home 16 | version_path = "%s/%s" % (versions_path, time.strftime("%Y%m%d%H%M%S")) 17 | current_path = "%s/current" % home 18 | logs = "/home/%s" % username 19 | 20 | keep = 5 21 | 22 | 23 | def checkout(): 24 | run('git clone -q -b %s %s %s' % (branch, repo, version_path)) 25 | 26 | def dependencies(): 27 | run('cd %s && npm install' % version_path) 28 | 29 | # TODO: why did I do this? (cp instead of ln) 30 | def make_current(): 31 | # run('rm -f %s && ln -s %s %s' % (current_path, version_path, current_path)) 32 | run('rm -rf %s && cp -r %s %s' % (current_path, version_path, current_path)) 33 | 34 | def cleanup(): 35 | versions = run("ls -x %s" % versions_path).split() 36 | destroy = versions[:-keep] 37 | 38 | for version in destroy: 39 | command = "rm -rf %s/%s" % (versions_path, version) 40 | run(command) 41 | 42 | 43 | ## can be run on their own 44 | 45 | def start(): 46 | # run("cd %s && NODE_ENV=%s forever -l %s/forever.log -a start app.js -p 3000" % (current_path, environment, logs)) 47 | run(("cd %s && " + 48 | "NODE_ENV=%s forever -l %s/forever.log -a start app.js 3000 && " + 49 | "NODE_ENV=%s forever -l %s/forever.log -a start app.js 3001") % 50 | (current_path, environment, logs, environment, logs) 51 | ) 52 | 53 | def stop(): 54 | run("forever stop app.js") 55 | 56 | def restart(): 57 | run("forever restart app.js") 58 | 59 | def deploy(): 60 | execute(checkout) 61 | execute(dependencies) 62 | execute(make_current) 63 | execute(restart) 64 | execute(cleanup) 65 | -------------------------------------------------------------------------------- /fingerprints.json: -------------------------------------------------------------------------------- 1 | { 2 | "certificates": [ 3 | { 4 | "name": "StartSSL Class1 Intermediate CA", 5 | "sha1": "F6:91:FC:87:EF:B3:13:53:54:22:5A:10:E1:27:E9:11:D1:C7:F8:CF", 6 | "url": "https://www.startssl.com/certs/class1/sha2/pem/sub.class1.server.sha2.ca.pem" 7 | }, 8 | { 9 | "name": "StartSSL Class2 Intermediate CA", 10 | "sha1": "A1:AC:E4:04:6B:6E:33:22:32:B8:7E:CF:B6:F3:7A:07:63:72:01:47", 11 | "url": "https://www.startssl.com/certs/class2/sha2/pem/sub.class2.server.sha2.ca.pem" 12 | }, 13 | { 14 | "name": "StartSSL Class3 Intermediate CA", 15 | "sha1": "48:35:1C:D3:E4:36:6F:C3:0F:37:1E:1E:EB:43:37:1A:27:BC:1B:24", 16 | "url": "https://www.startssl.com/certs/class3/sha2/pem/sub.class3.server.sha2.ca.pem" 17 | }, 18 | { 19 | "name": "StartSSL Class4 Intermediate CA", 20 | "sha1": "98:50:46:3B:55:04:9F:83:6C:D6:3F:69:B3:0B:D9:E2:C6:4D:42:74", 21 | "url": "https://www.startssl.com/certs/class4/sha2/pem/sub.ev.server.sha2.ca.pem" 22 | }, 23 | { 24 | "name": "DigiCert Secure Server CA", 25 | "sha1": "F9:AE:40:CC:BB:DA:47:95:E5:8A:C5:D2:03:BF:B7:BD:33:1B:81:E8", 26 | "url": "http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt" 27 | }, 28 | { 29 | "name": "VeriSign Standard SSL RSA Secondary SSL Intermediate CA Certificate", 30 | "sha1": "5D:EB:8F:33:9E:26:4C:19:F6:68:6F:5F:8F:32:B5:4A:4C:46:B4:76", 31 | "url": "https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&actp=CROSSLINK&id=AR2064" 32 | }, 33 | { 34 | "name": "VeriSign Standard SSL RSA Primary Intermediate CA Certificate", 35 | "sha1": "32:F3:08:82:62:2B:87:CF:88:56:C6:3D:B8:73:DF:08:53:B4:DD:27", 36 | "url": "https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&actp=CROSSLINK&id=AR2064" 37 | }, 38 | { 39 | "name": "VeriSign Premium SSL RSA Secondary SSL Intermediate CA Certificate", 40 | "sha1": "B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04", 41 | "url": "https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&actp=CROSSLINK&id=AR2064" 42 | } 43 | ] 44 | } -------------------------------------------------------------------------------- /public/css/html5-reset.css: -------------------------------------------------------------------------------- 1 | /* 2 | html5doctor.com Reset Stylesheet 3 | v1.6.1 4 | Last Updated: 2010-09-17 5 | Author: Richard Clark - http://richclarkdesign.com 6 | Twitter: @rich_clark 7 | */ 8 | 9 | html, body, div, span, object, iframe, 10 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 11 | abbr, address, cite, code, 12 | del, dfn, em, img, ins, kbd, q, samp, 13 | small, strong, sub, sup, var, 14 | b, i, 15 | dl, dt, dd, ol, ul, li, 16 | fieldset, form, label, legend, 17 | table, caption, tbody, tfoot, thead, tr, th, td, 18 | article, aside, canvas, details, figcaption, figure, 19 | footer, header, hgroup, menu, nav, section, summary, 20 | time, mark, audio, video { 21 | margin:0; 22 | padding:0; 23 | border:0; 24 | outline:0; 25 | font-size:100%; 26 | vertical-align:baseline; 27 | background:transparent; 28 | } 29 | 30 | body { 31 | line-height:1; 32 | } 33 | 34 | article,aside,details,figcaption,figure, 35 | footer,header,hgroup,menu,nav,section { 36 | display:block; 37 | } 38 | 39 | nav ul { 40 | list-style:none; 41 | } 42 | 43 | blockquote, q { 44 | quotes:none; 45 | } 46 | 47 | blockquote:before, blockquote:after, 48 | q:before, q:after { 49 | content:''; 50 | content:none; 51 | } 52 | 53 | a { 54 | margin:0; 55 | padding:0; 56 | font-size:100%; 57 | vertical-align:baseline; 58 | background:transparent; 59 | } 60 | 61 | /* change colours to suit your needs */ 62 | ins { 63 | background-color:#ff9; 64 | color:#000; 65 | text-decoration:none; 66 | } 67 | 68 | /* change colours to suit your needs */ 69 | mark { 70 | background-color:#ff9; 71 | color:#000; 72 | font-style:italic; 73 | font-weight:bold; 74 | } 75 | 76 | del { 77 | text-decoration: line-through; 78 | } 79 | 80 | abbr[title], dfn[title] { 81 | border-bottom:1px dotted; 82 | cursor:help; 83 | } 84 | 85 | table { 86 | border-collapse:collapse; 87 | border-spacing:0; 88 | } 89 | 90 | /* change border colour to suit your needs */ 91 | hr { 92 | display:block; 93 | height:1px; 94 | border:0; 95 | border-top:1px solid #cccccc; 96 | margin:1em 0; 97 | padding:0; 98 | } 99 | 100 | input, select { 101 | vertical-align:middle; 102 | } -------------------------------------------------------------------------------- /public/css/main.css: -------------------------------------------------------------------------------- 1 | /** Main styles for shaaaaaaaaaaaaa.com. */ 2 | 3 | 4 | /* layout */ 5 | #main { 6 | padding: 0 20px; max-width: 768px; 7 | margin: 0 auto; 8 | } 9 | #results {width: 100%;} 10 | 11 | a {color: #036;} 12 | 13 | /* fonts */ 14 | body { 15 | font-family: "Open Sans", "Arial", sans-serif; 16 | font-size: 11pt; 17 | } 18 | h1 {font-size: 5.1em; margin: 0;} 19 | p {line-height: 22px;} 20 | li {line-height: 23px; margin: 10px 0;} 21 | h2 {font-size: 1.5em;} 22 | header p {font-size: 11pt; line-height: 25px;} 23 | .lead p {font-size: 16pt; line-height: 30px;} 24 | #loading {font-size: 10pt;} 25 | 26 | #results .result p.bottom {font-size: 12pt;} 27 | 28 | /* spacing */ 29 | h2 {margin-top: 30px;} 30 | header p {margin-top: 0;} 31 | .lead {margin-bottom: 30px;} 32 | 33 | /* octicon link */ 34 | h2 {position: relative;} 35 | h2 a { 36 | background-image: url(/link-64.png); 37 | background-repeat: no-repeat; 38 | position: absolute; 39 | 40 | background-size: 16px; 41 | width: 25px; 42 | height: 25px; 43 | margin-left: -25px; 44 | margin-top: 7px; 45 | 46 | visibility: hidden; 47 | } 48 | h2:hover a,a:hover {visibility: visible;} 49 | 50 | #loading {display: none; margin-left: 10px; } 51 | 52 | #results .result { 53 | background-color: #e5e5e5; 54 | padding: 10px; 55 | } 56 | #results form {margin-top: 8px;} 57 | #results .result.answer, 58 | #results .result.error, 59 | #results .result.answer .word {display: none;} 60 | #results .result.answer #sha {display: none;} 61 | 62 | #results .result .domain {font-weight: bold;} 63 | #results .result .algorithm {font-weight: bold;} 64 | 65 | #results strong.word { 66 | display: block; font-size: 5.1em; 67 | margin-bottom: 5px; 68 | } 69 | #results .result strong.good {color: #090;} 70 | #results .result strong.bad {color: #900;} 71 | #results .result strong.error {color: #000;} 72 | #results .result strong.almost {color: #FA9008;} 73 | 74 | #results .result p { 75 | margin-left: 5px; 76 | margin-top: 0; margin-bottom: 15px; 77 | font-size: 14pt; line-height: 25px; 78 | } 79 | 80 | #results .result small { 81 | margin-left: 7px; 82 | } 83 | 84 | #results .pure-form input#domain { 85 | padding-top: 9px; padding-bottom: 9px; 86 | display: inline-block; 87 | width: 300px; 88 | margin-bottom: 10px; 89 | font-size: 2.1em; 90 | } 91 | 92 | input[type=submit] { 93 | padding-left: 15px; 94 | padding-right: 15px; 95 | margin-left: 5px; 96 | font-size: 1.5em; 97 | height: 51px; 98 | } 99 | 100 | 101 | p code { 102 | display: block; 103 | margin-top: 10px; 104 | padding: 10px; 105 | overflow: auto; 106 | font-size: 85%; 107 | line-height: 1.45; 108 | background-color: #e5e5e5; 109 | border-radius: 3px; 110 | } 111 | 112 | /* 113 | .result ul {padding-left: 0; margin-left: 7px;} 114 | .result ul, .result li {list-style-type: none;} 115 | */ 116 | -------------------------------------------------------------------------------- /snapshot/index_files/main.css: -------------------------------------------------------------------------------- 1 | /** Main styles for shaaaaaaaaaaaaa.com. */ 2 | 3 | 4 | /* layout */ 5 | #main { 6 | padding: 0 20px; max-width: 768px; 7 | margin: 0 auto; 8 | } 9 | #results {width: 100%;} 10 | 11 | a {color: #036;} 12 | 13 | /* fonts */ 14 | body { 15 | font-family: "Open Sans", "Arial", sans-serif; 16 | font-size: 11pt; 17 | } 18 | h1 {font-size: 5.1em; margin: 0;} 19 | p {line-height: 22px;} 20 | li {line-height: 23px; margin: 10px 0;} 21 | h2 {font-size: 1.5em;} 22 | header p {font-size: 11pt; line-height: 25px;} 23 | .lead p {font-size: 16pt; line-height: 30px;} 24 | #loading {font-size: 10pt;} 25 | 26 | #results .result p.bottom {font-size: 12pt;} 27 | 28 | /* spacing */ 29 | h2 {margin-top: 30px;} 30 | header p {margin-top: 0;} 31 | .lead {margin-bottom: 30px;} 32 | 33 | /* octicon link */ 34 | h2 {position: relative;} 35 | h2 a { 36 | background-image: url(/link-64.png); 37 | background-repeat: no-repeat; 38 | position: absolute; 39 | 40 | background-size: 16px; 41 | width: 25px; 42 | height: 25px; 43 | margin-left: -25px; 44 | margin-top: 7px; 45 | 46 | visibility: hidden; 47 | } 48 | h2:hover a,a:hover {visibility: visible;} 49 | 50 | #loading {display: none; margin-left: 10px; } 51 | 52 | #results .result { 53 | background-color: #e5e5e5; 54 | padding: 10px; 55 | } 56 | #results form {margin-top: 8px;} 57 | #results .result.answer, 58 | #results .result.error, 59 | #results .result.answer .word {display: none;} 60 | #results .result.answer #sha {display: none;} 61 | 62 | #results .result .domain {font-weight: bold;} 63 | #results .result .algorithm {font-weight: bold;} 64 | 65 | #results strong.word { 66 | display: block; font-size: 5.1em; 67 | margin-bottom: 5px; 68 | } 69 | #results .result strong.good {color: #090;} 70 | #results .result strong.bad {color: #900;} 71 | #results .result strong.error {color: #000;} 72 | #results .result strong.almost {color: #FA9008;} 73 | 74 | #results .result p { 75 | margin-left: 5px; 76 | margin-top: 0; margin-bottom: 15px; 77 | font-size: 14pt; line-height: 25px; 78 | } 79 | 80 | #results .result small { 81 | margin-left: 7px; 82 | } 83 | 84 | #results .pure-form input#domain { 85 | padding-top: 9px; padding-bottom: 9px; 86 | display: inline-block; 87 | width: 300px; 88 | margin-bottom: 10px; 89 | font-size: 2.1em; 90 | } 91 | 92 | input[type=submit] { 93 | padding-left: 15px; 94 | padding-right: 15px; 95 | margin-left: 5px; 96 | font-size: 1.5em; 97 | height: 51px; 98 | } 99 | 100 | 101 | p code { 102 | display: block; 103 | margin-top: 10px; 104 | padding: 10px; 105 | overflow: auto; 106 | font-size: 85%; 107 | line-height: 1.45; 108 | background-color: #e5e5e5; 109 | border-radius: 3px; 110 | } 111 | 112 | /* 113 | .result ul {padding-left: 0; margin-left: 7px;} 114 | .result ul, .result li {list-style-type: none;} 115 | */ 116 | -------------------------------------------------------------------------------- /public/js/main.js: -------------------------------------------------------------------------------- 1 | var hasPushstate = Boolean(window.history && history.pushState); 2 | 3 | $("form").on("submit", function(event) { 4 | var domain = $("#domain").val(); 5 | if (domain) { 6 | var escaped = domain.replace(/^https?:\/\//i, "").replace(/[^\w\.\-:]/g, ""); 7 | checkDomain(escaped); 8 | if (hasPushstate) { 9 | history.pushState(escaped, null, "/check/" + escaped); 10 | } 11 | } 12 | event.preventDefault(); 13 | }); 14 | 15 | $(window).on("popstate", function(event) { 16 | var domain = event.originalEvent.state; 17 | if (domain) { 18 | checkDomain(domain); 19 | } else { 20 | // don't let mere anchor clicks trigger the event 21 | // console.log(event); 22 | if (window.location.pathname == "/") 23 | startOver(); 24 | } 25 | }); 26 | 27 | var display = { 28 | "sha256": "SHA-2", 29 | "sha512": "SHA-2", 30 | "sha384": "SHA-2", 31 | "sha224": "SHA-2", 32 | "sha1": "SHA-1", 33 | "md5": "MD5", 34 | "md2": "MD2" 35 | }; 36 | 37 | var checkDomain = function(domain) { 38 | console.log("Checking domain: " + domain); 39 | 40 | $.ajax( 41 | {url: "/api/check/" + domain} 42 | ) 43 | .done(function(data) { 44 | hideLoading(); 45 | console.log("Done checking."); 46 | 47 | // transition from loading to main answer body 48 | $("#results .result").hide(); 49 | $("#results .result.answer").show(); 50 | $("#results .result .word").hide(); 51 | $("#results .result p.details").hide(); 52 | 53 | // always fill in algorithm and domain 54 | $("#results .result .algorithm").html(display[data.cert.algorithm]); 55 | $("#results .result .domain").html(domain); 56 | $("a.ssllabs").attr("href", ssllabsUrl(domain)); 57 | 58 | var test = domain.toLowerCase(); 59 | if (test == "shaaaaaaaaaaaaa.com") 60 | $(".extra").html(" and is undoubtedly the most magnificent website in the world").show(); 61 | else 62 | $(".extra").hide(); 63 | 64 | // diagnosis: "good", "bad", "almost" 65 | $("#results .result ." + data.diagnosis).css("display", "block"); 66 | 67 | // TODO: show details 68 | }) 69 | .fail(function(xhr) { 70 | hideLoading(); 71 | console.log("Error while checking domain:"); 72 | console.log(xhr.responseJSON.message); 73 | 74 | // load domain 75 | $("#results .result .domain").html(domain); 76 | 77 | // show results 78 | $("#results .result").hide(); 79 | $("#results .result.error").show(); 80 | $("#results .result.error .word").show(); 81 | }); 82 | 83 | showLoading(); 84 | }; 85 | 86 | var ssllabsUrl = function(domain) { 87 | return "https://www.ssllabs.com/ssltest/analyze.html?d=" + encodeURIComponent(domain); 88 | }; 89 | 90 | var showLoading = function() { 91 | console.log("Checking..."); 92 | 93 | $("#domain").attr("disabled", true); 94 | $("input[type=submit]") 95 | .attr("disabled", true) 96 | .val("Checking..."); 97 | $("#loading").css("display", "inline-block"); 98 | }; 99 | 100 | var hideLoading = function() { 101 | 102 | $("#loading").hide(); 103 | $("#domain").attr("disabled", false); 104 | $("input[type=submit]") 105 | .attr("disabled", false) 106 | .val("Go"); 107 | 108 | clearTimeout(loading); 109 | }; 110 | 111 | var startOver = function() { 112 | console.log("Starting over."); 113 | 114 | hideLoading(); 115 | $("#results .result").hide(); 116 | $("#results .result.form").show(); 117 | $("#domain").select().focus(); 118 | 119 | return false; 120 | } 121 | $(".start-over").on("click", startOver); 122 | 123 | -------------------------------------------------------------------------------- /snapshot/index_files/main.js: -------------------------------------------------------------------------------- 1 | var hasPushstate = Boolean(window.history && history.pushState); 2 | 3 | $("form").on("submit", function(event) { 4 | var domain = $("#domain").val(); 5 | if (domain) { 6 | var escaped = domain.replace(/^https?:\/\//i, "").replace(/[^\w\.\-:]/g, ""); 7 | checkDomain(escaped); 8 | if (hasPushstate) { 9 | history.pushState(escaped, null, "/check/" + escaped); 10 | } 11 | } 12 | event.preventDefault(); 13 | }); 14 | 15 | $(window).on("popstate", function(event) { 16 | var domain = event.originalEvent.state; 17 | if (domain) { 18 | checkDomain(domain); 19 | } else { 20 | // don't let mere anchor clicks trigger the event 21 | // console.log(event); 22 | if (window.location.pathname == "/") 23 | startOver(); 24 | } 25 | }); 26 | 27 | var display = { 28 | "sha256": "SHA-2", 29 | "sha512": "SHA-2", 30 | "sha384": "SHA-2", 31 | "sha224": "SHA-2", 32 | "sha1": "SHA-1", 33 | "md5": "MD5", 34 | "md2": "MD2" 35 | }; 36 | 37 | var checkDomain = function(domain) { 38 | console.log("Checking domain: " + domain); 39 | 40 | $.ajax( 41 | {url: "/api/check/" + domain} 42 | ) 43 | .done(function(data) { 44 | hideLoading(); 45 | console.log("Done checking."); 46 | 47 | // transition from loading to main answer body 48 | $("#results .result").hide(); 49 | $("#results .result.answer").show(); 50 | $("#results .result .word").hide(); 51 | $("#results .result p.details").hide(); 52 | 53 | // always fill in algorithm and domain 54 | $("#results .result .algorithm").html(display[data.cert.algorithm]); 55 | $("#results .result .domain").html(domain); 56 | $("a.ssllabs").attr("href", ssllabsUrl(domain)); 57 | 58 | var test = domain.toLowerCase(); 59 | if (test == "shaaaaaaaaaaaaa.com") 60 | $(".extra").html(" and is undoubtedly the most magnificent website in the world").show(); 61 | else 62 | $(".extra").hide(); 63 | 64 | // diagnosis: "good", "bad", "almost" 65 | $("#results .result ." + data.diagnosis).css("display", "block"); 66 | 67 | // TODO: show details 68 | }) 69 | .fail(function(xhr) { 70 | hideLoading(); 71 | console.log("Error while checking domain:"); 72 | console.log(xhr.responseJSON.message); 73 | 74 | // load domain 75 | $("#results .result .domain").html(domain); 76 | 77 | // show results 78 | $("#results .result").hide(); 79 | $("#results .result.error").show(); 80 | $("#results .result.error .word").show(); 81 | }); 82 | 83 | showLoading(); 84 | }; 85 | 86 | var ssllabsUrl = function(domain) { 87 | return "https://www.ssllabs.com/ssltest/analyze.html?d=" + encodeURIComponent(domain); 88 | }; 89 | 90 | var showLoading = function() { 91 | console.log("Checking..."); 92 | 93 | $("#domain").attr("disabled", true); 94 | $("input[type=submit]") 95 | .attr("disabled", true) 96 | .val("Checking..."); 97 | $("#loading").css("display", "inline-block"); 98 | }; 99 | 100 | var hideLoading = function() { 101 | 102 | $("#loading").hide(); 103 | $("#domain").attr("disabled", false); 104 | $("input[type=submit]") 105 | .attr("disabled", false) 106 | .val("Go"); 107 | 108 | clearTimeout(loading); 109 | }; 110 | 111 | var startOver = function() { 112 | console.log("Starting over."); 113 | 114 | hideLoading(); 115 | $("#results .result").hide(); 116 | $("#results .result.form").show(); 117 | $("#domain").select().focus(); 118 | 119 | return false; 120 | } 121 | $(".start-over").on("click", startOver); 122 | 123 | -------------------------------------------------------------------------------- /test/shaaaaa.js: -------------------------------------------------------------------------------- 1 | /* 2 | Meant to be run with faucet: 3 | 4 | npm install -g faucet 5 | faucet 6 | */ 7 | 8 | /* 9 | These tests are not meant to be run often (e.g. via Travis), 10 | as they hit the live internet, and hit domains whose security 11 | properties could change. 12 | 13 | They are here to be used during development and debugging, 14 | during which other production testing sites should be used 15 | if something seems to have changed, like SSL Labs. 16 | */ 17 | 18 | var test = require("tape"); 19 | var shaaaaa = require("../shaaaaa"); 20 | 21 | var sites = [ 22 | { 23 | name: "SHA-1 leaf (requires SNI), sha1-2017.badssl.com", 24 | domain: "sha1-2017.badssl.com", 25 | 26 | diagnosis: "bad", 27 | cert: {good: false, algorithm: "sha1"}, 28 | intermediates: [ 29 | {good: false, algorithm: "sha1"}, 30 | {good: true, algorithm: "sha1", root: true} 31 | ] 32 | }, 33 | { 34 | name: "SHA-2, konklone.com", 35 | domain: "konklone.com", 36 | 37 | diagnosis: "good", 38 | cert: {good: true, algorithm: "sha256"}, 39 | intermediates: [ 40 | {good: true, algorithm: "sha256"}, 41 | {good: true, algorithm: "sha1", root: true} 42 | ] 43 | }, 44 | { 45 | name: "Domain with number and SNI, teacup.p3k.io", 46 | domain: "teacup.p3k.io", 47 | 48 | diagnosis: "good", 49 | cert: {good: true, algorithm: "sha256"}, 50 | intermediates: [ 51 | {good: true, algorithm: "sha256"}, 52 | {good: true, algorithm: "sha1", root: true} 53 | ] 54 | }, 55 | { 56 | name: "Domain with port, konklone.com:443", 57 | domain: "konklone.com:443", 58 | 59 | diagnosis: "good", 60 | cert: {good: true, algorithm: "sha256"}, 61 | intermediates: [ 62 | {good: true, algorithm: "sha256"}, 63 | {good: true, algorithm: "sha1", root: true} 64 | ] 65 | }, 66 | { 67 | name: "Internationalized Domain, domaintest.みんな", 68 | domain: "domaintest.xn--q9jyb4c", 69 | 70 | diagnosis: "good", 71 | cert: {good: true, algorithm: "sha256"}, 72 | intermediates: [ 73 | {good: true, algorithm: "sha256"}, 74 | {good: false, algorithm: "sha1"} 75 | ] 76 | }, 77 | { 78 | name: "Internationalized Domain, اختبارنطاق.شبكة", 79 | domain: "xn--mgbaacjxy2c4fqb.xn--ngbc5azd", 80 | diagnosis: "good", 81 | 82 | cert: {good: true, algorithm: "sha256"}, 83 | intermediates: [ 84 | {good: true, algorithm: "sha256"}, 85 | {good: false, algorithm: "sha1"} 86 | ] 87 | }, 88 | { 89 | name: "SHA-1 root, acus.gov", 90 | domain: "acus.gov", 91 | diagnosis: "good", 92 | 93 | cert: {good: true, algorithm: "sha256"}, 94 | intermediates: [ 95 | {good: true, algorithm: "sha256"}, 96 | {good: true, algorithm: "sha256"}, 97 | {good: true, algorithm: "sha1", root: true} 98 | ] 99 | } 100 | ]; 101 | 102 | sites.forEach(function(site) { 103 | test(site.name, function(t) { 104 | shaaaaa.from(site.domain, function(err, answer) { 105 | if (err) t.fail("Error checking domain: " + err); 106 | 107 | t.equal(answer.domain, site.domain, "Domain mismatch."); 108 | 109 | t.equal(answer.cert.algorithm, site.cert.algorithm, "Wrong client algorithm."); 110 | t.equal(answer.cert.good, site.cert.good, "Wrong client diagnosis."); 111 | 112 | if (site.cert.root) t.ok(answer.cert.root); 113 | 114 | if (site.intermediates) { 115 | for (var i=0; i 2 | 3 | 4 | 5 | SHAAAAAAAAAAAAA | Check your site for weak SHA-1 certificates. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
43 | 44 |

SHAAAAAAAAAAAAA

45 | 46 |
47 |

48 | Check your site for weak SHA-1 certificates. Open source, by @konklone. 49 |

50 |
51 | 103 | 104 |
105 |

106 | From late 2014 through the full retirement of SHA-1 at the end of 2016, this site provided a web-based tool to check if a web service's certificate was using the dangerously outdated SHA-1 signature algorithm. 107 |

108 | 109 |

110 | Since SHA-1 is largely gone from the ecosystem, this tool has been disabled, but its code remains open source. 111 |

112 |

113 | This also includes a command line tool, which could easily be modified to support detection of other signature types. 114 |

115 |
116 | 117 |

118 | Background: As of January 1, 2016, no publicly trusted CA is allowed to issue a SHA-1 certificate. In addition, SHA-1 support was removed by most modern browsers and operating systems in early 2017. Any new certificate you get should automatically use a SHA-2 algorithm for its signature. 119 |

120 | 121 |

122 | Legacy clients will continue to accept SHA-1 certificates, and it is possible to have requested a certificate on December 31, 2015 that is valid for 39 months. So, it is possible to see SHA-1 certificates in the wild that expire in early 2019. 123 |

124 | 125 |

126 | The author "looks forward" to reviving this tool when SHA-2 is demonstrated to be weak, and the ecosystem begins moving towards SHA-3 or another suitable replacement. 127 |

128 | 129 |

130 | 131 | Credits 132 |

133 | 134 |

135 | Thanks to Mathias Bynens, Justin Mayer, and Jonny Barnes for inspiration and assistance. 136 |

137 | 138 |
139 | 140 | 141 | 153 | 154 | 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /shaaaaa.js: -------------------------------------------------------------------------------- 1 | /** 2 | * shaaaaa.js 3 | * 4 | * Checks a domain for its certificate algorithm. 5 | * 6 | */ 7 | 8 | var fs = require('fs'); // loads root certs 9 | 10 | // yorkie's fork, includes signatureAlgorithm 11 | var x509 = require("x509"); 12 | 13 | // network cxn handled directly by tls 14 | var tls = require('tls'); 15 | 16 | var Shaaa = { 17 | 18 | // root cert bundle, loaded when this file is required 19 | roots: null, 20 | 21 | // load root bundle, parse each cert 22 | loadRoots: function() { 23 | Shaaa.roots = []; 24 | 25 | // store a fingerprint of each one 26 | var certs = fs.readFileSync(__dirname + "/ca-bundle.crt", "utf-8").split("\n\n"); 27 | for (var i=0; i -1); 34 | }, 35 | 36 | // fingerprints of SHA-1 intermediate certs with known SHA-2 replacements 37 | fingerprints: null, 38 | loadFingerprints: function() { 39 | Shaaa.fingerprints = JSON.parse(fs.readFileSync(__dirname + '/fingerprints.json', 'utf-8')).certificates; 40 | }, 41 | 42 | algorithms: [ 43 | // new gold standards 44 | "sha256", "sha224", "sha384", "sha512", 45 | 46 | "sha1", // common, but deprecated 47 | "md5", // old, broken 48 | "md2" // so old, so broken 49 | ], 50 | 51 | // given e.g. 'sha256WithRSAEncryption', return 52 | // {algorithm: 'sha256', raw: 'sha256WithRSAEncryption', good: true} 53 | algorithm: function(raw) { 54 | var raw_compare = raw.toLowerCase(); 55 | 56 | var answer; 57 | for (var i=0; i 17 | 18 | 19 | 20 | 21 | 22 | 23 | SHAAAAAAAAAAAAA | Check your site for weak SHA-1 certificates. 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 |
61 | 62 |

SHAAAAAAAAAAAAA

63 | 64 |
65 |

66 | Check your site for weak SHA-1 certificates. Open source, by @konklone. 67 |

68 |
69 | 70 |
71 |
72 |
73 | 74 | 75 | 76 | 77 | If it hangs, start over. 78 | 79 | 80 |
81 |
82 | 83 |
84 | 85 | Nice. 86 | Almost. 87 | Dang. 88 | 89 |

90 | has a certificate chain signed with . 91 |

92 | If Chrome still says the site uses SHA-1, it's probably a chain caching bug on your computer. 93 |

94 | 95 |

96 | has a certificate, but needs to update its intermediates. 97 |

98 | 99 |

100 | is using . 101 |

102 | 103 | 117 | 118 |

119 | See the details at SSL Labs, or start over. 120 |

121 |
122 | 123 |
124 | Argh. 125 | 126 |

127 | There was an error checking . Check the developer console for details. 128 |

129 | 130 |

131 | Start over. 132 |

133 |
134 |
135 | 136 |
137 |

138 | Check above to see if a site is still using certificates that were issued using the dangerously outdated SHA-1 signature algorithm. 139 |

140 |
141 | 142 |

143 | As of January 1, 2016, no publicly trusted CA is allowed to issue a SHA-1 certificate. So any new certificate you get should automatically use a SHA-2 algorithm for its signature. 144 |

145 | 146 |

147 | However, existing SHA-1 certificates are still trusted by modern browsers and operating systems. Generally, they will be removing support for SHA-1 entirely by early 2017. 148 |

149 | 150 |

151 | Legacy clients will continue to accept SHA-1 certificates, and it is possible to have requested a certificate on December 31, 2015 valid for 39 months. So, it is possible to see SHA-1 certificates in the wild that expire in 2019. 152 |

153 | 154 | 155 |

156 | 157 | Credits 158 |

159 | 160 |

161 | This website is an open source project, and includes a command line tool — please lend a hand! 162 |

163 | 164 |

165 | Thanks to Mathias Bynens, Justin Mayer, and Jonny Barnes for inspiration and assistance. 166 |

167 | 168 |
169 | 170 | 171 | 185 | 186 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /public/css/pure-min-0.5.0.css: -------------------------------------------------------------------------------- 1 | /*! 2 | Pure v0.5.0 3 | Copyright 2014 Yahoo! Inc. All rights reserved. 4 | Licensed under the BSD License. 5 | https://github.com/yui/pure/blob/master/LICENSE.md 6 | */ 7 | /*! 8 | normalize.css v1.1.3 | MIT License | git.io/normalize 9 | Copyright (c) Nicolas Gallagher and Jonathan Neal 10 | */ 11 | /*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-button{display:inline-block;*display:inline;zoom:1;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-family:inherit;font-size:100%;*font-size:90%;*overflow:visible;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);*color:#444;border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input:not([type]):focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin dotted #333;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border-color:#ee5f5b}.pure-form input:focus:invalid:focus,.pure-form textarea:focus:invalid:focus,.pure-form select:focus:invalid:focus{border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 10em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input{display:block;padding:10px;margin:0;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus{z-index:2}.pure-form .pure-group input:first-child{top:1px;border-radius:4px 4px 0 0}.pure-form .pure-group input:last-child{top:-2px;border-radius:0 0 4px 4px}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu ul{position:absolute;visibility:hidden}.pure-menu.pure-menu-open{visibility:visible;z-index:2;width:100%}.pure-menu ul{left:-10000px;list-style:none;margin:0;padding:0;top:-10000px;z-index:1}.pure-menu>ul{position:relative}.pure-menu-open>ul{left:0;top:0;visibility:visible}.pure-menu-open>ul:focus{outline:0}.pure-menu li{position:relative}.pure-menu a,.pure-menu .pure-menu-heading{display:block;color:inherit;line-height:1.5em;padding:5px 20px;text-decoration:none;white-space:nowrap}.pure-menu.pure-menu-horizontal>.pure-menu-heading{display:inline-block;*display:inline;zoom:1;margin:0;vertical-align:middle}.pure-menu.pure-menu-horizontal>ul{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu li a{padding:5px 20px}.pure-menu-can-have-children>.pure-menu-label:after{content:'\25B8';float:right;font-family:'Lucida Grande','Lucida Sans Unicode','DejaVu Sans',sans-serif;margin-right:-20px;margin-top:-1px}.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-separator{background-color:#dfdfdf;display:block;height:1px;font-size:0;margin:7px 2px;overflow:hidden}.pure-menu-hidden{display:none}.pure-menu-fixed{position:fixed;top:0;left:0;width:100%}.pure-menu-horizontal li{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal li li{display:block}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label:after{content:"\25BE"}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-horizontal li.pure-menu-separator{height:50%;width:1px;margin:0 7px}.pure-menu-horizontal li li.pure-menu-separator{height:1px;width:auto;margin:7px 2px}.pure-menu.pure-menu-open,.pure-menu.pure-menu-horizontal li .pure-menu-children{background:#fff;border:1px solid #b7b7b7}.pure-menu.pure-menu-horizontal,.pure-menu.pure-menu-horizontal .pure-menu-heading{border:0}.pure-menu a{border:1px solid transparent;border-left:0;border-right:0}.pure-menu a,.pure-menu .pure-menu-can-have-children>li:after{color:#777}.pure-menu .pure-menu-can-have-children>li:hover:after{color:#fff}.pure-menu .pure-menu-open{background:#dedede}.pure-menu li a:hover,.pure-menu li a:focus{background:#eee}.pure-menu li.pure-menu-disabled a:hover,.pure-menu li.pure-menu-disabled a:focus{background:#fff;color:#bfbfbf}.pure-menu .pure-menu-disabled>a{background-image:none;border-color:transparent;cursor:default}.pure-menu .pure-menu-disabled>a,.pure-menu .pure-menu-can-have-children.pure-menu-disabled>a:after{color:#bfbfbf}.pure-menu .pure-menu-heading{color:#565d64;text-transform:uppercase;font-size:90%;margin-top:.5em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#dfdfdf}.pure-menu .pure-menu-selected a{color:#000}.pure-menu.pure-menu-open.pure-menu-fixed{border:0;border-bottom:1px solid #b7b7b7}.pure-paginator{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;list-style:none;margin:0;padding:0}.opera-only :-o-prefocus,.pure-paginator{word-spacing:-.43em}.pure-paginator li{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-paginator .pure-button{border-radius:0;padding:.8em 1.4em;vertical-align:top;height:1.1em}.pure-paginator .pure-button:focus,.pure-paginator .pure-button:active{outline-style:none}.pure-paginator .prev,.pure-paginator .next{color:#C0C1C3;text-shadow:0 -1px 0 rgba(0,0,0,.45)}.pure-paginator .prev{border-radius:2px 0 0 2px}.pure-paginator .next{border-radius:0 2px 2px 0}@media (max-width:480px){.pure-menu-horizontal{width:100%}.pure-menu-children li{display:block;border-bottom:1px solid #000}}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child td,.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0} -------------------------------------------------------------------------------- /snapshot/index_files/pure-min-0.5.0.css: -------------------------------------------------------------------------------- 1 | /*! 2 | Pure v0.5.0 3 | Copyright 2014 Yahoo! Inc. All rights reserved. 4 | Licensed under the BSD License. 5 | https://github.com/yui/pure/blob/master/LICENSE.md 6 | */ 7 | /*! 8 | normalize.css v1.1.3 | MIT License | git.io/normalize 9 | Copyright (c) Nicolas Gallagher and Jonathan Neal 10 | */ 11 | /*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-button{display:inline-block;*display:inline;zoom:1;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-family:inherit;font-size:100%;*font-size:90%;*overflow:visible;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);*color:#444;border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input:not([type]):focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin dotted #333;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border-color:#ee5f5b}.pure-form input:focus:invalid:focus,.pure-form textarea:focus:invalid:focus,.pure-form select:focus:invalid:focus{border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 10em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input{display:block;padding:10px;margin:0;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus{z-index:2}.pure-form .pure-group input:first-child{top:1px;border-radius:4px 4px 0 0}.pure-form .pure-group input:last-child{top:-2px;border-radius:0 0 4px 4px}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu ul{position:absolute;visibility:hidden}.pure-menu.pure-menu-open{visibility:visible;z-index:2;width:100%}.pure-menu ul{left:-10000px;list-style:none;margin:0;padding:0;top:-10000px;z-index:1}.pure-menu>ul{position:relative}.pure-menu-open>ul{left:0;top:0;visibility:visible}.pure-menu-open>ul:focus{outline:0}.pure-menu li{position:relative}.pure-menu a,.pure-menu .pure-menu-heading{display:block;color:inherit;line-height:1.5em;padding:5px 20px;text-decoration:none;white-space:nowrap}.pure-menu.pure-menu-horizontal>.pure-menu-heading{display:inline-block;*display:inline;zoom:1;margin:0;vertical-align:middle}.pure-menu.pure-menu-horizontal>ul{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu li a{padding:5px 20px}.pure-menu-can-have-children>.pure-menu-label:after{content:'\25B8';float:right;font-family:'Lucida Grande','Lucida Sans Unicode','DejaVu Sans',sans-serif;margin-right:-20px;margin-top:-1px}.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-separator{background-color:#dfdfdf;display:block;height:1px;font-size:0;margin:7px 2px;overflow:hidden}.pure-menu-hidden{display:none}.pure-menu-fixed{position:fixed;top:0;left:0;width:100%}.pure-menu-horizontal li{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal li li{display:block}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label:after{content:"\25BE"}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-horizontal li.pure-menu-separator{height:50%;width:1px;margin:0 7px}.pure-menu-horizontal li li.pure-menu-separator{height:1px;width:auto;margin:7px 2px}.pure-menu.pure-menu-open,.pure-menu.pure-menu-horizontal li .pure-menu-children{background:#fff;border:1px solid #b7b7b7}.pure-menu.pure-menu-horizontal,.pure-menu.pure-menu-horizontal .pure-menu-heading{border:0}.pure-menu a{border:1px solid transparent;border-left:0;border-right:0}.pure-menu a,.pure-menu .pure-menu-can-have-children>li:after{color:#777}.pure-menu .pure-menu-can-have-children>li:hover:after{color:#fff}.pure-menu .pure-menu-open{background:#dedede}.pure-menu li a:hover,.pure-menu li a:focus{background:#eee}.pure-menu li.pure-menu-disabled a:hover,.pure-menu li.pure-menu-disabled a:focus{background:#fff;color:#bfbfbf}.pure-menu .pure-menu-disabled>a{background-image:none;border-color:transparent;cursor:default}.pure-menu .pure-menu-disabled>a,.pure-menu .pure-menu-can-have-children.pure-menu-disabled>a:after{color:#bfbfbf}.pure-menu .pure-menu-heading{color:#565d64;text-transform:uppercase;font-size:90%;margin-top:.5em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#dfdfdf}.pure-menu .pure-menu-selected a{color:#000}.pure-menu.pure-menu-open.pure-menu-fixed{border:0;border-bottom:1px solid #b7b7b7}.pure-paginator{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;list-style:none;margin:0;padding:0}.opera-only :-o-prefocus,.pure-paginator{word-spacing:-.43em}.pure-paginator li{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-paginator .pure-button{border-radius:0;padding:.8em 1.4em;vertical-align:top;height:1.1em}.pure-paginator .pure-button:focus,.pure-paginator .pure-button:active{outline-style:none}.pure-paginator .prev,.pure-paginator .next{color:#C0C1C3;text-shadow:0 -1px 0 rgba(0,0,0,.45)}.pure-paginator .prev{border-radius:2px 0 0 2px}.pure-paginator .next{border-radius:0 2px 2px 0}@media (max-width:480px){.pure-menu-horizontal{width:100%}.pure-menu-children li{display:block;border-bottom:1px solid #000}}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child td,.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0} -------------------------------------------------------------------------------- /snapshot/index_files/analytics.js: -------------------------------------------------------------------------------- 1 | (function(){var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b\x3c/script>')):(c=M.createElement("script"), 3 | c.type="text/javascript",c.async=!0,c.src=a,d&&(c.onload=d),b&&(c.id=b),a=M.getElementsByTagName("script")[0],a.parentNode.insertBefore(c,a)))},Ud=function(){return"https:"==M.location.protocol},be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c= 4 | a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0:c}},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,d){var e=O.XMLHttpRequest;if(!e)return!1; 10 | var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var a=g.responseText;if(1>a.length)ge("xhr","ver","0"),c();else if("1"!=a.charAt(0))ge("xhr","ver",String(a.length)),c();else if(3=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";} 13 | function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];Qa.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});b.push("z="+Bd());a.set(Ra,b.join("&"),!0)} 14 | function Sa(a){var b=P(a,gd)||oe()+"/collect",c=a.get(qe),d=P(a,fa);!d&&a.get(Vd)&&(d="beacon");if(c)pe(b,P(a,Ra),c,a.get(Ia));else if(d){c=d;d=P(a,Ra);var e=a.get(Ia);e=e||ua;"image"==c?wc(b,d,e):"xhr"==c&&wd(b,d,e)||"beacon"==c&&x(b,d,e)||ba(b,d,e)}else ba(b,P(a,Ra),a.get(Ia));b=a.get(Na);b=h(b);c=b.hitcount;b.hitcount=c?c+1:1;b=a.get(Na);delete h(b).pending_experiments;a.set(Ia,ua,!0)} 15 | function Hc(a){(O.gaData=O.gaData||{}).expId&&a.set(Nc,(O.gaData=O.gaData||{}).expId);(O.gaData=O.gaData||{}).expVar&&a.set(Oc,(O.gaData=O.gaData||{}).expVar);var b=a.get(Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&a.set(m,d,!0)}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";} 16 | function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee},Qa=new ee,Za=[];Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:1*a};Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)}; 17 | var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)},bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=Qa.get(a);if(!b)for(var c=0;c=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&& 28 | !a.I){a.I=!0;var c=aa(b),d=0a.length)J(12);else{for(var d=[],e=0;e=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&& 46 | "function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;carguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={},Ed(this.ra,this.b)&&da(this.b.get(Na)))}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.C=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.C,this.i="require"==this.C,this.g="provide"==this.C,this.ba="remove"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.C)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort"; 49 | if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47}; 50 | var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);if(p.test(b)){J(52);a=N.j(a);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get(">m")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId= 51 | String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));a=d.B;c=(new Date).getTime();O[a]=O[a]||[];c={"gtm.start":c};e||(c.event="gtm.js");O[a].push(c);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);c&&(c&&0<=c.indexOf("/")||(c=(Ba||Ud()?"https:":"http:")+"//www.google-analytics.com/plugins/ua/"+c),d=ae(c),a=d.protocol,c=M.location.protocol,("https:"==a||a==c||("http:"!= 52 | a?0:"http:"==c))&&B(d)&&(wa(d.url,void 0,e),$d.set(b,!0)))}},v=function(a,b){var c=A.get(a)||[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;ca.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0, 54 | e[2].lastIndexOf("/"))+"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0c;c++){var d=b[c].src;if(d&&0==d.indexOf("https://www.google-analytics.com/analytics")){b= 59 | !0;break a}}b=!1}b&&(Ba=!0)}Ud()||Ba||!Ed(new Od)||(Ba=!0);(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b>21:b}return b};})(window); 60 | -------------------------------------------------------------------------------- /public/fonts/average-978fe73639fdbea7f62f3e268fb1f00032127166.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 14 | 15 | 17 | 20 | 22 | 25 | 26 | 27 | 28 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 38 | 40 | 42 | 44 | 45 | 47 | 48 | 50 | 52 | 53 | 54 | 55 | 56 | 57 | 59 | 62 | 64 | 66 | 68 | 70 | 73 | 75 | 77 | 80 | 82 | 84 | 86 | 88 | 90 | 92 | 94 | 96 | 98 | 100 | 102 | 104 | 106 | 108 | 110 | 113 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 124 | 126 | 127 | 129 | 131 | 133 | 136 | 138 | 140 | 142 | 144 | 145 | 148 | 150 | 151 | 153 | 155 | 157 | 159 | 161 | 163 | 165 | 167 | 169 | 171 | 172 | 174 | 175 | 177 | 178 | 179 | 181 | 183 | 185 | 187 | 188 | 191 | 192 | 194 | 196 | 197 | 198 | 201 | 202 | 203 | 204 | 206 | 208 | 209 | 211 | 213 | 214 | 215 | 216 | 218 | 219 | 222 | 225 | 228 | 230 | 232 | 234 | 236 | 238 | 240 | 242 | 245 | 247 | 250 | 253 | 256 | 259 | 261 | 263 | 265 | 267 | 269 | 272 | 274 | 276 | 278 | 280 | 282 | 283 | 285 | 288 | 291 | 294 | 297 | 299 | 301 | 304 | 306 | 308 | 310 | 313 | 316 | 319 | 322 | 324 | 326 | 328 | 330 | 332 | 334 | 336 | 338 | 340 | 342 | 345 | 347 | 349 | 351 | 353 | 355 | 356 | 358 | 360 | 362 | 364 | 367 | 369 | 371 | 374 | 375 | 376 | 377 | 378 | 379 | 381 | 383 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | --------------------------------------------------------------------------------