From a538ee369faf9297cad1929f6fe87da492c61bd9 Mon Sep 17 00:00:00 2001 From: Joakim Olsson Date: Tue, 17 Dec 2019 20:32:14 +0100 Subject: [PATCH] feat: initial commit --- .dockerignore | 5 + .editorconfig | 20 ++ .gitignore | 2 + .gitlab-ci.yml | 15 + Dockerfile | 12 + LICENSE | 21 ++ README.md | 49 +++ app.js | 165 +++++++++++ cert.js | 132 +++++++++ icon.png | Bin 0 -> 9121 bytes k8s/deploy.yaml | 42 +++ package.json | 25 ++ public/favicon.ico | Bin 0 -> 1150 bytes yarn.lock | 721 +++++++++++++++++++++++++++++++++++++++++++++ 14 files changed, 1209 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app.js create mode 100644 cert.js create mode 100644 icon.png create mode 100644 k8s/deploy.yaml create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 yarn.lock diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..61f1e52 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +node_modules +.editorconfig +*.iml +LICENSE +README.md diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3c69938 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# @w3tec +# http://editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +# Use 2 spaces since npm does not respect custom indentation settings +[package.json] +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78f2710 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +.idea/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..f1e0691 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,15 @@ +stages: + - build + +variables: + DOCKER_HOST: tcp://docker:2375/ + +image: buildtool/build-tools:0.0.6 + +build: + stage: build + services: + - docker:dind + script: + - build + - push diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fe7c860 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM node:12 +ENV AUDIENCE "https://angus.unbound.se" +ENV ORIGIN_HOST "auth0-mock" +ENV ORIGIN "https://auth0-mock:3333" +EXPOSE 3333 +WORKDIR /app +ADD package.json yarn.lock /app/ +RUN yarn install --frozen-lockfile +ADD app.js cert.js /app/ +ADD public /app/public +RUN mkdir -p /root/.config +ENTRYPOINT yarn start diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ca84069 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Gery Hirschfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8936a40 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# auth0-mock-server + +> This server helps you to simulate auth0 server locally. So, you are able to use the `/tokeninfo` endpoint to verify your token. + +## Getting Started +### Prerequisites +* Install [Node.js](http://nodejs.org) + * on OSX use [homebrew](http://brew.sh) `brew install node` + * on Windows use [chocolatey](https://chocolatey.org/) `choco install nodejs` + + +## Installing +* `fork` this repo +* `clone` your fork +* `npm install` to install all dependencies + +## Running the app +After you have installed all dependencies you can now run the app. +Run `npm start` to start a local server. +The port will be displayed to you as `http://0.0.0.0:3333` (or if you prefer IPv6, if you're using `express` server, then it's `http://[::1]:3333/`). + + +## API Documentation + +### `GET` /token/:username +Returns a token with the given user(username). This token can the be used by your application. + +### `POST` /tokeninfo +Returns the data of the token like the username. + +**Body** +``` +{ + "id_token": "your-token-kjasdf6ashasl..." +} +``` + + +## Related Projects +* [express-typescript-boilerplate](https://github.com/w3tecch/express-typescript-boilerplate) - Boilerplate for an restful express-apllication written in TypeScript +* [express-graphql-typescript-boilerplate](https://github.com/w3tecch/express-graphql-typescript-boilerplate) - A starter kit for building amazing GraphQL API's with TypeScript and express by @w3tecch + + +## License +[MIT](/LICENSE) + + +--- +Made with ♥ by Gery Hirschfeld ([@GeryHirschfeld1](https://twitter.com/GeryHirschfeld1)) \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..2d966a1 --- /dev/null +++ b/app.js @@ -0,0 +1,165 @@ +process.env.DEBUG = 'app*'; + +const express = require('express'); +const app = express(); +const jwt = require('jsonwebtoken'); +const Debug = require('debug'); +const path = require('path'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const favicon = require('serve-favicon'); +const cert = require('./cert'); + +let issuer = 'localhost:3333'; +let jwksOrigin = `https://${issuer}/`; +const audience = process.env.AUDIENCE || 'https://generic-audience'; + +const debug = Debug('app'); + +let {privateKey, certDer, thumbprint, exponent, modulus} = cert(jwksOrigin); + +// Configure our small auth0-mock-server +app.options('*', cors()) + .use(cors()) + .use(bodyParser.json()) + .use(bodyParser.urlencoded({extended: true})) + .use(express.static(`${__dirname}/public`)) + .use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); + +// This route can be used to generate a valid jwt-token. +app.post('/token', function (req, res) { + if (!req.body.email || !req.body.password) { + debug('Body is invalid!', req.body); + return res.status(400).send('Email or password is missing!'); + } + let date = Math.floor(Date.now() / 1000); + let accessToken = jwt.sign(Buffer.from(JSON.stringify({ + iss: jwksOrigin, + aud: [audience], + sub: 'auth0|' + req.body.email, + iat: date, + exp: date + 7200, + azp: req.body.clientId, + 'https://unbound.se/email': req.body.email + })), privateKey, { + algorithm: 'RS256', + keyid: thumbprint + }); + + let idToken = jwt.sign(Buffer.from(JSON.stringify({ + iss: jwksOrigin, + aud: req.body.clientId, + nonce: req.body.nonce, + sub: 'auth0|' + req.body.email, + iat: date, + exp: date + 7200, + azp: req.body.clientId + })), privateKey, { + algorithm: 'RS256', + keyid: thumbprint + }); + + debug('Signed token for ' + req.body.email); + // res.json({ token }); + res.redirect(`${req.body.redirect}?domain=${issuer}#access_token=${accessToken}&state=${req.body.state}&id_token=${idToken}&scope=openid%20profile%20email&expires_in=7200&token_type=Bearer`) +}); + +// This route can be used to generate a valid jwt-token. +app.get('/token/:email', function (req, res) { + if (!req.params.email) { + debug('No user was given!'); + return res.status(400).send('user is missing'); + } + const token = jwt.sign({ + user_id: 'auth0|' + req.params.email, + }, privateKey); + debug('Signed token for ' + req.params.email); + res.json({token}); +}); + +app.get('/authorize', function (req, res) { + let redirect = req.query.redirect_uri; + let state = req.query.state; + let nonce = req.query.nonce; + let clientId = req.query.client_id; + res.send(` + + + Auth + + +
+ + + + + + + +
+ + +`) +}); + +app.get('/userinfo', function (req, res) { + res.contentType("application/json").send(JSON.stringify({picture: 'https://cdn.playbuzz.com/cdn/5458360f-32ea-460e-a707-1a2d26760558/70bda687-cb84-4756-8a44-8cf735ed87b3.jpg'})) +}); + +app.get('/.well-known/jwks.json', function (req, res) { + res + .contentType("application/json") + .send(JSON.stringify({ + keys: [ + { + alg: 'RS256', + // e: 'AQAB', + e: exponent, + kid: thumbprint, + kty: 'RSA', + n: modulus, + use: 'sig', + x5c: [certDer], + x5t: thumbprint, + }, + ], + })); +}); + +// This route returns the inside of a jwt-token. Your main application +// should use this route to keep the auth0-flow +app.post('/tokeninfo', function (req, res) { + if (!req.body.id_token) { + debug('No token given in the body!'); + return res.status(401).send('missing id_token'); + } + const data = jwt.decode(req.body.id_token); + if (data) { + debug('Return token data from ' + data.user_id); + res.json(data); + } else { + debug('The token was invalid and could not be decoded!'); + res.status(401).send('invalid id_token'); + } +}); + +app.post('/issuer', (req, res) => { + if (!req.body.issuer) { + debug('No issuer given in the body!'); + return res.status(401).send('missing issuer'); + } + issuer = req.body.issuer; + jwksOrigin = `https://${issuer}/`; + const {privateKey: key, certDer: der, thumbPrint: thumb, exponent: exp, modulus: mod} = cert(jwksOrigin); + privateKey = key; + certDer = der; + thumbprint = thumb; + exponent = exp; + modulus = mod; + debug('Issuer set to ' + req.body.issuer); + res.send('ok') +}); + +app.listen(3333, function () { + debug('Auth0-Mock-Server listening on port 3333!'); +}); diff --git a/cert.js b/cert.js new file mode 100644 index 0000000..6c0a834 --- /dev/null +++ b/cert.js @@ -0,0 +1,132 @@ +const base64url = require('base64-url'); +const createHash = require('crypto').createHash; +const forge = require('node-forge'); +const NodeRSA = require('node-rsa'); + +const PRIVATE_KEY_PEM = + '-----BEGIN RSA PRIVATE KEY-----\n' + + 'MIIEpAIBAAKCAQEApoocpO3bbUF6o8eyJlQCfwLahEsunWdVF++yOEyKu4Lp1j0m\n' + + '2j/P7iHOtxBAkjdM2X2oW3qO1mR0sIFefqnm93g0q2nRuYEoS+W3o6X50wjOVm8f\n' + + 'r/tLqELzy5BoET0AQl7Axp1DNsb0HNOBcoIBt+xVY4I+k6uXJJJMzbgvahAgSLZ9\n' + + 'RW0Z0WT+dCHZpZUj0nLxNXIPdci65Bw6IognqXHP6AwKZXpT6jCzjzq9uyHxVcud\n' + + 'qw6j0kQw48/A5A6AN5fIVy1cKnd0sKdqRX1NUqVoiOrO4jaDB1IdLD+YmRE/JjOH\n' + + 'sWIMElYCPxKqnsNo6VCslGX/ziinArHhqRBrHwIDAQABAoIBAHAdmpsN5iLvafjI\n' + + 'f45+EBAhg6p8Uq102zx6CakNHniN8Y5hLL7RJtJRwDBNqKrGv93LUoQDRhXfGw+Y\n' + + 'iF0NVIhVTF/5pU8VPGOcCr0JB96ilwZpWRPIQW7NZAMu/GBeiMYls/IB/TXrSnv9\n' + + 'h6/nBfEkEXgkPqx7YA0m0L3NuV3U1lCY/LhBJY4Xvi0uRdqu3tTHXftehuPwC4UB\n' + + '42eJTWv/qLeOlkCdUUV4f7+dNaES88Vdhj6lu/BusnNhvnwHQik4dNwzPCGeP8NV\n' + + '5gaesWiNWFZuTURGKk1B65p5LzNPjsVT50RDuW8FnSZwIvNcohrX9ILPsmg/t0Kr\n' + + 'ozcOksECgYEA4XWOK4twx5RG162zveRHqU7H9RBWSz7/PzM9Eob9vx/tC/b1YqBR\n' + + 'VShk23vje19eNiYWAkxcpobIP4ek/0ZT8nHkJg8wl+J/hnXADcvwv2dKnoFnm5pn\n' + + 'rTBUKc8R3wrSlAV8XQAtdnxsfFa5AOQJ6WFVI9AdfH3Iw8XZk4gIIPMCgYEAvRlY\n' + + 'y80HnR3kwMOqY488V1qk41dmfNqa+YDL+zkPF1HhHI9VnK5BQuI7lyKJl984KwHu\n' + + '0gbwx3Wp4XkD5JUboEpl5LnaLsjEWemjTaQWdvJHPd5wkJ0m/jRQ2YeT4g2gFu4y\n' + + 'Pi/pWkrzhnzQQVAmOdAm5Kj27LtDzp0lspw3uCUCgYEAw2YdvFGSgfZZW4147QeO\n' + + 'sAbON+9bysUjdMPUl10VR/LEgA0d6MdnFfX3S13Y7tDdlvJ1OrKxzcWcgaru7ism\n' + + 'kEXy5KVfiRNNUNx2gb6RvWEpA6zFfc9ZMXlkSAPlyjfX/1+tw/Bmdn0pjK2gk0wP\n' + + '5wtrPameFInzWPD9O+a2nM8CgYBZ6UhgNs+M9B7FTQOiLQPa4R2PfwobCXIwef4D\n' + + 'KIE1bFgl1T02r2AWZi1BUkmr7ZXuVQ/xyx0HKbopm/mu4PruvxEtrPTB0/IQcleU\n' + + 'XhXUXqRjFXXePOrCaaubkqxNCn95B67aBLvmk8awxn3a4DocuQ0VIgWuT+gQwIWh\n' + + 'JEgWBQKBgQDKD+2Yh1/rUzu15lbPH0JSpozUinuFjePieR/4n+5CtEUxWJ2f0WeK\n' + + 's4XWWf2qgUccjpiGju2UR840mgWROoZ8BfSTd5tg1F7bo0HMgu2hu0RIRpZcRhsA\n' + + 'Cd0GrJvf1t0QIdDCXAy+RpgU1SLSq4Q6Lomc0WA5C5nBw9RKEUOV9A==\n' + + '-----END RSA PRIVATE KEY-----\n'; + +const PUBLIC_KEY_PEM = + '-----BEGIN PUBLIC KEY-----\n' + + 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApoocpO3bbUF6o8eyJlQC\n' + + 'fwLahEsunWdVF++yOEyKu4Lp1j0m2j/P7iHOtxBAkjdM2X2oW3qO1mR0sIFefqnm\n' + + '93g0q2nRuYEoS+W3o6X50wjOVm8fr/tLqELzy5BoET0AQl7Axp1DNsb0HNOBcoIB\n' + + 't+xVY4I+k6uXJJJMzbgvahAgSLZ9RW0Z0WT+dCHZpZUj0nLxNXIPdci65Bw6Iogn\n' + + 'qXHP6AwKZXpT6jCzjzq9uyHxVcudqw6j0kQw48/A5A6AN5fIVy1cKnd0sKdqRX1N\n' + + 'UqVoiOrO4jaDB1IdLD+YmRE/JjOHsWIMElYCPxKqnsNo6VCslGX/ziinArHhqRBr\n' + + 'HwIDAQAB\n' + + '-----END PUBLIC KEY-----\n'; + +const createCertificate = ({ + publicKey, + privateKey, + jwksOrigin, + }) => { + const cert = forge.pki.createCertificate(); + cert.publicKey = publicKey; + cert.serialNumber = '123'; + const attrs = [ + { + name: 'commonName', + value: `${jwksOrigin}`, + }, + ]; + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1); + cert.setSubject(attrs); + cert.setIssuer(attrs); + cert.sign(privateKey); + return forge.pki.certificateToPem(cert) +}; + +const getCertThumbprint = (certificate) => { + const shasum = createHash('sha1'); + const der = Buffer.from(certificate).toString('binary'); + shasum.update(der); + return shasum.digest('base64') +}; + +const createKeyPair = () => { + const privateKey = forge.pki.privateKeyFromPem(PRIVATE_KEY_PEM); + const publicKey = forge.pki.publicKeyFromPem(PUBLIC_KEY_PEM); + return { + privateKey, + publicKey, + } +}; + +const bnToB64 = (bn) => { + let hex = BigInt(bn).toString(16); + if (hex.length % 2) { + hex = '0' + hex; + } + + const bin = []; + let i = 0; + let d; + let b; + while (i < hex.length) { + d = parseInt(hex.slice(i, i + 2), 16); + b = String.fromCharCode(d); + bin.push(b); + i += 2; + } + + return Buffer.from(bin.join(''), 'binary').toString('base64'); +}; + +const setup = (jwksOrigin) => { + const {privateKey, publicKey} = createKeyPair(); + const certPem = createCertificate({ + jwksOrigin, + privateKey, + publicKey, + }); + const certDer = forge.util.encode64( + forge.asn1 + .toDer(forge.pki.certificateToAsn1(forge.pki.certificateFromPem(certPem))) + .getBytes() + ); + const thumbprint = base64url.encode(getCertThumbprint(certDer)); + + const helperKey = new NodeRSA(); + helperKey.importKey(forge.pki.privateKeyToPem(privateKey)); + const {n: modulus, e: exponent} = helperKey.exportKey('components'); + + return { + privateKey: forge.pki.privateKeyToPem(privateKey), + certDer: certDer, + thumbPrint: thumbprint, + exponent: bnToB64(exponent), + modulus: modulus.toString('base64') + } +}; + +module.exports = setup; diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d06d021c4441dfdb3ab9cf3f9d44e26e20c8d637 GIT binary patch literal 9121 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 LPpwkL?)m=#*A^0a literal 0 HcmV?d00001 diff --git a/k8s/deploy.yaml b/k8s/deploy.yaml new file mode 100644 index 0000000..cf03015 --- /dev/null +++ b/k8s/deploy.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: auth0mock +spec: + replicas: 1 + selector: + matchLabels: + app: auth0mock + template: + metadata: + labels: + app: auth0mock + spec: + containers: + - name: auth0mock + image: registry.gitlab.com/unboundsoftware/shiny/auth0mock:latest + imagePullPolicy: "IfNotPresent" + resources: + requests: + memory: 200Mi + limits: + memory: 300Mi + ports: + - containerPort: 3333 + readinessProbe: + httpGet: + port: 3333 + path: .well-known/jwks.json +--- +apiVersion: v1 +kind: Service +metadata: + name: auth0mock + labels: + app: auth0mock +spec: + ports: + - port: 3333 + selector: + app: auth0mock + type: ClusterIP diff --git a/package.json b/package.json new file mode 100644 index 0000000..b333435 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "auth0-mock-server", + "version": "1.0.0", + "description": "Helps us to develop locally with seeded data and keep the flow of auth0.", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node ./app.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "base64-url": "^2.2.1", + "body-parser": "^1.17.1", + "buffer": "^5.2.1", + "cors": "^2.8.3", + "debug": "^2.6.6", + "express": "^4.15.2", + "https-localhost": "^4.1.1", + "jsonwebtoken": "^8.5.1", + "node-forge": "^0.8.4", + "node-rsa": "^1.0.5", + "serve-favicon": "^2.4.2" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a406e949abb2e41d66c394bb9559f27481beca83 GIT binary patch literal 1150 zcmaLVO)ErU6u|K_gGNodBe^6+6JbbFvQVs)mzsP47FH&VB+5oc_yDr7P*$>`EEFqc zVPWAdO|w9ejY$zg2;+Y)Y3>~~{qA$mdCr;VWk$rs$LABC#S%&vF-4>tq{w{b8AO=N z@qV%5?}v|O!!TTo4d{Ru8E8c_(vjR^d)GPSUm9vf0aeg7 zU!eI>gEQ6nbH~nxt7;F!fzpF;z{4oJ;WFK~nueacADP(31q#uUW%!IK8E&zI)C+O+ zQ=>hq5H*;= 1.40.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cors@^2.8.3: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +debug@2.6.9, debug@^2.6.6: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +express-minify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/express-minify/-/express-minify-1.0.0.tgz#28c90ecb8add5f8da0d5d503739646fb54be5704" + integrity sha512-04/iYxB79jGeNZBBkbAW7L7FMG4Wtu78F1SayXIKiJD6MfqYnOI3DD8no7QOntgedYCdYUpj+Skg8QWR/2WnMQ== + dependencies: + clean-css "^4.1.7" + on-headers "^1.0.1" + uglify-js "^3.0.28" + +express@^4.15.2, express@^4.17.0: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2, http-errors@~1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +https-localhost@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/https-localhost/-/https-localhost-4.1.1.tgz#b71da1caf73d5ef5f1d775093202a1cf8cb2e0da" + integrity sha512-IoMmMxbu1rKx5Tlr5M7n90LZCEzL0m8RdDDS/xFhPrubz8rgaLJSVr5HiupRxHKmXatTV8ks50JavjN6ZDukvw== + dependencies: + appdata-path "^1.0.0" + compression "^1.7.4" + express "^4.17.0" + express-minify "^1.0.0" + spdy "^4.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1, ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +node-forge@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.4.tgz#d6738662b661be19e2711ef01aa3b18212f13030" + integrity sha512-UOfdpxivIYY4g5tqp5FNRNgROVNxRACUxxJREntJLFaJr1E0UEqFtUIk0F/jYx/E+Y6sVXd0KDi/m5My0yGCVw== + +node-rsa@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-rsa/-/node-rsa-1.0.5.tgz#854dc1b275729d69bc25883f83ca80705db9262e" + integrity sha512-9o51yfV167CtQANnuAf+5owNs7aIMsAKVLhNaKuRxihsUUnfoBMN5OTVOK/2mHSOWaWq9zZBiRM3bHORbTZqrg== + dependencies: + asn1 "^0.2.4" + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@^1.0.1, on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.0.1: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-favicon@^2.4.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" + integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= + dependencies: + etag "~1.8.1" + fresh "0.5.2" + ms "2.1.1" + parseurl "~1.3.2" + safe-buffer "5.1.1" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" + integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +uglify-js@^3.0.28: + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0"