From 09f406cba7c82d6ab818de042594c8f80662fcf5 Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Thu, 13 Sep 2018 21:15:47 +0200 Subject: [PATCH] Initial Commit --- .babelrc | 5 + .gitignore | 6 + .jshintrc | 38 + .vscode/settings.json | 12 + Dockerfile | 39 + README.md | 14 + assets/images/bg.png | Bin 0 -> 63741 bytes assets/test.txt | 1 + config.js | 47 + marko/browser.json | 7 + marko/components/background/component.js | 51 + marko/components/background/index.marko | 1 + marko/components/background/style.less | 23 + .../components/item-meta/component.js | 52 + .../components/item-meta/index.marko | 2 + .../components/item-tag-list/index.marko | 6 + .../components/content-list-item/index.marko | 15 + marko/components/content-list-item/style.less | 51 + marko/components/content-list/index.marko | 5 + marko/components/content-list/style.less | 12 + marko/components/layout-navbar/index.marko | 10 + marko/components/markdown/component.js | 39 + marko/components/markdown/index.marko | 3 + marko/components/markdown/plugins/wikilink.js | 40 + marko/components/markdown/style.less | 117 + marko/components/menu-blurb/index.marko | 1 + marko/components/menu-blurb/style.less | 7 + marko/components/menu-gap/index.marko | 1 + marko/components/menu-gap/style.less | 3 + marko/components/menu-header/index.marko | 1 + marko/components/menu-header/style.less | 5 + marko/components/menu-link/component.js | 13 + marko/components/menu-link/index.marko | 8 + marko/components/menu-link/style.less | 28 + marko/components/menu/index.marko | 12 + marko/components/menu/style.less | 14 + marko/global/base.less | 39 + marko/global/colors.less | 121 + marko/global/navbar.less | 32 + marko/page/layout.marko | 16 + .../logs/components/logs-list/index.marko | 13 + .../logs/components/logs-menu/index.marko | 10 + marko/page/logs/components/page/component.js | 15 + marko/page/logs/components/page/index.marko | 5 + marko/page/logs/list.marko | 6 + .../components/chapter-meta/component.js | 52 + .../components/chapter-meta/index.marko | 6 + .../components/chapter-meta/style.less | 20 + .../components/chapter/component.js | 5 + .../components/chapter/index.marko | 10 + .../components/chapter/style.less | 14 + .../story-content/components/page/index.marko | 8 + .../story-content/components/page/style.less | 9 + .../story-content-menu/component.js | 40 + .../components/story-content-menu/index.marko | 9 + .../components/story-tags/index.marko | 3 + .../components/story-tags/style.less | 20 + marko/page/story-content/view.marko | 6 + .../story/components/story-list/index.marko | 11 + .../story/components/story-menu/index.marko | 11 + marko/page/story/list.marko | 9 + marko/page/story/tag-list.marko | 8 + middleware/locals.js | 29 + middleware/passport.js | 29 + middleware/session.js | 15 + package-lock.json | 4922 +++++++++++++++++ package.json | 41 + routes/auth.js | 46 + routes/graphql.js | 56 + routes/logs/index.js | 19 + routes/story-content/index.js | 13 + routes/story/by-category.js | 22 + routes/story/by-tag.js | 24 + routes/story/common.js | 7 + routes/story/index.js | 20 + routes/story/tag-list.js | 20 + rpdata/api/Chapter.js | 53 + rpdata/api/Character.js | 5 + rpdata/api/LogHeader.js | 84 + rpdata/api/Story.js | 147 + rpdata/api/Tag.js | 34 + rpdata/api/index.js | 6 + rpdata/client.js | 40 + server.js | 101 + 84 files changed, 6920 insertions(+) create mode 100644 .babelrc create mode 100644 .gitignore create mode 100644 .jshintrc create mode 100644 .vscode/settings.json create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 assets/images/bg.png create mode 100644 assets/test.txt create mode 100644 config.js create mode 100644 marko/browser.json create mode 100644 marko/components/background/component.js create mode 100644 marko/components/background/index.marko create mode 100644 marko/components/background/style.less create mode 100644 marko/components/content-list-item/components/item-meta/component.js create mode 100644 marko/components/content-list-item/components/item-meta/index.marko create mode 100644 marko/components/content-list-item/components/item-tag-list/index.marko create mode 100644 marko/components/content-list-item/index.marko create mode 100644 marko/components/content-list-item/style.less create mode 100644 marko/components/content-list/index.marko create mode 100644 marko/components/content-list/style.less create mode 100644 marko/components/layout-navbar/index.marko create mode 100644 marko/components/markdown/component.js create mode 100644 marko/components/markdown/index.marko create mode 100644 marko/components/markdown/plugins/wikilink.js create mode 100644 marko/components/markdown/style.less create mode 100644 marko/components/menu-blurb/index.marko create mode 100644 marko/components/menu-blurb/style.less create mode 100644 marko/components/menu-gap/index.marko create mode 100644 marko/components/menu-gap/style.less create mode 100644 marko/components/menu-header/index.marko create mode 100644 marko/components/menu-header/style.less create mode 100644 marko/components/menu-link/component.js create mode 100644 marko/components/menu-link/index.marko create mode 100644 marko/components/menu-link/style.less create mode 100644 marko/components/menu/index.marko create mode 100644 marko/components/menu/style.less create mode 100644 marko/global/base.less create mode 100644 marko/global/colors.less create mode 100644 marko/global/navbar.less create mode 100644 marko/page/layout.marko create mode 100644 marko/page/logs/components/logs-list/index.marko create mode 100644 marko/page/logs/components/logs-menu/index.marko create mode 100644 marko/page/logs/components/page/component.js create mode 100644 marko/page/logs/components/page/index.marko create mode 100644 marko/page/logs/list.marko create mode 100644 marko/page/story-content/components/chapter-meta/component.js create mode 100644 marko/page/story-content/components/chapter-meta/index.marko create mode 100644 marko/page/story-content/components/chapter-meta/style.less create mode 100644 marko/page/story-content/components/chapter/component.js create mode 100644 marko/page/story-content/components/chapter/index.marko create mode 100644 marko/page/story-content/components/chapter/style.less create mode 100644 marko/page/story-content/components/page/index.marko create mode 100644 marko/page/story-content/components/page/style.less create mode 100644 marko/page/story-content/components/story-content-menu/component.js create mode 100644 marko/page/story-content/components/story-content-menu/index.marko create mode 100644 marko/page/story-content/components/story-tags/index.marko create mode 100644 marko/page/story-content/components/story-tags/style.less create mode 100644 marko/page/story-content/view.marko create mode 100644 marko/page/story/components/story-list/index.marko create mode 100644 marko/page/story/components/story-menu/index.marko create mode 100644 marko/page/story/list.marko create mode 100644 marko/page/story/tag-list.marko create mode 100644 middleware/locals.js create mode 100644 middleware/passport.js create mode 100644 middleware/session.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 routes/auth.js create mode 100644 routes/graphql.js create mode 100644 routes/logs/index.js create mode 100644 routes/story-content/index.js create mode 100644 routes/story/by-category.js create mode 100644 routes/story/by-tag.js create mode 100644 routes/story/common.js create mode 100644 routes/story/index.js create mode 100644 routes/story/tag-list.js create mode 100644 rpdata/api/Chapter.js create mode 100644 rpdata/api/Character.js create mode 100644 rpdata/api/LogHeader.js create mode 100644 rpdata/api/Story.js create mode 100644 rpdata/api/Tag.js create mode 100644 rpdata/api/index.js create mode 100644 rpdata/client.js create mode 100644 server.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..02f08fb --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "es2015" + ] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78511bf --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.marko.js +/node_modules +npm-debug.log +/.cache +/node_modules +/.static \ No newline at end of file diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..3bc0a8b --- /dev/null +++ b/.jshintrc @@ -0,0 +1,38 @@ +{ + "predef": [ + + ], + + "globals": { + "define": true, + "require": true + }, + + "node" : true, + "es5" : false, + "browser" : true, + "boss" : false, + "curly": false, + "debug": false, + "devel": false, + "evil": true, + "forin": false, + "immed": true, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": true, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": false, + "white": false, + "eqeqeq": true, + "latedef": true, + "unused": "vars", + "strict": false, + "eqnull": true +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..07638c0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "files.exclude": { + "**/**/**/**/*.marko.js": true, + "**/**/**/*.marko.js": true, + "**/**/*.marko.js": true, + "**/*.marko.js": true, + "node_modules": true, + ".cache": true, + ".static": true, + }, + "material-icon-theme.folders.theme": "classic" +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4f227bc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +## 1. Builder +# Use nodejs 10 +FROM node:10-alpine AS builder + +# Load repository into container +WORKDIR /rpdata-frontend +COPY . . + +# Setup development environment +RUN apk add --no-cache git + +# Erease all traces of browser-refresh +RUN sed -i '/browser-refresh/d' ./marko/page/layout.marko +RUN sed -i '/browser-refresh/d' ./package.json + +# Install and compress node_modules +RUN rm -rf node_modules +RUN mkdir node_modules +RUN npm install -g modclean +RUN npm install +RUN npm dedupe +RUN modclean -r + +# Remove dev stuff +RUN rm -rf .static +RUN rm -rf .cache +RUN rm -rf .git + +## 2. Regroup +FROM node:10-alpine +RUN apk add --no-cache ca-certificates + +# Bring data over from builder +WORKDIR /rpdata-frontend +COPY --from=builder /rpdata-frontend /rpdata-frontend +ENV NODE_ENV=production + +# Entry point +CMD ["/usr/local/bin/node", "server"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..df28bea --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Sample App: Marko + Express + +This is the [official sample](https://github.com/marko-js-samples/marko-express) changed to get it working with the latest versions of lasso, as well as some personal preferences. + +A lot of compiled/cached files are hidden in Visual Studio Code, see the config file in the `.vscode` folder to change that. + +## Install + +```sh +npm install +npm run dev +``` + +Then open the URL printed in the console. \ No newline at end of file diff --git a/assets/images/bg.png b/assets/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..fc64ef2d82dccf2c391368e781acfee600b84fa4 GIT binary patch literal 63741 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 literal 0 HcmV?d00001 diff --git a/assets/test.txt b/assets/test.txt new file mode 100644 index 0000000..5ab2f8a --- /dev/null +++ b/assets/test.txt @@ -0,0 +1 @@ +Hello \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000..a9918a2 --- /dev/null +++ b/config.js @@ -0,0 +1,47 @@ +const fs = require("fs") + +const config = { + graphqlEndpoint: "http://127.0.0.1:17000/graphql", + port: 8080, + root: "http://localhost:8080", + auth0: { + secret: "INVALID_SECRET", + clientId: "", + domain: "aiterp.eu.auth0.com", + }, + session: { + secret: "", + secure: false, + }, + redis: { + host: "127.0.0.1", + port: 6379, + }, + backend: { + kid: "", + secret: "", + } +} + +if (typeof(window) !== "undefined") { + config.graphqlEndpoint = "/graphql" + + delete config.port + delete config.root + delete config.auth0 + delete config.session + delete config.redis + delete config.backend +} else { + try { + const data = fs.readFileSync("/etc/aiterp/rpdata-frontend.json", "utf8") + const parsed = JSON.parse(data) + if (typeof(parsed) == "object" && !Array.isArray(parsed)) { + Object.assign(config, parsed) + } + } catch(err) { + console.error("Failed to load configuration: " + err.message || err.stack || err) + } +} + +module.exports = config diff --git a/marko/browser.json b/marko/browser.json new file mode 100644 index 0000000..2a1a5ba --- /dev/null +++ b/marko/browser.json @@ -0,0 +1,7 @@ +{ + "dependencies": [ + "./global/base.less", + "./global/colors.less", + "./global/navbar.less" + ] +} \ No newline at end of file diff --git a/marko/components/background/component.js b/marko/components/background/component.js new file mode 100644 index 0000000..f31bb41 --- /dev/null +++ b/marko/components/background/component.js @@ -0,0 +1,51 @@ +module.exports = class { + onCreate(input) { + this.state = { + src: input.src, + orientation: "portrait", + style: { + filter: `opacity(${input.opacity || 0.20})` + } + } + } + + onInput(input) { + if (input.src != this.state.src) { + this.updateOrientation() + } + + if (input.opacity != this.state.opacity) { + this.state.style.filter = `opacity(${input.opacity || 0.20})` + } + } + + onMount() { + this.updateOrientation() + } + + updateOrientation() { + const image = this.getEl("image", 0) + + if (image.complete && typeof(image.naturalHeight) !== 'undefined' && image.naturalHeight !== 0) { + const width = image.naturalWidth + const height = image.naturalHeight + + this.setLandscape(width > (height * 1.50)) + } else { + image.onload = () => { + const width = image.naturalWidth + const height = image.naturalHeight + + this.setLandscape(width > (height * 1.50)) + } + } + } + + setLandscape(value) { + const orientation = value ? "landscape" : "portrait" + + if (orientation !== this.state.orientation) { + this.state.orientation = orientation + } + } +} \ No newline at end of file diff --git a/marko/components/background/index.marko b/marko/components/background/index.marko new file mode 100644 index 0000000..c6b0b92 --- /dev/null +++ b/marko/components/background/index.marko @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/marko/components/background/style.less b/marko/components/background/style.less new file mode 100644 index 0000000..744d856 --- /dev/null +++ b/marko/components/background/style.less @@ -0,0 +1,23 @@ +.background { + /* Set rules to fill background */ + width: 100%; + /* Set up proportionate scaling */ + min-height: 100%; + height: auto; + /* Set up positioning */ + position: fixed; + top: 0; + left: 0; + user-select: none; + -webkit-user-drag: none; + + z-index: -1; +} + +.background.landscape { + /* Set rules to fill background */ + height: 100%; + /* Set up proportionate scaling */ + min-width: 100%; + width: auto; +} \ No newline at end of file diff --git a/marko/components/content-list-item/components/item-meta/component.js b/marko/components/content-list-item/components/item-meta/component.js new file mode 100644 index 0000000..ab67897 --- /dev/null +++ b/marko/components/content-list-item/components/item-meta/component.js @@ -0,0 +1,52 @@ +const moment = require("moment") + +module.exports = class { + onCreate({kind, value, updated}) { + this.state = {text: null, color: "color-menu", tooltip: null} + + if (value == null || value == "") { + return + } + + switch (kind) { + case "date": { + const m = moment(value) + if (m.year() < 2) { + break + } + + const dateStr = m.format("MMM D, YYYY") + + this.state.text = dateStr + + if (updated != null && Date.parse(updated) > Date.parse(value)) { + const m2 = moment(updated) + this.state.tooltip = "Originally posted: " + dateStr + this.state.text = m2.format("MMM D, YYYY") + " *" + } + + break + } + + case "tag": { + this.state.color = `color-tag-${value.kind.toLowerCase()}` + this.state.text = value.name + + break + } + + case "author": { + this.state.text = value + + break + } + + default: { + this.state.color = "color-menu" + this.state.text = value + + break + } + } + } +} \ No newline at end of file diff --git a/marko/components/content-list-item/components/item-meta/index.marko b/marko/components/content-list-item/components/item-meta/index.marko new file mode 100644 index 0000000..caf4a0c --- /dev/null +++ b/marko/components/content-list-item/components/item-meta/index.marko @@ -0,0 +1,2 @@ +
${state.text}
+
 
\ No newline at end of file diff --git a/marko/components/content-list-item/components/item-tag-list/index.marko b/marko/components/content-list-item/components/item-tag-list/index.marko new file mode 100644 index 0000000..3d1776e --- /dev/null +++ b/marko/components/content-list-item/components/item-tag-list/index.marko @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/marko/components/content-list-item/index.marko b/marko/components/content-list-item/index.marko new file mode 100644 index 0000000..0cbd89a --- /dev/null +++ b/marko/components/content-list-item/index.marko @@ -0,0 +1,15 @@ + + ${input.icon} + + +
${input.description || ""}
+
+ + + + +
+ + \ No newline at end of file diff --git a/marko/components/content-list-item/style.less b/marko/components/content-list-item/style.less new file mode 100644 index 0000000..8c91227 --- /dev/null +++ b/marko/components/content-list-item/style.less @@ -0,0 +1,51 @@ +tr.content-list-item { + user-select: none; + outline: 0.05px solid; + + > td.icon { + font-size: 2.75em; + text-align: center; + width: 2.5ch; + outline: 0.05px solid; + } + + > td.content { + padding: 0.25em; + padding-bottom: 0.33em; + margin: 0; + + > .title { + padding: 0.25em 1ch; + user-select: text; + + a { + font-size: 1.333em; + } + a:hover { + color: white; + } + } + + > .description { + margin: 0 1ch; + + p { + margin: 0; + } + } + + > .meta { + > div { + display: inline-block; + padding: 0.25em 1ch; + + user-select: text; + } + + > div.spc { + padding: 0; + user-select: none; + } + } + } +} \ No newline at end of file diff --git a/marko/components/content-list/index.marko b/marko/components/content-list/index.marko new file mode 100644 index 0000000..dce2962 --- /dev/null +++ b/marko/components/content-list/index.marko @@ -0,0 +1,5 @@ + + + + +
\ No newline at end of file diff --git a/marko/components/content-list/style.less b/marko/components/content-list/style.less new file mode 100644 index 0000000..60f4b5f --- /dev/null +++ b/marko/components/content-list/style.less @@ -0,0 +1,12 @@ +table.content-list { + padding-bottom: 3em; + + width: 99%; + max-width: 100ch; + padding-right: 1em; + + margin: auto; + + border-collapse: separate; + border-spacing: 0 1em; +} \ No newline at end of file diff --git a/marko/components/layout-navbar/index.marko b/marko/components/layout-navbar/index.marko new file mode 100644 index 0000000..a7efd3c --- /dev/null +++ b/marko/components/layout-navbar/index.marko @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/marko/components/markdown/component.js b/marko/components/markdown/component.js new file mode 100644 index 0000000..b14402f --- /dev/null +++ b/marko/components/markdown/component.js @@ -0,0 +1,39 @@ +const MarkdownIt = require("markdown-it") +const md = new MarkdownIt({ + html: true, + linkify: true, + typographer: false, + langPrefix: "language-", +}) +md.use(require("markdown-it-container"), "green") +md.use(require("markdown-it-container"), "orange") +md.use(require("markdown-it-container"), "blue") +md.use(require("./plugins/wikilink")) + +const renderer = md.renderer + +module.exports = class { + onCreate(input) { + this.state = { + render: () => {}, + } + + this.render(input.source || "") + } + + onInput(input) { + if (input.source) { + this.render(input.source) + } + } + + render(source) { + this.state.render = (out) => { + if (out.w) { + out.w(md.render(source)) + } + } + } +} + +renderer.rules \ No newline at end of file diff --git a/marko/components/markdown/index.marko b/marko/components/markdown/index.marko new file mode 100644 index 0000000..cd0e754 --- /dev/null +++ b/marko/components/markdown/index.marko @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/marko/components/markdown/plugins/wikilink.js b/marko/components/markdown/plugins/wikilink.js new file mode 100644 index 0000000..9bafbde --- /dev/null +++ b/marko/components/markdown/plugins/wikilink.js @@ -0,0 +1,40 @@ +/* + + Based on the markdown-it-wikilinks, which is distributed under the MIT license. + + https://github.com/jsepia/markdown-it-wikilinks @ 79fe609a03917f7df11128231118a66a559076d0 + + Copyright (c) 2016 Julio Sepia + + 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. + +*/ + +const Plugin = require('markdown-it-regexp') + +module.exports = new Plugin(/\[\[([\w'\s/]+)(\|([\w'\s/]+))?\]\]/, match => { + let label = "" + let page = "" + + if (match[3] != null) { + label = match[3] + page = encodeURIComponent(match[1]) + } else { + label = match[1] + page = encodeURIComponent(label) + } + + if (label == "" || page == "") { + return match.input + } + + return `${label}` + } +) + diff --git a/marko/components/markdown/style.less b/marko/components/markdown/style.less new file mode 100644 index 0000000..f31be4e --- /dev/null +++ b/marko/components/markdown/style.less @@ -0,0 +1,117 @@ +div.markdown-content { + line-height: 1.333em; + font-size: 1.25em; + + h1 { + font-size: 2em; + margin: 0; + margin-top: 0.75em; + line-height: 1.2em; + text-align: left; + + border-bottom: 1px solid; + } + h1:first-child { + margin-top: 0; + } + + h2 { + font-size: 1.5em; + margin: 0; + margin-top: 0.75em; + padding-bottom: 0.25em; + + border-bottom: 1px solid; + } + + h3 { + font-size: 1.25em; + margin: 0; + margin-top: 1em; + padding: 0; + margin-bottom: -0.25em; + } + + h4 { + font-size: 1em; + margin-top: 1em; + margin-bottom: -0.5em; + padding: 0; + } + + h5 { + font-size: 1em; + margin: 0; + margin-bottom: -0.5em; + } + + h6 { + font-size: 1em; + opacity: 0.5; + margin: 0; + margin-bottom: -0.5em; + } + + hr { + border: none; + margin: 2em 2ch; + border-bottom: 4px dotted; + opacity: 0.75; + } + + ul, ol { + padding: 0.5em 3ch; + margin: 0; + } + + p { + padding: 0.5em 0; + margin: 0; + } + p:first-child { + padding-top: 0.25em; + } + + .orange, .blue, .green, blockquote { + h1, h2, h3, h4, h5, h6 { + margin: 0; + padding: 0.5em 0; + } + + margin: 0.5em 0; + padding: 0.125em 0.5em 0 0.5em; + outline: 1px solid; + + p { + padding: 0.5em 0; + margin: 0; + } + } + + pre { + border: 1px solid; + padding: 0.5em; + } + + table { + width: 100%; + border: 1px solid; + padding: 0em 0.5em; + + th { + font-size: 0.75em; + padding: 0 1ch; + } + } + + img { + width: 100%; + } + + a { + opacity: 0.75; + } + a:hover { + opacity: 1; + } +} \ No newline at end of file diff --git a/marko/components/menu-blurb/index.marko b/marko/components/menu-blurb/index.marko new file mode 100644 index 0000000..83f07a7 --- /dev/null +++ b/marko/components/menu-blurb/index.marko @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/marko/components/menu-blurb/style.less b/marko/components/menu-blurb/style.less new file mode 100644 index 0000000..c243891 --- /dev/null +++ b/marko/components/menu-blurb/style.less @@ -0,0 +1,7 @@ +.menu-blurb { + opacity: 0.5; + padding: 0.25em 1.5ch; +} +.menu-blurb.error { + color: red; +} \ No newline at end of file diff --git a/marko/components/menu-gap/index.marko b/marko/components/menu-gap/index.marko new file mode 100644 index 0000000..cce1baa --- /dev/null +++ b/marko/components/menu-gap/index.marko @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/marko/components/menu-gap/style.less b/marko/components/menu-gap/style.less new file mode 100644 index 0000000..7a7eba3 --- /dev/null +++ b/marko/components/menu-gap/style.less @@ -0,0 +1,3 @@ +.menu-gap { + padding: 0.25em; +} \ No newline at end of file diff --git a/marko/components/menu-header/index.marko b/marko/components/menu-header/index.marko new file mode 100644 index 0000000..7d78ffa --- /dev/null +++ b/marko/components/menu-header/index.marko @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/marko/components/menu-header/style.less b/marko/components/menu-header/style.less new file mode 100644 index 0000000..b5a2ac1 --- /dev/null +++ b/marko/components/menu-header/style.less @@ -0,0 +1,5 @@ +.menu-header { + padding: 0.125em 1.5ch; + opacity: 0.5; + user-select: none; +} \ No newline at end of file diff --git a/marko/components/menu-link/component.js b/marko/components/menu-link/component.js new file mode 100644 index 0000000..1a137f0 --- /dev/null +++ b/marko/components/menu-link/component.js @@ -0,0 +1,13 @@ +module.exports = class { + onCreate(input) { + this.state = { + classes: ["menu-link", "color-menu", input.class], + } + + this.state.classes.push(input.selected ? "selected" : "not-selected") + } + + onClick() { + this.emit("click") + } +} \ No newline at end of file diff --git a/marko/components/menu-link/index.marko b/marko/components/menu-link/index.marko new file mode 100644 index 0000000..59f84af --- /dev/null +++ b/marko/components/menu-link/index.marko @@ -0,0 +1,8 @@ + +
+
${input.icon}
+
+ +
+
+
\ No newline at end of file diff --git a/marko/components/menu-link/style.less b/marko/components/menu-link/style.less new file mode 100644 index 0000000..899a4eb --- /dev/null +++ b/marko/components/menu-link/style.less @@ -0,0 +1,28 @@ +div.menu-link { + width: 100%; + padding-left: 0.5ch; + font-size: 1.1em; + + cursor: pointer; + + div.icon { + display: inline-block; + width: 3ch; + padding: 0.15em 0.125em; + text-align: center; + vertical-align: middle; + } + + div.text { + display: inline-block; + max-width: 22ch; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: middle; + + span.weak { + opacity: 0.3333; + } + } +} diff --git a/marko/components/menu/index.marko b/marko/components/menu/index.marko new file mode 100644 index 0000000..9c85c63 --- /dev/null +++ b/marko/components/menu/index.marko @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/marko/components/menu/style.less b/marko/components/menu/style.less new file mode 100644 index 0000000..aee3e21 --- /dev/null +++ b/marko/components/menu/style.less @@ -0,0 +1,14 @@ +.menu { + position: fixed; + top: 5.5em; + bottom: 0; + width: 28ch; + + padding: 0.333em; + + text-align: left; + + user-select: none; + overflow-x: hidden; + overflow-y: auto; +} \ No newline at end of file diff --git a/marko/global/base.less b/marko/global/base.less new file mode 100644 index 0000000..0486fd6 --- /dev/null +++ b/marko/global/base.less @@ -0,0 +1,39 @@ +body { + margin: 0; + padding: 0; + font-family: sans-serif; + background-color: black; + color: white; + + main { + margin-left: 30ch; // See side-menu + width: calc(100% - 30ch); + margin-right: 0; + } + + a { + text-decoration: none; + } +} + +/* + * Less glaring chrome/ium scrollbars. + */ + ::-webkit-scrollbar { + width: 2px; + /* for vertical scrollbars */ + height: 2px; + /* for horizontal scrollbars */ +} +::-webkit-scrollbar-button { + background-color: #555; + color: 000; + display: none; +} +::-webkit-scrollbar-track { + background-color: #222; +} +::-webkit-scrollbar-thumb { + background-color: #555; + color: #000; +} diff --git a/marko/global/colors.less b/marko/global/colors.less new file mode 100644 index 0000000..9861792 --- /dev/null +++ b/marko/global/colors.less @@ -0,0 +1,121 @@ +body.theme-story { + .color-menu { + color: #789; + } + .menu-link.selected { + background-color: rgba(17, 187, 255, 0.125); + } + .menu-link:hover, .menu > .head-menu > a:hover { + background-color: rgba(17, 187, 255, 0.25); + } + .color-primary, .markdown-content h1, .markdown-content h2, .markdown-content h3, .markdown-content h4, .markdown-content hr, .markdown-content a { + color: #4BF; + } + .color-text { + color: #ABC; + } + .color-highlight-primary { + background-color: rgba(34, 187, 255, 0.25); + color: #4BF; + } + .color-highlight-dark { + background-color: rgba(0, 9, 18, 0.50); + } +} + +body.theme-logs { + .color-menu { + color: #776; + } + .menu-link.selected { + background-color: rgba(255, 187, 17, 0.125); + } + .menu-link:hover, .Menu > .head-menu > a:hover { + background-color: rgba(255, 187, 17, 0.25); + } + .color-primary, .markdown-content h1, .markdown-content h2, .markdown-content h3, .markdown-content h4, .markdown-content hr, .markdown-content a { + color: #DA1; + } + .color-text { + color: #AAA; + } + .color-highlight-dark { + background-color: rgba(18, 9, 0, 0.50); + } + .color-highlight-primary { + background-color: rgba(255, 187, 15, 0.25); + color: #DA1; + } +} + +.theme-mapp { + .color-menu { + color: #898; + } + .menu-link.selected { + background-color: rgba(35, 255, 128, 0.125); + } + .menu-link:hover, .menu > .head-menu > a:hover { + background-color: rgba(35, 255, 128, 0.25); + } + .color-primary, .markdown-content h1, .markdown-content h2, .markdown-content h3, .markdown-content h4, .markdown-content hr, .markdown-content a { + color: #1F8; + } + .color-text { + color: #ACB; + } +} + +div.markdown-content .orange, body.theme-logs div.markdown-content blockquote, body.theme-logs div.markdown-content table, body.theme-logs div.markdown-content pre { + background-color: rgba(221, 170, 17, 0.125); + color: #DA1; + + h1, h2, h3 { + color: #DA1; + } +} +div.markdown-content .blue, body.theme-story div.markdown-content blockquote, body.theme-story div.markdown-content table, body.theme-story div.markdown-content pre { + background-color: rgba(34, 187, 255, 0.125); + color: #4BF; + + h1, h2, h3 { + color: #4BF; // + } +} +div.markdown-content .green, body.theme-mapp div.markdown-content blockquote, body.theme-mapp div.markdown-content table, body.theme-mapp div.markdown-content pre { + background-color: rgba(17,255,136, 0.125); + color: #1F8; + + h1, h2, h3 { + color: #1F8; + } +} + +/* Tag colors */ +.color-tag-event { + color: #B77; +} +.color-tag-location { + color: #7B7; +} +.color-tag-organization { + color: #B7B; +} +.color-tag-series { + color: #BB7; +} +.color-tag-character { + color: #37B; +} + +/* Danger */ +.color-danger { + color: #FA3; +} +.color-error { + color: #D20; +} + +.menu-link:hover, .menu-link:hover .text, .menu > .head-menu > a:hover { + color: #EEE !important; +} \ No newline at end of file diff --git a/marko/global/navbar.less b/marko/global/navbar.less new file mode 100644 index 0000000..5aa2927 --- /dev/null +++ b/marko/global/navbar.less @@ -0,0 +1,32 @@ +nav.layout-navbar { + position: fixed; + top: 0; + bottom: 0; + width: 30ch; + text-align: center; + + user-select: none; + + h1 { + display: inline-block; + font-size: 2em; + padding: 0.5em 0 0 0; + margin: 0; + } + + .options { + display: inline-block; + vertical-align: middle; + + a { + display: inline-block; + padding: 0.25em; + margin: 0 0.25ch; + opacity: 0.666; + } + a:hover { + opacity: 1; + color: white; + } + } +} \ No newline at end of file diff --git a/marko/page/layout.marko b/marko/page/layout.marko new file mode 100644 index 0000000..f9d0642 --- /dev/null +++ b/marko/page/layout.marko @@ -0,0 +1,16 @@ + + + + + + + ${input.title ? `${input.title} - Aite RP` : "Aite RP"} + + + + + + + + + diff --git a/marko/page/logs/components/logs-list/index.marko b/marko/page/logs/components/logs-list/index.marko new file mode 100644 index 0000000..b752755 --- /dev/null +++ b/marko/page/logs/components/logs-list/index.marko @@ -0,0 +1,13 @@ +import moment from "moment" + + + + \ No newline at end of file diff --git a/marko/page/logs/components/logs-menu/index.marko b/marko/page/logs/components/logs-menu/index.marko new file mode 100644 index 0000000..4878482 --- /dev/null +++ b/marko/page/logs/components/logs-menu/index.marko @@ -0,0 +1,10 @@ + + Logs + All + + Filters + + Data + Characters + Channels + \ No newline at end of file diff --git a/marko/page/logs/components/page/component.js b/marko/page/logs/components/page/component.js new file mode 100644 index 0000000..e2561d6 --- /dev/null +++ b/marko/page/logs/components/page/component.js @@ -0,0 +1,15 @@ +const {logHeaderApi} = require("../../../../../rpdata/api/LogHeader") + +module.exports = class { + onCreate(input) { + this.state = { + logs: input.logs + } + } + + onMount() { + logHeaderApi.list({limit: 0}).then(logs => { + this.state.logs = logs + }) + } +} \ No newline at end of file diff --git a/marko/page/logs/components/page/index.marko b/marko/page/logs/components/page/index.marko new file mode 100644 index 0000000..cc0ab97 --- /dev/null +++ b/marko/page/logs/components/page/index.marko @@ -0,0 +1,5 @@ + + +
+ +
\ No newline at end of file diff --git a/marko/page/logs/list.marko b/marko/page/logs/list.marko new file mode 100644 index 0000000..e6dc5d6 --- /dev/null +++ b/marko/page/logs/list.marko @@ -0,0 +1,6 @@ + + <@body> + + + + \ No newline at end of file diff --git a/marko/page/story-content/components/chapter-meta/component.js b/marko/page/story-content/components/chapter-meta/component.js new file mode 100644 index 0000000..d845544 --- /dev/null +++ b/marko/page/story-content/components/chapter-meta/component.js @@ -0,0 +1,52 @@ +const moment = require("moment") + +module.exports = class { + onCreate({kind, weak, value, updated}) { + this.state = {text: null, color: "color-menu", href: null, tooltip: null} + + if (value == null || value == "") { + return + } + + switch (kind) { + case "date": { + const m = moment(value) + if (m.year() < 2) { + break + } + + if (!weak) { + this.state.tooltip = `See all stories set during ${m.format("MMMM YYYY")}` + this.state.href = `/story/by-month/${m.format("YYYY-MM")}/` + } + + const dateStr = m.format("MMM D, YYYY") + + this.state.text = dateStr + + if (updated != null && Date.parse(updated) > Date.parse(value)) { + const m2 = moment(updated) + this.state.tooltip = "Originally posted: " + dateStr + this.state.text = m2.format("MMM D, YYYY") + " *" + } + + break + } + + case "author": { + this.state.text = value + this.state.tooltip = "See all stories by " + value + this.state.href = `/story/by-author/${value}/` + + break + } + + default: { + this.state.color = "color-menu" + this.state.text = value + + break + } + } + } +} \ No newline at end of file diff --git a/marko/page/story-content/components/chapter-meta/index.marko b/marko/page/story-content/components/chapter-meta/index.marko new file mode 100644 index 0000000..747cf07 --- /dev/null +++ b/marko/page/story-content/components/chapter-meta/index.marko @@ -0,0 +1,6 @@ + +
+ ${state.text} + ${state.text} +
+ \ No newline at end of file diff --git a/marko/page/story-content/components/chapter-meta/style.less b/marko/page/story-content/components/chapter-meta/style.less new file mode 100644 index 0000000..16d07ea --- /dev/null +++ b/marko/page/story-content/components/chapter-meta/style.less @@ -0,0 +1,20 @@ +div.chapter-meta { + display: inline-block; + padding: 0; + padding-right: 1em; + margin: 0; + + user-select: none; + + a { + color: inherit; + border-bottom: 0.25px dotted; + } + a:hover { + border-bottom: 0.5px solid; + } +} + +div.chapter-meta.weak { + opacity: 0.5; +} \ No newline at end of file diff --git a/marko/page/story-content/components/chapter/component.js b/marko/page/story-content/components/chapter/component.js new file mode 100644 index 0000000..fbed954 --- /dev/null +++ b/marko/page/story-content/components/chapter/component.js @@ -0,0 +1,5 @@ +module.exports = class { + onCreate(input) { + this.state = Object.assign({}, input.chapter) + } +} \ No newline at end of file diff --git a/marko/page/story-content/components/chapter/index.marko b/marko/page/story-content/components/chapter/index.marko new file mode 100644 index 0000000..be79045 --- /dev/null +++ b/marko/page/story-content/components/chapter/index.marko @@ -0,0 +1,10 @@ +
+ + + +
\ No newline at end of file diff --git a/marko/page/story-content/components/chapter/style.less b/marko/page/story-content/components/chapter/style.less new file mode 100644 index 0000000..c0f36ee --- /dev/null +++ b/marko/page/story-content/components/chapter/style.less @@ -0,0 +1,14 @@ +.story-chapter { + padding-bottom: 1em; + + .metadata { + padding: 0; + margin: 0; + } + + a.anchor { + display: block; + position: relative; + top: -8em; + } +} \ No newline at end of file diff --git a/marko/page/story-content/components/page/index.marko b/marko/page/story-content/components/page/index.marko new file mode 100644 index 0000000..cb01f8b --- /dev/null +++ b/marko/page/story-content/components/page/index.marko @@ -0,0 +1,8 @@ + +
+
+

${input.story.name}

+ + +
+
\ No newline at end of file diff --git a/marko/page/story-content/components/page/style.less b/marko/page/story-content/components/page/style.less new file mode 100644 index 0000000..27519d7 --- /dev/null +++ b/marko/page/story-content/components/page/style.less @@ -0,0 +1,9 @@ +.story-content { + width: 90%; + max-width: 75ch; + margin: auto; + + h1 { + text-align: center; + } +} \ No newline at end of file diff --git a/marko/page/story-content/components/story-content-menu/component.js b/marko/page/story-content/components/story-content-menu/component.js new file mode 100644 index 0000000..1d1b6a9 --- /dev/null +++ b/marko/page/story-content/components/story-content-menu/component.js @@ -0,0 +1,40 @@ +const moment = require("moment") + +module.exports = class { + onCreate(input) { + this.state = { + chapterTitles: {}, + fdateLink: "", + fdate: "", + selectedChapter: "" + } + } + + onMount() { + this.state.selectedChapter = (window.location.hash||"#").slice(1) + } + + onInput(input) { + if (input.story.fictionalDate && input.story.fictionalDate.getUTCFullYear() > 10) { + const fdate = input.story.fictionalDate + + this.state.fdateLink = `/story/by-month/${moment(fdate).format("YYYY-MM")}` + this.state.fdate = moment(fdate).format("MMM D, YYYY") + } + + for (const chapter of input.story.chapters) { + let title = "Chapter " + input.story.chapters.indexOf(chapter) + 1 + if (chapter.title) { + title = chapter.title + } else if (chapter.fictionalDate && chapter.fictionalDate.getUTCFullYear() > 1) { + title = moment(chapter.fictionalDate).format("MMM D, YYYY") + } + + this.state.chapterTitles[chapter.id] = title + } + } + + selectChapter(id) { + this.state.selectedChapter = id + } +} \ No newline at end of file diff --git a/marko/page/story-content/components/story-content-menu/index.marko b/marko/page/story-content/components/story-content-menu/index.marko new file mode 100644 index 0000000..fa41f15 --- /dev/null +++ b/marko/page/story-content/components/story-content-menu/index.marko @@ -0,0 +1,9 @@ + + 1)> + ${input.story.name} + + ${state.chapterTitles[chapter.id]} + + + + \ No newline at end of file diff --git a/marko/page/story-content/components/story-tags/index.marko b/marko/page/story-content/components/story-tags/index.marko new file mode 100644 index 0000000..4d7c456 --- /dev/null +++ b/marko/page/story-content/components/story-tags/index.marko @@ -0,0 +1,3 @@ +
\ No newline at end of file diff --git a/marko/page/story-content/components/story-tags/style.less b/marko/page/story-content/components/story-tags/style.less new file mode 100644 index 0000000..449d696 --- /dev/null +++ b/marko/page/story-content/components/story-tags/style.less @@ -0,0 +1,20 @@ +div.story-tags { + text-align: center; + margin-bottom: 1em; + margin-top: -1em; + + a.tag { + display: inline-block; + margin: 0.5em 0.5ch; + padding: 0.0625em 0.5ch; + + outline: 1px solid; + opacity: 0.75; + + user-select: none; + } + a.tag:hover { + opacity: 1; + cursor: pointer; + } +} \ No newline at end of file diff --git a/marko/page/story-content/view.marko b/marko/page/story-content/view.marko new file mode 100644 index 0000000..f6a78c5 --- /dev/null +++ b/marko/page/story-content/view.marko @@ -0,0 +1,6 @@ + + <@body> + + + + \ No newline at end of file diff --git a/marko/page/story/components/story-list/index.marko b/marko/page/story/components/story-list/index.marko new file mode 100644 index 0000000..ff1bc4a --- /dev/null +++ b/marko/page/story/components/story-list/index.marko @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/marko/page/story/components/story-menu/index.marko b/marko/page/story/components/story-menu/index.marko new file mode 100644 index 0000000..a949282 --- /dev/null +++ b/marko/page/story/components/story-menu/index.marko @@ -0,0 +1,11 @@ + + Story + Stories + + Categories + ${category.name} + + Tags + ${tag.name} + Tags + \ No newline at end of file diff --git a/marko/page/story/list.marko b/marko/page/story/list.marko new file mode 100644 index 0000000..5f4a82e --- /dev/null +++ b/marko/page/story/list.marko @@ -0,0 +1,9 @@ + + <@body> + + +
+ +
+ + diff --git a/marko/page/story/tag-list.marko b/marko/page/story/tag-list.marko new file mode 100644 index 0000000..cbca7b0 --- /dev/null +++ b/marko/page/story/tag-list.marko @@ -0,0 +1,8 @@ + + <@body> + + +
+
+ + diff --git a/middleware/locals.js b/middleware/locals.js new file mode 100644 index 0000000..3c612c6 --- /dev/null +++ b/middleware/locals.js @@ -0,0 +1,29 @@ +module.exports = (req, res, next) => { + if (res.marko) { + res.markoAsync = async(template, input) => { + const locals = Object.assign((res.locals || {}), input) + + for (const key in locals) { + const value = locals[key] + if (value instanceof Promise) { + locals[key] = await value + } + } + + return res.marko(template, locals) + } + } + + if (req.user) { + res.locals.user = { + loggedIn: true, + name: req.user._json.name, + } + } else { + res.locals.user = { + loggedIn: false, + } + } + + next() +} \ No newline at end of file diff --git a/middleware/passport.js b/middleware/passport.js new file mode 100644 index 0000000..c292d21 --- /dev/null +++ b/middleware/passport.js @@ -0,0 +1,29 @@ +const Auth0Strategy = require("passport-auth0") +const passport = require("passport") +const config = require("../config") + +//passport-auth0 +const strategy = new Auth0Strategy({ + domain: config.auth0.domain, + clientID: config.auth0.clientId, + clientSecret: config.auth0.secret, // Replace this with the client secret for your app + callbackURL: config.root + "/auth/callback" + }, (accessToken, refreshToken, extraParams, profile, done) => { + // accessToken is the token to call Auth0 API (not needed in the most cases) + // extraParams.id_token has the JSON Web Token + // profile has all the information from the user + return done(null, profile); + } +) + +passport.use(strategy) + +passport.serializeUser(function(user, done) { + done(null, user); +}); + +passport.deserializeUser(function(user, done) { + done(null, user); +}); + +module.exports = passport \ No newline at end of file diff --git a/middleware/session.js b/middleware/session.js new file mode 100644 index 0000000..f306204 --- /dev/null +++ b/middleware/session.js @@ -0,0 +1,15 @@ +const session = require("express-session") +const config = require("../config") +var RedisStore = require('connect-redis')(session); + +var sess = { + secret: config.session.secret, + store: new RedisStore(config.redis), + cookie: {}, + resave: false, + saveUninitialized: true, +} + +sess.cookie.secure = config.session.secure + +module.exports = session(sess) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..72c81ed --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4922 @@ +{ + "name": "@gisle/rpdata-frontend", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@lasso/marko-taglib": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@lasso/marko-taglib/-/marko-taglib-1.0.12.tgz", + "integrity": "sha512-Jz3VX2wcNt3thx6orNubm5bqVmPkLLcSsgJWywexV28ZFuQwZ5tUVi5TGAhSdNh/qVAiVBi8QGqbaxhr7WT3MQ==", + "requires": { + "async": "^0.9.2", + "lasso-resolve-from": "^1.2.0", + "raptor-async": "^1.1.3", + "raptor-logging": "^1.1.3", + "raptor-util": "^1.1.2" + } + }, + "JSONStream": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", + "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz", + "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==" + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-node": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.5.2.tgz", + "integrity": "sha512-krFKvw/d1F17AN3XZbybIUzEY4YEPNiGo05AfP3dBlfVKrMHETKpgjpuZkSF8qDNt9UkQcqj7am8yJLseklCMg==", + "requires": { + "acorn": "^5.7.1", + "acorn-dynamic-import": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=" + }, + "app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=" + }, + "argly": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/argly/-/argly-1.2.0.tgz", + "integrity": "sha1-KydORVGin/XnGZ0u2XiOtm7TbmA=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "async-writer": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/async-writer/-/async-writer-1.4.5.tgz", + "integrity": "sha1-ilUnuUk+WffzGkpHGE4OoS6/KD8=", + "requires": { + "events": "^1.0.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-refresh": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/browser-refresh/-/browser-refresh-1.7.3.tgz", + "integrity": "sha512-WrGbD4hadWYG2rCNiXu7dJWgMsN+C4/TXEtVMAEgzYIVyyCA4xG+LBomXAhbzwwWy4Cy+gjsE/TbQpdBkDgPqg==", + "requires": { + "async": "^0.9.0", + "browser-request": "^0.3.3", + "browserify": "^16.2.2", + "colors": "^0.6.2", + "express": "^4.16.3", + "ignoring-watcher": "^1.0.5", + "jsonminify": "^0.2.3", + "minimatch": "^3.0.4", + "opn": "^5.3.0", + "raptor-args": "^1", + "raptor-polyfill": "^1", + "raptor-util": "^1", + "socket.io": "^2.1.1" + }, + "dependencies": { + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + } + } + }, + "browser-refresh-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/browser-refresh-client/-/browser-refresh-client-1.1.4.tgz", + "integrity": "sha1-jl/4R1/h1UHSroH3oa6gWuIaYhc=" + }, + "browser-refresh-taglib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/browser-refresh-taglib/-/browser-refresh-taglib-1.1.0.tgz", + "integrity": "sha1-8zGLt6vR9ZeVQzq8fBuKo+JCYPE=", + "requires": { + "raptor-dust": "^1" + } + }, + "browser-request": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", + "integrity": "sha1-ns5bWsqJopkyJC4Yv5M975h2zBc=" + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.2.tgz", + "integrity": "sha512-fMES05wq1Oukts6ksGUU2TMVHHp06LyQt0SIwbXIHm7waSrQmNBZePsU0iM/4f94zbvb/wHma+D1YrdzWYnF/A==", + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.0.tgz", + "integrity": "sha512-nUJyfChH7PMJy75eRDCCKtszSEFokUNXC1hNVSe+o+VdcgvDPLs20k3v8UXI8ruRYAJiYtyRea8mYyqPxoHWDw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cached-path-relative": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", + "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" + }, + "callbackify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/callbackify/-/callbackify-1.1.0.tgz", + "integrity": "sha1-0qNphtKKppcUUmwREgm+65l50x4=" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "char-props": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/char-props/-/char-props-0.1.5.tgz", + "integrity": "sha1-W5UvniDqIc0Iyn/hNaEPb+kcEJ4=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "~0.6.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "complain": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/complain/-/complain-1.3.0.tgz", + "integrity": "sha512-PA9uGpaS4BXKrhFx3rl2nZMWySnGoW1pWf+dpBqNdDx3uR6PA0EPxjD17H9OxvW5w/bODBSziQ516Guf59rW+w==", + "requires": { + "error-stack-parser": "^2.0.1" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-ensure-login": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-ensure-login/-/connect-ensure-login-0.1.1.tgz", + "integrity": "sha1-F03MUSQ7nqwj+NmCFa62aU4uihI=" + }, + "connect-redis": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-3.3.3.tgz", + "integrity": "sha512-rpWsW2uk1uOe/ccY/JvW+RiLrhZm7auIx8z4yR+KXemFTIhJyD58jXiJbI0E/fZCnybawpdSqOZ+6/ah6aBeyg==", + "requires": { + "debug": "^3.1.0", + "redis": "^2.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "requires": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "deresolve": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deresolve/-/deresolve-1.1.2.tgz", + "integrity": "sha1-nPI3nI0tYx3EuZVylLkOSnLLbOA=", + "requires": { + "lasso-package-root": "^1.0.0", + "raptor-polyfill": "^1.0.2", + "resolve-from": "^1.0.1" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "detective": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", + "requires": { + "acorn-node": "^1.3.0", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dissolve": { + "version": "github:deoxxa/dissolve#eeb806f2bad501548138c8e38d0adcf95d4d1bdb", + "from": "github:deoxxa/dissolve#eeb806f2bad501548138c8e38d0adcf95d4d1bdb", + "requires": { + "bl": "^1.0.0", + "readable-stream": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", + "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "empty-module": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/empty-module/-/empty-module-0.0.2.tgz", + "integrity": "sha1-E7TdjUr+3dNeUMGNzXiMUQh/FUU=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "engine.io": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", + "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-stack-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", + "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "requires": { + "stackframe": "^1.0.4" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "events-light": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/events-light/-/events-light-1.0.5.tgz", + "integrity": "sha1-lk5jRQugr0prAiqpVbF//vZXte4=", + "requires": { + "chai": "^3.5.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "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.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "express-http-proxy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.2.0.tgz", + "integrity": "sha512-HefDxJyPLTtVqQXYhniN0JCS3ibyDwxvIjrwTGqXUeChdeTz9+Lo9LgKHJRTqTIp8wQeknM+W52v/+/NCm4IIw==", + "requires": { + "debug": "^3.0.1", + "es6-promise": "^4.1.1", + "raw-body": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "express-session": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", + "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "crc": "3.4.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "on-headers": "~1.0.1", + "parseurl": "~1.3.2", + "uid-safe": "~2.1.5", + "utils-merge": "1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graphql-query-compress": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/graphql-query-compress/-/graphql-query-compress-1.1.0.tgz", + "integrity": "sha512-b8ahXPJ7HLoYARnpDio30/1VgZKGoWZWOOc2uC8zipHQ3aQR3oKYy+EIlTCCUUc8q00vjKxqP+uiG7KLuUbS2Q==", + "requires": { + "tokenizr": "1.3.10" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "htmljs-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/htmljs-parser/-/htmljs-parser-2.4.0.tgz", + "integrity": "sha512-Vmc4hiSt5uqGc44JaBNuzzs5MPExjY+w5z1gWl+KaGxvdGIZ6LfDn+vHfJXT+SJ6E3RG8uMCr+0HyDEWqGN5iA==", + "requires": { + "char-props": "^0.1.5", + "complain": "^1.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + }, + "ignoring-watcher": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ignoring-watcher/-/ignoring-watcher-1.1.0.tgz", + "integrity": "sha1-RLrxKbjr4xm1UZ1lguEJKDqd0sA=", + "requires": { + "chokidar": "^1.4.3", + "raptor-util": "^1.0.7" + }, + "dependencies": { + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + } + } + }, + "image-size": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "requires": { + "is-unc-path": "^0.1.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "requires": { + "unc-path-regex": "^0.1.0" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonminify": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jsonminify/-/jsonminify-0.2.3.tgz", + "integrity": "sha1-S4Qsij/l1qpIsvj5Whz5qAwBnY4=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsonwebtoken": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz", + "integrity": "sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag==", + "requires": { + "jws": "^3.1.5", + "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" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jwa": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", + "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.10", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", + "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", + "requires": { + "jwa": "^1.1.5", + "safe-buffer": "^5.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "labeled-stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", + "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "requires": { + "inherits": "^2.0.1", + "isarray": "^2.0.4", + "stream-splicer": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", + "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==" + } + } + }, + "lasso": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/lasso/-/lasso-3.2.6.tgz", + "integrity": "sha512-Ln4i6XepzXJ8e/+PTxsB+vdZHXbN0wIzepT6Ygwvxtl37Qm4HWLy2VnkVbSXG2gV2XJmC/JP0acg0ShPYKa/nA==", + "requires": { + "app-root-dir": "^1.0.2", + "assert": "^1.4.1", + "babel-code-frame": "^6.26.0", + "browser-refresh-client": "^1.1.4", + "buffer": "^5.1.0", + "clean-css": "^4.1.11", + "clone": "^2.1.1", + "complain": "^1.2.0", + "escodegen": "^1.10.0", + "esprima": "^4.0.0", + "estraverse": "^4.2.0", + "events": "^3.0.0", + "glob": "^7.1.2", + "image-size": "^0.6.3", + "lasso-caching-fs": "^1.0.2", + "lasso-loader": "^3.0.2", + "lasso-modules-client": "^2.0.5", + "lasso-package-root": "^1.0.1", + "lasso-resolve-from": "^1.2.0", + "marko": "^4.10.0", + "mime": "^2.3.1", + "mkdirp": "^0.5.1", + "path-browserify": "1.0.0", + "pify": "^3.0.0", + "process": "^0.11.10", + "property-handlers": "^1.1.1", + "raptor-async": "^1.1.3", + "raptor-cache": "^2.0.4", + "raptor-css-parser": "^1.1.5", + "raptor-detect": "^1.0.1", + "raptor-logging": "^1.1.3", + "raptor-objects": "^1.0.2", + "raptor-polyfill": "^1.0.2", + "raptor-promises": "^1.0.3", + "raptor-regexp": "^1.0.1", + "raptor-strings": "^1.0.2", + "raptor-util": "^3.2.0", + "resolve-from": "^4.0.0", + "semver": "^5.5.0", + "send": "^0.16.2", + "stream-browserify": "^2.0.1", + "string_decoder": "^1.1.1", + "strip-json-comments": "^2.0.1", + "through": "^2.3.8", + "uglify-js": "^3.4.0", + "url": "^0.11.0", + "util": "^0.11.0" + }, + "dependencies": { + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" + }, + "path-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.0.tgz", + "integrity": "sha512-Hkavx/nY4/plImrZPHRk2CL9vpOymZLgEbMNX1U0bjcBL7QN9wODxyx0yaMZURSQaUtSEvDrfAvxa9oPb0at9g==" + }, + "raptor-util": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-3.2.0.tgz", + "integrity": "sha1-I7DIA8jxrIocrmfZpjiLSRYcl1g=" + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "util": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz", + "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==", + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "lasso-babel-transform": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lasso-babel-transform/-/lasso-babel-transform-1.0.2.tgz", + "integrity": "sha512-8AUeZ22LC5onZ6lanBRrdJKYq2D8EVtUoEm3UfMV/lNHD/8NUQEITZ+uRgTMxmSmAV0y68j06hsEUe4lf0tVVQ==", + "requires": { + "babel-core": "^6.0.14", + "lasso-caching-fs": "^1.0.1", + "lasso-package-root": "^1.0.0", + "strip-json-comments": "^2.0.1" + } + }, + "lasso-caching-fs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lasso-caching-fs/-/lasso-caching-fs-1.0.2.tgz", + "integrity": "sha1-m+TrHwaqwSYDRMrq70LC8AhusQ0=", + "requires": { + "raptor-async": "^1.1.2" + } + }, + "lasso-less": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lasso-less/-/lasso-less-3.0.1.tgz", + "integrity": "sha512-0R1EAQNfcYlD+EIrBtNDGcnftKUPy+ck8Xk/awet5AvP/HmJzz6I0lJyjG7rVbV58LN9/GSQBIaC3nNBt9w+bg==", + "requires": { + "async": "^2.6.0", + "lasso-package-root": "^1.0.1", + "less": "^3.0.4", + "raptor-async": "^1.1.3", + "raptor-logging": "^1.1.3", + "raptor-polyfill": "^1.0.2", + "raptor-util": "^1.1.2", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "requires": { + "lodash": "^4.17.10" + } + }, + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, + "lasso-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lasso-loader/-/lasso-loader-3.0.2.tgz", + "integrity": "sha1-29tV1fcu6zpbrnSn4xtrtf8t0JM=", + "requires": { + "events": "^1.0.2", + "raptor-util": "^1.0.0" + } + }, + "lasso-marko": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/lasso-marko/-/lasso-marko-2.4.4.tgz", + "integrity": "sha512-7Q0wNg0rQhdjezbUBmRw/W3dSa9NAqmm99oZhlVOss++OsCwLmPF7r870qMA5a3IUIX+ziOrZbCVHdWQdD/+XA==", + "requires": { + "callbackify": "^1.1.0" + } + }, + "lasso-modules-client": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lasso-modules-client/-/lasso-modules-client-2.0.5.tgz", + "integrity": "sha1-2aBnJKkAl3Y2lxZn7pwXDS/E3Sg=", + "requires": { + "lasso-package-root": "^1.0.0", + "raptor-polyfill": "^1.0.2" + } + }, + "lasso-package-root": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lasso-package-root/-/lasso-package-root-1.0.1.tgz", + "integrity": "sha1-mX0OcfQdA8Xw+gmlvCmNeW+LLCM=", + "requires": { + "lasso-caching-fs": "^1.0.0" + } + }, + "lasso-resolve-from": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lasso-resolve-from/-/lasso-resolve-from-1.2.0.tgz", + "integrity": "sha1-v7I0Rnr7abUwn1aLpFnMgyBiHG4=", + "requires": { + "is-absolute": "^0.2.3", + "lasso-caching-fs": "^1.0.1", + "raptor-util": "^1.0.10", + "resolve-from": "^2.0.0" + } + }, + "less": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", + "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "linkify-it": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", + "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "listener-tracker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/listener-tracker/-/listener-tracker-2.0.0.tgz", + "integrity": "sha1-OWCLQ1wJAfpVECF8FFJyjWvBm18=" + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-container": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", + "integrity": "sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=" + }, + "markdown-it-regexp": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-regexp/-/markdown-it-regexp-0.4.0.tgz", + "integrity": "sha1-1k1xPuzsVc5M/esyF1DswJniwtw=" + }, + "marko": { + "version": "4.13.4", + "resolved": "https://registry.npmjs.org/marko/-/marko-4.13.4.tgz", + "integrity": "sha512-eL8svidLARXY39e07JvY0YV7B5VAcd6GfnVK1W5xMpyvhazPo1fmL9S4HMGPIhToU0esrZZv4UG9APpo8V+Pdw==", + "requires": { + "app-module-path": "^2.2.0", + "argly": "^1.0.0", + "browser-refresh-client": "^1.0.0", + "char-props": "~0.1.5", + "complain": "^1.3.0", + "deresolve": "^1.1.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "estraverse": "^4.2.0", + "events": "^1.0.2", + "events-light": "^1.0.0", + "he": "^1.1.0", + "htmljs-parser": "^2.3.2", + "lasso-caching-fs": "^1.0.1", + "lasso-modules-client": "^2.0.4", + "lasso-package-root": "^1.0.1", + "listener-tracker": "^2.0.0", + "minimatch": "^3.0.2", + "object-assign": "^4.1.0", + "property-handlers": "^1.0.0", + "raptor-json": "^1.0.1", + "raptor-polyfill": "^1.0.0", + "raptor-promises": "^1.0.1", + "raptor-regexp": "^1.0.0", + "raptor-util": "^3.2.0", + "resolve-from": "^2.0.0", + "shorthash": "0.0.2", + "simple-sha1": "^2.1.0", + "strip-json-comments": "^2.0.1", + "try-require": "^1.2.1", + "warp10": "^1.0.0" + }, + "dependencies": { + "raptor-util": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-3.2.0.tgz", + "integrity": "sha1-I7DIA8jxrIocrmfZpjiLSRYcl1g=" + } + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "requires": { + "mime-db": "~1.35.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "module-deps": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz", + "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==", + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "passport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", + "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-auth0": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-auth0/-/passport-auth0-1.0.0.tgz", + "integrity": "sha512-kqH2SHVKiJe8Ttaszk0Dui2hcOywFBa6epSxGlpNrkNiBFv9sit+vlsntoMlDqckxqekdEyxs/cKNEvs07pWEw==", + "requires": { + "passport-oauth": "^1.0.0", + "request": "^2.61.0", + "xtend": "^4.0.0" + } + }, + "passport-oauth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz", + "integrity": "sha1-kK/2M4dUDwIImvKM2tOep/gNd98=", + "requires": { + "passport-oauth1": "1.x.x", + "passport-oauth2": "1.x.x" + } + }, + "passport-oauth1": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.1.0.tgz", + "integrity": "sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=", + "requires": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "utils-merge": "1.x.x" + } + }, + "passport-oauth2": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.4.0.tgz", + "integrity": "sha1-9i+BWDy+EmCb585vFguTlaJ7hq0=", + "requires": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "property-handlers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/property-handlers/-/property-handlers-1.1.1.tgz", + "integrity": "sha1-yyDTIqq32U//rCj0bJGGvVlHtLQ=" + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "optional": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raptor-args": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/raptor-args/-/raptor-args-1.0.3.tgz", + "integrity": "sha1-4JbOXA+d5eCEhheni/+s6UxU3IY=" + }, + "raptor-async": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/raptor-async/-/raptor-async-1.1.3.tgz", + "integrity": "sha1-uDw8m2A9yYXCw6n3jStAc+b2Akw=" + }, + "raptor-cache": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/raptor-cache/-/raptor-cache-2.0.4.tgz", + "integrity": "sha512-x1B07Qvz4H5hk5sfTrPNgWF4cPbQfxVWWdlYEyw3Igq9Cy75fGAtTd+HIp9/sxCQl8I9pSp10vi3a+eCpGrM6Q==", + "requires": { + "dissolve": "github:deoxxa/dissolve#eeb806f2bad501548138c8e38d0adcf95d4d1bdb", + "mkdirp": "^0.5.1", + "property-handlers": "^1.1.1", + "raptor-async": "^1.1.3", + "raptor-logging": "^1.1.3", + "raptor-util": "^1.1.2", + "through": "^2.3.8", + "uuid": "^3.2.1" + } + }, + "raptor-css-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/raptor-css-parser/-/raptor-css-parser-1.1.5.tgz", + "integrity": "sha1-HeAY2WEhyNwfHDRoZUmv9xZJ0Dc=", + "requires": { + "raptor-async": "^1.0.0", + "raptor-promises": "^1.0.1" + } + }, + "raptor-detect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/raptor-detect/-/raptor-detect-1.0.1.tgz", + "integrity": "sha1-ClTGOQVu9m39Ur45RfoizG0UZvM=" + }, + "raptor-dust": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/raptor-dust/-/raptor-dust-1.1.12.tgz", + "integrity": "sha1-/ZDKqnXxweZ5lYes7GT6FL/39Dk=", + "requires": { + "async-writer": "^1.1.0", + "raptor-util": "^1.0.0" + }, + "dependencies": { + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + } + } + }, + "raptor-json": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/raptor-json/-/raptor-json-1.1.0.tgz", + "integrity": "sha1-cL0JsU5k99MuxQzOg3fWApwPCHY=", + "requires": { + "raptor-strings": "^1.0.0" + } + }, + "raptor-logging": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/raptor-logging/-/raptor-logging-1.1.3.tgz", + "integrity": "sha512-eklLyQmG5Y2oyIrSsvkFjBkjRYvwjemUQpQhjG757KKaNPxIPX9wu34bfQkIcS7OG495CP28CjX9baABLfOzIw==", + "requires": { + "raptor-polyfill": "^1.0.0", + "raptor-stacktraces": "^1.0.0" + } + }, + "raptor-objects": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/raptor-objects/-/raptor-objects-1.0.2.tgz", + "integrity": "sha1-mQ3ONgQTsHni5K8RTy5zRKcc7hE=", + "requires": { + "raptor-util": "^1.0.0" + } + }, + "raptor-polyfill": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/raptor-polyfill/-/raptor-polyfill-1.1.0.tgz", + "integrity": "sha512-VhFc5e6EuNGdax7FQ2QWlCdXFi5OBBsclDh0kzZtgBI7lauc8aFs7+htdi5Q3qCRoYXfsucSBsRKf7a3s+YGmA==" + }, + "raptor-promises": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/raptor-promises/-/raptor-promises-1.0.3.tgz", + "integrity": "sha1-1XaxEOBCNlT3/fFyHijULk3DwOs=", + "requires": { + "q": "^1.0.1", + "raptor-util": "^1.0.0" + } + }, + "raptor-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/raptor-regexp/-/raptor-regexp-1.0.1.tgz", + "integrity": "sha1-7PD2bGZxwM2fXkjDcFAmxVCZlcA=" + }, + "raptor-stacktraces": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/raptor-stacktraces/-/raptor-stacktraces-1.0.1.tgz", + "integrity": "sha1-f5+ycafdza4pHGprFd3v+8wAinY=" + }, + "raptor-strings": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/raptor-strings/-/raptor-strings-1.0.2.tgz", + "integrity": "sha1-ks4ssBU6/pBHDYA5oCVbTPM6tfw=", + "requires": { + "raptor-polyfill": "^1.0.1" + } + }, + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "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" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "requires": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + } + }, + "redis-commands": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==" + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rusha": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", + "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "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.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shorthash": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/shorthash/-/shorthash-0.0.2.tgz", + "integrity": "sha1-WbJo7sveWQOLMNogK8+93rLEpOs=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-sha1": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.1.tgz", + "integrity": "sha512-pFMPd+I/lQkpf4wFUeS/sED5IqdIG1lUlrQviBMV4u4mz8BRAcB5fvUx5Ckfg3kBigEglAjHg7E9k/yy2KlCqA==", + "requires": { + "rusha": "^0.8.1" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "^1.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "requires": { + "acorn-node": "^1.2.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "~0.11.0" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "tokenizr": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/tokenizr/-/tokenizr-1.3.10.tgz", + "integrity": "sha512-XlYlczHEQrbmj/JInA9vcsBJlukyTJWvjmQodjlbkul5fZ4o1JDNYAvLlrHZs03CSR8nFjNmTEqN3NrjTjmN+A==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "try-require": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/try-require/-/try-require-1.2.1.tgz", + "integrity": "sha1-NEiaLKwMCcHMEO2RugEVlNQzO+I=" + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uc.micro": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" + }, + "uglify-js": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.8.tgz", + "integrity": "sha512-WatYTD84gP/867bELqI2F/2xC9PQBETn/L+7RGq9MQOA/7yFBNvY1UwXqvtILeE6n0ITwBXxp34M0/o70dzj6A==", + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undeclared-identifiers": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", + "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", + "requires": { + "acorn-node": "^1.3.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + }, + "warp10": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/warp10/-/warp10-1.3.6.tgz", + "integrity": "sha512-7cijX+NprqPV+UGUZXZw1I15JFHPqoy65tNVvP6cL43Vlanpcm8hBYoQTuDYUHa5x90Bct4gHhRtqqOOkLhQkw==" + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b55e25b --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "@gisle/rpdata-frontend", + "version": "0.1.0", + "description": "RPData (www.aiterp.net) frontend/proxy", + "main": "./index.js", + "scripts": { + "dev": "browser-refresh server.js", + "prod": "NODE_ENV=production node server.js" + }, + "author": "Gisle Aune ", + "license": "MIT", + "homepage": "https://github.com/marko-js-samples/marko-express", + "dependencies": { + "@lasso/marko-taglib": "^1.0.12", + "babel-preset-es2015": "^6.24.1", + "body-parser": "^1.18.3", + "browser-refresh": "^1.7.3", + "browser-refresh-taglib": "^1.1.0", + "connect-ensure-login": "^0.1.1", + "connect-redis": "^3.3.3", + "empty-module": "0.0.2", + "es6-promise": "^4.2.4", + "express": "^4.16.3", + "express-http-proxy": "^1.2.0", + "express-session": "^1.15.6", + "graphql-query-compress": "^1.1.0", + "isomorphic-fetch": "^2.2.1", + "jsonwebtoken": "^8.3.0", + "lasso": "^3.2.6", + "lasso-babel-transform": "^1.0.2", + "lasso-less": "^3.0.1", + "lasso-marko": "^2.4.4", + "markdown-it": "^8.4.2", + "markdown-it-container": "^2.0.0", + "markdown-it-regexp": "^0.4.0", + "marko": "^4.13.4", + "moment": "^2.22.2", + "passport": "^0.4.0", + "passport-auth0": "^1.0.0" + } +} diff --git a/routes/auth.js b/routes/auth.js new file mode 100644 index 0000000..7594322 --- /dev/null +++ b/routes/auth.js @@ -0,0 +1,46 @@ +const express = require("express") +const passport = require("../middleware/passport") + +const router = express.Router() + +function saveReferer(req, res, next) { + req.session.loginReferrer = req.get("Referer") + req.session.save() + + next() +} + +// Perform the login, after login Auth0 will redirect to callback +router.get("/login", saveReferer, passport.authenticate("auth0", {scope: "openid username profile"}), (req, res) => { + res.redirect("/") +}) + +router.get("/callback", passport.authenticate("auth0", { failureRedirect: "/auth/login" }), (req, res) => { + if (req.user == null) { + throw new Error("user null"); + } + + res.redirect(req.session.loginReferrer || "/"); +}) + +router.get("/user", (req, res) => { + if (req.user == null) { + return res.status(401).json({error: {message: "Unauthorized"}}) + } + + const name = req.user._json.name + + // TODO: Grab data from rpdata-api user database + + res.json({data: { + name + }}) +}) + +router.get("/logout", saveReferer, (req, res) => { + req.logout() + + res.redirect(req.session.loginReferrer || "/"); +}) + +module.exports = router \ No newline at end of file diff --git a/routes/graphql.js b/routes/graphql.js new file mode 100644 index 0000000..6270ce8 --- /dev/null +++ b/routes/graphql.js @@ -0,0 +1,56 @@ +const express = require("express") +const jwt = require("jsonwebtoken") + +const config = require("../config") +const { query } = require("../rpdata/client") + +const router = express.Router() + +router.post("/", (req, res) => { + if (!req.header("Content-Type").startsWith("application/json")) { + res.status(400).json({errors: [{message: "Incorrect input type, expected application/json"}]}) + return + } + + const user = res.locals.user + const permissions = (req.header("X-Permissions") || "").split(",").filter(t => t != "" && t != "undefined" && t != "null") + let authorization = req.header("Authorization") + if (authorization == "null") { + authorization = "" + } + + if (!authorization && permissions.length > 0 && user.loggedIn) { + authorization = `Bearer ${generateToken(user.name, permissions)}` + } + + fetch(config.graphqlEndpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": authorization, + }, + body: JSON.stringify(req.body), + credentials: "include", + }).then(fetchRes => { + res.setHeader("Content-Type", fetchRes.headers.get("Content-Type")) + res.status(fetchRes.status) + + return fetchRes.json() + }).then(json => { + res.json(json) + }).catch(err => { + res.status(500).text(err) + return null + }) +}) + + +/** + * @param {string} user + * @param {string[]} permissions + */ +function generateToken(user, permissions) { + return jwt.sign({user, permissions, exp: Math.floor((Date.now() / 1000) + 1200)}, config.backend.secret, {header: {kid: config.backend.kid}}) +} + +module.exports = router \ No newline at end of file diff --git a/routes/logs/index.js b/routes/logs/index.js new file mode 100644 index 0000000..eff2f97 --- /dev/null +++ b/routes/logs/index.js @@ -0,0 +1,19 @@ +const express = require("express") +const router = express.Router() + +const {logHeaderApi} = require("../../rpdata/api/LogHeader") + +const listTemplate = require("../../marko/page/logs/list.marko") + +router.get("/", async(req, res) => { + try { + res.markoAsync(listTemplate, { + logs: logHeaderApi.list({limit: 0}), + selected: {index: true}, + }) + } catch(err) { + console.error(err) + } +}) + +module.exports = router diff --git a/routes/story-content/index.js b/routes/story-content/index.js new file mode 100644 index 0000000..59d662d --- /dev/null +++ b/routes/story-content/index.js @@ -0,0 +1,13 @@ +const express = require("express") +const router = express.Router() + +const {storyApi} = require("../../rpdata/api/Story") + +const viewTemplate = require("../../marko/page/story-content/view.marko") + +module.exports = async(req, res, next) => { + res.markoAsync(viewTemplate, { + story: storyApi.find(req.params.id), + selected: {index: true}, + }) +} \ No newline at end of file diff --git a/routes/story/by-category.js b/routes/story/by-category.js new file mode 100644 index 0000000..be7f2f5 --- /dev/null +++ b/routes/story/by-category.js @@ -0,0 +1,22 @@ +const express = require("express") +const router = express.Router() + +const common = require("./common") +const {storyApi} = require("../../rpdata/api/Story") +const {Tag} = require("../../rpdata/api/Tag") + +const listTemplate = require("../../marko/page/story/list.marko") + +router.get("/:category", common, async(req, res) => { + try { + res.markoAsync(listTemplate, { + stories: storyApi.list({category: req.params.category}), + selected: {category: req.params.category}, + }) + } catch(err) { + console.error(err) + } +}) + +module.exports = router + diff --git a/routes/story/by-tag.js b/routes/story/by-tag.js new file mode 100644 index 0000000..41609ea --- /dev/null +++ b/routes/story/by-tag.js @@ -0,0 +1,24 @@ +const express = require("express") +const router = express.Router() + +const common = require("./common") +const {storyApi} = require("../../rpdata/api/Story") +const {Tag} = require("../../rpdata/api/Tag") + +const listTemplate = require("../../marko/page/story/list.marko") + +router.get("/:tagkind/:tagname", common, async(req, res) => { + try { + const tag = new Tag(req.params.tagkind, req.params.tagname) + + res.markoAsync(listTemplate, { + stories: storyApi.list({tags: tag}), + menuTags: [tag], + selected: {tag: `${tag.kind}:${tag.name}`}, + }) + } catch(err) { + console.error(err) + } +}) + +module.exports = router diff --git a/routes/story/common.js b/routes/story/common.js new file mode 100644 index 0000000..a065991 --- /dev/null +++ b/routes/story/common.js @@ -0,0 +1,7 @@ +const {storyApi} = require("../../rpdata/api/Story") + +module.exports = (req, res, next) => { + res.locals.categories = storyApi.categories() + + next() +} \ No newline at end of file diff --git a/routes/story/index.js b/routes/story/index.js new file mode 100644 index 0000000..829bbb1 --- /dev/null +++ b/routes/story/index.js @@ -0,0 +1,20 @@ +const express = require("express") +const router = express.Router() + +const common = require("./common") +const {storyApi} = require("../../rpdata/api/Story") + +const listTemplate = require("../../marko/page/story/list.marko") + +router.get("/", common, (req, res) => { + try { + res.markoAsync(listTemplate, { + stories: storyApi.list(), + selected: {index: true}, + }) + } catch(err) { + console.error(err) + } +}) + +module.exports = router diff --git a/routes/story/tag-list.js b/routes/story/tag-list.js new file mode 100644 index 0000000..cd9a266 --- /dev/null +++ b/routes/story/tag-list.js @@ -0,0 +1,20 @@ +const express = require("express") +const router = express.Router() + +const common = require("./common") +const {tagApi} = require("../../rpdata/api/Tag") + +const tagListTemplate = require("../../marko/page/story/tag-list.marko") + +router.get("/", common, (req, res) => { + try { + res.markoAsync(tagListTemplate, { + tags: tagApi.list(), + selected: {tags: true}, + }) + } catch(err) { + console.error(err) + } +}) + +module.exports = router diff --git a/rpdata/api/Chapter.js b/rpdata/api/Chapter.js new file mode 100644 index 0000000..09d7797 --- /dev/null +++ b/rpdata/api/Chapter.js @@ -0,0 +1,53 @@ +const {query} = require("../client") + +class Chapter { + /** + * @param {string} id + * @param {string} title + * @param {string} author + * @param {string} source + * @param {string | Date} createdDate + * @param {string | Date} fictionalDate + * @param {string | Date} editedDate + */ + constructor(id, title, author, source, createdDate, fictionalDate, editedDate) { + this.id = id + this.title = title + this.author = author + this.source = source + this.createdDate = new Date(createdDate) + this.fictionalDate = new Date(fictionalDate) + this.editedDate = new Date(editedDate) + } + + /** + * Query the chapter's editable fields and update this object. This promise returns a boolean + * whether there has been a change. + * + * @returns {Promise} `true` if the story was edited in the meantime + */ + update() { + return query(` + query UpdateChapter($id: String!) { + update: chapter(id: $id) { + title + source + fictionalDate + editedDate + } + } + `, {id: this.id}).then(({update}) => { + const editedDate = new Date(udpate.editedDate) + const wasEdited = editedDate.getTime() != this.editedDate.getTime() + + this.title = update.title + this.source = update.source + this.fictionalDate = new Date(update.fictionalDate) + this.editedDate = editedDate + + return wasEdited + }) + } +} + +module.exports = {Chapter} \ No newline at end of file diff --git a/rpdata/api/Character.js b/rpdata/api/Character.js new file mode 100644 index 0000000..f877647 --- /dev/null +++ b/rpdata/api/Character.js @@ -0,0 +1,5 @@ +const {query} = require("../client") + +class Character { + +} \ No newline at end of file diff --git a/rpdata/api/LogHeader.js b/rpdata/api/LogHeader.js new file mode 100644 index 0000000..3170c10 --- /dev/null +++ b/rpdata/api/LogHeader.js @@ -0,0 +1,84 @@ +const {query} = require("../client") + +class LogHeader { + /** + * Construct a log header. You should probably use the logHeaderApi instead of doing + * this manually, even for mutations. + * + * @param {string} id + * @param {Date|string} date + * @param {string} channelName + * @param {string} title + * @param {string} description + * @param {string} event + * @param {boolean} open + * @param {{id:string,name:string,shortName:string,author:string}[]} characters + */ + constructor(id, shortId, date, channelName, title, description, event, open, characters) { + this.id = id + this.shortId = shortId + this.date = new Date(date) + this.channelName = channelName + this.title = title || null + this.description = description || null + this.event = event || null + this.open = open + this.characters = characters.map(ch => new LogHeaderCharacter(ch.id, ch.name, ch.shortName, ch.author)) + } +} + +class LogHeaderCharacter { + /** + * Construct a log header character list entry. + * + * @param {string} id + * @param {string} name + * @param {string} shortName + * @param {string} author + */ + constructor(id, name, shortName, author) { + this.id = id + this.name = name + this.shortName = shortName + this.author = author + } +} + +/** + * logHeaderApi contains the API queries for the LogHeader frontend model, which is a subset of the + * logs model. + */ +const logHeaderApi = { + /** + * Call `stories(filter)` query + * + * @param {{search:string, channels:string|string[], events:string|string[], open:boolean, characters:string|string[], limit:number}} filter + * @returns {Promise} + */ + list(filter = {}) { + return query(` + query LogHeaders($filter: LogsFilter) { + headers: logs(filter:$filter) { + id + shortId + date + channelName + title + description + event + open + characters { + id + name + shortName + author + } + } + } + `, {filter}).then(({headers}) => { + return headers.map(h => new LogHeader(h.id, h.shortId, h.date, h.channelName, h.title, h.description, h.event, h.open, h.characters)) + }) + }, +} + +module.exports = {LogHeader, LogHeaderCharacter, logHeaderApi} \ No newline at end of file diff --git a/rpdata/api/Story.js b/rpdata/api/Story.js new file mode 100644 index 0000000..36a0e77 --- /dev/null +++ b/rpdata/api/Story.js @@ -0,0 +1,147 @@ +const {query} = require("../client") +const {Tag} = require("./Tag") +const {Chapter} = require("./Chapter") + +class Story { + /** + * Construct a story object. You should use the API instead of calling this. + * + * @param {string} id + * @param {string} name + * @param {string} author + * @param {"Info"|"News"|"Document"|"Background"|"Story"} category Story's category + * @param {string} createdDate + * @param {string} updatedDate + * @param {string} fictionalDate + * @param {{kind:string, name:string}[]} tags + * @param {Chapter[]} chapters + */ + constructor(id, name, author, category, createdDate, updatedDate, fictionalDate, tags, chapters) { + this.id = id + this.name = name + this.author = author + this.category = category + this.createdDate = new Date(createdDate) + this.updatedDate = new Date(updatedDate) + this.fictionalDate = new Date(fictionalDate) + this.tags = tags.map(dt => new Tag(dt.kind, dt.name)) + this.chapters = chapters != null ? chapters.map(c => new Chapter(c.id, c.title, c.author, c.source, c.createdDate, c.fictionalDate, c.editedDate)) : null + } +} + +class StoryCategory { + constructor(name, description) { + this.name = name + this.description = description + } +} + +const data = { + categories: null +} + +/** + * storyApi contains the API queries + */ +const storyApi = { + /** + * Call `stories(filter)` query + * + * @param {{author:string, category:string, tags:Tag[]|Tag, unlisted: boolean, open: boolean, earliestFictionalDate:Date|string, latestFictionalDate:Date|string, limit:number}} filter + * @returns {Promise} + */ + list(filter = {}) { + if (filter.earliestFictionalDate != null && typeof(filter.earliestFictionalDate) !== "string") { + filter.earliestFictionalDate = filter.earliestFictionalDate.toISOString() + } + if (filter.latestFictionalDate != null && typeof(filter.latestFictionalDate) !== "string") { + filter.latestFictionalDate = filter.latestFictionalDate.toISOString() + } + + return query(` + query ListStories($filter: StoriesFilter) { + stories(filter: $filter) { + id + name + author + category + tags { + kind + name + } + createdDate + fictionalDate + updatedDate + } + } + `, {filter}).then(({stories}) => { + return stories.map(d => new Story(d.id, d.name, d.author, d.category, d.createdDate, d.updatedDate, d.fictionalDate, d.tags)) + }) + }, + + /** + * @param {string} id + * @returns {Promise} + */ + find(id) { + return query(` + query FindStory($id: String!) { + story(id: $id) { + id + name + author + category + tags { + kind + name + } + createdDate + fictionalDate + updatedDate + chapters { + id + title + author + source + createdDate + fictionalDate + editedDate + } + } + } + `, {id}).then(({story}) => { + return new Story( + story.id, story.name, story.author, story.category, + story.createdDate, story.updatedDate, story.fictionalDate, + story.tags, story.chapters + ) + }) + }, + + /** + * Call `__type(name: "StoryCategory")` query and extracts the catogires from it + * + * @returns {Promise} + */ + categories() { + if (data.categories !== null) { + return data.categories + } + + return query(` + query ListStoryCategories { + categoryType: __type(name: "StoryCategory") { + enumValues { + name + description + } + } + } + `, {}).then(({categoryType}) => { + data.categories = categoryType.enumValues.map(d => new StoryCategory(d.name, d.description)) + return data.categories + }) + }, +} + +module.exports = {storyApi, Story} \ No newline at end of file diff --git a/rpdata/api/Tag.js b/rpdata/api/Tag.js new file mode 100644 index 0000000..9fac33d --- /dev/null +++ b/rpdata/api/Tag.js @@ -0,0 +1,34 @@ +const {query} = require("../client") + +class Tag { + /** + * @param {string} kind + * @param {string} name + */ + constructor(kind, name) { + this.kind = kind + this.name = name + } +} + +const tagApi = { + /** + * Call `tags` query + * + * @returns {Promise} + */ + list() { + return query(` + query Tags { + tags { + kind + name + } + } + `, {}).then(({tags}) => { + return tags.map(d => new Tag(d)) + }) + }, +} + +module.exports = {Tag, tagApi} \ No newline at end of file diff --git a/rpdata/api/index.js b/rpdata/api/index.js new file mode 100644 index 0000000..702f1ab --- /dev/null +++ b/rpdata/api/index.js @@ -0,0 +1,6 @@ +module.exports = { + ...require("./LogHeader"), + ...require("./Chapter"), + ...require("./Story"), + ...require("./Tag"), +} \ No newline at end of file diff --git a/rpdata/client.js b/rpdata/client.js new file mode 100644 index 0000000..3ca3719 --- /dev/null +++ b/rpdata/client.js @@ -0,0 +1,40 @@ +const fetch = require("isomorphic-fetch") +const config = require("../config") +const compressQuery = require("graphql-query-compress") + +/** + * Run a GraphQL query against the rpdata backend + * + * @param {string} query The query to run + * @param {{[x:string]: any}} variables + * @param {{operationName:string, token: string, permissions: string[]}} options + */ +function query(query, variables = {}, options = {}) { + return fetch(config.graphqlEndpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": options.token ? `Bearer ${options.token}` : null, + "X-Permissions": options.permissions ? options.permissions.join(",") : null, + }, + body: JSON.stringify({query: query.length > 256 ? compressQuery(query || "") : query, variables, operationName: options.operationName}), + credentials: "include", + }).then(res => { + if (!res.ok) { + return Promise.reject([{ + message: `HTTP: ${res.statusText}`, + location: null, + }]) + } + + return res.json() + }).then(json => { + if (json.errors != null && json.errors.length > 0) { + return Promise.reject(json.errors) + } + + return json.data + }) +} + +module.exports = { query } \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..e6c0bae --- /dev/null +++ b/server.js @@ -0,0 +1,101 @@ +// Setup global environment +require("marko/node-require").install() +require("marko/express") +require("es6-promise").polyfill() + +// Load server config +const config = require("./config") + +// Express depedencies +const express = require("express") +const proxy = require("express-http-proxy") +const lasso = require("lasso") +const lassoMiddleware = require("lasso/middleware") +const bodyParser = require("body-parser") + +// Load middleware +const passport = require("./middleware/passport") +const session = require("./middleware/session") + +// Setup express +const app = express() + +// Configure lasso +const isProduction = process.env.NODE_ENV === "production" +lasso.configure({ + plugins: [ + "lasso-marko", + "lasso-less", + ], + outputDir: "./.static", // Place all generated JS/CSS/etc. files into the "static" dir + bundlingEnabled: isProduction, // Only enable bundling in production + minify: isProduction, // Only minify JS and CSS code in production + fingerprintsEnabled: isProduction, // Only add fingerprints to URLs in production + + require: { + builtins: { + fs: require.resolve("empty-module"), + }, + + transforms: isProduction ? [ + { + transform: "lasso-babel-transform", + config: { + extensions: [".js", ".es6"], // Enabled file extensions. Default: [".js", ".es6"] + babelOptions: { + presets: [ "es2015" ] + } + } + } + ] : null + } +}) + +// Apply middleware +app.use(session) +app.use(passport.initialize()) +app.use(passport.session()) +app.use(require("./middleware/locals")) +app.use(bodyParser.json({limit: "1mb"})) +app.use(bodyParser.text({limit: "256kb"})) + +// Static assets +app.use("/assets", express.static(__dirname + "/assets")) +app.use(lassoMiddleware.serveStatic()) + +// Authentication +app.use("/auth", require("./routes/auth")) + +// API Proxy +app.use("/graphql", require("./routes/graphql")) + +// Page routes +app.use("/story/", require("./routes/story")) +app.use("/story/by-category/", require("./routes/story/by-category")) +app.use("/story/by-tag/", require("./routes/story/by-tag")) +app.use("/story/tag-list/", require("./routes/story/tag-list")) +app.use("/story/:id(S[0-9a-z]{15})/", require("./routes/story-content")) +app.use("/logs/", require("./routes/logs")) + +// Entry point +app.get("/", function(req, res) { + res.redirect("/story/") +}) + +// Render common templates +require("./marko/page/story/list.marko").render() +require("./marko/page/logs/list.marko").render() +require("./marko/page/story-content/view.marko").render({story: {chapters: []}}) + +// Start server +app.listen(config.port, function() { + console.log("Server started: http://localhost:" + config.port + "/") + + if (process.send) { + setTimeout(() => process.send("online"), 500) + } +}) + +// Handle shutdown signals (Docker needs this to shutdown quickly) +process.on('SIGINT', () => process.exit(0)) +process.on('SIGTERM', () => process.exit(0)) \ No newline at end of file