Просмотр исходного кода

Merge official crowi v1.6.3

* except @slack/client related impl

# Conflicts:
#	CHANGES.md
#	lib/routes/admin.js
#	lib/routes/me.js
#	lib/util/slack.js
#	npm-shrinkwrap.json
#	package.json
#	test/models/user.test.js
Yuki Takei 8 лет назад
Родитель
Сommit
d4d2683924

+ 3 - 0
bin/revision-string-replacer.js

@@ -20,6 +20,9 @@ cli.main(function(args, options)
     , dry = options.dry
     , dry = options.dry
     ;
     ;
 
 
+  console.log('This scriprt is not working now. Should be fixed.');
+  cli.exit(1);
+
   if (!to || !from) {
   if (!to || !from) {
     cli.error('"to" and "from" options are required.\n');
     cli.error('"to" and "from" options are required.\n');
     cli.output(cli.getUsage());
     cli.output(cli.getUsage());

+ 2 - 2
lib/routes/admin.js

@@ -199,8 +199,8 @@ module.exports = function(crowi, app) {
 
 
   // app.get('/admin/notification/slackAuth'     , admin.notification.slackauth);
   // app.get('/admin/notification/slackAuth'     , admin.notification.slackauth);
   actions.notification.slackAuth = function(req, res) {
   actions.notification.slackAuth = function(req, res) {
-    var code = req.query.code;
-    var config = crowi.getConfig();
+    const code = req.query.code;
+    const config = crowi.getConfig();
 
 
     if (!code || !Config.hasSlackAppConfig(req.config)) {
     if (!code || !Config.hasSlackAppConfig(req.config)) {
       return res.redirect('/admin/notification');
       return res.redirect('/admin/notification');

+ 2 - 0
lib/routes/attachment.js

@@ -23,12 +23,14 @@ module.exports = function(crowi, app) {
       // TODO: file delivery plugin for cdn
       // TODO: file delivery plugin for cdn
       Attachment.findDeliveryFile(data)
       Attachment.findDeliveryFile(data)
       .then(fileName => {
       .then(fileName => {
+        const encodedFileName = encodeURIComponent(data.originalName);
 
 
         var deliveryFile = {
         var deliveryFile = {
           fileName: fileName,
           fileName: fileName,
           options: {
           options: {
             headers: {
             headers: {
               'Content-Type': data.fileFormat,
               'Content-Type': data.fileFormat,
+              'Content-Disposition': `inline;filename*=UTF-8''${encodedFileName}`,
             },
             },
           },
           },
         };
         };

+ 15 - 5
lib/routes/page.js

@@ -872,12 +872,22 @@ module.exports = function(crowi, app) {
    * @apiParam {String} revision_id
    * @apiParam {String} revision_id
    */
    */
   api.get = function(req, res){
   api.get = function(req, res){
-    var pagePath = req.query.path || null;
-    var pageId = req.query.page_id || null; // TODO: handling
-    var revisionId = req.query.revision_id || null;
+    const pagePath = req.query.path || null;
+    const pageId = req.query.page_id || null; // TODO: handling
+    const revisionId = req.query.revision_id || null;
 
 
-    Page.findPage(pagePath, req.user, revisionId)
-    .then(function(pageData) {
+    if (!pageId && !pagePath) {
+      return res.json(ApiResponse.error(new Error('Parameter path or page_id is required.')));
+    }
+
+    let pageFinder;
+    if (pageId) { // prioritized
+      pageFinder = Page.findPageByIdAndGrantedUser(pageId, req.user);
+    } else if (pagePath) {
+      pageFinder = Page.findPage(pagePath, req.user, revisionId);
+    }
+
+    pageFinder.then(function(pageData) {
       var result = {};
       var result = {};
       result.page = pageData;
       result.page = pageData;
 
 

+ 1 - 1
lib/views/mail/admin/userWaitingActivation.txt

@@ -12,7 +12,7 @@ Email: {{ createdUser.email }}
 ====
 ====
 
 
 Please do some action with following URL:
 Please do some action with following URL:
-{{ url }}/admin/user
+{{ url }}/admin/users
 
 
 
 
 --
 --

+ 12 - 11
package.json

@@ -45,18 +45,19 @@
   },
   },
   "dependencies": {
   "dependencies": {
     "8fold-marked": "^0.3.7",
     "8fold-marked": "^0.3.7",
+    "@slack/client": "~3.13.0",
     "assets-webpack-plugin": "~3.5.1",
     "assets-webpack-plugin": "~3.5.1",
     "async": "^2.3.0",
     "async": "^2.3.0",
-    "aws-sdk": "^2.80.0",
-    "axios": "^0.16.1",
-    "babel-core": "^6.24.0",
-    "babel-loader": "^7.0.0",
-    "babel-preset-env": "^1.4.0",
-    "babel-preset-react": "^6.23.0",
+    "aws-sdk": "^2.88.0",
+    "axios": "^0.16.2",
+    "babel-core": "^6.25.0",
+    "babel-loader": "^7.1.1",
+    "babel-preset-env": "^1.6.0",
+    "babel-preset-react": "^6.24.1",
     "basic-auth-connect": "~1.0.0",
     "basic-auth-connect": "~1.0.0",
-    "body-parser": "^1.17.1",
+    "body-parser": "~1.17.2",
     "bootstrap-sass": "~3.3.6",
     "bootstrap-sass": "~3.3.6",
-    "botkit": "^0.6.0",
+    "botkit": "^0.6.4",
     "check-node-version": "^2.0.1",
     "check-node-version": "^2.0.1",
     "connect-flash": "~0.1.1",
     "connect-flash": "~0.1.1",
     "connect-redis": "^3.3.0",
     "connect-redis": "^3.3.0",
@@ -65,7 +66,7 @@
     "csrf": "~3.0.3",
     "csrf": "~3.0.3",
     "css-loader": "^0.28.0",
     "css-loader": "^0.28.0",
     "debug": "^3.1.0",
     "debug": "^3.1.0",
-    "diff": "^3.2.0",
+    "diff": "^3.3.0",
     "diff2html": "^2.3.0",
     "diff2html": "^2.3.0",
     "elasticsearch": "^13.2.0",
     "elasticsearch": "^13.2.0",
     "emojify.js": "^1.1.0",
     "emojify.js": "^1.1.0",
@@ -80,7 +81,7 @@
     "googleapis": "^22.0.0",
     "googleapis": "^22.0.0",
     "graceful-fs": "^4.1.11",
     "graceful-fs": "^4.1.11",
     "highlight.js": "^9.10.0",
     "highlight.js": "^9.10.0",
-    "i18next": "^9.0.0",
+    "i18next": "^10.0.1",
     "i18next-express-middleware": "^1.0.5",
     "i18next-express-middleware": "^1.0.5",
     "i18next-node-fs-backend": "^1.0.0",
     "i18next-node-fs-backend": "^1.0.0",
     "i18next-sprintf-postprocessor": "^0.2.2",
     "i18next-sprintf-postprocessor": "^0.2.2",
@@ -89,7 +90,7 @@
     "md5": "^2.2.1",
     "md5": "^2.2.1",
     "method-override": "^2.3.10",
     "method-override": "^2.3.10",
     "mkdirp": "~0.5.1",
     "mkdirp": "~0.5.1",
-    "moment": "^2.18.0",
+    "moment": "~2.18.1",
     "mongoose": "4.11.14",
     "mongoose": "4.11.14",
     "mongoose-paginate": "5.0.x",
     "mongoose-paginate": "5.0.x",
     "mongoose-unique-validator": "^1.0.6",
     "mongoose-unique-validator": "^1.0.6",

+ 1 - 1
resource/css/_wiki.scss

@@ -145,7 +145,7 @@ div.body {
   }
   }
 
 
   img.emoji {
   img.emoji {
-    width: 0.95em;
+    width: 1.1em;
     margin: 1px;
     margin: 1px;
     border: none;
     border: none;
     box-shadow: none;
     box-shadow: none;

+ 0 - 1
resource/js/legacy/crowi.js

@@ -3,7 +3,6 @@
 */
 */
 
 
 var io = require('socket.io-client');
 var io = require('socket.io-client');
-var moment = require("moment");
 require('bootstrap-sass');
 require('bootstrap-sass');
 require('jquery.cookie');
 require('jquery.cookie');
 
 

+ 97 - 56
test/models/page.test.js

@@ -6,20 +6,23 @@ var chai = require('chai')
   ;
   ;
 chai.use(sinonChai);
 chai.use(sinonChai);
 
 
-describe('Page', function () {
+describe('Page', () => {
   var Page = utils.models.Page,
   var Page = utils.models.Page,
     User   = utils.models.User,
     User   = utils.models.User,
-    conn   = utils.mongoose.connection;
+    conn   = utils.mongoose.connection,
+    createdPages,
+    createdUsers;
 
 
-  before(function (done) {
-    Promise.resolve().then(function() {
+  before(done => {
+    Promise.resolve().then(() => {
       var userFixture = [
       var userFixture = [
         {name: 'Anon 0', username: 'anonymous0', email: 'anonymous0@example.com'},
         {name: 'Anon 0', username: 'anonymous0', email: 'anonymous0@example.com'},
         {name: 'Anon 1', username: 'anonymous1', email: 'anonymous1@example.com'}
         {name: 'Anon 1', username: 'anonymous1', email: 'anonymous1@example.com'}
       ];
       ];
 
 
       return testDBUtil.generateFixture(conn, 'User', userFixture);
       return testDBUtil.generateFixture(conn, 'User', userFixture);
-    }).then(function(testUsers) {
+    }).then(testUsers => {
+      createdUsers = testUsers;
       var testUser0 = testUsers[0];
       var testUser0 = testUsers[0];
 
 
       var fixture = [
       var fixture = [
@@ -62,16 +65,17 @@ describe('Page', function () {
       ];
       ];
 
 
       return testDBUtil.generateFixture(conn, 'Page', fixture)
       return testDBUtil.generateFixture(conn, 'Page', fixture)
-      .then(function(pages) {
+      .then(pages => {
+        createdPages = pages;
         done();
         done();
       });
       });
     });
     });
   });
   });
 
 
-  describe('.isPublic', function () {
-    context('with a public page', function() {
-      it('should return true', function(done) {
-        Page.findOne({path: '/grant/public'}, function(err, page) {
+  describe('.isPublic', () => {
+    context('with a public page', () => {
+      it('should return true', done => {
+        Page.findOne({path: '/grant/public'}, (err, page) => {
           expect(err).to.be.null;
           expect(err).to.be.null;
           expect(page.isPublic()).to.be.equal(true);
           expect(page.isPublic()).to.be.equal(true);
           done();
           done();
@@ -79,10 +83,10 @@ describe('Page', function () {
       });
       });
     });
     });
 
 
-    ['restricted', 'specified', 'owner'].forEach(function(grant) {
-      context('with a ' + grant + ' page', function() {
-        it('should return false', function(done) {
-          Page.findOne({path: '/grant/' + grant}, function(err, page) {
+    ['restricted', 'specified', 'owner'].forEach(grant => {
+      context('with a ' + grant + ' page', () => {
+        it('should return false', done => {
+          Page.findOne({path: '/grant/' + grant}, (err, page) => {
             expect(err).to.be.null;
             expect(err).to.be.null;
             expect(page.isPublic()).to.be.equal(false);
             expect(page.isPublic()).to.be.equal(false);
             done();
             done();
@@ -92,22 +96,22 @@ describe('Page', function () {
     });
     });
   });
   });
 
 
-  describe('.getDeletedPageName', function() {
-    it('should return trash page name', function() {
+  describe('.getDeletedPageName', () => {
+    it('should return trash page name', () => {
       expect(Page.getDeletedPageName('/hoge')).to.be.equal('/trash/hoge');
       expect(Page.getDeletedPageName('/hoge')).to.be.equal('/trash/hoge');
       expect(Page.getDeletedPageName('hoge')).to.be.equal('/trash/hoge');
       expect(Page.getDeletedPageName('hoge')).to.be.equal('/trash/hoge');
     });
     });
   });
   });
-  describe('.getRevertDeletedPageName', function() {
-    it('should return reverted trash page name', function() {
+  describe('.getRevertDeletedPageName', () => {
+    it('should return reverted trash page name', () => {
       expect(Page.getRevertDeletedPageName('/hoge')).to.be.equal('/hoge');
       expect(Page.getRevertDeletedPageName('/hoge')).to.be.equal('/hoge');
       expect(Page.getRevertDeletedPageName('/trash/hoge')).to.be.equal('/hoge');
       expect(Page.getRevertDeletedPageName('/trash/hoge')).to.be.equal('/hoge');
       expect(Page.getRevertDeletedPageName('/trash/hoge/trash')).to.be.equal('/hoge/trash');
       expect(Page.getRevertDeletedPageName('/trash/hoge/trash')).to.be.equal('/hoge/trash');
     });
     });
   });
   });
 
 
-  describe('.isDeletableName', function() {
-    it('should decide deletable or not', function() {
+  describe('.isDeletableName', () => {
+    it('should decide deletable or not', () => {
       expect(Page.isDeletableName('/hoge')).to.be.true;
       expect(Page.isDeletableName('/hoge')).to.be.true;
       expect(Page.isDeletableName('/user/xxx')).to.be.false;
       expect(Page.isDeletableName('/user/xxx')).to.be.false;
       expect(Page.isDeletableName('/user/xxx123')).to.be.false;
       expect(Page.isDeletableName('/user/xxx123')).to.be.false;
@@ -116,8 +120,8 @@ describe('Page', function () {
     });
     });
   });
   });
 
 
-  describe('.isCreatableName', function() {
-    it('should decide creatable or not', function() {
+  describe('.isCreatableName', () => {
+    it('should decide creatable or not', () => {
       expect(Page.isCreatableName('/hoge')).to.be.true;
       expect(Page.isCreatableName('/hoge')).to.be.true;
 
 
       // edge cases
       // edge cases
@@ -164,13 +168,13 @@ describe('Page', function () {
     });
     });
   });
   });
 
 
-  describe('.isCreator', function() {
-    context('with creator', function() {
-      it('should return true', function(done) {
-        User.findOne({email: 'anonymous0@example.com'}, function(err, user) {
+  describe('.isCreator', () => {
+    context('with creator', () => {
+      it('should return true', done => {
+        User.findOne({email: 'anonymous0@example.com'}, (err, user) => {
           if (err) { done(err); }
           if (err) { done(err); }
 
 
-          Page.findOne({path: '/user/anonymous/memo'}, function(err, page) {
+          Page.findOne({path: '/user/anonymous/memo'}, (err, page) => {
             expect(page.isCreator(user)).to.be.equal(true);
             expect(page.isCreator(user)).to.be.equal(true);
             done();
             done();
           })
           })
@@ -178,12 +182,12 @@ describe('Page', function () {
       });
       });
     });
     });
 
 
-    context('with non-creator', function() {
-      it('should return false', function(done) {
-        User.findOne({email: 'anonymous1@example.com'}, function(err, user) {
+    context('with non-creator', () => {
+      it('should return false', done => {
+        User.findOne({email: 'anonymous1@example.com'}, (err, user) => {
           if (err) { done(err); }
           if (err) { done(err); }
 
 
-          Page.findOne({path: '/user/anonymous/memo'}, function(err, page) {
+          Page.findOne({path: '/user/anonymous/memo'}, (err, page) => {
             expect(page.isCreator(user)).to.be.equal(false);
             expect(page.isCreator(user)).to.be.equal(false);
             done();
             done();
           })
           })
@@ -192,13 +196,13 @@ describe('Page', function () {
     });
     });
   });
   });
 
 
-  describe('.isGrantedFor', function() {
-    context('with a granted user', function() {
-      it('should return true', function(done) {
-        User.findOne({email: 'anonymous0@example.com'}, function(err, user) {
+  describe('.isGrantedFor', () => {
+    context('with a granted user', () => {
+      it('should return true', done => {
+        User.findOne({email: 'anonymous0@example.com'}, (err, user) => {
           if (err) { done(err); }
           if (err) { done(err); }
 
 
-          Page.findOne({path: '/user/anonymous/memo'}, function(err, page) {
+          Page.findOne({path: '/user/anonymous/memo'}, (err, page) => {
             if (err) { done(err); }
             if (err) { done(err); }
 
 
             expect(page.isGrantedFor(user)).to.be.equal(true);
             expect(page.isGrantedFor(user)).to.be.equal(true);
@@ -208,12 +212,12 @@ describe('Page', function () {
       });
       });
     });
     });
 
 
-    context('with a public page', function() {
-      it('should return true', function(done) {
-        User.findOne({email: 'anonymous1@example.com'}, function(err, user) {
+    context('with a public page', () => {
+      it('should return true', done => {
+        User.findOne({email: 'anonymous1@example.com'}, (err, user) => {
           if (err) { done(err); }
           if (err) { done(err); }
 
 
-          Page.findOne({path: '/grant/public'}, function(err, page) {
+          Page.findOne({path: '/grant/public'}, (err, page) => {
             if (err) { done(err); }
             if (err) { done(err); }
 
 
             expect(page.isGrantedFor(user)).to.be.equal(true);
             expect(page.isGrantedFor(user)).to.be.equal(true);
@@ -223,12 +227,12 @@ describe('Page', function () {
       });
       });
     });
     });
 
 
-    context('with a restricted page and an user who has no grant', function() {
-      it('should return false', function(done) {
-        User.findOne({email: 'anonymous1@example.com'}, function(err, user) {
+    context('with a restricted page and an user who has no grant', () => {
+      it('should return false', done => {
+        User.findOne({email: 'anonymous1@example.com'}, (err, user) => {
           if (err) { done(err); }
           if (err) { done(err); }
 
 
-          Page.findOne({path: '/grant/restricted'}, function(err, page) {
+          Page.findOne({path: '/grant/restricted'}, (err, page) => {
             if (err) { done(err); }
             if (err) { done(err); }
 
 
             expect(page.isGrantedFor(user)).to.be.equal(false);
             expect(page.isGrantedFor(user)).to.be.equal(false);
@@ -239,21 +243,21 @@ describe('Page', function () {
     });
     });
   });
   });
 
 
-  describe('Extended field', function () {
-    context('Slack Channel.', function() {
-      it('should be empty', function(done) {
-        Page.findOne({path: '/page/for/extended'}, function(err, page) {
+  describe('Extended field', () => {
+    context('Slack Channel.', () => {
+      it('should be empty', done => {
+        Page.findOne({path: '/page/for/extended'}, (err, page) => {
           expect(page.extended.hoge).to.be.equal(1);
           expect(page.extended.hoge).to.be.equal(1);
           expect(page.getSlackChannel()).to.be.equal('');
           expect(page.getSlackChannel()).to.be.equal('');
           done();
           done();
         })
         })
       });
       });
 
 
-      it('set slack channel and should get it and should keep hoge ', function(done) {
-        Page.findOne({path: '/page/for/extended'}, function(err, page) {
+      it('set slack channel and should get it and should keep hoge ', done => {
+        Page.findOne({path: '/page/for/extended'}, (err, page) => {
           page.updateSlackChannel('slack-channel1')
           page.updateSlackChannel('slack-channel1')
-          .then(function(data) {
-            Page.findOne({path: '/page/for/extended'}, function(err, page) {
+          .then(data => {
+            Page.findOne({path: '/page/for/extended'}, (err, page) => {
               expect(page.extended.hoge).to.be.equal(1);
               expect(page.extended.hoge).to.be.equal(1);
               expect(page.getSlackChannel()).to.be.equal('slack-channel1');
               expect(page.getSlackChannel()).to.be.equal('slack-channel1');
               done();
               done();
@@ -265,18 +269,55 @@ describe('Page', function () {
     });
     });
   });
   });
 
 
-  describe('Normalize path', function () {
-    context('Normalize', function() {
-      it('should start with slash', function(done) {
+  describe('Normalize path', () => {
+    context('Normalize', () => {
+      it('should start with slash', done => {
         expect(Page.normalizePath('hoge/fuga')).to.equal('/hoge/fuga');
         expect(Page.normalizePath('hoge/fuga')).to.equal('/hoge/fuga');
         done();
         done();
       });
       });
 
 
-      it('should trim spaces of slash', function(done) {
+      it('should trim spaces of slash', done => {
         expect(Page.normalizePath('/ hoge / fuga')).to.equal('/hoge/fuga');
         expect(Page.normalizePath('/ hoge / fuga')).to.equal('/hoge/fuga');
         done();
         done();
       });
       });
     });
     });
   });
   });
 
 
+  describe('.findPage', () => {
+    context('findPageById', () => {
+      it('should find page', done => {
+        const pageToFind = createdPages[0];
+        Page.findPageById(pageToFind._id)
+        .then(pageData => {
+          expect(pageData.path).to.equal(pageToFind.path);
+          done();
+        });
+      });
+    });
+
+    context('findPageByIdAndGrantedUser', () => {
+      it('should find page', done => {
+        const pageToFind = createdPages[0];
+        const grantedUser = createdUsers[0];
+        Page.findPageByIdAndGrantedUser(pageToFind._id, grantedUser)
+        .then(pageData => {
+          expect(pageData.path).to.equal(pageToFind.path);
+          done();
+        });
+      });
+
+      it('should error by grant', done => {
+        const pageToFind = createdPages[0];
+        const grantedUser = createdUsers[1];
+        Page.findPageByIdAndGrantedUser(pageToFind._id, grantedUser)
+        .then(pageData => {
+          done(new Error());
+        }).catch(err => {
+          expect(err).to.instanceof(Error);
+          done();
+        });
+      });
+    });
+  });
+
 });
 });

+ 1 - 1
test/models/user.test.js

@@ -33,7 +33,7 @@ describe('User', function () {
 
 
         User.findUsersByPartOfEmail('ao', {})
         User.findUsersByPartOfEmail('ao', {})
         .then(function(userData) {
         .then(function(userData) {
-          expect(userData).to.be.a('array');
+          expect(userData).to.instanceof(Array);
           expect(userData[0]).to.instanceof(User);
           expect(userData[0]).to.instanceof(User);
           expect(userData[0].email).to.equal('aoi@example.com');
           expect(userData[0].email).to.equal('aoi@example.com');
           done();
           done();

+ 302 - 79
yarn.lock

@@ -191,6 +191,23 @@
     babel-runtime "^6.23.0"
     babel-runtime "^6.23.0"
     envify "^3.4.1"
     envify "^3.4.1"
 
 
+"@slack/client@~3.13.0":
+  version "3.13.0"
+  resolved "https://registry.yarnpkg.com/@slack/client/-/client-3.13.0.tgz#c4c297af5846210939773572f0c6985017754a13"
+  dependencies:
+    async "^1.5.0"
+    bluebird "^3.3.3"
+    eventemitter3 "^1.1.1"
+    https-proxy-agent "^1.0.0"
+    inherits "^2.0.1"
+    lodash "^4.13.1"
+    pkginfo "^0.4.0"
+    request "^2.64.0"
+    retry "^0.9.0"
+    url-join "0.0.1"
+    winston "^2.1.1"
+    ws "^1.0.1"
+
 abbrev@1:
 abbrev@1:
   version "1.1.0"
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
@@ -231,6 +248,13 @@ after@0.8.2:
   version "0.8.2"
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
   resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
 
 
+agent-base@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
+  dependencies:
+    extend "~3.0.0"
+    semver "~5.0.1"
+
 agent-base@^4.1.0:
 agent-base@^4.1.0:
   version "4.1.1"
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.1.1.tgz#92d8a4fc2524a3b09b3666a33b6c97960f23d6a4"
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.1.1.tgz#92d8a4fc2524a3b09b3666a33b6c97960f23d6a4"
@@ -261,6 +285,15 @@ ajv@^5.0.0, ajv@^5.1.5:
     json-schema-traverse "^0.3.0"
     json-schema-traverse "^0.3.0"
     json-stable-stringify "^1.0.1"
     json-stable-stringify "^1.0.1"
 
 
+ajv@^5.1.0:
+  version "5.2.3"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    json-schema-traverse "^0.3.0"
+    json-stable-stringify "^1.0.1"
+
 align-text@^0.1.1, align-text@^0.1.3:
 align-text@^0.1.1, align-text@^0.1.3:
   version "0.1.4"
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
   resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -474,7 +507,7 @@ async@^0.9.0:
   version "0.9.2"
   version "0.9.2"
   resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
   resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
 
 
-async@^1.5.2:
+async@^1.5.0, async@^1.5.2:
   version "1.5.2"
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
 
 
@@ -488,6 +521,10 @@ async@~0.2.6:
   version "0.2.10"
   version "0.2.10"
   resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
   resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
 
 
+async@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
+
 async@~1.2.1:
 async@~1.2.1:
   version "1.2.1"
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/async/-/async-1.2.1.tgz#a4816a17cd5ff516dfa2c7698a453369b9790de0"
   resolved "https://registry.yarnpkg.com/async/-/async-1.2.1.tgz#a4816a17cd5ff516dfa2c7698a453369b9790de0"
@@ -528,9 +565,9 @@ aws-sdk@^2.2.36:
     xml2js "0.4.17"
     xml2js "0.4.17"
     xmlbuilder "4.2.1"
     xmlbuilder "4.2.1"
 
 
-aws-sdk@^2.80.0:
-  version "2.125.0"
-  resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.125.0.tgz#c0c3131b57eef4a051c7266cc3b47a704e7e36ab"
+aws-sdk@^2.88.0:
+  version "2.131.0"
+  resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.131.0.tgz#5b213fa493ce36a88130b50bef0e9a0cb6cd9f72"
   dependencies:
   dependencies:
     buffer "4.9.1"
     buffer "4.9.1"
     crypto-browserify "1.0.9"
     crypto-browserify "1.0.9"
@@ -539,7 +576,7 @@ aws-sdk@^2.80.0:
     querystring "0.2.0"
     querystring "0.2.0"
     sax "1.2.1"
     sax "1.2.1"
     url "0.10.3"
     url "0.10.3"
-    uuid "3.0.1"
+    uuid "3.1.0"
     xml2js "0.4.17"
     xml2js "0.4.17"
     xmlbuilder "4.2.1"
     xmlbuilder "4.2.1"
 
 
@@ -547,11 +584,15 @@ aws-sign2@~0.6.0:
   version "0.6.0"
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
 
 
-aws4@^1.2.1:
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.2.1, aws4@^1.6.0:
   version "1.6.0"
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
 
 
-axios@^0.16.1:
+axios@^0.16.2:
   version "0.16.2"
   version "0.16.2"
   resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d"
   resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d"
   dependencies:
   dependencies:
@@ -566,7 +607,7 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.26.0:
     esutils "^2.0.2"
     esutils "^2.0.2"
     js-tokens "^3.0.2"
     js-tokens "^3.0.2"
 
 
-babel-core@^6.24.0, babel-core@^6.26.0:
+babel-core@^6.25.0, babel-core@^6.26.0:
   version "6.26.0"
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
   resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
   dependencies:
   dependencies:
@@ -712,7 +753,7 @@ babel-helpers@^6.24.1:
     babel-runtime "^6.22.0"
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
     babel-template "^6.24.1"
 
 
-babel-loader@^7.0.0:
+babel-loader@^7.1.1:
   version "7.1.2"
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126"
   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126"
   dependencies:
   dependencies:
@@ -992,7 +1033,7 @@ babel-polyfill@^6.23.0:
     core-js "^2.5.0"
     core-js "^2.5.0"
     regenerator-runtime "^0.10.5"
     regenerator-runtime "^0.10.5"
 
 
-babel-preset-env@^1.4.0:
+babel-preset-env@^1.6.0:
   version "1.6.0"
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4"
   resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4"
   dependencies:
   dependencies:
@@ -1033,7 +1074,7 @@ babel-preset-flow@^6.23.0:
   dependencies:
   dependencies:
     babel-plugin-transform-flow-strip-types "^6.22.0"
     babel-plugin-transform-flow-strip-types "^6.22.0"
 
 
-babel-preset-react@^6.23.0:
+babel-preset-react@^6.24.1:
   version "6.24.1"
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
   resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
   dependencies:
   dependencies:
@@ -1202,6 +1243,10 @@ bluebird@3.0.5:
   version "3.0.5"
   version "3.0.5"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.0.5.tgz#2ff9d07c9b3edb29d6d280fe07528365e7ecd392"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.0.5.tgz#2ff9d07c9b3edb29d6d280fe07528365e7ecd392"
 
 
+bluebird@^3.3.3:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
 bluebird@^3.5.0:
 bluebird@^3.5.0:
   version "3.5.0"
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
@@ -1225,12 +1270,39 @@ body-parser@1.18.2, body-parser@^1.17.1:
     raw-body "2.3.2"
     raw-body "2.3.2"
     type-is "~1.6.15"
     type-is "~1.6.15"
 
 
+body-parser@~1.17.2:
+  version "1.17.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee"
+  dependencies:
+    bytes "2.4.0"
+    content-type "~1.0.2"
+    debug "2.6.7"
+    depd "~1.1.0"
+    http-errors "~1.6.1"
+    iconv-lite "0.4.15"
+    on-finished "~2.3.0"
+    qs "6.4.0"
+    raw-body "~2.2.0"
+    type-is "~1.6.15"
+
 boom@2.x.x:
 boom@2.x.x:
   version "2.10.1"
   version "2.10.1"
   resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
   resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
   dependencies:
   dependencies:
     hoek "2.x.x"
     hoek "2.x.x"
 
 
+boom@4.x.x:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+  dependencies:
+    hoek "4.x.x"
+
+boom@5.x.x:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+  dependencies:
+    hoek "4.x.x"
+
 bootstrap-sass@~3.3.6:
 bootstrap-sass@~3.3.6:
   version "3.3.7"
   version "3.3.7"
   resolved "https://registry.yarnpkg.com/bootstrap-sass/-/bootstrap-sass-3.3.7.tgz#6596c7ab40f6637393323ab0bc80d064fc630498"
   resolved "https://registry.yarnpkg.com/bootstrap-sass/-/bootstrap-sass-3.3.7.tgz#6596c7ab40f6637393323ab0bc80d064fc630498"
@@ -1256,9 +1328,9 @@ botkit-studio-sdk@^1.0.2:
     promise "^7.1.1"
     promise "^7.1.1"
     request "^2.67.0"
     request "^2.67.0"
 
 
-botkit@^0.6.0:
-  version "0.6.3"
-  resolved "https://registry.yarnpkg.com/botkit/-/botkit-0.6.3.tgz#5d67247255ebb7e243e4736caa3bb96fd8cd9571"
+botkit@^0.6.4:
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/botkit/-/botkit-0.6.4.tgz#f24ea3875ffe1d5e992081e162f6e1086f7fb00b"
   dependencies:
   dependencies:
     async "^2.1.5"
     async "^2.1.5"
     back "^1.0.1"
     back "^1.0.1"
@@ -1411,6 +1483,10 @@ busboy@^0.2.11:
     dicer "0.2.5"
     dicer "0.2.5"
     readable-stream "1.1.x"
     readable-stream "1.1.x"
 
 
+bytes@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
 bytes@3.0.0:
 bytes@3.0.0:
   version "3.0.0"
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@@ -1698,7 +1774,7 @@ colormin@^1.0.5:
     css-color-names "0.0.4"
     css-color-names "0.0.4"
     has "^1.0.1"
     has "^1.0.1"
 
 
-colors@1.0.3:
+colors@1.0.3, colors@1.0.x:
   version "1.0.3"
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
 
 
@@ -1925,6 +2001,12 @@ cryptiles@2.x.x:
   dependencies:
   dependencies:
     boom "2.x.x"
     boom "2.x.x"
 
 
+cryptiles@3.x.x:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+  dependencies:
+    boom "5.x.x"
+
 crypto-browserify@1.0.9:
 crypto-browserify@1.0.9:
   version "1.0.9"
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-1.0.9.tgz#cc5449685dfb85eb11c9828acc7cb87ab5bbfcc0"
   resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-1.0.9.tgz#cc5449685dfb85eb11c9828acc7cb87ab5bbfcc0"
@@ -2041,6 +2123,10 @@ currently-unhandled@^0.4.1:
   dependencies:
   dependencies:
     array-find-index "^1.0.1"
     array-find-index "^1.0.1"
 
 
+cycle@1.0.x:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
+
 d@1:
 d@1:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
   resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
@@ -2074,6 +2160,12 @@ debug@*:
   dependencies:
   dependencies:
     ms "2.0.0"
     ms "2.0.0"
 
 
+debug@2, debug@2.6.7:
+  version "2.6.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
+  dependencies:
+    ms "2.0.0"
+
 debug@2.6.8, debug@^2.2.0, debug@^2.4.1, debug@^2.4.5, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6:
 debug@2.6.8, debug@^2.2.0, debug@^2.4.1, debug@^2.4.5, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6:
   version "2.6.8"
   version "2.6.8"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
@@ -2137,7 +2229,7 @@ delegates@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
   resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
 
 
-depd@1.1.1, depd@~1.1.1:
+depd@1.1.1, depd@~1.1.0, depd@~1.1.1:
   version "1.1.1"
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
 
 
@@ -2181,17 +2273,21 @@ dicer@0.2.5:
     streamsearch "0.1.2"
     streamsearch "0.1.2"
 
 
 diff2html@^2.3.0:
 diff2html@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/diff2html/-/diff2html-2.3.0.tgz#375fb0783ca8fa90307749399bc9c75eb7cf6580"
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/diff2html/-/diff2html-2.3.1.tgz#8bf7f351607826e217446163cab6da52c560e0ab"
   dependencies:
   dependencies:
-    diff "^3.2.0"
+    diff "^3.3.1"
     hogan.js "^3.0.2"
     hogan.js "^3.0.2"
     whatwg-fetch "^2.0.3"
     whatwg-fetch "^2.0.3"
 
 
-diff@3.3.1, diff@^3.1.0, diff@^3.2.0:
+diff@3.3.1, diff@^3.1.0:
   version "3.3.1"
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75"
 
 
+diff@^3.3.0, diff@^3.3.1:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
+
 diffie-hellman@^5.0.0:
 diffie-hellman@^5.0.0:
   version "5.0.2"
   version "5.0.2"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
@@ -2474,15 +2570,6 @@ escope@^3.6.0:
     esrecurse "^4.1.0"
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
     estraverse "^4.1.1"
 
 
-eslint-plugin-node@^5.1.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.0.tgz#e1efca04a385516cff3f2f04027ce8c5ae6db749"
-  dependencies:
-    ignore "^3.3.3"
-    minimatch "^3.0.4"
-    resolve "^1.3.3"
-    semver "5.3.0"
-
 esprima-fb@^15001.1.0-dev-harmony-fb:
 esprima-fb@^15001.1.0-dev-harmony-fb:
   version "15001.1.0-dev-harmony-fb"
   version "15001.1.0-dev-harmony-fb"
   resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901"
   resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901"
@@ -2533,6 +2620,10 @@ event-emitter@~0.3.5:
     d "1"
     d "1"
     es5-ext "~0.10.14"
     es5-ext "~0.10.14"
 
 
+eventemitter3@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
 events@^1.0.0, events@^1.1.1:
 events@^1.0.0, events@^1.1.1:
   version "1.1.1"
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
   resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
@@ -2638,8 +2729,8 @@ express@^4.15.2:
     vary "~1.1.1"
     vary "~1.1.1"
 
 
 express@^4.16.1:
 express@^4.16.1:
-  version "4.16.1"
-  resolved "https://registry.yarnpkg.com/express/-/express-4.16.1.tgz#6b33b560183c9b253b7b62144df33a4654ac9ed0"
+  version "4.16.2"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
   dependencies:
   dependencies:
     accepts "~1.3.4"
     accepts "~1.3.4"
     array-flatten "1.1.1"
     array-flatten "1.1.1"
@@ -2672,7 +2763,7 @@ express@^4.16.1:
     utils-merge "1.0.1"
     utils-merge "1.0.1"
     vary "~1.1.2"
     vary "~1.1.2"
 
 
-extend@^3.0.0, extend@~3.0.0:
+extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
   version "3.0.1"
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
 
 
@@ -2686,6 +2777,10 @@ extsprintf@1.3.0, extsprintf@^1.2.0:
   version "1.3.0"
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
 
 
+eyes@0.1.x:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
+
 fast-deep-equal@^1.0.0:
 fast-deep-equal@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
@@ -2715,8 +2810,8 @@ fbjs@^0.8.9:
     ua-parser-js "^0.7.9"
     ua-parser-js "^0.7.9"
 
 
 file-loader@^1.1.0:
 file-loader@^1.1.0:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.4.tgz#5ca9384adfafe008077c3439a435b2781a889ef5"
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.5.tgz#91c25b6b6fbe56dae99f10a425fd64933b5c9daa"
   dependencies:
   dependencies:
     loader-utils "^1.0.2"
     loader-utils "^1.0.2"
     schema-utils "^0.3.0"
     schema-utils "^0.3.0"
@@ -2869,6 +2964,14 @@ form-data@~2.1.1:
     combined-stream "^1.0.5"
     combined-stream "^1.0.5"
     mime-types "^2.1.12"
     mime-types "^2.1.12"
 
 
+form-data@~2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
 formatio@1.2.0, formatio@^1.2.0:
 formatio@1.2.0, formatio@^1.2.0:
   version "1.2.0"
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb"
   resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb"
@@ -3060,11 +3163,9 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
   version "4.1.11"
   version "4.1.11"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
 
 
-growl@1.10.2:
-  version "1.10.2"
-  resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.2.tgz#8f16dfcd8fb7c04cfc1f4e0012e0ea858726979a"
-  dependencies:
-    eslint-plugin-node "^5.1.0"
+growl@1.10.3:
+  version "1.10.3"
+  resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f"
 
 
 growly@^1.2.0:
 growly@^1.2.0:
   version "1.3.0"
   version "1.3.0"
@@ -3083,6 +3184,10 @@ har-schema@^1.0.5:
   version "1.0.5"
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
 
 
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
 har-validator@~2.0.6:
 har-validator@~2.0.6:
   version "2.0.6"
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
   resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
@@ -3099,6 +3204,13 @@ har-validator@~4.2.1:
     ajv "^4.9.1"
     ajv "^4.9.1"
     har-schema "^1.0.5"
     har-schema "^1.0.5"
 
 
+har-validator@~5.0.3:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+  dependencies:
+    ajv "^5.1.0"
+    har-schema "^2.0.0"
+
 has-ansi@^2.0.0:
 has-ansi@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
   resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -3162,6 +3274,15 @@ hawk@~3.1.3:
     hoek "2.x.x"
     hoek "2.x.x"
     sntp "1.x.x"
     sntp "1.x.x"
 
 
+hawk@~6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+  dependencies:
+    boom "4.x.x"
+    cryptiles "3.x.x"
+    hoek "4.x.x"
+    sntp "2.x.x"
+
 he@1.1.1:
 he@1.1.1:
   version "1.1.1"
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
   resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
@@ -3182,6 +3303,10 @@ hoek@2.x.x:
   version "2.16.3"
   version "2.16.3"
   resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
   resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
 
 
+hoek@4.x.x:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
+
 hogan.js@^3.0.2:
 hogan.js@^3.0.2:
   version "3.0.2"
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd"
   resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd"
@@ -3208,7 +3333,7 @@ html-comment-regex@^1.1.0:
   version "1.1.1"
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
   resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
 
 
-http-errors@1.6.2, http-errors@~1.6.2:
+http-errors@1.6.2, http-errors@~1.6.1, http-errors@~1.6.2:
   version "1.6.2"
   version "1.6.2"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
   dependencies:
   dependencies:
@@ -3225,10 +3350,26 @@ http-signature@~1.1.0:
     jsprim "^1.2.2"
     jsprim "^1.2.2"
     sshpk "^1.7.0"
     sshpk "^1.7.0"
 
 
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
 https-browserify@0.0.1:
 https-browserify@0.0.1:
   version "0.0.1"
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
 
 
+https-proxy-agent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
 https-proxy-agent@^2.0.0:
 https-proxy-agent@^2.0.0:
   version "2.1.0"
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.0.tgz#1391bee7fd66aeabc0df2a1fa90f58954f43e443"
   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.0.tgz#1391bee7fd66aeabc0df2a1fa90f58954f43e443"
@@ -3237,8 +3378,8 @@ https-proxy-agent@^2.0.0:
     debug "^2.4.1"
     debug "^2.4.1"
 
 
 i18next-express-middleware@^1.0.5:
 i18next-express-middleware@^1.0.5:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/i18next-express-middleware/-/i18next-express-middleware-1.0.6.tgz#110782e9492931f35feffef434904847bf349128"
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/i18next-express-middleware/-/i18next-express-middleware-1.0.7.tgz#7909233f4e6e94b5bd4964a114247dc8d6f3f839"
   dependencies:
   dependencies:
     cookies "0.7.1"
     cookies "0.7.1"
 
 
@@ -3253,9 +3394,13 @@ i18next-sprintf-postprocessor@^0.2.2:
   version "0.2.2"
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz#2e409f1043579382698b6a2da70cdaa551d67ea4"
   resolved "https://registry.yarnpkg.com/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz#2e409f1043579382698b6a2da70cdaa551d67ea4"
 
 
-i18next@^9.0.0:
-  version "9.0.1"
-  resolved "https://registry.yarnpkg.com/i18next/-/i18next-9.0.1.tgz#8b8a55d017c1e256df9700ded277d47c53cd833b"
+i18next@^10.0.1:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/i18next/-/i18next-10.0.1.tgz#ce682ef7c43590d015b0cc5cef31f226475d0a3f"
+
+iconv-lite@0.4.15:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
 
 
 iconv-lite@0.4.19, iconv-lite@^0.4.5, iconv-lite@~0.4.13:
 iconv-lite@0.4.19, iconv-lite@^0.4.5, iconv-lite@~0.4.13:
   version "0.4.19"
   version "0.4.19"
@@ -3275,10 +3420,6 @@ ieee754@^1.1.4:
   version "1.1.8"
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
 
 
-ignore@^3.3.3:
-  version "3.3.5"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6"
-
 in-publish@^2.0.0:
 in-publish@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
   resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
@@ -3534,7 +3675,7 @@ isomorphic-fetch@^2.1.1:
     node-fetch "^1.0.1"
     node-fetch "^1.0.1"
     whatwg-fetch ">=0.10.0"
     whatwg-fetch ">=0.10.0"
 
 
-isstream@~0.1.2:
+isstream@0.1.x, isstream@~0.1.2:
   version "0.1.2"
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
 
 
@@ -4003,7 +4144,7 @@ lodash@2.4.2:
   version "2.4.2"
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
 
 
-lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.6.1, lodash@~4.17.4:
+lodash@^4.0.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.6.1, lodash@~4.17.4:
   version "4.17.4"
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
 
@@ -4011,9 +4152,9 @@ lolex@^1.6.0:
   version "1.6.0"
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6"
   resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6"
 
 
-lolex@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.1.2.tgz#2694b953c9ea4d013e5b8bfba891c991025b2629"
+lolex@^2.1.3:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.1.3.tgz#53f893bbe88c80378156240e127126b905c83087"
 
 
 longest@^1.0.1:
 longest@^1.0.1:
   version "1.0.1"
   version "1.0.1"
@@ -4174,7 +4315,7 @@ mime-db@~1.30.0:
   version "1.30.0"
   version "1.30.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
 
 
-mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7:
+mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7:
   version "2.1.17"
   version "2.1.17"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
   dependencies:
   dependencies:
@@ -4246,8 +4387,8 @@ mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd
     minimist "0.0.8"
     minimist "0.0.8"
 
 
 mocha@^4.0.0:
 mocha@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.0.0.tgz#3da718ccd76e93b9d82afb065e17086bdbe352bf"
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.0.1.tgz#0aee5a95cf69a4618820f5e51fa31717117daf1b"
   dependencies:
   dependencies:
     browser-stdout "1.3.0"
     browser-stdout "1.3.0"
     commander "2.11.0"
     commander "2.11.0"
@@ -4255,12 +4396,12 @@ mocha@^4.0.0:
     diff "3.3.1"
     diff "3.3.1"
     escape-string-regexp "1.0.5"
     escape-string-regexp "1.0.5"
     glob "7.1.2"
     glob "7.1.2"
-    growl "1.10.2"
+    growl "1.10.3"
     he "1.1.1"
     he "1.1.1"
     mkdirp "0.5.1"
     mkdirp "0.5.1"
     supports-color "4.4.0"
     supports-color "4.4.0"
 
 
-moment@2.x.x, moment@^2.10.3, moment@^2.18.0:
+moment@2.x.x, moment@^2.10.3, moment@~2.18.1:
   version "2.18.1"
   version "2.18.1"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
 
 
@@ -4386,9 +4527,9 @@ negotiator@0.6.1:
   version "0.6.1"
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
 
 
-nise@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/nise/-/nise-1.1.0.tgz#37e41b9bf0041ccb83d1bf03e79440bbc0db10ad"
+nise@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/nise/-/nise-1.1.1.tgz#1faa07147f3bf2465d4dbedc0e4a84048f081041"
   dependencies:
   dependencies:
     formatio "^1.2.0"
     formatio "^1.2.0"
     just-extend "^1.1.22"
     just-extend "^1.1.22"
@@ -4535,8 +4676,8 @@ nodemailer-ses-transport@~1.5.0:
     aws-sdk "^2.2.36"
     aws-sdk "^2.2.36"
 
 
 nodemailer@^4.0.1:
 nodemailer@^4.0.1:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.1.2.tgz#82e1fb61ddc7272fe4f34c5ba6adaa99faa8b635"
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.1.3.tgz#4125a6ef79ecfb68357a65c34e4810f210ae120c"
 
 
 nopt@1.0.10:
 nopt@1.0.10:
   version "1.0.10"
   version "1.0.10"
@@ -4608,7 +4749,7 @@ number-is-nan@^1.0.0:
   version "1.0.1"
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
 
 
-oauth-sign@~0.8.1:
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
   version "0.8.2"
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
 
 
@@ -4913,6 +5054,10 @@ performance-now@^0.2.0:
   version "0.2.0"
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
 
 
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
 pify@^2.0.0, pify@^2.3.0:
 pify@^2.0.0, pify@^2.3.0:
   version "2.3.0"
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -4976,6 +5121,10 @@ pkg-dir@^2.0.0:
   dependencies:
   dependencies:
     find-up "^2.1.0"
     find-up "^2.1.0"
 
 
+pkginfo@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
+
 plantuml-encoder@^1.2.4:
 plantuml-encoder@^1.2.4:
   version "1.2.4"
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/plantuml-encoder/-/plantuml-encoder-1.2.4.tgz#5f0056f7c04bd76aeef420bfcddef339e9f44081"
   resolved "https://registry.yarnpkg.com/plantuml-encoder/-/plantuml-encoder-1.2.4.tgz#5f0056f7c04bd76aeef420bfcddef339e9f44081"
@@ -5337,11 +5486,15 @@ q@^1.1.2:
   version "1.5.0"
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
 
 
+qs@6.4.0, qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
 qs@6.5.0:
 qs@6.5.0:
   version "6.5.0"
   version "6.5.0"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49"
 
 
-qs@6.5.1:
+qs@6.5.1, qs@~6.5.1:
   version "6.5.1"
   version "6.5.1"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
 
 
@@ -5353,10 +5506,6 @@ qs@~6.2.0:
   version "6.2.3"
   version "6.2.3"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
 
 
-qs@~6.4.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
-
 query-string@^4.1.0:
 query-string@^4.1.0:
   version "4.3.4"
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
   resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
@@ -5408,6 +5557,14 @@ raw-body@2.3.2:
     iconv-lite "0.4.19"
     iconv-lite "0.4.19"
     unpipe "1.0.0"
     unpipe "1.0.0"
 
 
+raw-body@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96"
+  dependencies:
+    bytes "2.4.0"
+    iconv-lite "0.4.15"
+    unpipe "1.0.0"
+
 rc@^1.1.7:
 rc@^1.1.7:
   version "1.2.1"
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
@@ -5784,6 +5941,33 @@ request@2.74.x:
     tough-cookie "~2.3.0"
     tough-cookie "~2.3.0"
     tunnel-agent "~0.4.1"
     tunnel-agent "~0.4.1"
 
 
+request@^2.64.0:
+  version "2.83.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.6.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.1"
+    forever-agent "~0.6.1"
+    form-data "~2.3.1"
+    har-validator "~5.0.3"
+    hawk "~6.0.2"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.17"
+    oauth-sign "~0.8.2"
+    performance-now "^2.1.0"
+    qs "~6.5.1"
+    safe-buffer "^5.1.1"
+    stringstream "~0.0.5"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
 requestretry@^1.12.0:
 requestretry@^1.12.0:
   version "1.12.2"
   version "1.12.2"
   resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.12.2.tgz#13ce38a4ce4e809f3c9ec6d4ca3b7b9ba4acf26c"
   resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.12.2.tgz#13ce38a4ce4e809f3c9ec6d4ca3b7b9ba4acf26c"
@@ -5812,7 +5996,7 @@ resolve-from@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
 
 
-resolve@^1.0.0, resolve@^1.3.3, resolve@~1.4.0:
+resolve@^1.0.0, resolve@~1.4.0:
   version "1.4.0"
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86"
   dependencies:
   dependencies:
@@ -5824,6 +6008,10 @@ resumer@~0.0.0:
   dependencies:
   dependencies:
     through "~2.3.4"
     through "~2.3.4"
 
 
+retry@^0.9.0:
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/retry/-/retry-0.9.0.tgz#6f697e50a0e4ddc8c8f7fb547a9b60dead43678d"
+
 reveal.js@^3.5.0:
 reveal.js@^3.5.0:
   version "3.5.0"
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/reveal.js/-/reveal.js-3.5.0.tgz#95545949ad682636acecfdaea05cf0ca892d442d"
   resolved "https://registry.yarnpkg.com/reveal.js/-/reveal.js-3.5.0.tgz#95545949ad682636acecfdaea05cf0ca892d442d"
@@ -5931,7 +6119,11 @@ select@^1.1.2:
   version "5.4.1"
   version "5.4.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
 
 
-semver@5.3.0, semver@~5.3.0:
+semver@~5.0.1:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
+
+semver@~5.3.0:
   version "5.3.0"
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
 
 
@@ -6047,15 +6239,15 @@ sinon-chai@^2.13.0:
   resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.14.0.tgz#da7dd4cc83cd6a260b67cca0f7a9fdae26a1205d"
   resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.14.0.tgz#da7dd4cc83cd6a260b67cca0f7a9fdae26a1205d"
 
 
 sinon@^4.0.0:
 sinon@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.0.0.tgz#a54a5f0237aa1dd2215e5e81c89b42b50c4fdb6b"
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.0.1.tgz#e46146a8a8420f837bdba32e2965bd1fe43d5b05"
   dependencies:
   dependencies:
     diff "^3.1.0"
     diff "^3.1.0"
     formatio "1.2.0"
     formatio "1.2.0"
     lodash.get "^4.4.2"
     lodash.get "^4.4.2"
-    lolex "^2.1.2"
+    lolex "^2.1.3"
     native-promise-only "^0.8.1"
     native-promise-only "^0.8.1"
-    nise "^1.1.0"
+    nise "^1.1.1"
     path-to-regexp "^1.7.0"
     path-to-regexp "^1.7.0"
     samsam "^1.1.3"
     samsam "^1.1.3"
     text-encoding "0.6.4"
     text-encoding "0.6.4"
@@ -6079,6 +6271,12 @@ sntp@1.x.x:
   dependencies:
   dependencies:
     hoek "2.x.x"
     hoek "2.x.x"
 
 
+sntp@2.x.x:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b"
+  dependencies:
+    hoek "4.x.x"
+
 socket.io-adapter@~1.1.0:
 socket.io-adapter@~1.1.0:
   version "1.1.1"
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
   resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
@@ -6193,6 +6391,10 @@ sshpk@^1.7.0:
     jsbn "~0.1.0"
     jsbn "~0.1.0"
     tweetnacl "~0.14.0"
     tweetnacl "~0.14.0"
 
 
+stack-trace@0.0.x:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+
 "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
 "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
   version "1.3.1"
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
@@ -6273,7 +6475,7 @@ string_decoder@~1.0.0, string_decoder@~1.0.3:
   dependencies:
   dependencies:
     safe-buffer "~5.1.0"
     safe-buffer "~5.1.0"
 
 
-stringstream@~0.0.4:
+stringstream@~0.0.4, stringstream@~0.0.5:
   version "0.0.5"
   version "0.0.5"
   resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
   resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
 
 
@@ -6469,6 +6671,12 @@ tough-cookie@~2.3.0:
   dependencies:
   dependencies:
     punycode "^1.4.1"
     punycode "^1.4.1"
 
 
+tough-cookie@~2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
+  dependencies:
+    punycode "^1.4.1"
+
 trim-newlines@^1.0.0:
 trim-newlines@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
@@ -6624,6 +6832,10 @@ unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
 
 
+url-join@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8"
+
 url-join@^1.1.0:
 url-join@^1.1.0:
   version "1.1.0"
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
   resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
@@ -6672,7 +6884,7 @@ uuid@3.0.1:
   version "3.0.1"
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
 
 
-uuid@^3.0.0, uuid@^3.0.1:
+uuid@3.1.0, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
   version "3.1.0"
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
 
 
@@ -6852,6 +7064,17 @@ window-size@^0.2.0:
   version "0.2.0"
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
 
 
+winston@^2.1.1:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.0.tgz#808050b93d52661ed9fb6c26b3f0c826708b0aee"
+  dependencies:
+    async "~1.0.0"
+    colors "1.0.x"
+    cycle "1.0.x"
+    eyes "0.1.x"
+    isstream "0.1.x"
+    stack-trace "0.0.x"
+
 wordwrap@0.0.2:
 wordwrap@0.0.2:
   version "0.0.2"
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
@@ -6885,7 +7108,7 @@ ws@0.4.20:
     options latest
     options latest
     tinycolor "0.x"
     tinycolor "0.x"
 
 
-ws@^1.1.4:
+ws@^1.0.1, ws@^1.1.4:
   version "1.1.4"
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61"
   resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61"
   dependencies:
   dependencies: