From f91a53d8936d9c387630c6ae4a313002a061a3c9 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 13:23:58 +0900
Subject: [PATCH 001/369] Update dependencies :rocket:

---
 package.json | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/package.json b/package.json
index 534b0c296d..e67b33ceb7 100644
--- a/package.json
+++ b/package.json
@@ -95,7 +95,7 @@
 		"css-loader": "0.28.11",
 		"debug": "3.1.0",
 		"deep-equal": "1.0.1",
-		"deepcopy": "0.6.3",
+		"deepcopy": "1.0.0",
 		"diskusage": "0.2.4",
 		"dompurify": "1.0.4",
 		"elasticsearch": "15.0.0",
@@ -114,7 +114,7 @@
 		"gulp-cssnano": "2.1.3",
 		"gulp-htmlmin": "4.0.0",
 		"gulp-imagemin": "4.1.0",
-		"gulp-mocha": "5.0.0",
+		"gulp-mocha": "6.0.0",
 		"gulp-pug": "4.0.1",
 		"gulp-rename": "1.2.3",
 		"gulp-replace": "1.0.0",
@@ -124,17 +124,17 @@
 		"gulp-typescript": "4.0.2",
 		"gulp-uglify": "3.0.0",
 		"gulp-util": "3.0.8",
-		"hard-source-webpack-plugin": "0.6.9",
+		"hard-source-webpack-plugin": "0.6.10",
 		"highlight.js": "9.12.0",
-		"html-minifier": "3.5.15",
+		"html-minifier": "3.5.16",
 		"http-signature": "1.2.0",
 		"inquirer": "5.2.0",
 		"is-root": "2.0.0",
 		"is-url": "1.2.4",
 		"js-yaml": "3.11.0",
-		"jsdom": "11.10.0",
+		"jsdom": "11.11.0",
 		"koa": "2.5.1",
-		"koa-bodyparser": "4.2.0",
+		"koa-bodyparser": "4.2.1",
 		"koa-compress": "3.0.0",
 		"koa-favicon": "2.0.1",
 		"koa-json-body": "5.3.0",
@@ -163,18 +163,18 @@
 		"object-assign-deep": "0.4.0",
 		"on-build-webpack": "0.1.0",
 		"os-utils": "0.0.14",
-		"parse5": "4.0.0",
+		"parse5": "5.0.0",
 		"progress-bar-webpack-plugin": "1.11.0",
 		"prominence": "0.2.0",
 		"promise-sequential": "1.1.1",
 		"pug": "2.0.3",
-		"punycode": "2.1.0",
+		"punycode": "2.1.1",
 		"qrcode": "1.2.0",
 		"ratelimiter": "3.0.3",
 		"recaptcha-promise": "0.1.3",
 		"reconnecting-websocket": "3.2.2",
 		"redis": "2.8.0",
-		"request": "2.86.0",
+		"request": "2.87.0",
 		"request-promise-native": "1.0.5",
 		"rimraf": "2.6.2",
 		"rndstr": "1.0.0",
@@ -193,7 +193,7 @@
 		"textarea-caret": "3.1.0",
 		"tmp": "0.0.33",
 		"ts-loader": "4.3.0",
-		"ts-node": "6.0.3",
+		"ts-node": "6.0.4",
 		"tslint": "5.10.0",
 		"typescript": "2.8.3",
 		"typescript-eslint-parser": "15.0.0",
@@ -205,7 +205,7 @@
 		"vue-cropperjs": "2.2.0",
 		"vue-js-modal": "1.3.13",
 		"vue-json-tree-view": "2.1.4",
-		"vue-loader": "15.1.0",
+		"vue-loader": "15.2.1",
 		"vue-material": "^1.0.0-beta-10.2",
 		"vue-router": "3.0.1",
 		"vue-template-compiler": "2.5.16",
@@ -214,10 +214,10 @@
 		"vuex-persistedstate": "^2.5.4",
 		"web-push": "3.3.1",
 		"webfinger.js": "2.6.6",
-		"webpack": "4.8.3",
-		"webpack-cli": "2.1.3",
+		"webpack": "4.9.1",
+		"webpack-cli": "2.1.4",
 		"websocket": "1.0.26",
-		"ws": "5.1.1",
+		"ws": "5.2.0",
 		"xev": "2.0.0"
 	}
 }

From 65a3bac5431c1d11994e9ccff3163f18f5eb2600 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 13:25:10 +0900
Subject: [PATCH 002/369] :v:

---
 src/models/user.ts | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/models/user.ts b/src/models/user.ts
index 477bb232e4..ff1ae57d73 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -169,9 +169,9 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) {
 	).map(x => deleteAccessToken(x)));
 
 	// このユーザーのNoteをすべて削除
-	//await sequential((
-	//	await Note.find({ userId: u._id })
-	//).map(x => () => deleteNote(x)));
+	await sequential((
+		await Note.find({ userId: u._id })
+	).map(x => () => deleteNote(x)));
 
 	// このユーザーのNoteReactionをすべて削除
 	await Promise.all((

From 5415b67baac04a7d11a8a296b5c6991fc8726003 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 16:04:47 +0900
Subject: [PATCH 003/369] Fix bug

---
 package.json                    | 2 +-
 src/models/app.ts               | 2 +-
 src/models/auth-session.ts      | 2 +-
 src/models/drive-file.ts        | 2 +-
 src/models/drive-folder.ts      | 2 +-
 src/models/favorite.ts          | 2 +-
 src/models/messaging-message.ts | 2 +-
 src/models/note-reaction.ts     | 2 +-
 src/models/note.ts              | 2 +-
 src/models/notification.ts      | 2 +-
 src/models/othello-game.ts      | 2 +-
 src/models/othello-matching.ts  | 2 +-
 src/models/signin.ts            | 2 +-
 src/models/user-list.ts         | 2 +-
 src/models/user.ts              | 2 +-
 15 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/package.json b/package.json
index e67b33ceb7..3806074de2 100644
--- a/package.json
+++ b/package.json
@@ -95,7 +95,7 @@
 		"css-loader": "0.28.11",
 		"debug": "3.1.0",
 		"deep-equal": "1.0.1",
-		"deepcopy": "1.0.0",
+		"deepcopy": "0.6.3",
 		"diskusage": "0.2.4",
 		"dompurify": "1.0.4",
 		"elasticsearch": "15.0.0",
diff --git a/src/models/app.ts b/src/models/app.ts
index 45c95d92d8..7926f2fac2 100644
--- a/src/models/app.ts
+++ b/src/models/app.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import AccessToken from './access-token';
 import db from '../db/mongodb';
 import config from '../config';
diff --git a/src/models/auth-session.ts b/src/models/auth-session.ts
index 6fe3468a7b..219b1a4c8b 100644
--- a/src/models/auth-session.ts
+++ b/src/models/auth-session.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import { pack as packApp } from './app';
 
diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts
index a3a567038e..bb98c11a93 100644
--- a/src/models/drive-file.ts
+++ b/src/models/drive-file.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import { pack as packFolder } from './drive-folder';
 import config from '../config';
 import monkDb, { nativeDbConn } from '../db/mongodb';
diff --git a/src/models/drive-folder.ts b/src/models/drive-folder.ts
index e7961936aa..cafb9cdf13 100644
--- a/src/models/drive-folder.ts
+++ b/src/models/drive-folder.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import DriveFile from './drive-file';
 
diff --git a/src/models/favorite.ts b/src/models/favorite.ts
index d24833f191..45417212e3 100644
--- a/src/models/favorite.ts
+++ b/src/models/favorite.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import { pack as packNote } from './note';
 
diff --git a/src/models/messaging-message.ts b/src/models/messaging-message.ts
index a6a50fc8cf..ad2d1657e6 100644
--- a/src/models/messaging-message.ts
+++ b/src/models/messaging-message.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import { pack as packUser } from './user';
 import { pack as packFile } from './drive-file';
 import db from '../db/mongodb';
diff --git a/src/models/note-reaction.ts b/src/models/note-reaction.ts
index 706ae54c16..e5e108c017 100644
--- a/src/models/note-reaction.ts
+++ b/src/models/note-reaction.ts
@@ -1,6 +1,6 @@
 import * as mongo from 'mongodb';
 import $ from 'cafy';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import Reaction from './note-reaction';
 import { pack as packUser } from './user';
diff --git a/src/models/note.ts b/src/models/note.ts
index 1274901d45..5d7bab3833 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import rap from '@prezzemolo/rap';
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
diff --git a/src/models/notification.ts b/src/models/notification.ts
index 76871166a9..c4cf1e4efd 100644
--- a/src/models/notification.ts
+++ b/src/models/notification.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 import { pack as packNote } from './note';
diff --git a/src/models/othello-game.ts b/src/models/othello-game.ts
index 297aee3028..1dd375d2e5 100644
--- a/src/models/othello-game.ts
+++ b/src/models/othello-game.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 
diff --git a/src/models/othello-matching.ts b/src/models/othello-matching.ts
index 8082c258c8..0efba3ae5d 100644
--- a/src/models/othello-matching.ts
+++ b/src/models/othello-matching.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 
diff --git a/src/models/signin.ts b/src/models/signin.ts
index 7f56e1a283..d8b05c0e30 100644
--- a/src/models/signin.ts
+++ b/src/models/signin.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 
 const Signin = db.get<ISignin>('signin');
diff --git a/src/models/user-list.ts b/src/models/user-list.ts
index 7100fced7e..4cf1de61a4 100644
--- a/src/models/user-list.ts
+++ b/src/models/user-list.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 
 const UserList = db.get<IUserList>('userList');
diff --git a/src/models/user.ts b/src/models/user.ts
index ff1ae57d73..74ddcc77f9 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import deepcopy = require('deepcopy');
+import * as deepcopy from 'deepcopy';
 import sequential = require('promise-sequential');
 import rap from '@prezzemolo/rap';
 import db from '../db/mongodb';

From ddb413ca52e9c3a2b182c929007efd80727f81cf Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 16:05:02 +0900
Subject: [PATCH 004/369] :art:

---
 src/client/app/mobile/views/components/note-preview.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index 8fa57768e0..f3805ac481 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -61,7 +61,7 @@ root(isDark)
 		> header
 			display flex
 			align-items baseline
-			margin-bottom 4px
+			margin-bottom 2px
 			white-space nowrap
 
 			> .avatar

From 8f175186bcd62d2a4372eef8147119ed2ccb0f66 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 16:08:57 +0900
Subject: [PATCH 005/369] Fix bug

---
 src/client/app/mobile/views/pages/notifications.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/mobile/views/pages/notifications.vue b/src/client/app/mobile/views/pages/notifications.vue
index 2e98201caa..64cfa60da0 100644
--- a/src/client/app/mobile/views/pages/notifications.vue
+++ b/src/client/app/mobile/views/pages/notifications.vue
@@ -24,7 +24,7 @@ export default Vue.extend({
 			const ok = window.confirm('%i18n:@read-all%');
 			if (!ok) return;
 
-			(this as any).api('notifications/markAsRead_all');
+			(this as any).api('notifications/mark_as_read_all');
 		},
 		onFetched() {
 			Progress.done();

From f840d491e56b55101491b494a91ee47e0396d395 Mon Sep 17 00:00:00 2001
From: Zero King <l2dy@icloud.com>
Date: Sat, 26 May 2018 11:43:09 +0000
Subject: [PATCH 006/369] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index a44c7e16ee..842c3e8a34 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ ultimately sophisticated new type of mini-blog based SNS.
 * Real time contents
 * ActivityPub compatible
 
-and more! You can touch with your own eyes at [misskey.xyz](https://misskey.xyz).
+and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
 
 :package: Create your instance
 ----------------------------------------------------------------

From 67b3461c242e50a3248f99bb164d160db2823db1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 23:20:52 +0900
Subject: [PATCH 007/369] Better mention handling

---
 .../app/desktop/views/components/post-form.vue       | 12 ++++++++++++
 src/client/app/mobile/views/components/post-form.vue | 12 ++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index 0696d4e82b..0e0848524a 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -49,6 +49,7 @@ import Vue from 'vue';
 import * as XDraggable from 'vuedraggable';
 import getKao from '../../../common/scripts/get-kao';
 import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
+import parse from '../../../../../text/parse';
 
 export default Vue.extend({
 	components: {
@@ -110,6 +111,17 @@ export default Vue.extend({
 			this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
 		}
 
+		if (this.reply && this.reply.text != null) {
+			const ast = parse(this.reply.text);
+
+			ast.filter(t => t.type == 'mention').forEach(x => {
+				const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`;
+				if (this.text.indexOf(`${mention} `) == -1) {
+					this.text += `${mention} `;
+				}
+			});
+		}
+
 		this.$nextTick(() => {
 			// 書きかけの投稿を復元
 			const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId];
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index b3b5ffd502..55347b7e53 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -49,6 +49,7 @@ import Vue from 'vue';
 import * as XDraggable from 'vuedraggable';
 import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
 import getKao from '../../../common/scripts/get-kao';
+import parse from '../../../../../text/parse';
 
 export default Vue.extend({
 	components: {
@@ -78,6 +79,17 @@ export default Vue.extend({
 			this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
 		}
 
+		if (this.reply && this.reply.text != null) {
+			const ast = parse(this.reply.text);
+
+			ast.filter(t => t.type == 'mention').forEach(x => {
+				const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`;
+				if (this.text.indexOf(`${mention} `) == -1) {
+					this.text += `${mention} `;
+				}
+			});
+		}
+
 		this.$nextTick(() => {
 			this.focus();
 		});

From 102aaeb3907b06b3a13371474df41cb1160d0084 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 23:34:20 +0900
Subject: [PATCH 008/369] Darken

---
 .../app/desktop/views/components/calendar.vue | 36 ++++++++++---------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue
index 9a93841e52..3b0330cf61 100644
--- a/src/client/app/desktop/views/components/calendar.vue
+++ b/src/client/app/desktop/views/components/calendar.vue
@@ -138,6 +138,7 @@ root(isDark)
 	background isDark ? #282C37 : #fff
 	border solid 1px rgba(#000, 0.075)
 	border-radius 6px
+	overflow hidden
 
 	&[data-melt]
 		background transparent !important
@@ -151,9 +152,12 @@ root(isDark)
 		line-height 42px
 		font-size 0.9em
 		font-weight bold
-		color #888
+		color isDark ? #c5ced6 : #888
 		box-shadow 0 1px rgba(#000, 0.07)
 
+		if isDark
+			background #313543
+
 		> [data-fa]
 			margin-right 4px
 
@@ -165,13 +169,13 @@ root(isDark)
 		width 42px
 		font-size 0.9em
 		line-height 42px
-		color #ccc
+		color isDark ? #9baec8 : #ccc
 
 		&:hover
-			color #aaa
+			color isDark ? #b2c1d5 : #aaa
 
 		&:active
-			color #999
+			color isDark ? #b2c1d5 : #999
 
 		&:first-of-type
 			left 0
@@ -194,49 +198,49 @@ root(isDark)
 			font-size 14px
 
 			&.weekday
-				color #19a2a9
+				color isDark ? #43d5dc : #19a2a9
 
 				&[data-is-donichi]
-					color #ef95a0
+					color isDark ? #ff6679 : #ef95a0
 
 				&[data-today]
-					box-shadow 0 0 0 1px #19a2a9 inset
+					box-shadow 0 0 0 1px isDark ? #43d5dc : #19a2a9 inset
 					border-radius 6px
 
 					&[data-is-donichi]
-						box-shadow 0 0 0 1px #ef95a0 inset
+						box-shadow 0 0 0 1px isDark ? #ff6679 : #ef95a0 inset
 
 			&.day
 				cursor pointer
-				color #777
+				color isDark ? #c5ced6 : #777
 
 				> div
 					border-radius 6px
 
 				&:hover > div
-					background rgba(#000, 0.025)
+					background rgba(#000, isDark ? 0.1 : 0.025)
 
 				&:active > div
-					background rgba(#000, 0.05)
+					background rgba(#000, isDark ? 0.2 : 0.05)
 
 				&[data-is-donichi]
-					color #ef95a0
+					color isDark ? #ff6679 : #ef95a0
 
 				&[data-is-out-of-range]
 					cursor default
-					color rgba(#777, 0.5)
+					color rgba(isDark ? #c5ced6 : #777, 0.5)
 
 					&[data-is-donichi]
-						color rgba(#ef95a0, 0.5)
+						color rgba(isDark ? #ff6679 : #ef95a0, 0.5)
 
 				&[data-selected]
 					font-weight bold
 
 					> div
-						background rgba(#000, 0.025)
+						background rgba(#000, isDark ? 0.1 : 0.025)
 
 					&:active > div
-						background rgba(#000, 0.05)
+						background rgba(#000, isDark ? 0.2 : 0.05)
 
 				&[data-today]
 					> div

From 100557e975a0aab19d0fa42e552ac5bf7882a65f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 23:37:40 +0900
Subject: [PATCH 009/369] Fix bug

---
 .../views/components/user-list-timeline.vue    | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/client/app/mobile/views/components/user-list-timeline.vue b/src/client/app/mobile/views/components/user-list-timeline.vue
index 59d6abbbc1..c0ba995b68 100644
--- a/src/client/app/mobile/views/components/user-list-timeline.vue
+++ b/src/client/app/mobile/views/components/user-list-timeline.vue
@@ -12,6 +12,7 @@ const fetchLimit = 10;
 
 export default Vue.extend({
 	props: ['list'],
+
 	data() {
 		return {
 			fetching: true,
@@ -20,15 +21,25 @@ export default Vue.extend({
 			connection: null
 		};
 	},
+
+	computed: {
+		canFetchMore(): boolean {
+			return !this.moreFetching && !this.fetching && this.existMore;
+		}
+	},
+
 	watch: {
 		$route: 'init'
 	},
+
 	mounted() {
 		this.init();
 	},
+
 	beforeDestroy() {
 		this.connection.close();
 	},
+
 	methods: {
 		init() {
 			if (this.connection) this.connection.close();
@@ -39,6 +50,7 @@ export default Vue.extend({
 
 			this.fetch();
 		},
+
 		fetch() {
 			this.fetching = true;
 
@@ -59,7 +71,10 @@ export default Vue.extend({
 				}, rej);
 			}));
 		},
+
 		more() {
+			if (!this.canFetchMore) return;
+
 			this.moreFetching = true;
 
 			(this as any).api('notes/user-list-timeline', {
@@ -78,13 +93,16 @@ export default Vue.extend({
 				this.moreFetching = false;
 			});
 		},
+
 		onNote(note) {
 			// Prepend a note
 			(this.$refs.timeline as any).prepend(note);
 		},
+
 		onUserAdded() {
 			this.fetch();
 		},
+
 		onUserRemoved() {
 			this.fetch();
 		}

From d29459fa3781043c4e484c876966dbae5c98a538 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 May 2018 23:53:22 +0900
Subject: [PATCH 010/369] Fix bug

---
 .../desktop/views/components/timeline.core.vue  |  8 ++++++--
 .../views/components/user-list-timeline.vue     |  8 ++++++--
 .../desktop/views/pages/user/user.timeline.vue  | 17 +++++++++++++++--
 .../views/components/user-list-timeline.vue     |  8 ++++++--
 .../mobile/views/components/user-timeline.vue   |  9 +++++++--
 .../app/mobile/views/pages/home.timeline.vue    |  8 ++++++--
 6 files changed, 46 insertions(+), 12 deletions(-)

diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue
index 254a5b9d63..3c7e87aea1 100644
--- a/src/client/app/desktop/views/components/timeline.core.vue
+++ b/src/client/app/desktop/views/components/timeline.core.vue
@@ -120,12 +120,14 @@ export default Vue.extend({
 
 			this.moreFetching = true;
 
-			(this as any).api(this.endpoint, {
+			const promise = (this as any).api(this.endpoint, {
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
 				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
 				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
-			}).then(notes => {
+			});
+
+			promise.then(notes => {
 				if (notes.length == fetchLimit + 1) {
 					notes.pop();
 				} else {
@@ -134,6 +136,8 @@ export default Vue.extend({
 				notes.forEach(n => (this.$refs.timeline as any).append(n));
 				this.moreFetching = false;
 			});
+
+			return promise;
 		},
 
 		onNote(note) {
diff --git a/src/client/app/desktop/views/components/user-list-timeline.vue b/src/client/app/desktop/views/components/user-list-timeline.vue
index 59d6abbbc1..4f14da70fe 100644
--- a/src/client/app/desktop/views/components/user-list-timeline.vue
+++ b/src/client/app/desktop/views/components/user-list-timeline.vue
@@ -62,13 +62,15 @@ export default Vue.extend({
 		more() {
 			this.moreFetching = true;
 
-			(this as any).api('notes/user-list-timeline', {
+			const promise = (this as any).api('notes/user-list-timeline', {
 				listId: this.list.id,
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
 				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
 				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
-			}).then(notes => {
+			});
+
+			promise.then(notes => {
 				if (notes.length == fetchLimit + 1) {
 					notes.pop();
 				} else {
@@ -77,6 +79,8 @@ export default Vue.extend({
 				notes.forEach(n => (this.$refs.timeline as any).append(n));
 				this.moreFetching = false;
 			});
+
+			return promise;
 		},
 		onNote(note) {
 			// Prepend a note
diff --git a/src/client/app/desktop/views/pages/user/user.timeline.vue b/src/client/app/desktop/views/pages/user/user.timeline.vue
index 576a285104..812b5b4229 100644
--- a/src/client/app/desktop/views/pages/user/user.timeline.vue
+++ b/src/client/app/desktop/views/pages/user/user.timeline.vue
@@ -21,6 +21,7 @@ const fetchLimit = 10;
 
 export default Vue.extend({
 	props: ['user'],
+
 	data() {
 		return {
 			fetching: true,
@@ -31,19 +32,23 @@ export default Vue.extend({
 			date: null
 		};
 	},
+
 	watch: {
 		mode() {
 			this.fetch();
 		}
 	},
+
 	mounted() {
 		document.addEventListener('keydown', this.onDocumentKeydown);
 
 		this.fetch(() => this.$emit('loaded'));
 	},
+
 	beforeDestroy() {
 		document.removeEventListener('keydown', this.onDocumentKeydown);
 	},
+
 	methods: {
 		onDocumentKeydown(e) {
 			if (e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA') {
@@ -52,6 +57,7 @@ export default Vue.extend({
 				}
 			}
 		},
+
 		fetch(cb?) {
 			this.fetching = true;
 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
@@ -72,15 +78,19 @@ export default Vue.extend({
 				}, rej);
 			}));
 		},
+
 		more() {
 			this.moreFetching = true;
-			(this as any).api('users/notes', {
+
+			const promise = (this as any).api('users/notes', {
 				userId: this.user.id,
 				limit: fetchLimit + 1,
 				includeReplies: this.mode == 'with-replies',
 				withMedia: this.mode == 'with-media',
 				untilId: (this.$refs.timeline as any).tail().id
-			}).then(notes => {
+			});
+
+			promise.then(notes => {
 				if (notes.length == fetchLimit + 1) {
 					notes.pop();
 				} else {
@@ -89,7 +99,10 @@ export default Vue.extend({
 				notes.forEach(n => (this.$refs.timeline as any).append(n));
 				this.moreFetching = false;
 			});
+
+			return promise;
 		},
+
 		warp(date) {
 			this.date = date;
 			this.fetch();
diff --git a/src/client/app/mobile/views/components/user-list-timeline.vue b/src/client/app/mobile/views/components/user-list-timeline.vue
index c0ba995b68..629151302c 100644
--- a/src/client/app/mobile/views/components/user-list-timeline.vue
+++ b/src/client/app/mobile/views/components/user-list-timeline.vue
@@ -77,13 +77,15 @@ export default Vue.extend({
 
 			this.moreFetching = true;
 
-			(this as any).api('notes/user-list-timeline', {
+			const promise = (this as any).api('notes/user-list-timeline', {
 				listId: this.list.id,
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
 				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
 				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
-			}).then(notes => {
+			});
+
+			promise.then(notes => {
 				if (notes.length == fetchLimit + 1) {
 					notes.pop();
 				} else {
@@ -92,6 +94,8 @@ export default Vue.extend({
 				notes.forEach(n => (this.$refs.timeline as any).append(n));
 				this.moreFetching = false;
 			});
+
+			return promise;
 		},
 
 		onNote(note) {
diff --git a/src/client/app/mobile/views/components/user-timeline.vue b/src/client/app/mobile/views/components/user-timeline.vue
index aca6f783b8..6be675c0a7 100644
--- a/src/client/app/mobile/views/components/user-timeline.vue
+++ b/src/client/app/mobile/views/components/user-timeline.vue
@@ -59,12 +59,15 @@ export default Vue.extend({
 			if (!this.canFetchMore) return;
 
 			this.moreFetching = true;
-			(this as any).api('users/notes', {
+
+			const promise = (this as any).api('users/notes', {
 				userId: this.user.id,
 				withMedia: this.withMedia,
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id
-			}).then(notes => {
+			});
+
+			promise.then(notes => {
 				if (notes.length == fetchLimit + 1) {
 					notes.pop();
 				} else {
@@ -73,6 +76,8 @@ export default Vue.extend({
 				notes.forEach(n => (this.$refs.timeline as any).append(n));
 				this.moreFetching = false;
 			});
+
+			return promise;
 		}
 	}
 });
diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue
index 4c1c344db1..9ebce53de7 100644
--- a/src/client/app/mobile/views/pages/home.timeline.vue
+++ b/src/client/app/mobile/views/pages/home.timeline.vue
@@ -111,12 +111,14 @@ export default Vue.extend({
 
 			this.moreFetching = true;
 
-			(this as any).api(this.endpoint, {
+			const promise = (this as any).api(this.endpoint, {
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
 				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
 				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
-			}).then(notes => {
+			});
+
+			promise.then(notes => {
 				if (notes.length == fetchLimit + 1) {
 					notes.pop();
 				} else {
@@ -125,6 +127,8 @@ export default Vue.extend({
 				notes.forEach(n => (this.$refs.timeline as any).append(n));
 				this.moreFetching = false;
 			});
+
+			return promise;
 		},
 
 		onNote(note) {

From 83c819a1309c42599f0c4acdbc61942484dc54bd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 00:18:44 +0900
Subject: [PATCH 011/369] #1539

---
 .../app/desktop/views/components/timeline.vue | 23 +++++++++++-
 src/client/app/mobile/views/pages/home.vue    | 37 ++++++++++++++-----
 src/client/app/store.ts                       |  7 ++++
 3 files changed, 57 insertions(+), 10 deletions(-)

diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue
index a776e40a24..6a243ca563 100644
--- a/src/client/app/desktop/views/components/timeline.vue
+++ b/src/client/app/desktop/views/components/timeline.vue
@@ -31,8 +31,29 @@ export default Vue.extend({
 		};
 	},
 
+	watch: {
+		src() {
+			this.$store.commit('device/setTl', {
+				src: this.src,
+				arg: this.list
+			});
+		},
+
+		list() {
+			this.$store.commit('device/setTl', {
+				src: this.src,
+				arg: this.list
+			});
+		}
+	},
+
 	created() {
-		if ((this as any).os.i.followingCount == 0) {
+		if (this.$store.state.device.tl) {
+			this.src = this.$store.state.device.tl.src;
+			if (this.src == 'list') {
+				this.list = this.$store.state.device.tl.arg;
+			}
+		} else if ((this as any).os.i.followingCount == 0) {
 			this.src = 'local';
 		}
 	},
diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue
index 5701ff03d5..8d10d96c82 100644
--- a/src/client/app/mobile/views/pages/home.vue
+++ b/src/client/app/mobile/views/pages/home.vue
@@ -5,7 +5,7 @@
 			<span v-if="src == 'home'">%fa:home%%i18n:@home%</span>
 			<span v-if="src == 'local'">%fa:R comments%%i18n:@local%</span>
 			<span v-if="src == 'global'">%fa:globe%%i18n:@global%</span>
-			<span v-if="src.startsWith('list')">%fa:list%{{ list.title }}</span>
+			<span v-if="src == 'list'">%fa:list%{{ list.title }}</span>
 		</span>
 		<span style="margin-left:8px">
 			<template v-if="!showNav">%fa:angle-down%</template>
@@ -26,17 +26,17 @@
 					<span :data-active="src == 'local'" @click="src = 'local'">%fa:R comments% %i18n:@local%</span>
 					<span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span>
 					<template v-if="lists">
-						<span v-for="l in lists" :data-active="src == 'list:' + l.id" @click="src = 'list:' + l.id; list = l" :key="l.id">%fa:list% {{ l.title }}</span>
+						<span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span>
 					</template>
 				</div>
 			</div>
 		</div>
 
 		<div class="tl">
-			<x-tl v-if="src == 'home'" ref="tl" key="home" src="home" @loaded="onLoaded"/>
+			<x-tl v-if="src == 'home'" ref="tl" key="home" src="home"/>
 			<x-tl v-if="src == 'local'" ref="tl" key="local" src="local"/>
 			<x-tl v-if="src == 'global'" ref="tl" key="global" src="global"/>
-			<mk-user-list-timeline v-if="src.startsWith('list:')" ref="tl" :key="list.id" :list="list"/>
+			<mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/>
 		</div>
 	</main>
 </mk-ui>
@@ -64,6 +64,20 @@ export default Vue.extend({
 	watch: {
 		src() {
 			this.showNav = false;
+
+			this.$store.commit('device/setTl', {
+				src: this.src,
+				arg: this.list
+			});
+		},
+
+		list() {
+			this.showNav = false;
+
+			this.$store.commit('device/setTl', {
+				src: this.src,
+				arg: this.list
+			});
 		},
 
 		showNav(v) {
@@ -76,7 +90,12 @@ export default Vue.extend({
 	},
 
 	created() {
-		if ((this as any).os.i.followingCount == 0) {
+		if (this.$store.state.device.tl) {
+			this.src = this.$store.state.device.tl.src;
+			if (this.src == 'list') {
+				this.list = this.$store.state.device.tl.arg;
+			}
+		} else if ((this as any).os.i.followingCount == 0) {
 			this.src = 'local';
 		}
 	},
@@ -85,6 +104,10 @@ export default Vue.extend({
 		document.title = 'Misskey';
 
 		Progress.start();
+
+		(this.$refs.tl as any).$once('loaded', () => {
+			Progress.done();
+		});
 	},
 
 	methods: {
@@ -92,10 +115,6 @@ export default Vue.extend({
 			(this as any).apis.post();
 		},
 
-		onLoaded() {
-			Progress.done();
-		},
-
 		warp() {
 
 		}
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index e300d31d8d..e787b41464 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -68,6 +68,13 @@ export default (os: MiOS) => new Vuex.Store({
 			mutations: {
 				set(state, x: { key: string; value: any }) {
 					state[x.key] = x.value;
+				},
+
+				setTl(state, x) {
+					state.tl = {
+						src: x.src,
+						arg: x.arg
+					};
 				}
 			}
 		},

From e7d1b6ec00e75c29c89bf5cf555b5b50812ee7e6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 00:27:46 +0900
Subject: [PATCH 012/369] Fix bug

---
 .../views/components/timeline.core.vue        | 15 ---------
 src/client/app/desktop/views/pages/home.vue   | 33 -------------------
 2 files changed, 48 deletions(-)

diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue
index 3c7e87aea1..3fcec86e48 100644
--- a/src/client/app/desktop/views/components/timeline.core.vue
+++ b/src/client/app/desktop/views/components/timeline.core.vue
@@ -34,7 +34,6 @@ export default Vue.extend({
 			existMore: false,
 			connection: null,
 			connectionId: null,
-			unreadCount: 0,
 			date: null
 		};
 	},
@@ -76,7 +75,6 @@ export default Vue.extend({
 		}
 
 		document.addEventListener('keydown', this.onKeydown);
-		document.addEventListener('visibilitychange', this.onVisibilitychange, false);
 
 		this.fetch();
 	},
@@ -90,7 +88,6 @@ export default Vue.extend({
 		this.stream.dispose(this.connectionId);
 
 		document.removeEventListener('keydown', this.onKeydown);
-		document.removeEventListener('visibilitychange', this.onVisibilitychange);
 	},
 
 	methods: {
@@ -141,11 +138,6 @@ export default Vue.extend({
 		},
 
 		onNote(note) {
-			if (document.hidden && note.userId !== (this as any).os.i.id) {
-				this.unreadCount++;
-				document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`;
-			}
-
 			// Prepend a note
 			(this.$refs.timeline as any).prepend(note);
 		},
@@ -163,13 +155,6 @@ export default Vue.extend({
 			this.fetch();
 		},
 
-		onVisibilitychange() {
-			if (!document.hidden) {
-				this.unreadCount = 0;
-				document.title = 'Misskey';
-			}
-		},
-
 		onKeydown(e) {
 			if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') {
 				if (e.which == 84) { // t
diff --git a/src/client/app/desktop/views/pages/home.vue b/src/client/app/desktop/views/pages/home.vue
index e4caa2022e..60b257edb7 100644
--- a/src/client/app/desktop/views/pages/home.vue
+++ b/src/client/app/desktop/views/pages/home.vue
@@ -7,7 +7,6 @@
 <script lang="ts">
 import Vue from 'vue';
 import Progress from '../../../common/scripts/loading';
-import getNoteSummary from '../../../../../renderers/get-note-summary';
 
 export default Vue.extend({
 	props: {
@@ -16,46 +15,14 @@ export default Vue.extend({
 			default: 'timeline'
 		}
 	},
-	data() {
-		return {
-			connection: null,
-			connectionId: null,
-			unreadCount: 0
-		};
-	},
 	mounted() {
 		document.title = 'Misskey';
 
-		this.connection = (this as any).os.stream.getConnection();
-		this.connectionId = (this as any).os.stream.use();
-
-		this.connection.on('note', this.onStreamNote);
-		document.addEventListener('visibilitychange', this.onVisibilitychange, false);
-
 		Progress.start();
 	},
-	beforeDestroy() {
-		this.connection.off('note', this.onStreamNote);
-		(this as any).os.stream.dispose(this.connectionId);
-		document.removeEventListener('visibilitychange', this.onVisibilitychange);
-	},
 	methods: {
 		loaded() {
 			Progress.done();
-		},
-
-		onStreamNote(note) {
-			if (document.hidden && note.userId != (this as any).os.i.id) {
-				this.unreadCount++;
-				document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`;
-			}
-		},
-
-		onVisibilitychange() {
-			if (!document.hidden) {
-				this.unreadCount = 0;
-				document.title = 'Misskey';
-			}
 		}
 	}
 });

From f8abc8193b5fecb5e3ff439a819ba05f8db4b56e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 00:29:31 +0900
Subject: [PATCH 013/369] 2.18.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 3806074de2..5688484b9c 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.17.0",
-	"clientVersion": "1.0.5731",
+	"version": "2.18.0",
+	"clientVersion": "1.0.5784",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 728dd446b3fdb3a9ed46de87a46b3f0eb3ccb05d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 02:56:54 +0900
Subject: [PATCH 014/369] Refactor

---
 .../app/desktop/views/components/timeline.vue | 17 +++++++++--------
 src/client/app/mobile/views/pages/home.vue    | 19 +++++++++----------
 2 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue
index 6a243ca563..27d329d13f 100644
--- a/src/client/app/desktop/views/components/timeline.vue
+++ b/src/client/app/desktop/views/components/timeline.vue
@@ -33,17 +33,11 @@ export default Vue.extend({
 
 	watch: {
 		src() {
-			this.$store.commit('device/setTl', {
-				src: this.src,
-				arg: this.list
-			});
+			this.saveSrc();
 		},
 
 		list() {
-			this.$store.commit('device/setTl', {
-				src: this.src,
-				arg: this.list
-			});
+			this.saveSrc();
 		}
 	},
 
@@ -65,6 +59,13 @@ export default Vue.extend({
 	},
 
 	methods: {
+		saveSrc() {
+			this.$store.commit('device/setTl', {
+				src: this.src,
+				arg: this.list
+			});
+		},
+
 		warp(date) {
 			(this.$refs.tl as any).warp(date);
 		},
diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue
index 8d10d96c82..33579185e1 100644
--- a/src/client/app/mobile/views/pages/home.vue
+++ b/src/client/app/mobile/views/pages/home.vue
@@ -64,20 +64,12 @@ export default Vue.extend({
 	watch: {
 		src() {
 			this.showNav = false;
-
-			this.$store.commit('device/setTl', {
-				src: this.src,
-				arg: this.list
-			});
+			this.saveSrc();
 		},
 
 		list() {
 			this.showNav = false;
-
-			this.$store.commit('device/setTl', {
-				src: this.src,
-				arg: this.list
-			});
+			this.saveSrc();
 		},
 
 		showNav(v) {
@@ -115,6 +107,13 @@ export default Vue.extend({
 			(this as any).apis.post();
 		},
 
+		saveSrc() {
+			this.$store.commit('device/setTl', {
+				src: this.src,
+				arg: this.list
+			});
+		},
+
 		warp() {
 
 		}

From 20bb851c4e4be3e975a41a66b108170b3318ef37 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 03:01:08 +0900
Subject: [PATCH 015/369] Fix bug

---
 src/client/app/desktop/views/components/post-form.vue | 11 ++++++++---
 src/client/app/mobile/views/components/post-form.vue  | 11 ++++++++---
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index 0e0848524a..39bec6cf0c 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -116,9 +116,14 @@ export default Vue.extend({
 
 			ast.filter(t => t.type == 'mention').forEach(x => {
 				const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`;
-				if (this.text.indexOf(`${mention} `) == -1) {
-					this.text += `${mention} `;
-				}
+
+				// 自分は除外
+				if (this.os.i.username == x.username && x.host == null) return;
+
+				// 重複は除外
+				if (this.text.indexOf(`${mention} `) != -1) return;
+
+				this.text += `${mention} `;
 			});
 		}
 
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index 55347b7e53..264eb08448 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -84,9 +84,14 @@ export default Vue.extend({
 
 			ast.filter(t => t.type == 'mention').forEach(x => {
 				const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`;
-				if (this.text.indexOf(`${mention} `) == -1) {
-					this.text += `${mention} `;
-				}
+
+				// 自分は除外
+				if (this.os.i.username == x.username && x.host == null) return;
+
+				// 重複は除外
+				if (this.text.indexOf(`${mention} `) != -1) return;
+
+				this.text += `${mention} `;
 			});
 		}
 

From 7cdb790f4e2f8860c0d88be126e115ef2f563cb5 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 04:34:32 +0900
Subject: [PATCH 016/369] Update favicon

---
 assets/favicon.ico                     | Bin 360414 -> 270398 bytes
 assets/favicon/128.png                 | Bin 2325 -> 0 bytes
 assets/favicon/128.svg                 | 161 -------------------------
 assets/favicon/16.png                  | Bin 518 -> 0 bytes
 assets/favicon/256.png                 | Bin 4824 -> 0 bytes
 assets/favicon/256.svg                 | 161 -------------------------
 assets/favicon/32.png                  | Bin 761 -> 0 bytes
 assets/favicon/32.svg                  | 152 -----------------------
 assets/favicon/64.png                  | Bin 1258 -> 0 bytes
 assets/favicon/64.svg                  | 152 -----------------------
 assets/favicon/favicon.png             | Bin 0 -> 6972 bytes
 assets/favicon/{16.svg => favicon.svg} |   8 +-
 12 files changed, 4 insertions(+), 630 deletions(-)
 delete mode 100644 assets/favicon/128.png
 delete mode 100644 assets/favicon/128.svg
 delete mode 100644 assets/favicon/16.png
 delete mode 100644 assets/favicon/256.png
 delete mode 100644 assets/favicon/256.svg
 delete mode 100644 assets/favicon/32.png
 delete mode 100644 assets/favicon/32.svg
 delete mode 100644 assets/favicon/64.png
 delete mode 100644 assets/favicon/64.svg
 create mode 100644 assets/favicon/favicon.png
 rename assets/favicon/{16.svg => favicon.svg} (98%)

diff --git a/assets/favicon.ico b/assets/favicon.ico
index d63c68b016517e26f94913d9460272f815855917..8e2b3ff4ca221e3c4e5f2debdcba4b6fad4809ec 100644
GIT binary patch
literal 270398
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

literal 360414
zcmeI5d2k&^oyV00ilwM6peTwzwx|uYyG6D_Bsn3303m@8&Om?=vVjdL76`E6*buTI
zgg_v$;R<0%u~`F&W!a9e*pBVkj&)d)CHays*_Lhjl5N?R<@=IlSx0aGo;=EEG&65z
z-keXLu6p(6=xcuc`S$emboZ2$Tvqa$k~hAwME_r2^37M5lzgG2q~!9;hxcdb<ID81
zn{FE3zv4qBCHKCiq~x*3F75yAWhKAAQwPva!e4Rut4kK&b6Lq1dS3_CM~08<KPPvY
zK9Sh3?)hupQZ>2k@v6zCk2F2|j=!_!Woc#UTdOO}9@oEz>t<b<J6}^-dRI+F*^@Ps
z%id8vxwN5ra+#8!-k)s^ug|YE&g(d)RaKO~Z)AUR={CJRII>?+)-B<yo}KXbi=UhD
zmb$u|UNdrTIE_xd|5eMeT-uk8ovyAdf8^5kV9n(6`z(GB>b$#!H^*hSop^X{!`qE(
z()K=SY<v7axOU<-V$&)5*RI3gX&bJxY+}{q^4T`$4r=aSb%}>XRh1KN)P7zmzhMUE
ziJ!%P{HNFIbB*RWG-sVvmF1r_9XmM6Pi0w)=I!+cL&AVQzw;IU<<oWAH@vc6y3OEI
z_%(+$;xPCYE)2e_DoXFtd3o~XDOdlq;V;2|opf*~^~~k^ca#1}{o~>it7CFmOR$b3
z{p9X1*xuguxq7^!Y@M#ly7fJBe$8`N{iB<$<X%`)QTp(3eOS6r|37WiXA(}=Z(koi
zm#br+m^JH;S2@L3Go}0%?bmvL>oCV>4Xf|>KN}OKqHLb{tEwpbsP&w_w>)5t!`Rn;
z=UDyAzTA%tKi2<h-8QfbBW;DM%Ci3%bFQ+i&KifYuiFJ;ckA^lT_z8UAGv=meeRua
zGwiWq*7dKm^{?Z&)Sj7SJuhh(=~@4s(wFkBnp8eP$JKr*zCLN2Eu47G>#gyR><`}$
zLrGtASgqsj8j1TA8;yy7#80T{+my*Gc^F$>a*p(+Jv63#g77y|rul4cK0j>#r>$Xi
z`VCg@jeRHnt#NqTm-H(}wJCF)h?b1>tp8!BFY)U-=mD*t<2uhhx-Nc3+S%50jeT$F
zm$vA*&gQj&zJ7_fZqnti)Ajmi<=O0|X;;0;NXzcuL;8~>T=k^V>vj6Qu6fYuFP?hc
z8+1L@X7bnN*0y#{zoM*h)~qXEYvfzo@=K<8$J7B*|LU|Kvhg#;h{O7??_~>Z{7c*&
z^2}lNuj`n{9sH{$lgi(&uV>8tN8ih8t??N9HIqs|ZWCWub>-FnV)(KCYya}hX1V_I
z`QlIKZ_NEy-!JdC#$n#q=kL^cY}Ik<XUNh;byG{<W<GDXT~ks1khXQF4x^vjO8;Wq
zAI0x0?T^xZ(pHdrs9hW!vu_V#7wi%-13LQTob*%Nq<@d;AN>@tp2I*;;D-%h00v+H
z24DaNU;qYS00v+H24KJw1Nz;=-MUY<PTrAT>Ytq>@5KsvwwAts-9Id2fI5fYz3OpZ
z6=h#>>etnNKP7$M+P}QdmiN<>q;I^CJmd?T8_T5MLF=?E{o=-c`Gfi5usg4>^L`!Y
zpk2K3?!f$hLc(8qFK?HJ<JFU{y2>t%FplZ`Jz<we^D!B3<tMG0$rJ3x28_P8%Ce`7
zIG0vjb&WYa>$bdOF#Lx3FYg|7TJG<rgbO{U%ul*H&N}Ng*zETk?}@4_N}sYhKgwS6
zPTx-+y!h2)-EPj8u5sQNx0x?q(Y6lLZ-jIEmv@a4pVo?t{)Tm^>!h6DeChi+Uo*M%
z4!8W7&(%(w@DE<%uAX?!8_eO{w)J?!uS=XR?-EBC&>FnMOZtBNNSto@GoLfp!?LZJ
zeK0p>Mvr${I_avBcaC+F%HL!T=en)O8)fbKbzStRzNRsJ>oR;&*e}-W*LB6)hsP%v
z_eGn3JwEp3zh3!f*D^QXXERj()sxHRJ-6-s+;Y8}E&C%H9&<cX*Kbqa=CTa3&Gl!d
z{u{$?kn*;Mq5LWTjI@8E<X=DQ&d(dap0nepZRf?WpY~tg{8_c_W&aiZ|0!SmdY;g=
zUarZHpR`=R^t0r-{&u&q_<pY0>^CjfFL~0>cTYOlphx#7TyM^ISlem3ez_(+Hu4*~
zow@sx9dui>v^t9Ce#3rgyM7~I(l6sS_Sx`P=zk&Cuji{gEB$i1te$q@*16qp)Qy+w
zKjS*|^VPR>nQyxkpYE3`pRb?0BJ2ALdi{D{=Mr;$q@Rgx#ua;bUNBw1*8fBYJNDF0
zDSw|~qcHyiU4MlhqptgS%=wUU^SaztI^^G(1LOWTx$J{^!bVd6>pq;@^Q1dE@A}<<
zQ$JYE^Y47Cj!XLNM~89QmwD7;N15x8FI*J&f4Q&ZOV@P1H{X4zX6l41wg1zmFs`<c
zId8e^cbLm&jz`ZozRk>B7~8r2?@Dj^)%v{KOPZ2Too_GwB>KL7#hWG0TtA`<Ct`=F
z?t?n*pPKD#zwPfGkgiwmvyaE5jf&D=8uqN2RDNw9{~HXyVgE}#uJ1F`ozmBJyW<>8
zx4h{1zN3G(9OyXb$y`)(cwGlP;*f`Kw>d55I11U;ZSdRmuTJMdzk8IqDP?nHUQi)%
zUMkm_T05OOzN7lrD07jV;?(7E+oe1l)i&zT+Y`Oasd0*r<BSc50T_S*7=Qs7fB_hQ
z0T_S*7=Qs7C}IZmrQyb_1!SFw$K>Mm%m=r1B6NS8YyUjwu@4Nu01UtY48Q;kzyJ)u
z01UtY48Q;kzyJ)u01UtY48Q;kzyJ)u01UtY48Q;kzyJ)u01UtY48Q;kzyJ)u01UtY
z48Q;kzyJ)u01UtY48Q;kzyJ)u01UtY48Q;kzyJ)u01UtY48Q;kzyJ&s7X!_6Z&lk@
z{kPiJR;doOzo7PP`it7!_^_&<abqHDlP#Neo!VIYUA4RQ|5RuDEVXazRJCL6@73y;
z?$Y@w_noJj%B$7drC(LMH~g>a+&)w7-#SgTxBO16c=5Bo<0>ZhS1<aaI?=U8Ik};s
z0d-)<9JPGb&9T@?%6<37XVk#Ob52=O=T7ZW8<&00bAE)Qp40mr<2!nwQ8mr|r04jG
zrTn+AenLt4dT|%dA607>-yNxqn&y05ojK9&B|AAk`?o!>MAvTRv1`MhwBMn;abCP|
zGV<$l%V*r@wypYQUYl4w4D|P?l?(20wRh0#sGsoxb^gqLYm#~Q5AK}jn4h-hpXLp3
z_R!aRTs6M%QOEd#UR&D2ty=g6H8j|7zI4yq=g)Mi+Ntjj-9}Oe2X$K-9~qOM`sp{Q
zi+!hkM|rqo>6p0ER(^%%=h(q!-*zzv*t!0Xq1tHO(yyDN_q~0gr&~$8!EBeE>;B+7
zp5XvPMO_ChpZ#HdnfdRBZpQ09cW9KY&2|s6-L+@2TXLSxwbuV&RGyA^t@aeo&ePTv
zKN}TSkZVe7n6~Dh*j=*kW6kq!3(ZE-_A1mJ+&OnteuA_mj6CdVoj5A4w3cO%e95y_
z7;b&_H$$<Jv?aoD#}BO<l^<!#1$ELl5X81w2qV`PhTFXShoRVL`RrT5$c{R5eEX>U
zQ2zG)lcANr?i&n)_vN!c5>EN+egkuUDF0;2U;1!%v^=S#O?UjzN_A-00wsMgs~q|b
zD1ZBMGP4}!c2xSWd;Y!Z;I8?)KXK4e&!>)T9Mj)U`DefUo9BHx*C+2-@TL>ehiLA*
zr~I>B{>!xP<$a7FH_(4x*8`u)-LEPCY?i<Dk<?DTRt4?1J$G`KYMA+<90z{baq=tg
zjm-B++JE+3g?0b$*Y9Wh^gF>qoW$YwUe-_Cl)rs>n>8WZVU@q1vWdel<xlyWS*QND
z=K=lauZ_e;W|oR+oARgp^IIT$KDhte*Z0=C3;pM3oBBV$jnd`={iA<#T}S)ho(Jmx
z{52Q#e|{UK%?I_rz241rqHK>B{mVG@pl(m=pLzZdYP^KPS@mDY_}{kX$0+}V$}woN
z*7D!6_NjnT75Di6@lyZGyygDBv%VQ9_W3{KrTnF>!~DOoZNl+X{=$Iw`M;;snnnLs
zwD*1EIbgh%zg)M>4eLGE<#;bRad@qgF^q<diur#$mcNvz%rla4r?QU7;f^Kh(C&pw
z=6OZEra{_R8n5M_wsJ@+KXH}6%*PU~74jVJSYg|ous;7;?JHwVWql*j{)w)Z+_=^K
z+h?c^HTUT?L?(=jx?gM(NBPU#AG1x{*Zjt&#KJw~RQ{5W+<HR&y^aZ<J+Wh4wEf~J
z|C8Mta^u3S`rEsu!qNU=oUki@SsUnRXM?Bc2M798Yu)#Yz8;8D|L4yh)MNTTXlp~!
z;gS7yp2{MKC%f|Z%iMsjBcfX0$f}2=_M<9)S+8y7g3sHQy>YF}rd_Yj`dHt~4+qxr
zm-P(2u5D&cN7@EPev9!xit?8^pR&fD7kf3n@G;fbd(3R|P`0h*-?8bhf#Wsirg^!Z
ztoeze{AC?YKXzzYa*vYxZJ5rw{==ywt%0ML=LA33lO?~hu4|Z1=6naaep$0EOecMK
z=6uK+RY6_H=4VI6WsW!N+igvc1~to=aANb?DenqwtB%djjfpepfwAj9G5*7jRk{Bb
zy8fG#k&Le?bZzJ`p9wZKJUEI&X~zY1#XSB)m?(7p$Ns)EW7hGoW6jGkc_xs1cOg#J
zf3(&^vPNYvSKQ-2q)g;FE$I5MQueZDxR<i^>PPx!dro%*D=r;slV$BkNw;C<O|EN*
zJ0&K4mtOOoWq(1|f0p%h!!CQnhO!PwkhK8hTLnfO*8i<5f9_Pww#TI&k@Zon@f7R+
z_BFru+(#m7Jvgo56_$M(^fw0l+zX`5mv8;|;q@-_uXihDU+jH<cI71B({TI#!{Fe>
z-1k6aeRjL>VIPzGxZJzl#_q|z!miGD%1dkA{p$SL1Gbu%w(#MOm&cXv?d;S%?^DCy
zf6?!3546wDjg8pS_#;&}{r$0&yERX;w$O&!Z|A<(BJXMUZ=0@UP4D3`S^>WQGUXbz
zuIk=V-;>$C`d9k9AGaoQeb(z`f9zOAY=TW-00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qZ9V4wtt1+V}XzyeqR3yeDpTp?F{
zng0Ea{9P`4wl0dc2XWG-g#j3V0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7
zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ
z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*
z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7
zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ
z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*
z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7
zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ
z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_sb
zfttz*s_})7snsvtrPfv5tJW;OTdiF1d9`fX^(v0^vyetj<<+Wb?k7jtXvO@`soJUU
zPK}M~o`0`uo_CvSS@IRNYT*~u^4T9&lJ6|ompsN>*NMLOwEkJ0?B1XT2l|wg>pgc!
z9oqep+SKrnt`FWbu2@>V=!<Ia=1J=G(amab@S>B6RL`0H>fo;Vs<rO^SnGrO={Kk?
zjXzRddlsvU7f#ydZ)j*xojK92_HL=rb;6zFs{E)^#?~ntmwiv2I=ac0m3#*WE}qMA
z)G+g=BIc+(SJ#PVg1CzpPO04+pHX$w-yfNcB<{U!lhr_fkMAs==vt#zFZxnsc|&t!
zHJ1jPG|#<N9Y3_nH!pSpF7};P+gAQUGgMww97&t#)R9)ZOZI)NulJbR-1u<l_L1ka
zzTV@$^J5MmZGw)?&*^7_38CjN4Xl%g(RGlt-R0gLw(H(ktK^xp80@`u<>UG}=t9^g
zQipae2<@3*>&l<2p~3#p@_6h(Q>5*bV&Ed{*RX5-)0&r|(3r7CbmsUr)iCSk4A%kW
zxwf?Ry29K)*}bk{opo&bYnWLYiR<*SHr=mtU53kV^t~?YdJQxGJJ<bTq@1JNICpZF
zlD?=g^Bz}R(k~W=lRlTA{ij<RABi-J-TP{E*%jBbTwMI5HJ#SF?`vkFyYE|pJkiyX
zxpz%lSNzO+8IkTE*}u%U&g310+xwZYGA!-Hw6aXT{Izl9U4DPxnXu6C9FMe7vr<;_
z?mmj={d~sS(ek8c8%h71JYU7(q>hoX16e6Q^66YB9O<l&1DP>tNWXG6-Z7V}6NlH1
z$$uONq|Ry5?_#|0yLtH!<H*uT8ZwT+OTO^qti7advv%p%M#?jZ4bfH7HprKLYyA(B
zFwIDs-FvG&+357qEhAy#*pT{r`RtE)%3D4gb3U0m;@H9FI8bp-L&l$`x%{QiJ4q)x
zljjdN8#T}SR3ceyZ~2{TzTEQ6xnwkN*uC+Ek1Am+X?JM%!qhS(<Kolc_O(rMwb8a!
zzf2^X#||{Q=F4D>|75jpXaDw=-zLJ0HBlLtT07-kspM$SroULTo5=o!o^DtBbZ(!S
z%6!>z$FX$O1xNPRCBlqdqAg4AapgNHW@NroTAW*dyS$T6!pZnT#s#NC&we%1d#)=9
zWNg!HU-O$3>c3pinK^Hp-y{yo+&!l<PO_e=pK+sOzMS&Q@nq`^nTMW+XMaOS`?pO`
z9YZo7K21*M2|DTK?8%*pWmWnfo$|%;WOeRj|Fp4vxMNA`7?SyYX>x9LB>GRM&Ybj@
z^l=$ek|uYwvmtf*mwE4La<XQK6F2A|{X4N?cRZ>0#ZG!Un!@);vaVU0oXicjD@!?s
z{?We^8+OOhe|}!jzqi_t=l}dH*=aDzW9UDBnW2C5pQJ{kOuLx$FY6A=JchQWN0rQ%
zlXVPaJX~x21A2~{^i2nwtB(HBf0P<bGVZMFU*0)yU-RqSTD$q)WA^u*Rb9Imsg1SY
z^)*%n{iFXRH5z5wS=E32j1T12q8#Y&^#-TKSI_B=OY3arZxf(@i}4(Ghuc{BpQoba
znYjJgKa2X`Q2QOdmhCYI3jH0HwJev<zQwUWU3fzO-fW8g{b?@^byc?XU#{=@&uSRM
zU7zg2`J-ypf;$}R0Q8Uk)1cKT@{kq%%iIzf_Y#$pzJXN>|JAk*K>yyX&i$YJzc*5x
zeL0Q)iDSLp3q6N(-@dcfv*_Qsyv%3NKl(TG5M<j<|C<^f3=&nKFw!4@{sWor(mU4d
zX~0_E<7q!_?SHHO<QpMQ->3{mY5q`KntnX04p_7J%lQMv=!5aU)G=YzQEAh^d=uAL
zM?$op#F~4umW7NVGHjgGnp#d(3i?O?2AhTcr%nIDysSlfV8<N&ErPR75{TuveA83D
zO%QkcBj3fLfAn9d?v3zi)PFwy$NPEokNyq)7W$9=vsas-fAn9d?v3#1AN_}A0b$AD
zivMiXQRqJ``s0g-`+qjHm4!MG{l}-<uu?+*=s&Ew1^tJm%J||z|L7n6$EUZnrG);`
zKl)FbD&xx!`bYohKR&&sEhY4i{?UKhR2g4>&_DV||MBT9Z7HFD^pF12rpoy8gZ|M!
z`j1a<X-f(Hqkr_DHdV%#AM}s@(SLk;OIu3lAN`~Mw5c+_{GfmIkN)G+TiQ}W|L7n6
zr%jdd<p=$vfAk-p-qMy5`bYohKW(avFF)uX{iFZ*^p>`i&_DV||7lZYeED(H|EVJz
z<I9L8rG}X|vHq9-UTj#}j3XY_|FA%ufn7KKckioB<O+s{21dTy5C^xU5l%gW{u7Z)
zL5aHQzjOP{g5nMu_(D&2rtW*xAH($r`VUHca^c+cpVYUC?7rKG#=^NrM`=g&pPY_^
zrtGHwq{_3s<+t4bGxqE+^-5B_1ZAIaO1bG@%JlTn&9RzkXlPJ>H~kj$kN#ujZoDRz
zPyd^j|1eh5bnRJ;_A{t`?*FmMB(%ix>0iE|eCGJJ(9&~@XmFrUw;?}`{?Wf1CY%e=
z0{QeW_4?|U?oxvT7eY+cKB}GT|A_W8s(tSN_DrY!s2BZ9*>0-;fxeWX$S$XQZ<W@5
zIr>NckugTZV=drS|569+X`MJWf)I{KA7ky*ccc9bYoGgn2tr683P1XnGH!4AosvHK
zu-vI5t*U<d4QM~(+DHFkDI(r@{OVuIc|+~DRe#^vf-`zx#~kkaMWB0O0{s^(heRR>
zqJJst<+E<ijUAA&`hMNnlRMS=>Thz-FCy)uf4?e7hyS4ZH|qSRIiJY&3!FQ-OJ9(4
z|KP>G)9P@?(p=kte!ldN<u%IJ&p+e;(xGWTxhPcsW<Kg?d_b*SaEDr7^B-zU(~s50
zW&f#KmfWM7=HAMDz9PHVo6FtUM*n`4mkz&S>fhji|KhyA=POtApAJp?$p!i!pIXhQ
z<sj$LzaQnL!*5vnm-qK;mwqkR?%%QY_o`#_b86T6r&U|?Pjb%#b<e+-{=OoA1}HZD
zpFev*$^4fF-PgTr+V#0-+3vm7=@4#6xhO>cwNtNEZB37=qn!<Epug8OM?-`C>O|KX
zwSCR6wJoosE-1pfpqTW3?BEK`>3eKB-Q4)F9s}e5y_c&%5;_@7|K(~+<0DGe=?UU4
z^c+#Lwn)vCYi#Wsr0q$V<ey`TMgOOdwK;0v;7s^;d*2mA7fFQitAA<dAKJYzl&qfY
z-jEwdVAz!Z<TYGK85D#5<=(V>_D4M3mv(P_CKMec8HpeLH_iFDI&-2u)a*(dV)ddg
zd9rsQY!Wv5x+UxSmpQJh7k$wOi{(nztH`qRs{duW|L)wW-H}{s|HX4^#r)6tuzU0@
zQ(ySEahCNjb6RA)ir;dV_OQ%h$*S|Be^~=W`uL)B=g)Mi`WZL+w!h!<!oPoAd$n1X
z^}l27Q-Rr&_XEA>x}uavWN~}Z|BjX?BTL^L@sa&?fy=-vqxeJrX69tuiw5#>Bkfmd
z$7aptyY{;2?^72qoQmzTWNu+TTXQ}-4HshDEZ+Z5cCXiSP_GSzx%D;og*rDr4$<Y)
ze^hIJI9;2(dntrL!X{TYWKI7vz9;PO%*oidEIBv**Hm7u`g)JWemSz<AUaM?$3bnM
zCH+fVedYYyBjM~o`|Q{?6Es0L{jXj6)u7Q96i&tt2W60O$<-TK(Z7t{TUYgs$QYAx
zZ6~@~3erGaf!*}KYr~)7%EqX4P95D8S=mrOL{~pF&Hd!4a!l*a_SH{B&X>%EKYwO_
zT1_yLuY)^ZbhL$>OTt~eaMCeP=r=n37HV5zKJD({&Uvx1wc^Fk=ymeWq}n8V+a^2O
zL%zeAj2lw5Q{Ls6uR=K`d^B~4j1viSZP>8cJK4Q1cCOY}e=F5Car@?m^u;ITypF*}
z%h6~#s9j|oR~ntP#ie}`^tuWO7uWciAa>u>@L!HLNpf6c*zaWuDL=w`uVcD)FA9QT
zq+tdk?CbZ+hOBj+Mz?(ShaL5QWdE{6vMl|x(w6jUTl{&~XVkXZw(=K=FyoY{JdbS9
z<8q?D?tJmf^Q??DN|Wo+Z6ddPcec+;B)c*v&@Eq_OOM{IWg&Ao<U6iuaq_(yYaWx@
zPun{InZN92i|wm_l}Is4zoT2eIG0}iOWDXe?`d#u@3xa-XvK@4O~pI`S&wV^>|0!Q
zCV5T5wYU7%HD5`U9qD?jcVs<>q~8M^JJ=k1U%yvAWR6Q5-_v%}?t%6fJZUWK^*-G4
zB<JMW->px=tBvvJO{-DaN#3(3<)jZX?Q6@)TDeKp0e!v4J--WSYyN4h#VBiwMa3lX
z##blE`<uSr6S1-*iAkTe%v;GqS+~|dkVrd8)-?8NAE`&ro!S#iIm#NsGKSP^-tZTn
zo`cw0=8wp8W?b(0p;e*H<qdMZLBhy7xN$n^)AyUtHH*Kj1_v)jp3U|(zww<nzt@8Q
zc<YR~-UrH96<MP{i{&e0@ZxZ%j%*CvC(_pZSfp7z+_6NLU3n(UFN@5@nP;g3qU;Y8
zuIs1YkZE@0TRBm#Cw}7aS|w}w6jJVcH&2SB4v@748SfwOeYp@0f`o0YyI;?RIU71Z
zvi`2D!5Jh^X$vD`aR>T)LbuW3y;Y&vXzR+K=lbZw%A~x9NPAyx+BnH-e&l_#tnnCz
zlQrq&8`D{}g;Tzz|0}Gu1El|TQ^P}{+epS!${gK7oV@$ky7KYR^X6n%j;E)6v99V~
zy`J>)K+gmh`%dd`OFo<V_I^GdH`IPd$vPN8oP5JX`V^v^?<C_q_ivl-`yHk{2TGf*
zY0f9mei42HFdx_E^G$PaRnq4x<2?uZ&pV>td+t!~n^W@Ms#x0kW;?iTuUc@2k~KJ`
zkHdMqz>qq7Vu#wdb!u*|L!8gj4KqKOE5qYms~x`qD(`@#e^%BLLig#p54&-f#5ox=
zAZuo<efi(jn#Fgkl?y(f**^Vf>{qTDU-+1k^)Y4qko?O$`83su(&mtH!%~J)eho7}
z#9Y2{exHv<3)G|76$W4c24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS
z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H
z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN
zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+ndIm~xSO5!P
z0W5$8umBdo0$2bGU;!+E1+V}XzyeqR3t#~(fCaDs7Qg~n01IFNEPw^DK;|v*|Ki5|
AWB>pF

diff --git a/assets/favicon/128.png b/assets/favicon/128.png
deleted file mode 100644
index 1ccaaeee1c6f460fd041e911dc0083b132695014..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2325
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

diff --git a/assets/favicon/128.svg b/assets/favicon/128.svg
deleted file mode 100644
index 34888557b9..0000000000
--- a/assets/favicon/128.svg
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="896"
-   height="896"
-   viewBox="0 0 237.06667 237.06667"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.1 r15371"
-   sodipodi:docname="128.svg"
-   inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\128.png"
-   inkscape:export-xdpi="13.714286"
-   inkscape:export-ydpi="13.714286">
-  <defs
-     id="defs2">
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5115"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5111"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5104"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.7071068"
-     inkscape:cx="908.16505"
-     inkscape:cy="468.2779"
-     inkscape:document-units="px"
-     inkscape:current-layer="g4502"
-     showgrid="true"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:snap-center="true"
-     inkscape:snap-page="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1017"
-     inkscape:window-x="-8"
-     inkscape:window-y="1072"
-     inkscape:window-maximized="1"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-midpoints="true"
-     inkscape:object-paths="true"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     objecttolerance="1"
-     guidetolerance="1"
-     inkscape:snap-nodes="true"
-     inkscape:snap-others="false"
-     inkscape:bbox-paths="true"
-     inkscape:snap-bbox-midpoints="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4504"
-       spacingx="4.2333334"
-       spacingy="4.2333334"
-       empcolor="#ff3fff"
-       empopacity="0.25098039"
-       empspacing="4" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="レイヤー 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-30.809093,-10.18601)">
-    <g
-       id="g4502"
-       transform="matrix(1.096096,0,0,1.096096,47.839369,-94.823577)"
-       inkscape:export-xdpi="6"
-       inkscape:export-ydpi="6">
-      <rect
-         style="opacity:1;fill:#2fa1bb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.96554804;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.97647059"
-         id="rect4506"
-         width="216.28276"
-         height="216.28278"
-         x="-15.537212"
-         y="95.803268" />
-      <g
-         style="fill:#ffffff;fill-opacity:1"
-         transform="translate(-1.3333333e-6,-1.3439941e-6)"
-         id="g5125">
-        <g
-           transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
-           id="text4489"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           aria-label="Mi">
-          <path
-             sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
-             inkscape:connector-curvature="0"
-             id="path5210"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path5212"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
-        </g>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/assets/favicon/16.png b/assets/favicon/16.png
deleted file mode 100644
index a1d3e1be72e0985aa0f1f62750d88909ca16cf0e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 518
zcmV+h0{Q)kP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm0001X0001X0Zw}+2mk;88FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10fR|IK~y-6#gIEoTu~H-zjf{%%s}t~CMbji!qg+87CwSlXc_|w
zA)pW&!6xW0NMWHrzy}UYA<=}`*(p8(f{FxED1jh0mbO9?8Rg!&JH<RQ>foaYS>0x>
z^X;_{{BJ3_xc*qUQ8UXRoBBTV@~kw_^m(f`41zI97nvYFeKg$hEBRq#K%&`mQA!O9
zn>#>94#zhm>MB4Q=T{#^UThCY<ZPBq%wg;R7#upFt+>u;k$E2(A9soA)r!cAEf*f=
zY<nTBvREIg9N;crW&I7$+fxs#{7=PZe=l|i$9rpt3B-z%4f<t&#uzbF)@rKn^+G#+
z1|%X}U3tI_3gf4*Fy7|Jl)Euqww!88rkZ;LuIeh_r^I`}fUMBFy8yB!{W1qb-IFe~
zCoUV*S3mXAd00VNnU&7?2D^ez0Hkez{o$UILLj-Y`Bl)G^VwEpM<(U>ap=cl{_8LZ
z#thCc!uZU!j*9xgjRI%k1Aq3%o37u<#V-SjXqHIdcH+O+A9XE%Lhb{CA^-pY07*qo
IM6N<$f(mcgxBvhE

diff --git a/assets/favicon/256.png b/assets/favicon/256.png
deleted file mode 100644
index b3c4be42af8a52592ca2a7ab8fa81988fd866dfe..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4824
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

diff --git a/assets/favicon/256.svg b/assets/favicon/256.svg
deleted file mode 100644
index 5ecee9e0be..0000000000
--- a/assets/favicon/256.svg
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="896"
-   height="896"
-   viewBox="0 0 237.06667 237.06667"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.1 r15371"
-   sodipodi:docname="256.svg"
-   inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\256.png"
-   inkscape:export-xdpi="27.428572"
-   inkscape:export-ydpi="27.428572">
-  <defs
-     id="defs2">
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5115"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5111"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5104"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.7071068"
-     inkscape:cx="908.16505"
-     inkscape:cy="468.2779"
-     inkscape:document-units="px"
-     inkscape:current-layer="g4502"
-     showgrid="true"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:snap-center="true"
-     inkscape:snap-page="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1017"
-     inkscape:window-x="-8"
-     inkscape:window-y="1072"
-     inkscape:window-maximized="1"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-midpoints="true"
-     inkscape:object-paths="true"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     objecttolerance="1"
-     guidetolerance="1"
-     inkscape:snap-nodes="true"
-     inkscape:snap-others="false"
-     inkscape:bbox-paths="true"
-     inkscape:snap-bbox-midpoints="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4504"
-       spacingx="4.2333334"
-       spacingy="4.2333334"
-       empcolor="#ff3fff"
-       empopacity="0.25098039"
-       empspacing="4" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="レイヤー 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-30.809093,-10.18601)">
-    <g
-       id="g4502"
-       transform="matrix(1.096096,0,0,1.096096,47.839369,-94.823577)"
-       inkscape:export-xdpi="6"
-       inkscape:export-ydpi="6">
-      <rect
-         style="opacity:1;fill:#2fa1bb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.96554804;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.97647059"
-         id="rect4506"
-         width="216.28276"
-         height="216.28278"
-         x="-15.537212"
-         y="95.803268" />
-      <g
-         style="fill:#ffffff;fill-opacity:1"
-         transform="translate(-1.3333333e-6,-1.3439941e-6)"
-         id="g5125">
-        <g
-           transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
-           id="text4489"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           aria-label="Mi">
-          <path
-             sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
-             inkscape:connector-curvature="0"
-             id="path5210"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path5212"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
-        </g>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/assets/favicon/32.png b/assets/favicon/32.png
deleted file mode 100644
index f0466cce9127f3a324421f36aa48dddc9cf60be2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 761
zcmV<V0tWqwP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS00009a7bBm0002J0002J0UcV#`Tzg`8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10(MD6K~z|U?UqYORACgyf9Kxug+Yi&QINF>DsU!r5mAdm%`A!_
zgu*9M(QDIdVGxrNZGs4b6f8&E2|*9E=vu2DL}5-8Q3+Go!&*e;!V$gqw6KYpJ2P2{
zN-)3O`G4oT=l5MM_g+YmBE<|N?!X(cDiCP^%~!aG>Dl$9a?QJ>S5OsS`>n$&&VCR>
zp=)F;>)?y}RYL&24r_-hM-<XUB@ldl=Qw`9lTe_bt*1;3?RMpZrm(iRy5xDH;ogp(
zcA(02s;hl9C7Zn+);g3Mv3ocWtSvbmDUFzo!kz?oWv;DsEx*v6=brDq*wg49K0bp@
zzP9TNMP+@Qw8+Nj(k(DAZo@c>93$=0vd+%*NZ{+Rwxb+P(hp+JSDcUW3;I5(z;6*&
zdxmqG0Selz6{?&k!87!0j3JU~j-3O278MVghTZsY0^`&bv|A6wzydNSYJN~z{{5Si
zRwRaOQITzqXJlz_RayUJ1P~|!X8mdZY;$z4<7lg>wwiXviNcmgX_FH88+-w411hHk
za)E4Bc8_L!Jv40sDwMf1!<9{`0FXUVHq`<X@_z^@^Z*H7Dzr_D04le|(Q@GB&twF&
z$rBFmn-&2vRQu{m`+}jnOKjU&5FX3Q3)Yk#OV7#Gq<b7qx)zNmx={2DP#D*x5(2>Q
zcb>vPB)(s<a@ZTNJ|WDB6R-(snhv3{Z)+7DimqcnMus#4Zu3xhEVDcL8Kfm%n9Gmr
zOF!VymEbVfk_z-y6<Y{fQF?*T3RfIkiX%T4iO9(}n^dI%=vR0PoDJJq)d0cT(wide
r1YQ9HB6@Oh)|WHM50fHAiW%Ss1kc=<`a=~100000NkvXXu0mjfoBc_e

diff --git a/assets/favicon/32.svg b/assets/favicon/32.svg
deleted file mode 100644
index 4dfcc68606..0000000000
--- a/assets/favicon/32.svg
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="640"
-   height="640"
-   viewBox="0 0 169.33333 169.33333"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.1 r15371"
-   sodipodi:docname="32.svg"
-   inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
-   inkscape:export-xdpi="4.8000002"
-   inkscape:export-ydpi="4.8000002">
-  <defs
-     id="defs2">
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5115"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5111"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5104"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.7071068"
-     inkscape:cx="16.781901"
-     inkscape:cy="343.6089"
-     inkscape:document-units="px"
-     inkscape:current-layer="g4502"
-     showgrid="true"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="false"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:snap-center="true"
-     inkscape:snap-page="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1017"
-     inkscape:window-x="-8"
-     inkscape:window-y="1072"
-     inkscape:window-maximized="1"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-midpoints="true"
-     inkscape:object-paths="true"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     objecttolerance="1"
-     guidetolerance="1"
-     inkscape:snap-nodes="false"
-     inkscape:snap-others="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4504"
-       spacingx="4.2333334"
-       spacingy="4.2333334"
-       empcolor="#ff3fff"
-       empopacity="0.25098039"
-       empspacing="4" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="レイヤー 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-30.809093,-77.919343)">
-    <g
-       id="g4502"
-       transform="matrix(1.096096,0,0,1.096096,13.972699,-60.956914)"
-       inkscape:export-xdpi="6"
-       inkscape:export-ydpi="6">
-      <g
-         style="fill:#2fa1bb;fill-opacity:1"
-         transform="translate(-1.7127735e-6,-1.5982974e-6)"
-         id="g5125">
-        <g
-           transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
-           id="text4489"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa1bb;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           aria-label="Mi">
-          <path
-             sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
-             inkscape:connector-curvature="0"
-             id="path5210"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path5212"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
-        </g>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/assets/favicon/64.png b/assets/favicon/64.png
deleted file mode 100644
index 9710052ae73ca84acb5e6436a36291073961f8ee..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1258
zcmV<G1Qq*<P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004b3#c}2nYxW
zd<bNS00009a7bBm0003y0003y0UzIQaR2}S8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11ZPP^K~#90?U`?gR8<(pfA5{q9W+x35+W@yGPc#3#Uu-%mUdT+
zsDxY!c2_r{kPyt&0z;OJB5187$VFs!c1>aZpcEMFjBFp=pg)^4TBH`WK_vaNz;Y*N
z=DdB_RZwT<o@?IBI=^po&oj^a&NJuSd+xp9a5x+ehr{7;I2;a#!|^{u0)InQ;(eK=
zz-p9Qpa6U*s#~%vnujj6kwh}HKs{XtdN)W7a7=`^vTcpK5z&kEsq{lCtU<XQ<PSs#
z)QfID+}iM6kh*~aSk~Vk`Eqo6pTc8hh81L8Zh7ODAf5p6RC+b=I^dOQaqsk5k(T!x
z8j5F+Bzn^uRe7<D)sGS3-cQ?`zOb!breI}`=cjF~@Z$jlv@4NHuMgsx=pA?p*jl+4
zU3&7{V&^%1GP6LH%@ypfFDbiFwf<wR1DLbp;1rOxemaF$;;DgF8_#(?0}raoRzIBx
zYi>(rt^?4BX{GwiO(c5Kahv)OAb?5Hd>zVE3#ou?uTN#}swS%6nW+_#KFb~^*Ql8f
zfXa=2Vk6A5@C3`^0F+d3u+;)Fqq?{L?E^QJ8?4)vnPE!0AGp@mP(5!ZfCxYMX(Jxr
z+xl7u;CUM8e1R~-6wLnl-RbjY&CSWdm{-ufK-q9A)@Q7~s_gNR9=|2_+aY`3FcE4?
zG2Okazdr(is!a7t+XbpFk80$WHx7b!R~SAmp4YLbrKM!+7j6K6B1?{+p4L4#nVuW(
z&1?m=Izd(=*WR=W(Nzj(FL$E?@2HqNvu*c%5X39`cbl<7WThvpyo`RDgKfaJIXezc
zxuzJ)4?lTF;Zm&rnE*l{(UW-s(GAMz>|%7ZG%uAN^o*|0b~I;$_=LU$!XTa+=u**c
zh1uhWA_9%-$&laW_d>3^0OGyrMO8LrlMLE(?xbtMRTlt89`#Y&`c-~fy{+9<7l4ZT
z?*x&{zZ3koAS%8+3;G{k0+$&Vz?E*`O5*|u!&KlfU@WAcg;75Up#)&WJdEguY8nxq
zFBVGogi${Tp#<QSjON;!wt#E`iWdwkDqY#HhhCl#sj-<Qp%UKB(AXW@=0x(nJ|odb
z#M7A|CrrugJJPZEC;-X9(8}9l9e`0!g^M1~mqjK{JSWU{EExe_EvJi|DQYohTVL&p
z2gH5}Na>`dQqN5Aez6e_pBOsD*ozfkJkR@i+}`(TkLpFsuClMK@Xx~JkAYENq43G)
zEe*e0nRa#>;Gl)FAcZqS016|%Ef~JBs!xCbj;&mD3V6durh<0bdX6<9FM-e665c%Y
z`29ZtC}wAMz2vehnsWB_0}#zm--NQS!mtWFn{992AH?&}^2Q9xGgR6)sJvT@{rcS5
zk4IK49#)l&73@wLqiyBhC061RUyi0*QRzUbMYI6&5yES^_9mO@T$Xvs^g{7uE$Bj&
zi7FfwC6yZ)N{ug-^N6Q14**Yt)+yu#4u~nfFn-c?I2;a#!{Kl^91e%W;c!&qFH<Op
UgYrXL(f|Me07*qoM6N<$f+1o}2><{9

diff --git a/assets/favicon/64.svg b/assets/favicon/64.svg
deleted file mode 100644
index e2378791a7..0000000000
--- a/assets/favicon/64.svg
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="768"
-   height="768"
-   viewBox="0 0 203.2 203.2"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.1 r15371"
-   sodipodi:docname="64.svg"
-   inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\64.png"
-   inkscape:export-xdpi="8"
-   inkscape:export-ydpi="8">
-  <defs
-     id="defs2">
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5115"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5111"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-    <inkscape:path-effect
-       effect="simplify"
-       id="path-effect5104"
-       is_visible="true"
-       steps="1"
-       threshold="0.000408163"
-       smooth_angles="360"
-       helper_size="0"
-       simplify_individual_paths="false"
-       simplify_just_coalesce="false"
-       simplifyindividualpaths="false"
-       simplifyJustCoalesce="false" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.7071068"
-     inkscape:cx="16.781901"
-     inkscape:cy="343.6089"
-     inkscape:document-units="px"
-     inkscape:current-layer="g5125"
-     showgrid="true"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="false"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:snap-center="true"
-     inkscape:snap-page="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1017"
-     inkscape:window-x="-8"
-     inkscape:window-y="1072"
-     inkscape:window-maximized="1"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-midpoints="true"
-     inkscape:object-paths="true"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     objecttolerance="1"
-     guidetolerance="1"
-     inkscape:snap-nodes="false"
-     inkscape:snap-others="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4504"
-       spacingx="4.2333334"
-       spacingy="4.2333334"
-       empcolor="#ff3fff"
-       empopacity="0.25098039"
-       empspacing="4" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="レイヤー 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-30.809093,-44.052677)">
-    <g
-       id="g4502"
-       transform="matrix(1.096096,0,0,1.096096,30.906034,-77.890245)"
-       inkscape:export-xdpi="6"
-       inkscape:export-ydpi="6">
-      <g
-         style="fill:#2fa1bb;fill-opacity:0.94117647"
-         transform="translate(-1.3333333e-6,-1.3439941e-6)"
-         id="g5125">
-        <g
-           transform="matrix(0.91391326,0,0,0.91391326,7.9719903,17.595761)"
-           id="text4489"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa1bb;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           aria-label="Mi">
-          <path
-             sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
-             inkscape:connector-curvature="0"
-             id="path5210"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path5212"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px"
-             d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
-        </g>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/assets/favicon/favicon.png b/assets/favicon/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2efa2cad61442fc9b0ff1075b0d84cfb6ad531c0
GIT binary patch
literal 6972
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

literal 0
HcmV?d00001

diff --git a/assets/favicon/16.svg b/assets/favicon/favicon.svg
similarity index 98%
rename from assets/favicon/16.svg
rename to assets/favicon/favicon.svg
index 03aa8bc6bd..9532def728 100644
--- a/assets/favicon/16.svg
+++ b/assets/favicon/favicon.svg
@@ -15,7 +15,7 @@
    version="1.1"
    id="svg8"
    inkscape:version="0.92.1 r15371"
-   sodipodi:docname="16.svg"
+   sodipodi:docname="favicon.svg"
    inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\16.png"
    inkscape:export-xdpi="3"
    inkscape:export-ydpi="3">
@@ -66,7 +66,7 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="1.4142136"
-     inkscape:cx="110.21885"
+     inkscape:cx="15.466544"
      inkscape:cy="235.92965"
      inkscape:document-units="px"
      inkscape:current-layer="g4502"
@@ -79,7 +79,7 @@
      inkscape:snap-center="true"
      inkscape:snap-page="true"
      inkscape:window-width="1920"
-     inkscape:window-height="1017"
+     inkscape:window-height="1027"
      inkscape:window-x="-8"
      inkscape:window-y="1072"
      inkscape:window-maximized="1"
@@ -111,7 +111,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
+        <dc:title></dc:title>
       </cc:Work>
     </rdf:RDF>
   </metadata>

From d5f92eed8c4b1a42e0b05f9da2fa86dbc17922f4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 13:49:09 +0900
Subject: [PATCH 017/369] Refactor

---
 src/client/app/auth/views/index.vue           |  6 +-
 .../app/common/scripts/streaming/home.ts      |  4 +-
 .../app/common/views/components/avatar.vue    |  2 +-
 .../components/messaging-room.message.vue     |  4 +-
 .../views/components/messaging-room.vue       |  8 +-
 .../app/common/views/components/messaging.vue |  2 +-
 .../app/common/views/components/note-menu.vue |  2 +-
 .../common/views/components/othello.game.vue  | 10 +--
 .../views/components/othello.gameroom.vue     |  2 +-
 .../common/views/components/othello.room.vue  | 16 ++--
 .../views/components/twitter-setting.vue      | 14 ++--
 .../app/common/views/components/uploader.vue  |  2 +-
 .../app/desktop/api/choose-drive-file.ts      | 17 ++--
 .../app/desktop/api/choose-drive-folder.ts    | 15 ++--
 src/client/app/desktop/api/update-avatar.ts   | 32 ++++----
 src/client/app/desktop/api/update-banner.ts   | 32 ++++----
 src/client/app/desktop/script.ts              |  5 +-
 .../desktop/views/components/drive.file.vue   |  4 +-
 .../app/desktop/views/components/home.vue     |  4 +-
 .../views/components/note-detail.sub.vue      |  2 +-
 .../desktop/views/components/note-detail.vue  |  4 +-
 .../desktop/views/components/notes.note.vue   | 16 ++--
 .../app/desktop/views/components/notes.vue    | 12 +--
 .../desktop/views/components/post-form.vue    |  2 +-
 .../desktop/views/components/settings.2fa.vue |  8 +-
 .../desktop/views/components/settings.api.vue |  2 +-
 .../views/components/settings.profile.vue     | 18 ++---
 .../app/desktop/views/components/settings.vue | 20 ++---
 .../views/components/sub-note-content.vue     |  2 +-
 .../views/components/timeline.core.vue        | 10 +--
 .../app/desktop/views/components/timeline.vue |  2 +-
 .../views/components/ui.header.account.vue    |  6 +-
 .../views/components/ui.header.nav.vue        |  6 +-
 .../components/ui.header.notifications.vue    |  4 +-
 .../desktop/views/components/ui.header.vue    | 16 ++--
 .../app/desktop/views/components/ui.vue       |  2 +-
 .../views/components/user-list-timeline.vue   | 10 +--
 .../desktop/views/components/user-preview.vue |  2 +-
 .../desktop/views/components/users-list.vue   |  2 +-
 .../views/components/widget-container.vue     |  6 +-
 .../app/desktop/views/components/window.vue   |  4 +-
 src/client/app/desktop/views/pages/index.vue  |  2 +-
 .../desktop/views/pages/user/user.header.vue  |  2 +-
 .../desktop/views/pages/user/user.home.vue    |  2 +-
 .../desktop/views/pages/user/user.profile.vue |  2 +-
 .../app/desktop/views/widgets/activity.vue    |  2 +-
 .../app/desktop/views/widgets/profile.vue     |  8 +-
 src/client/app/init.ts                        |  3 +-
 src/client/app/mios.ts                        | 79 +++++--------------
 .../mobile/views/components/note-detail.vue   |  4 +-
 .../app/mobile/views/components/note.vue      | 16 ++--
 .../app/mobile/views/components/notes.vue     | 12 +--
 .../app/mobile/views/components/post-form.vue |  4 +-
 .../views/components/sub-note-content.vue     |  2 +-
 .../app/mobile/views/components/ui.header.vue | 12 +--
 .../app/mobile/views/components/ui.nav.vue    | 10 +--
 src/client/app/mobile/views/components/ui.vue |  6 +-
 .../views/components/user-list-timeline.vue   | 10 +--
 .../mobile/views/components/users-list.vue    |  2 +-
 .../app/mobile/views/pages/home.timeline.vue  | 10 +--
 src/client/app/mobile/views/pages/home.vue    |  2 +-
 src/client/app/mobile/views/pages/index.vue   |  2 +-
 .../app/mobile/views/pages/settings.vue       | 24 +++---
 .../views/pages/settings/settings.profile.vue | 30 +++----
 src/client/app/mobile/views/pages/user.vue    |  2 +-
 .../app/mobile/views/pages/user/home.vue      |  2 +-
 .../app/mobile/views/widgets/activity.vue     |  2 +-
 .../app/mobile/views/widgets/profile.vue      |  6 +-
 src/client/app/store.ts                       | 49 +++++++++---
 69 files changed, 314 insertions(+), 330 deletions(-)

diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue
index 0fcd9bfe53..e53bbd026f 100644
--- a/src/client/app/auth/views/index.vue
+++ b/src/client/app/auth/views/index.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="index">
-	<main v-if="os.isSignedIn">
+	<main v-if="$store.getters.isSignedIn">
 		<p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p>
 		<x-form
 			ref="form"
@@ -22,7 +22,7 @@
 			<p>セッションが存在しません。</p>
 		</div>
 	</main>
-	<main class="signin" v-if="!os.isSignedIn">
+	<main class="signin" v-if="!$store.getters.isSignedIn">
 		<h1>サインインしてください</h1>
 		<mk-signin/>
 	</main>
@@ -51,7 +51,7 @@ export default Vue.extend({
 		}
 	},
 	mounted() {
-		if (!this.$root.$data.os.isSignedIn) return;
+		if (!this.$root.$data.$store.getters.isSignedIn) return;
 
 		// Fetch session
 		(this as any).api('auth/session/show', {
diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts
index 44d07e331a..2715b9e0e9 100644
--- a/src/client/app/common/scripts/streaming/home.ts
+++ b/src/client/app/common/scripts/streaming/home.ts
@@ -24,10 +24,8 @@ export class HomeStream extends Stream {
 			if (os.debug) {
 				console.log('I updated:', i);
 			}
-			merge(me, i);
 
-			// キャッシュ更新
-			os.bakeMe();
+			os.store.dispatch('mergeMe', i);
 		});
 
 		this.on('clientSettingUpdated', x => {
diff --git a/src/client/app/common/views/components/avatar.vue b/src/client/app/common/views/components/avatar.vue
index 3e1b17635f..a65b62882f 100644
--- a/src/client/app/common/views/components/avatar.vue
+++ b/src/client/app/common/views/components/avatar.vue
@@ -32,7 +32,7 @@ export default Vue.extend({
 						? `rgb(${ this.user.avatarColor.join(',') })`
 						: null,
 				backgroundImage: this.lightmode ? null : `url(${ this.user.avatarUrl }?thumbnail)`,
-				borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null
+				borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
 			};
 		}
 	}
diff --git a/src/client/app/common/views/components/messaging-room.message.vue b/src/client/app/common/views/components/messaging-room.message.vue
index ef39199dc4..a77b5f3658 100644
--- a/src/client/app/common/views/components/messaging-room.message.vue
+++ b/src/client/app/common/views/components/messaging-room.message.vue
@@ -8,7 +8,7 @@
 				<img src="/assets/desktop/messaging/delete.png" alt="Delete"/>
 			</button>
 			<div class="content" v-if="!message.isDeleted">
-				<mk-note-html class="text" v-if="message.text" ref="text" :text="message.text" :i="os.i"/>
+				<mk-note-html class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
 				<div class="file" v-if="message.file">
 					<a :href="message.file.url" target="_blank" :title="message.file.name">
 						<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"/>
@@ -42,7 +42,7 @@ export default Vue.extend({
 	},
 	computed: {
 		isMe(): boolean {
-			return this.message.userId == (this as any).os.i.id;
+			return this.message.userId == this.$store.state.i.id;
 		},
 		urls(): string[] {
 			if (this.message.text) {
diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue
index 79756b22eb..b2831d6928 100644
--- a/src/client/app/common/views/components/messaging-room.vue
+++ b/src/client/app/common/views/components/messaging-room.vue
@@ -72,7 +72,7 @@ export default Vue.extend({
 	},
 
 	mounted() {
-		this.connection = new MessagingStream((this as any).os, (this as any).os.i, this.user.id);
+		this.connection = new MessagingStream((this as any).os, this.$store.state.i, this.user.id);
 
 		this.connection.on('message', this.onMessage);
 		this.connection.on('read', this.onRead);
@@ -164,7 +164,7 @@ export default Vue.extend({
 			const isBottom = this.isBottom();
 
 			this.messages.push(message);
-			if (message.userId != (this as any).os.i.id && !document.hidden) {
+			if (message.userId != this.$store.state.i.id && !document.hidden) {
 				this.connection.send({
 					type: 'read',
 					id: message.id
@@ -176,7 +176,7 @@ export default Vue.extend({
 				this.$nextTick(() => {
 					this.scrollToBottom();
 				});
-			} else if (message.userId != (this as any).os.i.id) {
+			} else if (message.userId != this.$store.state.i.id) {
 				// Notify
 				this.notifyNewMessage();
 			}
@@ -229,7 +229,7 @@ export default Vue.extend({
 		onVisibilitychange() {
 			if (document.hidden) return;
 			this.messages.forEach(message => {
-				if (message.userId !== (this as any).os.i.id && !message.isRead) {
+				if (message.userId !== this.$store.state.i.id && !message.isRead) {
 					this.connection.send({
 						type: 'read',
 						id: message.id
diff --git a/src/client/app/common/views/components/messaging.vue b/src/client/app/common/views/components/messaging.vue
index 11f9c366d4..2ddec29984 100644
--- a/src/client/app/common/views/components/messaging.vue
+++ b/src/client/app/common/views/components/messaging.vue
@@ -95,7 +95,7 @@ export default Vue.extend({
 	methods: {
 		getAcct,
 		isMe(message) {
-			return message.userId == (this as any).os.i.id;
+			return message.userId == this.$store.state.i.id;
 		},
 		onMessage(message) {
 			this.messages = this.messages.filter(m => !(
diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue
index 88dc22aaf4..fb95055049 100644
--- a/src/client/app/common/views/components/note-menu.vue
+++ b/src/client/app/common/views/components/note-menu.vue
@@ -3,7 +3,7 @@
 	<div class="backdrop" ref="backdrop" @click="close"></div>
 	<div class="popover" :class="{ compact }" ref="popover">
 		<button @click="favorite">%i18n:@favorite%</button>
-		<button v-if="note.userId == os.i.id" @click="pin">%i18n:@pin%</button>
+		<button v-if="note.userId == $store.state.i.id" @click="pin">%i18n:@pin%</button>
 		<a v-if="note.uri" :href="note.uri" target="_blank">%i18n:@remote%</a>
 	</div>
 </div>
diff --git a/src/client/app/common/views/components/othello.game.vue b/src/client/app/common/views/components/othello.game.vue
index ea75558d10..4c63bd18b8 100644
--- a/src/client/app/common/views/components/othello.game.vue
+++ b/src/client/app/common/views/components/othello.game.vue
@@ -61,13 +61,13 @@ export default Vue.extend({
 
 	computed: {
 		iAmPlayer(): boolean {
-			if (!(this as any).os.isSignedIn) return false;
-			return this.game.user1Id == (this as any).os.i.id || this.game.user2Id == (this as any).os.i.id;
+			if (!this.$store.getters.isSignedIn) return false;
+			return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id;
 		},
 		myColor(): Color {
 			if (!this.iAmPlayer) return null;
-			if (this.game.user1Id == (this as any).os.i.id && this.game.black == 1) return true;
-			if (this.game.user2Id == (this as any).os.i.id && this.game.black == 2) return true;
+			if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true;
+			if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true;
 			return false;
 		},
 		opColor(): Color {
@@ -91,7 +91,7 @@ export default Vue.extend({
 		},
 		isMyTurn(): boolean {
 			if (this.turnUser == null) return null;
-			return this.turnUser.id == (this as any).os.i.id;
+			return this.turnUser.id == this.$store.state.i.id;
 		}
 	},
 
diff --git a/src/client/app/common/views/components/othello.gameroom.vue b/src/client/app/common/views/components/othello.gameroom.vue
index dba9ccd16d..2dbd04ce49 100644
--- a/src/client/app/common/views/components/othello.gameroom.vue
+++ b/src/client/app/common/views/components/othello.gameroom.vue
@@ -25,7 +25,7 @@ export default Vue.extend({
 	},
 	created() {
 		this.g = this.game;
-		this.connection = new OthelloGameStream((this as any).os, (this as any).os.i, this.game);
+		this.connection = new OthelloGameStream((this as any).os, this.$store.state.i, this.game);
 		this.connection.on('started', this.onStarted);
 	},
 	beforeDestroy() {
diff --git a/src/client/app/common/views/components/othello.room.vue b/src/client/app/common/views/components/othello.room.vue
index 86368b3cc3..dcf41f2e04 100644
--- a/src/client/app/common/views/components/othello.room.vue
+++ b/src/client/app/common/views/components/othello.room.vue
@@ -116,13 +116,13 @@ export default Vue.extend({
 			return categories.filter((item, pos) => categories.indexOf(item) == pos);
 		},
 		isAccepted(): boolean {
-			if (this.game.user1Id == (this as any).os.i.id && this.game.user1Accepted) return true;
-			if (this.game.user2Id == (this as any).os.i.id && this.game.user2Accepted) return true;
+			if (this.game.user1Id == this.$store.state.i.id && this.game.user1Accepted) return true;
+			if (this.game.user2Id == this.$store.state.i.id && this.game.user2Accepted) return true;
 			return false;
 		},
 		isOpAccepted(): boolean {
-			if (this.game.user1Id != (this as any).os.i.id && this.game.user1Accepted) return true;
-			if (this.game.user2Id != (this as any).os.i.id && this.game.user2Accepted) return true;
+			if (this.game.user1Id != this.$store.state.i.id && this.game.user1Accepted) return true;
+			if (this.game.user2Id != this.$store.state.i.id && this.game.user2Accepted) return true;
 			return false;
 		}
 	},
@@ -133,8 +133,8 @@ export default Vue.extend({
 		this.connection.on('init-form', this.onInitForm);
 		this.connection.on('message', this.onMessage);
 
-		if (this.game.user1Id != (this as any).os.i.id && this.game.settings.form1) this.form = this.game.settings.form1;
-		if (this.game.user2Id != (this as any).os.i.id && this.game.settings.form2) this.form = this.game.settings.form2;
+		if (this.game.user1Id != this.$store.state.i.id && this.game.settings.form1) this.form = this.game.settings.form1;
+		if (this.game.user2Id != this.$store.state.i.id && this.game.settings.form2) this.form = this.game.settings.form2;
 	},
 
 	beforeDestroy() {
@@ -185,12 +185,12 @@ export default Vue.extend({
 		},
 
 		onInitForm(x) {
-			if (x.userId == (this as any).os.i.id) return;
+			if (x.userId == this.$store.state.i.id) return;
 			this.form = x.form;
 		},
 
 		onMessage(x) {
-			if (x.userId == (this as any).os.i.id) return;
+			if (x.userId == this.$store.state.i.id) return;
 			this.messages.unshift(x.message);
 		},
 
diff --git a/src/client/app/common/views/components/twitter-setting.vue b/src/client/app/common/views/components/twitter-setting.vue
index 9a2a1c3d40..d1cb78c544 100644
--- a/src/client/app/common/views/components/twitter-setting.vue
+++ b/src/client/app/common/views/components/twitter-setting.vue
@@ -1,13 +1,13 @@
 <template>
 <div class="mk-twitter-setting">
 	<p>%i18n:@description%<a :href="`${docsUrl}/link-to-twitter`" target="_blank">%i18n:@detail%</a></p>
-	<p class="account" v-if="os.i.twitter" :title="`Twitter ID: ${os.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p>
+	<p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
 	<p>
-		<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a>
-		<span v-if="os.i.twitter"> or </span>
-		<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a>
+		<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a>
+		<span v-if="$store.state.i.twitter"> or </span>
+		<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a>
 	</p>
-	<p class="id" v-if="os.i.twitter">Twitter ID: {{ os.i.twitter.userId }}</p>
+	<p class="id" v-if="$store.state.i.twitter">Twitter ID: {{ $store.state.i.twitter.userId }}</p>
 </div>
 </template>
 
@@ -24,8 +24,8 @@ export default Vue.extend({
 		};
 	},
 	mounted() {
-		this.$watch('os.i', () => {
-			if ((this as any).os.i.twitter) {
+		this.$watch('$store.state.i', () => {
+			if (this.$store.state.i.twitter) {
 				if (this.form) this.form.close();
 			}
 		}, {
diff --git a/src/client/app/common/views/components/uploader.vue b/src/client/app/common/views/components/uploader.vue
index a6caa80f3c..f4797d89f7 100644
--- a/src/client/app/common/views/components/uploader.vue
+++ b/src/client/app/common/views/components/uploader.vue
@@ -50,7 +50,7 @@ export default Vue.extend({
 			reader.readAsDataURL(file);
 
 			const data = new FormData();
-			data.append('i', (this as any).os.i.token);
+			data.append('i', this.$store.state.i.token);
 			data.append('file', file);
 
 			if (folder) data.append('folderId', folder);
diff --git a/src/client/app/desktop/api/choose-drive-file.ts b/src/client/app/desktop/api/choose-drive-file.ts
index fbda600e6e..3d0004b741 100644
--- a/src/client/app/desktop/api/choose-drive-file.ts
+++ b/src/client/app/desktop/api/choose-drive-file.ts
@@ -1,18 +1,17 @@
+import OS from '../../mios';
 import { url } from '../../config';
 import MkChooseFileFromDriveWindow from '../views/components/choose-file-from-drive-window.vue';
 
-export default function(opts) {
+export default (os: OS) => opts => {
 	return new Promise((res, rej) => {
 		const o = opts || {};
 
 		if (document.body.clientWidth > 800) {
-			const w = new MkChooseFileFromDriveWindow({
-				propsData: {
-					title: o.title,
-					multiple: o.multiple,
-					initFolder: o.currentFolder
-				}
-			}).$mount();
+			const w = os.new(MkChooseFileFromDriveWindow, {
+				title: o.title,
+				multiple: o.multiple,
+				initFolder: o.currentFolder
+			});
 			w.$once('selected', file => {
 				res(file);
 			});
@@ -27,4 +26,4 @@ export default function(opts) {
 				'height=500, width=800');
 		}
 	});
-}
+};
diff --git a/src/client/app/desktop/api/choose-drive-folder.ts b/src/client/app/desktop/api/choose-drive-folder.ts
index 9b33a20d9a..68dc7988b5 100644
--- a/src/client/app/desktop/api/choose-drive-folder.ts
+++ b/src/client/app/desktop/api/choose-drive-folder.ts
@@ -1,17 +1,16 @@
+import OS from '../../mios';
 import MkChooseFolderFromDriveWindow from '../views/components/choose-folder-from-drive-window.vue';
 
-export default function(opts) {
+export default (os: OS) => opts => {
 	return new Promise((res, rej) => {
 		const o = opts || {};
-		const w = new MkChooseFolderFromDriveWindow({
-			propsData: {
-				title: o.title,
-				initFolder: o.currentFolder
-			}
-		}).$mount();
+		const w = os.new(MkChooseFolderFromDriveWindow, {
+			title: o.title,
+			initFolder: o.currentFolder
+		});
 		w.$once('selected', folder => {
 			res(folder);
 		});
 		document.body.appendChild(w.$el);
 	});
-}
+};
diff --git a/src/client/app/desktop/api/update-avatar.ts b/src/client/app/desktop/api/update-avatar.ts
index 8ddaebc072..887367a24e 100644
--- a/src/client/app/desktop/api/update-avatar.ts
+++ b/src/client/app/desktop/api/update-avatar.ts
@@ -6,17 +6,15 @@ import ProgressDialog from '../views/components/progress-dialog.vue';
 export default (os: OS) => (cb, file = null) => {
 	const fileSelected = file => {
 
-		const w = new CropWindow({
-			propsData: {
-				image: file,
-				title: 'アバターとして表示する部分を選択',
-				aspectRatio: 1 / 1
-			}
-		}).$mount();
+		const w = os.new(CropWindow, {
+			image: file,
+			title: 'アバターとして表示する部分を選択',
+			aspectRatio: 1 / 1
+		});
 
 		w.$once('cropped', blob => {
 			const data = new FormData();
-			data.append('i', os.i.token);
+			data.append('i', os.store.state.i.token);
 			data.append('file', blob, file.name + '.cropped.png');
 
 			os.api('drive/folders/find', {
@@ -42,11 +40,9 @@ export default (os: OS) => (cb, file = null) => {
 	};
 
 	const upload = (data, folder) => {
-		const dialog = new ProgressDialog({
-			propsData: {
-				title: '新しいアバターをアップロードしています'
-			}
-		}).$mount();
+		const dialog = os.new(ProgressDialog, {
+			title: '新しいアバターをアップロードしています'
+		});
 		document.body.appendChild(dialog.$el);
 
 		if (folder) data.append('folderId', folder.id);
@@ -70,8 +66,14 @@ export default (os: OS) => (cb, file = null) => {
 		os.api('i/update', {
 			avatarId: file.id
 		}).then(i => {
-			os.i.avatarId = i.avatarId;
-			os.i.avatarUrl = i.avatarUrl;
+			os.store.commit('updateIKeyValue', {
+				key: 'avatarId',
+				value: i.avatarId
+			});
+			os.store.commit('updateIKeyValue', {
+				key: 'avatarUrl',
+				value: i.avatarUrl
+			});
 
 			os.apis.dialog({
 				title: '%fa:info-circle%アバターを更新しました',
diff --git a/src/client/app/desktop/api/update-banner.ts b/src/client/app/desktop/api/update-banner.ts
index 1a5da272bd..4e6dd4e2c7 100644
--- a/src/client/app/desktop/api/update-banner.ts
+++ b/src/client/app/desktop/api/update-banner.ts
@@ -6,17 +6,15 @@ import ProgressDialog from '../views/components/progress-dialog.vue';
 export default (os: OS) => {
 
 	const cropImage = file => new Promise((resolve, reject) => {
-		const w = new CropWindow({
-			propsData: {
-				image: file,
-				title: 'バナーとして表示する部分を選択',
-				aspectRatio: 16 / 9
-			}
-		}).$mount();
+		const w = os.new(CropWindow, {
+			image: file,
+			title: 'バナーとして表示する部分を選択',
+			aspectRatio: 16 / 9
+		});
 
 		w.$once('cropped', blob => {
 			const data = new FormData();
-			data.append('i', os.i.token);
+			data.append('i', os.store.state.i.token);
 			data.append('file', blob, file.name + '.cropped.png');
 
 			os.api('drive/folders/find', {
@@ -44,11 +42,9 @@ export default (os: OS) => {
 	});
 
 	const upload = (data, folder) => new Promise((resolve, reject) => {
-		const dialog = new ProgressDialog({
-			propsData: {
-				title: '新しいバナーをアップロードしています'
-			}
-		}).$mount();
+		const dialog = os.new(ProgressDialog, {
+			title: '新しいバナーをアップロードしています'
+		});
 		document.body.appendChild(dialog.$el);
 
 		if (folder) data.append('folderId', folder.id);
@@ -73,8 +69,14 @@ export default (os: OS) => {
 		return os.api('i/update', {
 			bannerId: file.id
 		}).then(i => {
-			os.i.bannerId = i.bannerId;
-			os.i.bannerUrl = i.bannerUrl;
+			os.store.commit('updateIKeyValue', {
+				key: 'bannerId',
+				value: i.bannerId
+			});
+			os.store.commit('updateIKeyValue', {
+				key: 'bannerUrl',
+				value: i.bannerUrl
+			});
 
 			os.apis.dialog({
 				title: '%fa:info-circle%バナーを更新しました',
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index 2658a86b95..09a9257ea3 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -2,7 +2,6 @@
  * Desktop Client
  */
 
-import Vue from 'vue';
 import VueRouter from 'vue-router';
 
 // Style
@@ -68,8 +67,8 @@ init(async (launch) => {
 
 	// Launch the app
 	const [, os] = launch(router, os => ({
-		chooseDriveFolder,
-		chooseDriveFile,
+		chooseDriveFolder: chooseDriveFolder(os),
+		chooseDriveFile: chooseDriveFile(os),
 		dialog,
 		input,
 		post,
diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue
index fb553e1ae7..fe8f57bc5f 100644
--- a/src/client/app/desktop/views/components/drive.file.vue
+++ b/src/client/app/desktop/views/components/drive.file.vue
@@ -9,10 +9,10 @@
 	@contextmenu.prevent.stop="onContextmenu"
 	:title="title"
 >
-	<div class="label" v-if="os.i.avatarId == file.id"><img src="/assets/label.svg"/>
+	<div class="label" v-if="$store.state.i.avatarId == file.id"><img src="/assets/label.svg"/>
 		<p>%i18n:@avatar%</p>
 	</div>
-	<div class="label" v-if="os.i.bannerId == file.id"><img src="/assets/label.svg"/>
+	<div class="label" v-if="$store.state.i.bannerId == file.id"><img src="/assets/label.svg"/>
 		<p>%i18n:@banner%</p>
 	</div>
 	<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index d84c1e404f..9d34575e55 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -51,7 +51,7 @@
 			<div class="main">
 				<a @click="hint">カスタマイズのヒント</a>
 				<div>
-					<mk-post-form v-if="clientSettings.showPostFormOnTopOfTl"/>
+					<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/>
 					<mk-timeline ref="tl" @loaded="onTlLoaded"/>
 				</div>
 			</div>
@@ -61,7 +61,7 @@
 				<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
 			</div>
 			<div class="main">
-				<mk-post-form v-if="clientSettings.showPostFormOnTopOfTl"/>
+				<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/>
 				<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
 				<mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/>
 			</div>
diff --git a/src/client/app/desktop/views/components/note-detail.sub.vue b/src/client/app/desktop/views/components/note-detail.sub.vue
index c798b41b25..0471c70ee7 100644
--- a/src/client/app/desktop/views/components/note-detail.sub.vue
+++ b/src/client/app/desktop/views/components/note-detail.sub.vue
@@ -16,7 +16,7 @@
 		<div class="body">
 			<div class="text">
 				<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
-				<mk-note-html v-if="note.text" :text="note.text" :i="os.i"/>
+				<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
 			</div>
 			<div class="media" v-if="note.mediaIds.length > 0">
 				<mk-media-list :media-list="note.media"/>
diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue
index 5b48b7a1ba..e64990b4ce 100644
--- a/src/client/app/desktop/views/components/note-detail.vue
+++ b/src/client/app/desktop/views/components/note-detail.vue
@@ -39,7 +39,7 @@
 		<div class="body">
 			<div class="text">
 				<span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span>
-				<mk-note-html v-if="p.text" :text="p.text" :i="os.i"/>
+				<mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/>
 			</div>
 			<div class="media" v-if="p.media.length > 0">
 				<mk-media-list :media-list="p.media" :raw="true"/>
@@ -158,7 +158,7 @@ export default Vue.extend({
 
 		// Draw map
 		if (this.p.geo) {
-			const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true;
+			const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
 			if (shouldShowMap) {
 				(this as any).os.getGoogleMaps().then(maps => {
 					const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index 4448820eb9..e69e6cdb51 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="note" tabindex="-1" :title="title" @keydown="onKeydown">
-	<div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)">
+	<div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
 		<x-sub :note="p.reply"/>
 	</div>
 	<div class="renote" v-if="isRenote">
@@ -43,7 +43,7 @@
 					<div class="text">
 						<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
 						<a class="reply" v-if="p.reply">%fa:reply%</a>
-						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="os.i" :class="$style.text"/>
+						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/>
 						<a class="rp" v-if="p.renote">RP:</a>
 					</div>
 					<div class="media" v-if="p.media.length > 0">
@@ -166,7 +166,7 @@ export default Vue.extend({
 	},
 
 	created() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 		}
@@ -175,13 +175,13 @@ export default Vue.extend({
 	mounted() {
 		this.capture(true);
 
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.on('_connected_', this.onStreamConnected);
 		}
 
 		// Draw map
 		if (this.p.geo) {
-			const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true;
+			const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
 			if (shouldShowMap) {
 				(this as any).os.getGoogleMaps().then(maps => {
 					const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
@@ -201,7 +201,7 @@ export default Vue.extend({
 	beforeDestroy() {
 		this.decapture(true);
 
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.off('_connected_', this.onStreamConnected);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
@@ -211,7 +211,7 @@ export default Vue.extend({
 		canHideText,
 
 		capture(withHandler = false) {
-			if ((this as any).os.isSignedIn) {
+			if (this.$store.getters.isSignedIn) {
 				this.connection.send({
 					type: 'capture',
 					id: this.p.id
@@ -221,7 +221,7 @@ export default Vue.extend({
 		},
 
 		decapture(withHandler = false) {
-			if ((this as any).os.isSignedIn) {
+			if (this.$store.getters.isSignedIn) {
 				this.connection.send({
 					type: 'decapture',
 					id: this.p.id
diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue
index 55b0de3fbd..5a147f31e2 100644
--- a/src/client/app/desktop/views/components/notes.vue
+++ b/src/client/app/desktop/views/components/notes.vue
@@ -118,24 +118,24 @@ export default Vue.extend({
 
 		prepend(note, silent = false) {
 			//#region 弾く
-			const isMyNote = note.userId == (this as any).os.i.id;
+			const isMyNote = note.userId == this.$store.state.i.id;
 			const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null;
 
-			if ((this as any).clientSettings.showMyRenotes === false) {
+			if (this.$store.state.settings.showMyRenotes === false) {
 				if (isMyNote && isPureRenote) {
 					return;
 				}
 			}
 
-			if ((this as any).clientSettings.showRenotedMyNotes === false) {
-				if (isPureRenote && (note.renote.userId == (this as any).os.i.id)) {
+			if (this.$store.state.settings.showRenotedMyNotes === false) {
+				if (isPureRenote && (note.renote.userId == this.$store.state.i.id)) {
 					return;
 				}
 			}
 			//#endregion
 
 			// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
-			if ((document.hidden || !this.isScrollTop()) && note.userId !== (this as any).os.i.id) {
+			if ((document.hidden || !this.isScrollTop()) && note.userId !== this.$store.state.i.id) {
 				this.unreadCount++;
 				document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`;
 			}
@@ -199,7 +199,7 @@ export default Vue.extend({
 				this.clearNotification();
 			}
 
-			if ((this as any).clientSettings.fetchOnScroll !== false) {
+			if (this.$store.state.settings.fetchOnScroll !== false) {
 				const current = window.scrollY + window.innerHeight;
 				if (current > document.body.offsetHeight - 8) this.loadMore();
 			}
diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index 39bec6cf0c..8eec677b06 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -118,7 +118,7 @@ export default Vue.extend({
 				const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`;
 
 				// 自分は除外
-				if (this.os.i.username == x.username && x.host == null) return;
+				if (this.$store.state.i.username == x.username && x.host == null) return;
 
 				// 重複は除外
 				if (this.text.indexOf(`${mention} `) != -1) return;
diff --git a/src/client/app/desktop/views/components/settings.2fa.vue b/src/client/app/desktop/views/components/settings.2fa.vue
index 0809dd798c..3e8c860eba 100644
--- a/src/client/app/desktop/views/components/settings.2fa.vue
+++ b/src/client/app/desktop/views/components/settings.2fa.vue
@@ -2,8 +2,8 @@
 <div class="2fa">
 	<p>%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p>
 	<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
-	<p v-if="!data && !os.i.twoFactorEnabled"><button @click="register" class="ui primary">%i18n:@register%</button></p>
-	<template v-if="os.i.twoFactorEnabled">
+	<p v-if="!data && !$store.state.i.twoFactorEnabled"><button @click="register" class="ui primary">%i18n:@register%</button></p>
+	<template v-if="$store.state.i.twoFactorEnabled">
 		<p>%i18n:@already-registered%</p>
 		<button @click="unregister" class="ui">%i18n:@unregister%</button>
 	</template>
@@ -54,7 +54,7 @@ export default Vue.extend({
 					password: password
 				}).then(() => {
 					(this as any).apis.notify('%i18n:@unregistered%');
-					(this as any).os.i.twoFactorEnabled = false;
+					this.$store.state.i.twoFactorEnabled = false;
 				});
 			});
 		},
@@ -64,7 +64,7 @@ export default Vue.extend({
 				token: this.token
 			}).then(() => {
 				(this as any).apis.notify('%i18n:@success%');
-				(this as any).os.i.twoFactorEnabled = true;
+				this.$store.state.i.twoFactorEnabled = true;
 			}).catch(() => {
 				(this as any).apis.notify('%i18n:@failed%');
 			});
diff --git a/src/client/app/desktop/views/components/settings.api.vue b/src/client/app/desktop/views/components/settings.api.vue
index b8eef3de63..113764c3e1 100644
--- a/src/client/app/desktop/views/components/settings.api.vue
+++ b/src/client/app/desktop/views/components/settings.api.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="root api">
-	<p>%i18n:@token% <code>{{ os.i.token }}</code></p>
+	<p>%i18n:@token% <code>{{ $store.state.i.token }}</code></p>
 	<p>%i18n:@intro%</p>
 	<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
 	<p>%i18n:@regeneration-of-token%</p>
diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue
index 132ab12f1c..9932cbf7db 100644
--- a/src/client/app/desktop/views/components/settings.profile.vue
+++ b/src/client/app/desktop/views/components/settings.profile.vue
@@ -2,7 +2,7 @@
 <div class="profile">
 	<label class="avatar ui from group">
 		<p>%i18n:@avatar%</p>
-		<img class="avatar" :src="`${os.i.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<img class="avatar" :src="`${$store.state.i.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
 		<button class="ui" @click="updateAvatar">%i18n:@choice-avatar%</button>
 	</label>
 	<label class="ui from group">
@@ -24,8 +24,8 @@
 	<button class="ui primary" @click="save">%i18n:@save%</button>
 	<section>
 		<h2>その他</h2>
-		<mk-switch v-model="os.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
-		<mk-switch v-model="os.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
+		<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
+		<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
 	</section>
 </div>
 </template>
@@ -43,10 +43,10 @@ export default Vue.extend({
 		};
 	},
 	created() {
-		this.name = (this as any).os.i.name || '';
-		this.location = (this as any).os.i.profile.location;
-		this.description = (this as any).os.i.description;
-		this.birthday = (this as any).os.i.profile.birthday;
+		this.name = this.$store.state.i.name || '';
+		this.location = this.$store.state.i.profile.location;
+		this.description = this.$store.state.i.description;
+		this.birthday = this.$store.state.i.profile.birthday;
 	},
 	methods: {
 		updateAvatar() {
@@ -64,12 +64,12 @@ export default Vue.extend({
 		},
 		onChangeIsBot() {
 			(this as any).api('i/update', {
-				isBot: (this as any).os.i.isBot
+				isBot: this.$store.state.i.isBot
 			});
 		},
 		onChangeIsCat() {
 			(this as any).api('i/update', {
-				isCat: (this as any).os.i.isCat
+				isCat: this.$store.state.i.isCat
 			});
 		}
 	}
diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue
index dac5fe67cb..1bfff8cc83 100644
--- a/src/client/app/desktop/views/components/settings.vue
+++ b/src/client/app/desktop/views/components/settings.vue
@@ -20,7 +20,7 @@
 
 		<section class="web" v-show="page == 'web'">
 			<h1>%i18n:@behaviour%</h1>
-			<mk-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%">
+			<mk-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%">
 				<span>%i18n:@fetch-on-scroll-desc%</span>
 			</mk-switch>
 			<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
@@ -41,14 +41,14 @@
 			</div>
 			<div class="div">
 				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
-				<mk-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
-				<mk-switch v-model="clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
+				<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
+				<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
 			</div>
-			<mk-switch v-model="clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
-			<mk-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
-			<mk-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
-			<mk-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
-			<mk-switch v-model="clientSettings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
+			<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
+			<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
+			<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
+			<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
+			<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
 				<span>%i18n:@show-maps-desc%</span>
 			</mk-switch>
 		</section>
@@ -72,7 +72,7 @@
 
 		<section class="web" v-show="page == 'web'">
 			<h1>%i18n:@mobile%</h1>
-			<mk-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/>
+			<mk-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/>
 		</section>
 
 		<section class="web" v-show="page == 'web'">
@@ -100,7 +100,7 @@
 
 		<section class="notification" v-show="page == 'notification'">
 			<h1>%i18n:@notification%</h1>
-			<mk-switch v-model="os.i.settings.autoWatch" @change="onChangeAutoWatch" text="%i18n:@auto-watch%">
+			<mk-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch" text="%i18n:@auto-watch%">
 				<span>%i18n:@auto-watch-desc%</span>
 			</mk-switch>
 		</section>
diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue
index 03b634b0ff..8aa32cec73 100644
--- a/src/client/app/desktop/views/components/sub-note-content.vue
+++ b/src/client/app/desktop/views/components/sub-note-content.vue
@@ -3,7 +3,7 @@
 	<div class="body">
 		<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@hidden%</span>
 		<a class="reply" v-if="note.replyId">%fa:reply%</a>
-		<mk-note-html :text="note.text" :i="os.i"/>
+		<mk-note-html :text="note.text" :i="$store.state.i"/>
 		<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a>
 	</div>
 	<details v-if="note.media.length > 0">
diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue
index 3fcec86e48..44d5967db5 100644
--- a/src/client/app/desktop/views/components/timeline.core.vue
+++ b/src/client/app/desktop/views/components/timeline.core.vue
@@ -40,7 +40,7 @@ export default Vue.extend({
 
 	computed: {
 		alone(): boolean {
-			return (this as any).os.i.followingCount == 0;
+			return this.$store.state.i.followingCount == 0;
 		},
 
 		stream(): any {
@@ -98,8 +98,8 @@ export default Vue.extend({
 				(this as any).api(this.endpoint, {
 					limit: fetchLimit + 1,
 					untilDate: this.date ? this.date.getTime() : undefined,
-					includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-					includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+					includeMyRenotes: this.$store.state.settings.showMyRenotes,
+					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 				}).then(notes => {
 					if (notes.length == fetchLimit + 1) {
 						notes.pop();
@@ -120,8 +120,8 @@ export default Vue.extend({
 			const promise = (this as any).api(this.endpoint, {
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
-				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+				includeMyRenotes: this.$store.state.settings.showMyRenotes,
+				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 			});
 
 			promise.then(notes => {
diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue
index 27d329d13f..0728b78aa9 100644
--- a/src/client/app/desktop/views/components/timeline.vue
+++ b/src/client/app/desktop/views/components/timeline.vue
@@ -47,7 +47,7 @@ export default Vue.extend({
 			if (this.src == 'list') {
 				this.list = this.$store.state.device.tl.arg;
 			}
-		} else if ((this as any).os.i.followingCount == 0) {
+		} else if (this.$store.state.i.followingCount == 0) {
 			this.src = 'local';
 		}
 	},
diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue
index f3f6539496..8d26691f84 100644
--- a/src/client/app/desktop/views/components/ui.header.account.vue
+++ b/src/client/app/desktop/views/components/ui.header.account.vue
@@ -1,14 +1,14 @@
 <template>
 <div class="account">
 	<button class="header" :data-active="isOpen" @click="toggle">
-		<span class="username">{{ os.i.username }}<template v-if="!isOpen">%fa:angle-down%</template><template v-if="isOpen">%fa:angle-up%</template></span>
-		<mk-avatar class="avatar" :user="os.i"/>
+		<span class="username">{{ $store.state.i.username }}<template v-if="!isOpen">%fa:angle-down%</template><template v-if="isOpen">%fa:angle-up%</template></span>
+		<mk-avatar class="avatar" :user="$store.state.i"/>
 	</button>
 	<transition name="zoom-in-top">
 		<div class="menu" v-if="isOpen">
 			<ul>
 				<li>
-					<router-link :to="`/@${ os.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link>
+					<router-link :to="`/@${ $store.state.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link>
 				</li>
 				<li @click="drive">
 					<p>%fa:cloud%<span>%i18n:@drive%</span>%fa:angle-right%</p>
diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue
index 0800d96eb6..201b04b039 100644
--- a/src/client/app/desktop/views/components/ui.header.nav.vue
+++ b/src/client/app/desktop/views/components/ui.header.nav.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="nav">
 	<ul>
-		<template v-if="os.isSignedIn">
+		<template v-if="$store.getters.isSignedIn">
 			<li class="home" :class="{ active: $route.name == 'index' }">
 				<router-link to="/">
 					%fa:home%
@@ -42,7 +42,7 @@ export default Vue.extend({
 		};
 	},
 	mounted() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
@@ -60,7 +60,7 @@ export default Vue.extend({
 		}
 	},
 	beforeDestroy() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
 			this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
 			this.connection.off('othello_invited', this.onOthelloInvited);
diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue
index ea814dd7a3..9eaaa62c61 100644
--- a/src/client/app/desktop/views/components/ui.header.notifications.vue
+++ b/src/client/app/desktop/views/components/ui.header.notifications.vue
@@ -23,7 +23,7 @@ export default Vue.extend({
 		};
 	},
 	mounted() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
@@ -39,7 +39,7 @@ export default Vue.extend({
 		}
 	},
 	beforeDestroy() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.off('read_all_notifications', this.onReadAllNotifications);
 			this.connection.off('unread_notification', this.onUnreadNotification);
 			(this as any).os.stream.dispose(this.connectionId);
diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue
index 7729575b56..34464bf4b2 100644
--- a/src/client/app/desktop/views/components/ui.header.vue
+++ b/src/client/app/desktop/views/components/ui.header.vue
@@ -4,16 +4,16 @@
 	<div class="main" ref="main">
 		<div class="backdrop"></div>
 		<div class="main">
-			<p ref="welcomeback" v-if="os.isSignedIn">おかえりなさい、<b>{{ os.i | userName }}</b>さん</p>
+			<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p>
 			<div class="container" ref="mainContainer">
 				<div class="left">
 					<x-nav/>
 				</div>
 				<div class="right">
 					<x-search/>
-					<x-account v-if="os.isSignedIn"/>
-					<x-notifications v-if="os.isSignedIn"/>
-					<x-post v-if="os.isSignedIn"/>
+					<x-account v-if="$store.getters.isSignedIn"/>
+					<x-notifications v-if="$store.getters.isSignedIn"/>
+					<x-post v-if="$store.getters.isSignedIn"/>
 					<x-clock/>
 				</div>
 			</div>
@@ -45,11 +45,11 @@ export default Vue.extend({
 	mounted() {
 		this.$store.commit('setUiHeaderHeight', 48);
 
-		if ((this as any).os.isSignedIn) {
-			const ago = (new Date().getTime() - new Date((this as any).os.i.lastUsedAt).getTime()) / 1000;
+		if (this.$store.getters.isSignedIn) {
+			const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
 			const isHisasiburi = ago >= 3600;
-			(this as any).os.i.lastUsedAt = new Date();
-			(this as any).os.bakeMe();
+			this.$store.state.i.lastUsedAt = new Date();
+
 			if (isHisasiburi) {
 				(this.$refs.welcomeback as any).style.display = 'block';
 				(this.$refs.main as any).style.overflow = 'hidden';
diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue
index 87f932ff14..b6dd22c1f8 100644
--- a/src/client/app/desktop/views/components/ui.vue
+++ b/src/client/app/desktop/views/components/ui.vue
@@ -4,7 +4,7 @@
 	<div class="content">
 		<slot></slot>
 	</div>
-	<mk-stream-indicator v-if="os.isSignedIn"/>
+	<mk-stream-indicator v-if="$store.getters.isSignedIn"/>
 </div>
 </template>
 
diff --git a/src/client/app/desktop/views/components/user-list-timeline.vue b/src/client/app/desktop/views/components/user-list-timeline.vue
index 4f14da70fe..03ac81a4a1 100644
--- a/src/client/app/desktop/views/components/user-list-timeline.vue
+++ b/src/client/app/desktop/views/components/user-list-timeline.vue
@@ -32,7 +32,7 @@ export default Vue.extend({
 	methods: {
 		init() {
 			if (this.connection) this.connection.close();
-			this.connection = new UserListStream((this as any).os, (this as any).os.i, this.list.id);
+			this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id);
 			this.connection.on('note', this.onNote);
 			this.connection.on('userAdded', this.onUserAdded);
 			this.connection.on('userRemoved', this.onUserRemoved);
@@ -46,8 +46,8 @@ export default Vue.extend({
 				(this as any).api('notes/user-list-timeline', {
 					listId: this.list.id,
 					limit: fetchLimit + 1,
-					includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-					includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+					includeMyRenotes: this.$store.state.settings.showMyRenotes,
+					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 				}).then(notes => {
 					if (notes.length == fetchLimit + 1) {
 						notes.pop();
@@ -66,8 +66,8 @@ export default Vue.extend({
 				listId: this.list.id,
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
-				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+				includeMyRenotes: this.$store.state.settings.showMyRenotes,
+				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 			});
 
 			promise.then(notes => {
diff --git a/src/client/app/desktop/views/components/user-preview.vue b/src/client/app/desktop/views/components/user-preview.vue
index b8854a8032..788881ead5 100644
--- a/src/client/app/desktop/views/components/user-preview.vue
+++ b/src/client/app/desktop/views/components/user-preview.vue
@@ -19,7 +19,7 @@
 				<p>%i18n:@followers%</p><a>{{ u.followersCount }}</a>
 			</div>
 		</div>
-		<mk-follow-button v-if="os.isSignedIn && user.id != os.i.id" :user="u"/>
+		<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="u"/>
 	</template>
 </div>
 </template>
diff --git a/src/client/app/desktop/views/components/users-list.vue b/src/client/app/desktop/views/components/users-list.vue
index 1ed5c33b13..0423db8ed7 100644
--- a/src/client/app/desktop/views/components/users-list.vue
+++ b/src/client/app/desktop/views/components/users-list.vue
@@ -3,7 +3,7 @@
 	<nav>
 		<div>
 			<span :data-active="mode == 'all'" @click="mode = 'all'">%i18n:@all%<span>{{ count }}</span></span>
-			<span v-if="os.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@iknow%<span>{{ youKnowCount }}</span></span>
+			<span v-if="$store.getters.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@iknow%<span>{{ youKnowCount }}</span></span>
 		</div>
 	</nav>
 	<div class="users" v-if="!fetching && users.length != 0">
diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue
index ab8327d39e..488e9cb249 100644
--- a/src/client/app/desktop/views/components/widget-container.vue
+++ b/src/client/app/desktop/views/components/widget-container.vue
@@ -23,9 +23,9 @@ export default Vue.extend({
 	},
 	computed: {
 		withGradient(): boolean {
-			return (this as any).os.isSignedIn
-				? (this as any).clientSettings.gradientWindowHeader != null
-					? (this as any).clientSettings.gradientWindowHeader
+			return this.$store.getters.isSignedIn
+				? this.$store.state.settings.gradientWindowHeader != null
+					? this.$store.state.settings.gradientWindowHeader
 					: false
 				: false;
 		}
diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue
index ac06ac8e57..e4753f55db 100644
--- a/src/client/app/desktop/views/components/window.vue
+++ b/src/client/app/desktop/views/components/window.vue
@@ -4,7 +4,7 @@
 	<div class="main" ref="main" tabindex="-1" :data-is-modal="isModal" @mousedown="onBodyMousedown" @keydown="onKeydown" :style="{ width, height }">
 		<div class="body">
 			<header ref="header"
-				:class="{ withGradient: clientSettings.gradientWindowHeader }"
+				:class="{ withGradient: $store.state.settings.gradientWindowHeader }"
 				@contextmenu.prevent="() => {}" @mousedown.prevent="onHeaderMousedown"
 			>
 				<h1><slot name="header"></slot></h1>
@@ -95,7 +95,7 @@ export default Vue.extend({
 	},
 
 	created() {
-		if ((this as any).os.store.state.device.autoPopout && this.popoutUrl) {
+		if (this.$store.state.device.autoPopout && this.popoutUrl) {
 			this.popout();
 			this.preventMount = true;
 		} else {
diff --git a/src/client/app/desktop/views/pages/index.vue b/src/client/app/desktop/views/pages/index.vue
index 0ea47d913b..5d11fc5423 100644
--- a/src/client/app/desktop/views/pages/index.vue
+++ b/src/client/app/desktop/views/pages/index.vue
@@ -1,5 +1,5 @@
 <template>
-<component :is="os.isSignedIn ? 'home' : 'welcome'"></component>
+<component :is="$store.getters.isSignedIn ? 'home' : 'welcome'"></component>
 </template>
 
 <script lang="ts">
diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue
index 73af3a4a4c..44910bc7f0 100644
--- a/src/client/app/desktop/views/pages/user/user.header.vue
+++ b/src/client/app/desktop/views/pages/user/user.header.vue
@@ -63,7 +63,7 @@ export default Vue.extend({
 		},
 
 		onBannerClick() {
-			if (!(this as any).os.isSignedIn || (this as any).os.i.id != this.user.id) return;
+			if (!this.$store.getters.isSignedIn || this.$store.state.i.id != this.user.id) return;
 
 			(this as any).apis.updateBanner().then(i => {
 				this.user.bannerUrl = i.bannerUrl;
diff --git a/src/client/app/desktop/views/pages/user/user.home.vue b/src/client/app/desktop/views/pages/user/user.home.vue
index 6b242a6129..afaf97dc9e 100644
--- a/src/client/app/desktop/views/pages/user/user.home.vue
+++ b/src/client/app/desktop/views/pages/user/user.home.vue
@@ -4,7 +4,7 @@
 		<div ref="left">
 			<x-profile :user="user"/>
 			<x-photos :user="user"/>
-			<x-followers-you-know v-if="os.isSignedIn && os.i.id != user.id" :user="user"/>
+			<x-followers-you-know v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
 			<p v-if="user.host === null">%i18n:@last-used-at%: <b><mk-time :time="user.lastUsedAt"/></b></p>
 		</div>
 	</div>
diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue
index 29e49f36a6..5aa08f7c85 100644
--- a/src/client/app/desktop/views/pages/user/user.profile.vue
+++ b/src/client/app/desktop/views/pages/user/user.profile.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="profile">
-	<div class="friend-form" v-if="os.isSignedIn && os.i.id != user.id">
+	<div class="friend-form" v-if="$store.getters.isSignedIn && $store.state.i.id != user.id">
 		<mk-follow-button :user="user" size="big"/>
 		<p class="followed" v-if="user.isFollowed">%i18n:@follows-you%</p>
 		<p class="stalk" v-if="user.isFollowing">
diff --git a/src/client/app/desktop/views/widgets/activity.vue b/src/client/app/desktop/views/widgets/activity.vue
index 1be87f590c..73c6d0ef64 100644
--- a/src/client/app/desktop/views/widgets/activity.vue
+++ b/src/client/app/desktop/views/widgets/activity.vue
@@ -2,7 +2,7 @@
 <mk-activity
 	:design="props.design"
 	:init-view="props.view"
-	:user="os.i"
+	:user="$store.state.i"
 	@view-changed="viewChanged"/>
 </template>
 
diff --git a/src/client/app/desktop/views/widgets/profile.vue b/src/client/app/desktop/views/widgets/profile.vue
index 5af5b88e23..7b0fea3729 100644
--- a/src/client/app/desktop/views/widgets/profile.vue
+++ b/src/client/app/desktop/views/widgets/profile.vue
@@ -4,16 +4,16 @@
 	:data-melt="props.design == 2"
 >
 	<div class="banner"
-		:style="os.i.bannerUrl ? `background-image: url(${os.i.bannerUrl}?thumbnail&size=256)` : ''"
+		:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl}?thumbnail&size=256)` : ''"
 		title="%i18n:@update-banner%"
 		@click="os.apis.updateBanner"
 	></div>
-	<mk-avatar class="avatar" :user="os.i"
+	<mk-avatar class="avatar" :user="$store.state.i"
 		@click="os.apis.updateAvatar"
 		title="%i18n:@update-avatar%"
 	/>
-	<router-link class="name" :to="os.i | userPage">{{ os.i | userName }}</router-link>
-	<p class="username">@{{ os.i | acct }}</p>
+	<router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link>
+	<p class="username">@{{ $store.state.i | acct }}</p>
 </div>
 </template>
 
diff --git a/src/client/app/init.ts b/src/client/app/init.ts
index 560ab1a096..58013ec5a8 100644
--- a/src/client/app/init.ts
+++ b/src/client/app/init.ts
@@ -143,8 +143,7 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
 					return {
 						os,
 						api: os.api,
-						apis: os.apis,
-						clientSettings: os.store.state.settings
+						apis: os.apis
 					};
 				}
 			});
diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts
index a5a38a5414..a8da5ddb55 100644
--- a/src/client/app/mios.ts
+++ b/src/client/app/mios.ts
@@ -1,10 +1,9 @@
 import Vue from 'vue';
 import { EventEmitter } from 'eventemitter3';
-import * as merge from 'object-assign-deep';
 import * as uuid from 'uuid';
 
 import initStore from './store';
-import { hostname, apiUrl, swPublickey, version, lang, googleMapsApiKey } from './config';
+import { apiUrl, swPublickey, version, lang, googleMapsApiKey } from './config';
 import Progress from './common/scripts/loading';
 import Connection from './common/scripts/streaming/stream';
 import { HomeStreamManager } from './common/scripts/streaming/home';
@@ -82,18 +81,6 @@ export default class MiOS extends EventEmitter {
 		return w;
 	}
 
-	/**
-	 * A signing user
-	 */
-	public i: { [x: string]: any };
-
-	/**
-	 * Whether signed in
-	 */
-	public get isSignedIn() {
-		return this.i != null;
-	}
-
 	/**
 	 * Whether is debug mode
 	 */
@@ -218,15 +205,8 @@ export default class MiOS extends EventEmitter {
 		console.error.apply(null, args);
 	}
 
-	public bakeMe() {
-		// ローカルストレージにキャッシュ
-		localStorage.setItem('me', JSON.stringify(this.i));
-	}
-
 	public signout() {
-		localStorage.removeItem('me');
-		localStorage.removeItem('settings');
-		document.cookie = `i=; domain=${hostname}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
+		this.store.dispatch('logout');
 		location.href = '/';
 	}
 
@@ -242,14 +222,14 @@ export default class MiOS extends EventEmitter {
 
 		this.once('signedin', () => {
 			// Init home stream manager
-			this.stream = new HomeStreamManager(this, this.i);
+			this.stream = new HomeStreamManager(this, this.store.state.i);
 
 			// Init other stream manager
-			this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.i);
-			this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.i);
-			this.streams.driveStream = new DriveStreamManager(this, this.i);
-			this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.i);
-			this.streams.othelloStream = new OthelloStreamManager(this, this.i);
+			this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.store.state.i);
+			this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i);
+			this.streams.driveStream = new DriveStreamManager(this, this.store.state.i);
+			this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.store.state.i);
+			this.streams.othelloStream = new OthelloStreamManager(this, this.store.state.i);
 		});
 		//#endregion
 
@@ -300,51 +280,29 @@ export default class MiOS extends EventEmitter {
 		};
 
 		// フェッチが完了したとき
-		const fetched = me => {
-			this.i = me;
-
-			// ローカルストレージにキャッシュ
-			this.bakeMe();
-
+		const fetched = () => {
 			this.emit('signedin');
 
 			// Finish init
 			callback();
 
-			//#region Note
-
 			// Init service worker
 			if (this.shouldRegisterSw) this.registerSw();
-
-			//#endregion
 		};
 
-		// Get cached account data
-		const cachedMe = JSON.parse(localStorage.getItem('me'));
-
-		//#region キャッシュされた設定を復元
-		const cachedSettings = JSON.parse(localStorage.getItem('settings'));
-
-		if (cachedSettings) {
-			this.store.dispatch('settings/merge', cachedSettings);
-		}
-		//#endregion
-
 		// キャッシュがあったとき
-		if (cachedMe) {
-			if (cachedMe.token == null) {
+		if (this.store.state.i != null) {
+			if (this.store.state.i.token == null) {
 				this.signout();
 				return;
 			}
 
 			// とりあえずキャッシュされたデータでお茶を濁して(?)おいて、
-			fetched(cachedMe);
+			fetched();
 
 			// 後から新鮮なデータをフェッチ
-			fetchme(cachedMe.token, freshData => {
-				merge(cachedMe, freshData);
-
-				this.store.dispatch('settings/merge', freshData.clientSettings);
+			fetchme(this.store.state.i.token, freshData => {
+				this.store.dispatch('mergeMe', freshData);
 			});
 		} else {
 			// Get token from cookie
@@ -352,9 +310,8 @@ export default class MiOS extends EventEmitter {
 
 			fetchme(i, me => {
 				if (me) {
-					this.store.dispatch('settings/merge', me.clientSettings);
-
-					fetched(me);
+					this.store.dispatch('login', me);
+					fetched();
 				} else {
 					// Finish init
 					callback();
@@ -375,7 +332,7 @@ export default class MiOS extends EventEmitter {
 		if (!isSwSupported) return;
 
 		// Reject when not signed in to Misskey
-		if (!this.isSignedIn) return;
+		if (!this.store.getters.isSignedIn) return;
 
 		// When service worker activated
 		navigator.serviceWorker.ready.then(registration => {
@@ -484,7 +441,7 @@ export default class MiOS extends EventEmitter {
 				});
 			} else {
 				// Append a credential
-				if (this.isSignedIn) (data as any).i = this.i.token;
+				if (this.store.getters.isSignedIn) (data as any).i = this.store.state.i.token;
 
 				const req = {
 					id: uuid(),
diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index 244dbb6c03..eb934431d2 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -31,7 +31,7 @@
 		<div class="body">
 			<div class="text">
 				<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
-				<mk-note-html v-if="p.text" :text="p.text" :i="os.i"/>
+				<mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/>
 			</div>
 			<div class="tags" v-if="p.tags && p.tags.length > 0">
 				<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
@@ -147,7 +147,7 @@ export default Vue.extend({
 
 		// Draw map
 		if (this.p.geo) {
-			const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true;
+			const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
 			if (shouldShowMap) {
 				(this as any).os.getGoogleMaps().then(maps => {
 					const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 2004263d22..42d3ffe40e 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="note" :class="{ renote: isRenote, smart: $store.state.device.postStyle == 'smart' }">
-	<div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)">
+	<div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
 		<x-sub :note="p.reply"/>
 	</div>
 	<div class="renote" v-if="isRenote">
@@ -43,7 +43,7 @@
 					<div class="text">
 						<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
 						<a class="reply" v-if="p.reply">%fa:reply%</a>
-						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="os.i" :class="$style.text"/>
+						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/>
 						<a class="rp" v-if="p.renote != null">RP:</a>
 					</div>
 					<div class="media" v-if="p.media.length > 0">
@@ -141,7 +141,7 @@ export default Vue.extend({
 	},
 
 	created() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 		}
@@ -150,13 +150,13 @@ export default Vue.extend({
 	mounted() {
 		this.capture(true);
 
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.on('_connected_', this.onStreamConnected);
 		}
 
 		// Draw map
 		if (this.p.geo) {
-			const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true;
+			const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
 			if (shouldShowMap) {
 				(this as any).os.getGoogleMaps().then(maps => {
 					const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
@@ -176,7 +176,7 @@ export default Vue.extend({
 	beforeDestroy() {
 		this.decapture(true);
 
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.off('_connected_', this.onStreamConnected);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
@@ -186,7 +186,7 @@ export default Vue.extend({
 		canHideText,
 
 		capture(withHandler = false) {
-			if ((this as any).os.isSignedIn) {
+			if (this.$store.getters.isSignedIn) {
 				this.connection.send({
 					type: 'capture',
 					id: this.p.id
@@ -196,7 +196,7 @@ export default Vue.extend({
 		},
 
 		decapture(withHandler = false) {
-			if ((this as any).os.isSignedIn) {
+			if (this.$store.getters.isSignedIn) {
 				this.connection.send({
 					type: 'decapture',
 					id: this.p.id
diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue
index e77698dea9..fbba111664 100644
--- a/src/client/app/mobile/views/components/notes.vue
+++ b/src/client/app/mobile/views/components/notes.vue
@@ -121,24 +121,24 @@ export default Vue.extend({
 
 		prepend(note, silent = false) {
 			//#region 弾く
-			const isMyNote = note.userId == (this as any).os.i.id;
+			const isMyNote = note.userId == this.$store.state.i.id;
 			const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null;
 
-			if ((this as any).clientSettings.showMyRenotes === false) {
+			if (this.$store.state.settings.showMyRenotes === false) {
 				if (isMyNote && isPureRenote) {
 					return;
 				}
 			}
 
-			if ((this as any).clientSettings.showRenotedMyNotes === false) {
-				if (isPureRenote && (note.renote.userId == (this as any).os.i.id)) {
+			if (this.$store.state.settings.showRenotedMyNotes === false) {
+				if (isPureRenote && (note.renote.userId == this.$store.state.i.id)) {
 					return;
 				}
 			}
 			//#endregion
 
 			// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
-			if ((document.hidden || !this.isScrollTop()) && note.userId !== (this as any).os.i.id) {
+			if ((document.hidden || !this.isScrollTop()) && note.userId !== this.$store.state.i.id) {
 				this.unreadCount++;
 				document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`;
 			}
@@ -195,7 +195,7 @@ export default Vue.extend({
 				this.clearNotification();
 			}
 
-			if ((this as any).clientSettings.fetchOnScroll !== false) {
+			if (this.$store.state.settings.fetchOnScroll !== false) {
 				// 親要素が display none だったら弾く
 				// https://github.com/syuilo/misskey/issues/1569
 				// http://d.hatena.ne.jp/favril/20091105/1257403319
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index 264eb08448..f999988c60 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -86,7 +86,7 @@ export default Vue.extend({
 				const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`;
 
 				// 自分は除外
-				if (this.os.i.username == x.username && x.host == null) return;
+				if (this.$store.state.i.username == x.username && x.host == null) return;
 
 				// 重複は除外
 				if (this.text.indexOf(`${mention} `) != -1) return;
@@ -194,7 +194,7 @@ export default Vue.extend({
 
 		post() {
 			this.posting = true;
-			const viaMobile = (this as any).clientSettings.disableViaMobile !== true;
+			const viaMobile = this.$store.state.settings.disableViaMobile !== true;
 			(this as any).api('notes/create', {
 				text: this.text == '' ? undefined : this.text,
 				mediaIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue
index cc50977a58..bb96d65147 100644
--- a/src/client/app/mobile/views/components/sub-note-content.vue
+++ b/src/client/app/mobile/views/components/sub-note-content.vue
@@ -3,7 +3,7 @@
 	<div class="body">
 		<span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
 		<a class="reply" v-if="note.replyId">%fa:reply%</a>
-		<mk-note-html v-if="note.text" :text="note.text" :i="os.i"/>
+		<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
 		<a class="rp" v-if="note.renoteId">RP: ...</a>
 	</div>
 	<details v-if="note.media.length > 0">
diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue
index a49462b159..09aa18f769 100644
--- a/src/client/app/mobile/views/components/ui.header.vue
+++ b/src/client/app/mobile/views/components/ui.header.vue
@@ -3,7 +3,7 @@
 	<mk-special-message/>
 	<div class="main" ref="main">
 		<div class="backdrop"></div>
-		<p ref="welcomeback" v-if="os.isSignedIn">おかえりなさい、<b>{{ os.i | userName }}</b>さん</p>
+		<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p>
 		<div class="content" ref="mainContainer">
 			<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
 			<template v-if="hasUnreadNotifications || hasUnreadMessagingMessages || hasGameInvitations">%fa:circle%</template>
@@ -35,7 +35,7 @@ export default Vue.extend({
 	mounted() {
 		this.$store.commit('setUiHeaderHeight', 48);
 
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
@@ -60,10 +60,10 @@ export default Vue.extend({
 				}
 			});
 
-			const ago = (new Date().getTime() - new Date((this as any).os.i.lastUsedAt).getTime()) / 1000;
+			const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
 			const isHisasiburi = ago >= 3600;
-			(this as any).os.i.lastUsedAt = new Date();
-			(this as any).os.bakeMe();
+			this.$store.state.i.lastUsedAt = new Date();
+
 			if (isHisasiburi) {
 				(this.$refs.welcomeback as any).style.display = 'block';
 				(this.$refs.main as any).style.overflow = 'hidden';
@@ -109,7 +109,7 @@ export default Vue.extend({
 		}
 	},
 	beforeDestroy() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.off('read_all_notifications', this.onReadAllNotifications);
 			this.connection.off('unread_notification', this.onUnreadNotification);
 			this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index aa469bd1c8..5f0cc831cc 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -9,9 +9,9 @@
 	</transition>
 	<transition name="nav">
 		<div class="body" v-if="isOpen">
-			<router-link class="me" v-if="os.isSignedIn" :to="`/@${os.i.username}`">
-				<img class="avatar" :src="`${os.i.avatarUrl}?thumbnail&size=128`" alt="avatar"/>
-				<p class="name">{{ os.i | userName }}</p>
+			<router-link class="me" v-if="$store.getters.isSignedIn" :to="`/@${$store.state.i.username}`">
+				<img class="avatar" :src="`${$store.state.i.avatarUrl}?thumbnail&size=128`" alt="avatar"/>
+				<p class="name">{{ $store.state.i | userName }}</p>
 			</router-link>
 			<div class="links">
 				<ul>
@@ -55,7 +55,7 @@ export default Vue.extend({
 		};
 	},
 	mounted() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
@@ -82,7 +82,7 @@ export default Vue.extend({
 		}
 	},
 	beforeDestroy() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.off('read_all_notifications', this.onReadAllNotifications);
 			this.connection.off('unread_notification', this.onUnreadNotification);
 			this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
diff --git a/src/client/app/mobile/views/components/ui.vue b/src/client/app/mobile/views/components/ui.vue
index 325ce9d40e..7e2d39f259 100644
--- a/src/client/app/mobile/views/components/ui.vue
+++ b/src/client/app/mobile/views/components/ui.vue
@@ -8,7 +8,7 @@
 	<div class="content">
 		<slot></slot>
 	</div>
-	<mk-stream-indicator v-if="os.isSignedIn"/>
+	<mk-stream-indicator v-if="$store.getters.isSignedIn"/>
 </div>
 </template>
 
@@ -32,7 +32,7 @@ export default Vue.extend({
 		};
 	},
 	mounted() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
@@ -40,7 +40,7 @@ export default Vue.extend({
 		}
 	},
 	beforeDestroy() {
-		if ((this as any).os.isSignedIn) {
+		if (this.$store.getters.isSignedIn) {
 			this.connection.off('notification', this.onNotification);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
diff --git a/src/client/app/mobile/views/components/user-list-timeline.vue b/src/client/app/mobile/views/components/user-list-timeline.vue
index 629151302c..2c1564b7ed 100644
--- a/src/client/app/mobile/views/components/user-list-timeline.vue
+++ b/src/client/app/mobile/views/components/user-list-timeline.vue
@@ -43,7 +43,7 @@ export default Vue.extend({
 	methods: {
 		init() {
 			if (this.connection) this.connection.close();
-			this.connection = new UserListStream((this as any).os, (this as any).os.i, this.list.id);
+			this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id);
 			this.connection.on('note', this.onNote);
 			this.connection.on('userAdded', this.onUserAdded);
 			this.connection.on('userRemoved', this.onUserRemoved);
@@ -58,8 +58,8 @@ export default Vue.extend({
 				(this as any).api('notes/user-list-timeline', {
 					listId: this.list.id,
 					limit: fetchLimit + 1,
-					includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-					includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+					includeMyRenotes: this.$store.state.settings.showMyRenotes,
+					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 				}).then(notes => {
 					if (notes.length == fetchLimit + 1) {
 						notes.pop();
@@ -81,8 +81,8 @@ export default Vue.extend({
 				listId: this.list.id,
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
-				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+				includeMyRenotes: this.$store.state.settings.showMyRenotes,
+				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 			});
 
 			promise.then(notes => {
diff --git a/src/client/app/mobile/views/components/users-list.vue b/src/client/app/mobile/views/components/users-list.vue
index 6175067459..a57b821293 100644
--- a/src/client/app/mobile/views/components/users-list.vue
+++ b/src/client/app/mobile/views/components/users-list.vue
@@ -2,7 +2,7 @@
 <div class="mk-users-list">
 	<nav>
 		<span :data-active="mode == 'all'" @click="mode = 'all'">%i18n:@all%<span>{{ count }}</span></span>
-		<span v-if="os.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@known%<span>{{ youKnowCount }}</span></span>
+		<span v-if="$store.getters.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@known%<span>{{ youKnowCount }}</span></span>
 	</nav>
 	<div class="users" v-if="!fetching && users.length != 0">
 		<mk-user-preview v-for="u in users" :user="u" :key="u.id"/>
diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue
index 9ebce53de7..364367b940 100644
--- a/src/client/app/mobile/views/pages/home.timeline.vue
+++ b/src/client/app/mobile/views/pages/home.timeline.vue
@@ -38,7 +38,7 @@ export default Vue.extend({
 
 	computed: {
 		alone(): boolean {
-			return (this as any).os.i.followingCount == 0;
+			return this.$store.state.i.followingCount == 0;
 		},
 
 		stream(): any {
@@ -92,8 +92,8 @@ export default Vue.extend({
 				(this as any).api(this.endpoint, {
 					limit: fetchLimit + 1,
 					untilDate: this.date ? this.date.getTime() : undefined,
-					includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-					includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+					includeMyRenotes: this.$store.state.settings.showMyRenotes,
+					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 				}).then(notes => {
 					if (notes.length == fetchLimit + 1) {
 						notes.pop();
@@ -114,8 +114,8 @@ export default Vue.extend({
 			const promise = (this as any).api(this.endpoint, {
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
-				includeMyRenotes: (this as any).clientSettings.showMyRenotes,
-				includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes
+				includeMyRenotes: this.$store.state.settings.showMyRenotes,
+				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 			});
 
 			promise.then(notes => {
diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue
index 33579185e1..c0c2ee8ab5 100644
--- a/src/client/app/mobile/views/pages/home.vue
+++ b/src/client/app/mobile/views/pages/home.vue
@@ -87,7 +87,7 @@ export default Vue.extend({
 			if (this.src == 'list') {
 				this.list = this.$store.state.device.tl.arg;
 			}
-		} else if ((this as any).os.i.followingCount == 0) {
+		} else if (this.$store.state.i.followingCount == 0) {
 			this.src = 'local';
 		}
 	},
diff --git a/src/client/app/mobile/views/pages/index.vue b/src/client/app/mobile/views/pages/index.vue
index 0ea47d913b..5d11fc5423 100644
--- a/src/client/app/mobile/views/pages/index.vue
+++ b/src/client/app/mobile/views/pages/index.vue
@@ -1,5 +1,5 @@
 <template>
-<component :is="os.isSignedIn ? 'home' : 'welcome'"></component>
+<component :is="$store.getters.isSignedIn ? 'home' : 'welcome'"></component>
 </template>
 
 <script lang="ts">
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index 3bb25f88f8..8da7a76633 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -17,22 +17,22 @@
 					</div>
 
 					<div>
-						<md-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</md-switch>
+						<md-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</md-switch>
 					</div>
 
 					<div>
 						<div class="md-body-2">%i18n:@timeline%</div>
 
 						<div>
-							<md-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</md-switch>
+							<md-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</md-switch>
 						</div>
 
 						<div>
-							<md-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</md-switch>
+							<md-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</md-switch>
 						</div>
 
 						<div>
-							<md-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch>
+							<md-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch>
 						</div>
 					</div>
 
@@ -52,11 +52,11 @@
 
 				<md-card-content>
 					<div>
-						<md-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</md-switch>
+						<md-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</md-switch>
 					</div>
 
 					<div>
-						<md-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch>
+						<md-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch>
 					</div>
 
 					<div>
@@ -64,7 +64,7 @@
 					</div>
 
 					<div>
-						<md-switch v-model="clientSettings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</md-switch>
+						<md-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</md-switch>
 					</div>
 
 					<div>
@@ -100,11 +100,11 @@
 				</md-card-header>
 
 				<md-card-content>
-					<p class="account" v-if="os.i.twitter"><a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p>
+					<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
 					<p>
-						<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
-						<span v-if="os.i.twitter"> or </span>
-						<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter">%i18n:@twitter-disconnect%</a>
+						<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
+						<span v-if="$store.state.i.twitter"> or </span>
+						<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a>
 					</p>
 				</md-card-content>
 			</md-card>
@@ -156,7 +156,7 @@ export default Vue.extend({
 
 	computed: {
 		name(): string {
-			return Vue.filter('userName')((this as any).os.i);
+			return Vue.filter('userName')(this.$store.state.i);
 		},
 
 		darkmode: {
diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue
index c16c44e133..f3444eb1f0 100644
--- a/src/client/app/mobile/views/pages/settings/settings.profile.vue
+++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue
@@ -82,15 +82,15 @@ export default Vue.extend({
 	},
 
 	created() {
-		this.name = (this as any).os.i.name || '';
-		this.username = (this as any).os.i.username;
-		this.location = (this as any).os.i.profile.location;
-		this.description = (this as any).os.i.description;
-		this.birthday = (this as any).os.i.profile.birthday;
-		this.avatarId = (this as any).os.i.avatarId;
-		this.bannerId = (this as any).os.i.bannerId;
-		this.isBot = (this as any).os.i.isBot;
-		this.isCat = (this as any).os.i.isCat;
+		this.name = this.$store.state.i.name || '';
+		this.username = this.$store.state.i.username;
+		this.location = this.$store.state.i.profile.location;
+		this.description = this.$store.state.i.description;
+		this.birthday = this.$store.state.i.profile.birthday;
+		this.avatarId = this.$store.state.i.avatarId;
+		this.bannerId = this.$store.state.i.bannerId;
+		this.isBot = this.$store.state.i.isBot;
+		this.isCat = this.$store.state.i.isCat;
 	},
 
 	methods: {
@@ -99,7 +99,7 @@ export default Vue.extend({
 
 			const data = new FormData();
 			data.append('file', file);
-			data.append('i', (this as any).os.i.token);
+			data.append('i', this.$store.state.i.token);
 
 			fetch(apiUrl + '/drive/files/create', {
 				method: 'POST',
@@ -121,7 +121,7 @@ export default Vue.extend({
 
 			const data = new FormData();
 			data.append('file', file);
-			data.append('i', (this as any).os.i.token);
+			data.append('i', this.$store.state.i.token);
 
 			fetch(apiUrl + '/drive/files/create', {
 				method: 'POST',
@@ -152,10 +152,10 @@ export default Vue.extend({
 				isCat: this.isCat
 			}).then(i => {
 				this.saving = false;
-				(this as any).os.i.avatarId = i.avatarId;
-				(this as any).os.i.avatarUrl = i.avatarUrl;
-				(this as any).os.i.bannerId = i.bannerId;
-				(this as any).os.i.bannerUrl = i.bannerUrl;
+				this.$store.state.i.avatarId = i.avatarId;
+				this.$store.state.i.avatarUrl = i.avatarUrl;
+				this.$store.state.i.bannerId = i.bannerId;
+				this.$store.state.i.bannerUrl = i.bannerUrl;
 
 				alert('%i18n:@saved%');
 			});
diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue
index 84fd7eda02..b3b820650c 100644
--- a/src/client/app/mobile/views/pages/user.vue
+++ b/src/client/app/mobile/views/pages/user.vue
@@ -11,7 +11,7 @@
 					<a class="avatar">
 						<img :src="user.avatarUrl" alt="avatar"/>
 					</a>
-					<mk-follow-button v-if="os.isSignedIn && os.i.id != user.id" :user="user"/>
+					<mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
 				</div>
 				<div class="title">
 					<h1>{{ user | userName }}</h1>
diff --git a/src/client/app/mobile/views/pages/user/home.vue b/src/client/app/mobile/views/pages/user/home.vue
index d02daf5027..8b57276b17 100644
--- a/src/client/app/mobile/views/pages/user/home.vue
+++ b/src/client/app/mobile/views/pages/user/home.vue
@@ -25,7 +25,7 @@
 			<x-friends :user="user"/>
 		</div>
 	</section>
-	<section class="followers-you-know" v-if="os.isSignedIn && os.i.id !== user.id">
+	<section class="followers-you-know" v-if="$store.getters.isSignedIn && $store.state.i.id !== user.id">
 		<h2>%fa:users%%i18n:@followers-you-know%</h2>
 		<div>
 			<x-followers-you-know :user="user"/>
diff --git a/src/client/app/mobile/views/widgets/activity.vue b/src/client/app/mobile/views/widgets/activity.vue
index 7763be41f5..85f925ceda 100644
--- a/src/client/app/mobile/views/widgets/activity.vue
+++ b/src/client/app/mobile/views/widgets/activity.vue
@@ -3,7 +3,7 @@
 	<mk-widget-container :show-header="!props.compact">
 		<template slot="header">%fa:chart-bar%アクティビティ</template>
 		<div :class="$style.body">
-			<mk-activity :user="os.i"/>
+			<mk-activity :user="$store.state.i"/>
 		</div>
 	</mk-widget-container>
 </div>
diff --git a/src/client/app/mobile/views/widgets/profile.vue b/src/client/app/mobile/views/widgets/profile.vue
index 59c1ec7c0e..a94f7e94b8 100644
--- a/src/client/app/mobile/views/widgets/profile.vue
+++ b/src/client/app/mobile/views/widgets/profile.vue
@@ -2,13 +2,13 @@
 <div class="mkw-profile">
 	<mk-widget-container>
 		<div :class="$style.banner"
-			:style="os.i.bannerUrl ? `background-image: url(${os.i.bannerUrl}?thumbnail&size=256)` : ''"
+			:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl}?thumbnail&size=256)` : ''"
 		></div>
 		<img :class="$style.avatar"
-			:src="`${os.i.avatarUrl}?thumbnail&size=96`"
+			:src="`${$store.state.i.avatarUrl}?thumbnail&size=96`"
 			alt="avatar"
 		/>
-		<router-link :class="$style.name" :to="os.i | userPage">{{ os.i | userName }}</router-link>
+		<router-link :class="$style.name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link>
 	</mk-widget-container>
 </div>
 </template>
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index e787b41464..c27ff0dfcf 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -2,6 +2,7 @@ import Vuex from 'vuex';
 import createPersistedState from 'vuex-persistedstate';
 
 import MiOS from './mios';
+import { hostname } from './config';
 
 const defaultSettings = {
 	home: [],
@@ -33,23 +34,29 @@ const defaultDeviceSettings = {
 };
 
 export default (os: MiOS) => new Vuex.Store({
-	plugins: [store => {
-		store.subscribe((mutation, state) => {
-			if (mutation.type.startsWith('settings/')) {
-				localStorage.setItem('settings', JSON.stringify(state.settings));
-			}
-		});
-	}, createPersistedState({
-		paths: ['device'],
-		filter: mut => mut.type.startsWith('device/')
+	plugins: [createPersistedState({
+		paths: ['i', 'device', 'settings']
 	})],
 
 	state: {
+		i: null,
 		indicate: false,
 		uiHeaderHeight: 0
 	},
 
+	getters: {
+		isSignedIn: state => state.i != null
+	},
+
 	mutations: {
+		updateI(state, x) {
+			state.i = x;
+		},
+
+		updateIKeyValue(state, x) {
+			state.i[x.key] = x.value;
+		},
+
 		indicate(state, x) {
 			state.indicate = x;
 		},
@@ -59,6 +66,28 @@ export default (os: MiOS) => new Vuex.Store({
 		}
 	},
 
+	actions: {
+		login(ctx, i) {
+			ctx.commit('updateI', i);
+			ctx.dispatch('settings/merge', i.clientSettings);
+		},
+
+		logout(ctx) {
+			ctx.commit('updateI', null);
+			document.cookie = `i=; domain=${hostname}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
+		},
+
+		mergeMe(ctx, me) {
+			Object.entries(me).forEach(([key, value]) => {
+				ctx.commit('updateIKeyValue', { key, value });
+			});
+
+			if (me.clientSettings) {
+				ctx.dispatch('settings/merge', me.clientSettings);
+			}
+		},
+	},
+
 	modules: {
 		device: {
 			namespaced: true,
@@ -134,7 +163,7 @@ export default (os: MiOS) => new Vuex.Store({
 				set(ctx, x) {
 					ctx.commit('set', x);
 
-					if (os.isSignedIn) {
+					if (ctx.rootGetters.isSignedIn) {
 						os.api('i/update_client_setting', {
 							name: x.key,
 							value: x.value

From e477de6dd0998a96ff81e2133a657d3fec33eb89 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 13:58:35 +0900
Subject: [PATCH 018/369] 2.18.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 5688484b9c..e09491f26a 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.18.0",
-	"clientVersion": "1.0.5784",
+	"version": "2.18.1",
+	"clientVersion": "1.0.5789",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From fa1a85f682302c3629326198b3cb5ecf738d3cd7 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 18:12:39 +0900
Subject: [PATCH 019/369] Fix bug

---
 src/client/app/desktop/api/contextmenu.ts | 17 ++++++++---------
 src/client/app/desktop/api/dialog.ts      | 17 ++++++++---------
 src/client/app/desktop/api/input.ts       | 21 ++++++++++-----------
 src/client/app/desktop/api/notify.ts      | 13 ++++++-------
 src/client/app/desktop/api/post.ts        | 21 +++++++++------------
 src/client/app/desktop/script.ts          |  8 ++++----
 6 files changed, 45 insertions(+), 52 deletions(-)

diff --git a/src/client/app/desktop/api/contextmenu.ts b/src/client/app/desktop/api/contextmenu.ts
index b70d7122d3..c92f087551 100644
--- a/src/client/app/desktop/api/contextmenu.ts
+++ b/src/client/app/desktop/api/contextmenu.ts
@@ -1,16 +1,15 @@
+import OS from '../../mios';
 import Ctx from '../views/components/context-menu.vue';
 
-export default function(e, menu, opts?) {
+export default (os: OS) => (e, menu, opts?) => {
 	const o = opts || {};
-	const vm = new Ctx({
-		propsData: {
-			menu,
-			x: e.pageX - window.pageXOffset,
-			y: e.pageY - window.pageYOffset,
-		}
-	}).$mount();
+	const vm = os.new(Ctx, {
+		menu,
+		x: e.pageX - window.pageXOffset,
+		y: e.pageY - window.pageYOffset,
+	});
 	vm.$once('closed', () => {
 		if (o.closed) o.closed();
 	});
 	document.body.appendChild(vm.$el);
-}
+};
diff --git a/src/client/app/desktop/api/dialog.ts b/src/client/app/desktop/api/dialog.ts
index 07935485b0..32785cf828 100644
--- a/src/client/app/desktop/api/dialog.ts
+++ b/src/client/app/desktop/api/dialog.ts
@@ -1,16 +1,15 @@
+import OS from '../../mios';
 import Dialog from '../views/components/dialog.vue';
 
-export default function(opts) {
+export default (os: OS) => opts => {
 	return new Promise<string>((res, rej) => {
 		const o = opts || {};
-		const d = new Dialog({
-			propsData: {
-				title: o.title,
-				text: o.text,
-				modal: o.modal,
-				buttons: o.actions
-			}
-		}).$mount();
+		const d = os.new(Dialog, {
+			title: o.title,
+			text: o.text,
+			modal: o.modal,
+			buttons: o.actions
+		});
 		d.$once('clicked', id => {
 			res(id);
 		});
diff --git a/src/client/app/desktop/api/input.ts b/src/client/app/desktop/api/input.ts
index ce26a8112f..bd7bfa0129 100644
--- a/src/client/app/desktop/api/input.ts
+++ b/src/client/app/desktop/api/input.ts
@@ -1,20 +1,19 @@
+import OS from '../../mios';
 import InputDialog from '../views/components/input-dialog.vue';
 
-export default function(opts) {
+export default (os: OS) => opts => {
 	return new Promise<string>((res, rej) => {
 		const o = opts || {};
-		const d = new InputDialog({
-			propsData: {
-				title: o.title,
-				placeholder: o.placeholder,
-				default: o.default,
-				type: o.type || 'text',
-				allowEmpty: o.allowEmpty
-			}
-		}).$mount();
+		const d = os.new(InputDialog, {
+			title: o.title,
+			placeholder: o.placeholder,
+			default: o.default,
+			type: o.type || 'text',
+			allowEmpty: o.allowEmpty
+		});
 		d.$once('done', text => {
 			res(text);
 		});
 		document.body.appendChild(d.$el);
 	});
-}
+};
diff --git a/src/client/app/desktop/api/notify.ts b/src/client/app/desktop/api/notify.ts
index 1f89f40ce6..72e5827607 100644
--- a/src/client/app/desktop/api/notify.ts
+++ b/src/client/app/desktop/api/notify.ts
@@ -1,10 +1,9 @@
+import OS from '../../mios';
 import Notification from '../views/components/ui-notification.vue';
 
-export default function(message) {
-	const vm = new Notification({
-		propsData: {
-			message
-		}
-	}).$mount();
+export default (os: OS) => message => {
+	const vm = os.new(Notification, {
+		message
+	});
 	document.body.appendChild(vm.$el);
-}
+};
diff --git a/src/client/app/desktop/api/post.ts b/src/client/app/desktop/api/post.ts
index b569610e1d..af71829c7b 100644
--- a/src/client/app/desktop/api/post.ts
+++ b/src/client/app/desktop/api/post.ts
@@ -1,21 +1,18 @@
+import OS from '../../mios';
 import PostFormWindow from '../views/components/post-form-window.vue';
 import RenoteFormWindow from '../views/components/renote-form-window.vue';
 
-export default function(opts) {
+export default (os: OS) => opts => {
 	const o = opts || {};
 	if (o.renote) {
-		const vm = new RenoteFormWindow({
-			propsData: {
-				renote: o.renote
-			}
-		}).$mount();
+		const vm = os.new(RenoteFormWindow, {
+			renote: o.renote
+		});
 		document.body.appendChild(vm.$el);
 	} else {
-		const vm = new PostFormWindow({
-			propsData: {
-				reply: o.reply
-			}
-		}).$mount();
+		const vm = os.new(PostFormWindow, {
+			reply: o.reply
+		});
 		document.body.appendChild(vm.$el);
 	}
-}
+};
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index 09a9257ea3..8fb6096afa 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -69,10 +69,10 @@ init(async (launch) => {
 	const [, os] = launch(router, os => ({
 		chooseDriveFolder: chooseDriveFolder(os),
 		chooseDriveFile: chooseDriveFile(os),
-		dialog,
-		input,
-		post,
-		notify,
+		dialog: dialog(os),
+		input: input(os),
+		post: post(os),
+		notify: notify(os),
 		updateAvatar: updateAvatar(os),
 		updateBanner: updateBanner(os)
 	}));

From 46ef86e478b6b32ec35ac70a8ecdf18e709bcf4f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 18:18:18 +0900
Subject: [PATCH 020/369] :art:

---
 src/client/app/desktop/views/components/window.vue | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue
index e4753f55db..ec044ad27e 100644
--- a/src/client/app/desktop/views/components/window.vue
+++ b/src/client/app/desktop/views/components/window.vue
@@ -488,7 +488,10 @@ root(isDark)
 		&:focus
 			&:not([data-is-modal])
 				> .body
-					box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 6px 0 rgba(#000, 0.2)
+					if isDark
+						box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 12px 0 rgba(#000, 0.5)
+					else
+						box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 6px 0 rgba(#000, 0.2)
 
 		> .handle
 			$size = 8px
@@ -556,7 +559,11 @@ root(isDark)
 			overflow hidden
 			background isDark ? #282C37 : #fff
 			border-radius 6px
-			box-shadow 0 2px 6px 0 rgba(#000, 0.2)
+
+			if isDark
+				box-shadow 0 2px 12px 0 rgba(#000, 0.5)
+			else
+				box-shadow 0 2px 6px 0 rgba(#000, 0.2)
 
 			> header
 				$header-height = 40px

From 46a953a9d8f2e155d67d436b8f32dfb7907f21ca Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 18:18:51 +0900
Subject: [PATCH 021/369] 2.18.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index e09491f26a..1850b22b9e 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.18.1",
-	"clientVersion": "1.0.5789",
+	"version": "2.18.2",
+	"clientVersion": "1.0.5793",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From fd1eea21d2578ad3a2491ac48e833a4b227dc5d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marcin=20Miko=C5=82ajczak?= <me@m4sk.in>
Date: Sun, 27 May 2018 14:51:57 +0200
Subject: [PATCH 022/369] some moar i18n
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
---
 locales/ja.yml                                | 44 +++++++++++++++++++
 .../views/components/drive.file-detail.vue    |  2 +-
 .../app/mobile/views/components/drive.vue     | 16 +++----
 .../mobile/views/components/friends-maker.vue | 10 ++---
 .../mobile/views/components/note-detail.vue   |  6 +--
 .../mobile/views/components/note-preview.vue  |  6 +--
 .../app/mobile/views/components/note.sub.vue  |  6 +--
 .../app/mobile/views/components/note.vue      |  6 +--
 .../app/mobile/views/components/notes.vue     |  4 +-
 .../app/mobile/views/components/post-form.vue | 10 ++---
 .../views/components/sub-note-content.vue     |  2 +-
 11 files changed, 78 insertions(+), 34 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 0fcbca5361..ab87494f93 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -724,6 +724,16 @@ mobile/views/components/drive.vue:
   load-more: "もっと読み込む"
   nothing-in-drive: "ドライブには何もありません"
   folder-is-empty: "このフォルダは空です"
+  prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
+  deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。"
+  folder-name: "フォルダー名"
+  root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
+  root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
+  url-prompt: "アップロードしたいファイルのURL"
+  uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
+
+mobile/views/components/drive-file-detail.vue:
+  rename: "名前を変更"
 
 mobile/views/components/drive-file-chooser.vue:
   select-file: "ファイルを選択"
@@ -742,26 +752,60 @@ mobile/views/components/follow-button.vue:
   follow: "フォロー"
   unfollow: "フォロー解除"
 
+mobile/views/components/friends-maker.vue:
+  title: "気になるユーザーをフォロー"
+  empty: "おすすめのユーザーは見つかりませんでした。"
+  fetching: "読み込んでいます"
+  refresh: "もっと見る"
+  close: "閉じる"
+
 mobile/views/components/note.vue:
   reposted-by: "{}がRenote"
+  more: "もっと見る"
+  less: "隠す"
+  hidden: "この投稿は非公開です"
+  location: "位置情報"
 
 mobile/views/components/note-detail.vue:
   reply: "返信"
   reaction: "リアクション"
+  is-renote: "がRenote"
+  hidden: "この投稿は非公開です"
+  location: "位置情報"
+
+mobile/views/components/note-preview.vue:
+  admin: "admin"
+  bot: "bot"
+  cat: "cat"
+
+mobile/views/components/note-sub.vue:
+  admin: "admin"
+  bot: "bot"
+  cat: "cat"
+
+mobile/views/components/notes.vue:
+  failed: "読み込みに失敗しました。"
+  retry: "リトライ"
 
 mobile/views/components/notifications.vue:
   more: "もっと見る"
   empty: "ありません!"
 
 mobile/views/components/post-form.vue:
+  add-visible-user: "ユーザーを追加"
   submit: "投稿"
   reply: "返信"
   renote: "Renote"
   renote-placeholder: "この投稿を引用... (オプション)"
   reply-placeholder: "この投稿への返信..."
   note-placeholder: "いまどうしてる?"
+  cw-placeholder: "内容への注釈 (オプション)"
+  location-alert: "お使いの端末は位置情報に対応していません"
+  error: "エラー"
+  username-prompt: "ユーザー名を入力してください"
 
 mobile/views/components/sub-note-content.vue:
+  hidden: "この投稿は非公開です"
   media-count: "{}個のメディア"
   poll: "投票"
 
diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue
index ddf17d2723..ad29135268 100644
--- a/src/client/app/mobile/views/components/drive.file-detail.vue
+++ b/src/client/app/mobile/views/components/drive.file-detail.vue
@@ -93,7 +93,7 @@ export default Vue.extend({
 	},
 	methods: {
 		rename() {
-			const name = window.prompt('名前を変更', this.file.name);
+			const name = window.prompt('%i18n:@rename%', this.file.name);
 			if (name == null || name == '' || name == this.file.name) return;
 			(this as any).api('drive/files/update', {
 				fileId: this.file.id,
diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue
index 8e35e6c88b..8adf6d8543 100644
--- a/src/client/app/mobile/views/components/drive.vue
+++ b/src/client/app/mobile/views/components/drive.vue
@@ -372,7 +372,7 @@ export default Vue.extend({
 		},
 
 		openContextMenu() {
-			const fn = window.prompt('何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>');
+			const fn = window.prompt('%i18n:@prompt%');
 			if (fn == null || fn == '') return;
 			switch (fn) {
 				case '1':
@@ -391,7 +391,7 @@ export default Vue.extend({
 					this.moveFolder();
 					break;
 				case '6':
-					alert('ごめんなさい!フォルダの削除は未実装です...。');
+					alert('%i18n:@deletion-alert%');
 					break;
 			}
 		},
@@ -401,7 +401,7 @@ export default Vue.extend({
 		},
 
 		createFolder() {
-			const name = window.prompt('フォルダー名');
+			const name = window.prompt('%i18n:@folder-name%');
 			if (name == null || name == '') return;
 			(this as any).api('drive/folders/create', {
 				name: name,
@@ -413,10 +413,10 @@ export default Vue.extend({
 
 		renameFolder() {
 			if (this.folder == null) {
-				alert('現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。');
+				alert('%i18n:@root-rename-alert%');
 				return;
 			}
-			const name = window.prompt('フォルダー名', this.folder.name);
+			const name = window.prompt('%i18n:@folder-name%', this.folder.name);
 			if (name == null || name == '') return;
 			(this as any).api('drive/folders/update', {
 				name: name,
@@ -428,7 +428,7 @@ export default Vue.extend({
 
 		moveFolder() {
 			if (this.folder == null) {
-				alert('現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。');
+				alert('%i18n:@root-move-alert%');
 				return;
 			}
 			(this as any).apis.chooseDriveFolder().then(folder => {
@@ -442,13 +442,13 @@ export default Vue.extend({
 		},
 
 		urlUpload() {
-			const url = window.prompt('アップロードしたいファイルのURL');
+			const url = window.prompt('%i18n:@url-prompt%');
 			if (url == null || url == '') return;
 			(this as any).api('drive/files/upload_from_url', {
 				url: url,
 				folderId: this.folder ? this.folder.id : undefined
 			});
-			alert('アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。');
+			alert('%i18n:@uploading%');
 		},
 
 		onChangeLocalFile() {
diff --git a/src/client/app/mobile/views/components/friends-maker.vue b/src/client/app/mobile/views/components/friends-maker.vue
index ba4abe341f..e0461d2bc2 100644
--- a/src/client/app/mobile/views/components/friends-maker.vue
+++ b/src/client/app/mobile/views/components/friends-maker.vue
@@ -1,13 +1,13 @@
 <template>
 <div class="mk-friends-maker">
-	<p class="title">気になるユーザーをフォロー:</p>
+	<p class="title">%i18n:@title%:</p>
 	<div class="users" v-if="!fetching && users.length > 0">
 		<mk-user-card v-for="user in users" :key="user.id" :user="user"/>
 	</div>
-	<p class="empty" v-if="!fetching && users.length == 0">おすすめのユーザーは見つかりませんでした。</p>
-	<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%読み込んでいます<mk-ellipsis/></p>
-	<a class="refresh" @click="refresh">もっと見る</a>
-	<button class="close" @click="close" title="閉じる">%fa:times%</button>
+	<p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>
+	<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p>
+	<a class="refresh" @click="refresh">%i18n:@refresh%</a>
+	<button class="close" @click="close" title="%i18n:@close%">%fa:times%</button>
 </div>
 </template>
 
diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index eb934431d2..9282848d7a 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -17,7 +17,7 @@
 	</div>
 	<div class="renote" v-if="isRenote">
 		<p>
-			<mk-avatar class="avatar" :user="note.user"/>%fa:retweet%<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>がRenote
+			<mk-avatar class="avatar" :user="note.user"/>%fa:retweet%<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>%i18n:@is-renote%
 		</p>
 	</div>
 	<article>
@@ -30,7 +30,7 @@
 		</header>
 		<div class="body">
 			<div class="text">
-				<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
+				<span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span>
 				<mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/>
 			</div>
 			<div class="tags" v-if="p.tags && p.tags.length > 0">
@@ -41,7 +41,7 @@
 			</div>
 			<mk-poll v-if="p.poll" :note="p"/>
 			<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
-			<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
+			<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
 			<div class="map" v-if="p.geo" ref="map"></div>
 			<div class="renote" v-if="p.renote">
 				<mk-note-preview :note="p.renote"/>
diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index f3805ac481..1c97e610d7 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -5,9 +5,9 @@
 		<header>
 			<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
 			<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
-			<span class="is-admin" v-if="note.user.isAdmin">admin</span>
-			<span class="is-bot" v-if="note.user.isBot">bot</span>
-			<span class="is-cat" v-if="note.user.isCat">cat</span>
+			<span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span>
+			<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
+			<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
 			<span class="username"><mk-acct :user="note.user"/></span>
 			<router-link class="time" :to="note | notePage">
 				<mk-time :time="note.createdAt"/>
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index 149a78ecde..42787e6d75 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -5,9 +5,9 @@
 		<header>
 			<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
 			<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
-			<span class="is-admin" v-if="note.user.isAdmin">admin</span>
-			<span class="is-bot" v-if="note.user.isBot">bot</span>
-			<span class="is-cat" v-if="note.user.isCat">cat</span>
+			<span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span>
+			<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
+			<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
 			<span class="username"><mk-acct :user="note.user"/></span>
 			<div class="info">
 				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 42d3ffe40e..5cc864f319 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -37,11 +37,11 @@
 			<div class="body">
 				<p v-if="p.cw != null" class="cw">
 					<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
-					<span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span>
+					<span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@less%' : '%i18n:@more%' }}</span>
 				</p>
 				<div class="content" v-show="p.cw == null || showContent">
 					<div class="text">
-						<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
+						<span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span>
 						<a class="reply" v-if="p.reply">%fa:reply%</a>
 						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/>
 						<a class="rp" v-if="p.renote != null">RP:</a>
@@ -54,7 +54,7 @@
 						<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
 					</div>
 					<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
-					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
+					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
 					<div class="map" v-if="p.geo" ref="map"></div>
 					<div class="renote" v-if="p.renote">
 						<mk-note-preview :note="p.renote"/>
diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue
index fbba111664..09cee966a3 100644
--- a/src/client/app/mobile/views/components/notes.vue
+++ b/src/client/app/mobile/views/components/notes.vue
@@ -9,8 +9,8 @@
 	</div>
 
 	<div v-if="!fetching && requestInitPromise != null">
-		<p>読み込みに失敗しました。</p>
-		<button @click="resolveInitPromise">リトライ</button>
+		<p>%i18n:@failed%</p>
+		<button @click="resolveInitPromise">%i18n:@retry%</button>
 	</div>
 
 	<transition-group name="mk-notes" class="transition">
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index f999988c60..f5badb48cc 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -17,9 +17,9 @@
 		<mk-note-preview v-if="renote" :note="renote"/>
 		<div v-if="visibility == 'specified'" class="visibleUsers">
 			<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
-			<a @click="addVisibleUser">+ユーザーを追加</a>
+			<a @click="addVisibleUser">+%i18n:@add-visible-user%</a>
 		</div>
-		<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)">
+		<input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%">
 		<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea>
 		<div class="attaches" v-show="files.length != 0">
 			<x-draggable class="files" :list="files" :options="{ animation: 150 }">
@@ -141,14 +141,14 @@ export default Vue.extend({
 
 		setGeo() {
 			if (navigator.geolocation == null) {
-				alert('お使いの端末は位置情報に対応していません');
+				alert('%i18n:@location-alert%');
 				return;
 			}
 
 			navigator.geolocation.getCurrentPosition(pos => {
 				this.geo = pos.coords;
 			}, err => {
-				alert('エラー: ' + err.message);
+				alert('%i18n:@error%: ' + err.message);
 			}, {
 				enableHighAccuracy: true
 			});
@@ -171,7 +171,7 @@ export default Vue.extend({
 
 		addVisibleUser() {
 			(this as any).apis.input({
-				title: 'ユーザー名を入力してください'
+				title: '%i18n:@username-prompt%'
 			}).then(username => {
 				(this as any).api('users/show', {
 					username
diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue
index bb96d65147..023dec70d2 100644
--- a/src/client/app/mobile/views/components/sub-note-content.vue
+++ b/src/client/app/mobile/views/components/sub-note-content.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mk-sub-note-content">
 	<div class="body">
-		<span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
+		<span v-if="note.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span>
 		<a class="reply" v-if="note.replyId">%fa:reply%</a>
 		<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
 		<a class="rp" v-if="note.renoteId">RP: ...</a>

From 0d6ccd489dce89c2920bc806216b9c2585fe1a88 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 22:39:20 +0900
Subject: [PATCH 023/369] :v:

---
 locales/ja.yml                                |  46 +++++---
 src/client/app/common/views/widgets/index.ts  |   2 +
 src/client/app/common/views/widgets/memo.vue  | 110 ++++++++++++++++++
 .../app/desktop/views/components/home.vue     |  39 ++++---
 src/client/app/mobile/views/pages/widgets.vue |  23 ++--
 src/client/app/store.ts                       |   3 +-
 6 files changed, 173 insertions(+), 50 deletions(-)
 create mode 100644 src/client/app/common/views/widgets/memo.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index ab87494f93..90764f7e60 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -43,6 +43,28 @@ common:
   update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
 
+  widgets:
+    profile: "プロフィール"
+    calendar: "カレンダー"
+    timemachine: "カレンダー(タイムマシン)"
+    activity: "アクティビティ"
+    rss: "RSSリーダー"
+    memo: "メモ"
+    trends: "トレンド"
+    photo-stream: "フォトストリーム"
+    slideshow: "スライドショー"
+    version: "バージョン"
+    broadcast: "ブロードキャスト"
+    notifications: "通知"
+    users: "おすすめユーザー"
+    polls: "投票"
+    post-form: "投稿フォーム"
+    messaging: "メッセージ"
+    server: "サーバー情報"
+    donation: "寄付のお願い"
+    nav: "ナビゲーション"
+    tips: "ヒント"
+
 common/views/components/connect-failed.vue:
   title: "サーバーに接続できません"
   description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -201,6 +223,11 @@ common/views/widgets/server.vue:
   title: "サーバー情報"
   toggle: "表示を切り替え"
 
+common/views/widgets/memo.vue:
+  title: "メモ"
+  memo: "ここに書いて!"
+  save: "保存"
+
 desktop/views/components/activity.chart.vue:
   total: "Black ... Total"
   notes: "Blue ... Notes"
@@ -319,25 +346,6 @@ desktop/views/components/game-window.vue:
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
-  profile: "プロフィール"
-  calendar: "カレンダー"
-  timemachine: "カレンダー(タイムマシン)"
-  activity: "アクティビティ"
-  rss: "RSSリーダー"
-  trends: "トレンド"
-  photostream: "フォトストリーム"
-  slideshow: "スライドショー"
-  version: "バージョン"
-  broadcast: "ブロードキャスト"
-  notifications: "通知"
-  users: "おすすめユーザー"
-  polls: "投票"
-  post-form: "投稿フォーム"
-  messaging: "メッセージ"
-  server: "サーバー情報"
-  donation: "寄付のお願い"
-  nav: "ナビゲーション"
-  tips: "ヒント"
   add: "追加"
 
 desktop/views/input-dialog.vue:
diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts
index 9107d90ce7..7ef4e02092 100644
--- a/src/client/app/common/views/widgets/index.ts
+++ b/src/client/app/common/views/widgets/index.ts
@@ -3,6 +3,7 @@ import Vue from 'vue';
 import wVersion from './version.vue';
 import wRss from './rss.vue';
 import wServer from './server.vue';
+import wMemo from './memo.vue';
 import wBroadcast from './broadcast.vue';
 import wCalendar from './calendar.vue';
 import wPhotoStream from './photo-stream.vue';
@@ -19,5 +20,6 @@ Vue.component('mkw-tips', wTips);
 Vue.component('mkw-donation', wDonation);
 Vue.component('mkw-broadcast', wBroadcast);
 Vue.component('mkw-server', wServer);
+Vue.component('mkw-memo', wMemo);
 Vue.component('mkw-rss', wRss);
 Vue.component('mkw-version', wVersion);
diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue
new file mode 100644
index 0000000000..3f599c82a0
--- /dev/null
+++ b/src/client/app/common/views/widgets/memo.vue
@@ -0,0 +1,110 @@
+<template>
+<div class="mkw-memo">
+	<mk-widget-container :show-header="!props.compact">
+		<template slot="header">%fa:R sticky-note%%i18n:@title%</template>
+
+		<div class="mkw-memo--body">
+			<textarea v-model="text" placeholder="%i18n:@memo%" @input="onChange"></textarea>
+			<button @click="saveMemo" :disabled="!changed">%i18n:@save%</button>
+		</div>
+	</mk-widget-container>
+</div>
+</template>
+
+<script lang="ts">
+import define from '../../define-widget';
+
+export default define({
+	name: 'memo',
+	props: () => ({
+		compact: false
+	})
+}).extend({
+	data() {
+		return {
+			text: null,
+			changed: false
+		};
+	},
+
+	created() {
+		this.text = this.$store.state.settings.memo;
+
+		this.$watch('$store.state.settings.memo', text => {
+			this.text = text;
+		});
+	},
+
+	methods: {
+		func() {
+			this.props.compact = !this.props.compact;
+			this.save();
+		},
+
+		onChange() {
+			this.changed = true;
+		},
+
+		saveMemo() {
+			this.$store.dispatch('settings/set', {
+				key: 'memo',
+				value: this.text
+			});
+			this.changed = false;
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	.mkw-memo--body
+		padding-bottom 28px + 16px
+
+		> textarea
+			display block
+			width 100%
+			max-width 100%
+			min-width 100%
+			padding 16px
+			color isDark ? #fff : #222
+			background isDark ? #282c37 : #fff
+			border none
+			border-bottom solid 1px isDark ? #1c2023 : #eee
+
+		> button
+			display block
+			position absolute
+			bottom 8px
+			right 8px
+			margin 0
+			padding 0 10px
+			height 28px
+			color $theme-color-foreground
+			background $theme-color !important
+			outline none
+			border none
+			border-radius 4px
+			transition background 0.1s ease
+			cursor pointer
+
+			&:hover
+				background lighten($theme-color, 10%) !important
+
+			&:active
+				background darken($theme-color, 10%) !important
+				transition background 0s ease
+
+			&:disabled
+				opacity 0.7
+				cursor default
+
+.mkw-memo[data-darkmode]
+	root(true)
+
+.mkw-memo:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index 9d34575e55..f51fed7454 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -6,25 +6,26 @@
 			<div class="adder">
 				<p>%i18n:@add-widget%</p>
 				<select v-model="widgetAdderSelected">
-					<option value="profile">%i18n:@profile%</option>
-					<option value="calendar">%i18n:@calendar%</option>
-					<option value="timemachine">%i18n:@timemachine%</option>
-					<option value="activity">%i18n:@activity%</option>
-					<option value="rss">%i18n:@rss%</option>
-					<option value="trends">%i18n:@trends%</option>
-					<option value="photo-stream">%i18n:@photo-stream%</option>
-					<option value="slideshow">%i18n:@slideshow%</option>
-					<option value="version">%i18n:@version%</option>
-					<option value="broadcast">%i18n:@broadcast%</option>
-					<option value="notifications">%i18n:@notifications%</option>
-					<option value="users">%i18n:@users%</option>
-					<option value="polls">%i18n:@polls%</option>
-					<option value="post-form">%i18n:@post-form%</option>
-					<option value="messaging">%i18n:@messaging%</option>
-					<option value="server">%i18n:@server%</option>
-					<option value="donation">%i18n:@donation%</option>
-					<option value="nav">%i18n:@nav%</option>
-					<option value="tips">%i18n:@tips%</option>
+					<option value="profile">%i18n:common.widgets.profile%</option>
+					<option value="calendar">%i18n:common.widgets.calendar%</option>
+					<option value="timemachine">%i18n:common.widgets.timemachine%</option>
+					<option value="activity">%i18n:common.widgets.activity%</option>
+					<option value="rss">%i18n:common.widgets.rss%</option>
+					<option value="trends">%i18n:common.widgets.trends%</option>
+					<option value="photo-stream">%i18n:common.widgets.photo-stream%</option>
+					<option value="slideshow">%i18n:common.widgets.slideshow%</option>
+					<option value="version">%i18n:common.widgets.version%</option>
+					<option value="broadcast">%i18n:common.widgets.broadcast%</option>
+					<option value="notifications">%i18n:common.widgets.notifications%</option>
+					<option value="users">%i18n:common.widgets.users%</option>
+					<option value="polls">%i18n:common.widgets.polls%</option>
+					<option value="post-form">%i18n:common.widgets.post-form%</option>
+					<option value="messaging">%i18n:common.widgets.messaging%</option>
+					<option value="memo">%i18n:common.widgets.memo%</option>
+					<option value="server">%i18n:common.widgets.server%</option>
+					<option value="donation">%i18n:common.widgets.donation%</option>
+					<option value="nav">%i18n:common.widgets.nav%</option>
+					<option value="tips">%i18n:common.widgets.tips%</option>
 				</select>
 				<button @click="addWidget">%i18n:@add%</button>
 			</div>
diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue
index 03abcabe8f..9d047fa635 100644
--- a/src/client/app/mobile/views/pages/widgets.vue
+++ b/src/client/app/mobile/views/pages/widgets.vue
@@ -8,17 +8,18 @@
 		<template v-if="customizing">
 			<header>
 				<select v-model="widgetAdderSelected">
-					<option value="profile">プロフィール</option>
-					<option value="calendar">カレンダー</option>
-					<option value="activity">アクティビティ</option>
-					<option value="rss">RSSリーダー</option>
-					<option value="photo-stream">フォトストリーム</option>
-					<option value="slideshow">スライドショー</option>
-					<option value="version">バージョン</option>
-					<option value="server">サーバー情報</option>
-					<option value="donation">寄付のお願い</option>
-					<option value="nav">ナビゲーション</option>
-					<option value="tips">ヒント</option>
+					<option value="profile">%i18n:common.widgets.profile%</option>
+					<option value="calendar">%i18n:common.widgets.calendar%</option>
+					<option value="activity">%i18n:common.widgets.activity%</option>
+					<option value="rss">%i18n:common.widgets.rss%</option>
+					<option value="photo-stream">%i18n:common.widgets.photo-stream%</option>
+					<option value="slideshow">%i18n:common.widgets.slideshow%</option>
+					<option value="version">%i18n:common.widgets.version%</option>
+					<option value="server">%i18n:common.widgets.server%</option>
+					<option value="memo">%i18n:common.widgets.memo%</option>
+					<option value="donation">%i18n:common.widgets.donation%</option>
+					<option value="nav">%i18n:common.widgets.nav%</option>
+					<option value="tips">%i18n:common.widgets.tips%</option>
 				</select>
 				<button @click="addWidget">追加</button>
 				<p><a @click="hint">カスタマイズのヒント</a></p>
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index c27ff0dfcf..905ec0501c 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -16,7 +16,8 @@ const defaultSettings = {
 	showMyRenotes: true,
 	showRenotedMyNotes: true,
 	loadRemoteMedia: true,
-	disableViaMobile: false
+	disableViaMobile: false,
+	memo: null
 };
 
 const defaultDeviceSettings = {

From 4ff95be53bdd9db382cbb92b5dbb4dabd0c78ad2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 22:41:05 +0900
Subject: [PATCH 024/369] Fix

---
 src/client/app/mobile/views/widgets/profile.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/mobile/views/widgets/profile.vue b/src/client/app/mobile/views/widgets/profile.vue
index a94f7e94b8..beae1ffa36 100644
--- a/src/client/app/mobile/views/widgets/profile.vue
+++ b/src/client/app/mobile/views/widgets/profile.vue
@@ -56,7 +56,7 @@ export default define({
 	left 92px
 	margin 0
 	line-height 100px
-	color #fff
+	color #fff !important // !important is for md
 	font-weight bold
 	text-shadow 0 0 8px rgba(#000, 0.5)
 

From c5ef18bc7a3c19bb73d3bc1fb67c6e6ad45735df Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 22:52:14 +0900
Subject: [PATCH 025/369] Fix

---
 locales/ja.yml                                         | 2 +-
 src/client/app/mobile/views/components/note-detail.vue | 8 +++++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 90764f7e60..06ef453de8 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -777,7 +777,7 @@ mobile/views/components/note.vue:
 mobile/views/components/note-detail.vue:
   reply: "返信"
   reaction: "リアクション"
-  is-renote: "がRenote"
+  reposted-by: "{}がRenote"
   hidden: "この投稿は非公開です"
   location: "位置情報"
 
diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index 9282848d7a..91b8c20111 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -17,7 +17,13 @@
 	</div>
 	<div class="renote" v-if="isRenote">
 		<p>
-			<mk-avatar class="avatar" :user="note.user"/>%fa:retweet%<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>%i18n:@is-renote%
+			<mk-avatar class="avatar" :user="note.user"/>
+			%fa:retweet%
+			<router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link>
+			<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
+			<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
+			<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
+			<mk-time :time="note.createdAt"/>
 		</p>
 	</div>
 	<article>

From 79821f00fbc5f3ca0386559885a40bb8a132b735 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 23:19:57 +0900
Subject: [PATCH 026/369] Fix bug

---
 src/services/drive/add-file.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index 0e42a00bf6..35a7a42d80 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -226,7 +226,7 @@ export default async function(
 
 	const properties = {};
 
-	let propPromises = [];
+	let propPromises: Array<Promise<void>> = [];
 
 	const isImage = ['image/jpeg', 'image/gif', 'image/png'].includes(mime);
 
@@ -271,7 +271,7 @@ export default async function(
 		propPromises = [calcWh(), calcAvg()];
 	}
 
-	const [folder] = await Promise.all([fetchFolder(), propPromises]);
+	const [folder] = await Promise.all([fetchFolder(), Promise.all(propPromises)]);
 
 	const metadata = {
 		userId: user._id,

From ed862188176047809ea7c41d923878db24e4b804 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 27 May 2018 23:20:45 +0900
Subject: [PATCH 027/369] 2.19.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 1850b22b9e..9a99154773 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.18.2",
-	"clientVersion": "1.0.5793",
+	"version": "2.19.0",
+	"clientVersion": "1.0.5840",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 1a91b6d03e4972c6683ee4313e2142a941ff8a3b Mon Sep 17 00:00:00 2001
From: Zero King <l2dy@icloud.com>
Date: Sun, 27 May 2018 16:09:59 +0000
Subject: [PATCH 028/369] Fix

---
 src/client/app/desktop/api/dialog.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/api/dialog.ts b/src/client/app/desktop/api/dialog.ts
index 32785cf828..23f35b7aa9 100644
--- a/src/client/app/desktop/api/dialog.ts
+++ b/src/client/app/desktop/api/dialog.ts
@@ -15,4 +15,4 @@ export default (os: OS) => opts => {
 		});
 		document.body.appendChild(d.$el);
 	});
-}
+};

From fe30e4e3a5360c534952ed837e1277d13444f606 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 13:55:21 +0900
Subject: [PATCH 029/369] Fix bug

---
 src/client/app/desktop/views/components/timeline.core.vue | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue
index 44d5967db5..1728dad286 100644
--- a/src/client/app/desktop/views/components/timeline.core.vue
+++ b/src/client/app/desktop/views/components/timeline.core.vue
@@ -5,7 +5,7 @@
 		<mk-ellipsis-icon/>
 	</div>
 
-	<mk-notes ref="timeline" :more="canFetchMore ? more : null">
+	<mk-notes ref="timeline" :more="existMore ? more : null">
 		<p :class="$style.empty" slot="empty">
 			%fa:R comments%%i18n:@empty%
 		</p>
@@ -15,7 +15,6 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import getNoteSummary from '../../../../../renderers/get-note-summary';
 
 const fetchLimit = 10;
 

From 85114ebd743b528dfb9bf1989a215f919defc68b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 13:58:57 +0900
Subject: [PATCH 030/369] :art:

---
 src/client/app/desktop/views/components/notes.note.sub.vue | 1 +
 src/client/app/desktop/views/components/notes.note.vue     | 1 +
 src/client/app/mobile/views/components/note-preview.vue    | 1 +
 src/client/app/mobile/views/components/note.sub.vue        | 1 +
 src/client/app/mobile/views/components/note.vue            | 1 +
 5 files changed, 5 insertions(+)

diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue
index 5f0c46b4c6..997e1d5050 100644
--- a/src/client/app/desktop/views/components/notes.note.sub.vue
+++ b/src/client/app/desktop/views/components/notes.note.sub.vue
@@ -89,6 +89,7 @@ root(isDark)
 			> .is-admin
 			> .is-bot
 			> .is-cat
+				align-self center
 				margin 0 0.5em 0 0
 				padding 1px 5px
 				font-size 10px
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index e69e6cdb51..c4ad67c2f8 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -435,6 +435,7 @@ root(isDark)
 				> .is-admin
 				> .is-bot
 				> .is-cat
+					align-self center
 					margin 0 .5em 0 0
 					padding 1px 6px
 					font-size 12px
diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index 1c97e610d7..e328238da0 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -86,6 +86,7 @@ root(isDark)
 			> .is-admin
 			> .is-bot
 			> .is-cat
+				align-self center
 				margin 0 0.5em 0 0
 				padding 1px 6px
 				font-size 10px
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index 42787e6d75..afdfe7d229 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -109,6 +109,7 @@ root(isDark)
 			> .is-admin
 			> .is-bot
 			> .is-cat
+				align-self center
 				margin 0 0.5em 0 0
 				padding 1px 5px
 				font-size 10px
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 5cc864f319..35e1c24b07 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -389,6 +389,7 @@ root(isDark)
 				> .is-admin
 				> .is-bot
 				> .is-cat
+					align-self center
 					margin 0 0.5em 0 0
 					padding 1px 6px
 					font-size 12px

From ceda2ca89661d1bd3889453997fe0868a8c31e9d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 14:39:46 +0900
Subject: [PATCH 031/369] Implement delete note

---
 locales/ja.yml                                | 24 ++++++----
 .../app/common/views/components/note-menu.vue | 10 +++++
 .../views/components/note-detail.sub.vue      |  1 +
 .../desktop/views/components/note-detail.vue  |  1 +
 .../desktop/views/components/notes.note.vue   |  3 +-
 .../views/components/sub-note-content.vue     |  5 ++-
 .../mobile/views/components/note-detail.vue   |  3 +-
 .../app/mobile/views/components/note.vue      |  3 +-
 .../views/components/sub-note-content.vue     |  5 ++-
 src/remote/activitypub/kernel/delete/note.ts  | 10 +----
 src/remote/activitypub/renderer/delete.ts     |  4 ++
 src/renderers/get-note-summary.ts             |  4 ++
 src/server/api/endpoints.ts                   |  5 +++
 src/server/api/endpoints/notes/delete.ts      | 26 +++++++++++
 src/services/note/delete.ts                   | 44 +++++++++++++++++++
 15 files changed, 125 insertions(+), 23 deletions(-)
 create mode 100644 src/remote/activitypub/renderer/delete.ts
 create mode 100644 src/server/api/endpoints/notes/delete.ts
 create mode 100644 src/services/note/delete.ts

diff --git a/locales/ja.yml b/locales/ja.yml
index 06ef453de8..d8bc94b293 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -126,6 +126,8 @@ common/views/components/nav.vue:
 common/views/components/note-menu.vue:
   favorite: "お気に入り"
   pin: "ピン留め"
+  delete: "削除"
+  delete-confirm: "この投稿を削除しますか?"
   remote: "投稿元で見る"
 
 common/views/components/poll.vue:
@@ -360,14 +362,16 @@ desktop/views/components/messaging-window.vue:
 
 desktop/views/components/note-detail.vue:
   more: "会話をもっと読み込む"
-  private: "(この投稿は非公開です)"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
   reposted-by: "{}がRenote"
   location: "位置情報"
   renote: "Renote"
   add-reaction: "リアクション"
 
 desktop/views/components/note-detail.sub.vue:
-  private: "(この投稿は非公開です)"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
 
 desktop/views/components/notes.note.vue:
   reposted-by: "{}がRenote"
@@ -565,8 +569,9 @@ desktop/views/components/settings.profile.vue:
   is-cat: "このアカウントはCatです"
 
 desktop/views/components/sub-note-content.vue:
-  hidden: "(この投稿は非公開です)"
-  media: "つのメディア"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
+  media-count: "{}つのメディア"
   poll: "投票"
 
 desktop/views/components/taskmanager.vue:
@@ -771,14 +776,16 @@ mobile/views/components/note.vue:
   reposted-by: "{}がRenote"
   more: "もっと見る"
   less: "隠す"
-  hidden: "この投稿は非公開です"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
   location: "位置情報"
 
 mobile/views/components/note-detail.vue:
   reply: "返信"
   reaction: "リアクション"
   reposted-by: "{}がRenote"
-  hidden: "この投稿は非公開です"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
   location: "位置情報"
 
 mobile/views/components/note-preview.vue:
@@ -813,8 +820,9 @@ mobile/views/components/post-form.vue:
   username-prompt: "ユーザー名を入力してください"
 
 mobile/views/components/sub-note-content.vue:
-  hidden: "この投稿は非公開です"
-  media-count: "{}個のメディア"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
+  media-count: "{}つのメディア"
   poll: "投票"
 
 mobile/views/components/timeline.vue:
diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue
index fb95055049..a400610a2b 100644
--- a/src/client/app/common/views/components/note-menu.vue
+++ b/src/client/app/common/views/components/note-menu.vue
@@ -4,6 +4,7 @@
 	<div class="popover" :class="{ compact }" ref="popover">
 		<button @click="favorite">%i18n:@favorite%</button>
 		<button v-if="note.userId == $store.state.i.id" @click="pin">%i18n:@pin%</button>
+		<button v-if="note.userId == $store.state.i.id" @click="del">%i18n:@delete%</button>
 		<a v-if="note.uri" :href="note.uri" target="_blank">%i18n:@remote%</a>
 	</div>
 </div>
@@ -59,6 +60,15 @@ export default Vue.extend({
 			});
 		},
 
+		del() {
+			if (!window.confirm('%i18n:@delete-confirm%')) return;
+			(this as any).api('notes/delete', {
+				noteId: this.note.id
+			}).then(() => {
+				this.$destroy();
+			});
+		},
+
 		favorite() {
 			(this as any).api('notes/favorites/create', {
 				noteId: this.note.id
diff --git a/src/client/app/desktop/views/components/note-detail.sub.vue b/src/client/app/desktop/views/components/note-detail.sub.vue
index 0471c70ee7..00e54ff1a6 100644
--- a/src/client/app/desktop/views/components/note-detail.sub.vue
+++ b/src/client/app/desktop/views/components/note-detail.sub.vue
@@ -16,6 +16,7 @@
 		<div class="body">
 			<div class="text">
 				<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
+				<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
 				<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
 			</div>
 			<div class="media" v-if="note.mediaIds.length > 0">
diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue
index e64990b4ce..63b2150110 100644
--- a/src/client/app/desktop/views/components/note-detail.vue
+++ b/src/client/app/desktop/views/components/note-detail.vue
@@ -39,6 +39,7 @@
 		<div class="body">
 			<div class="text">
 				<span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span>
+				<span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
 				<mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/>
 			</div>
 			<div class="media" v-if="p.media.length > 0">
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index c4ad67c2f8..f293ffacfb 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -41,7 +41,8 @@
 				</p>
 				<div class="content" v-show="p.cw == null || showContent">
 					<div class="text">
-						<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
+						<span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span>
+						<span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
 						<a class="reply" v-if="p.reply">%fa:reply%</a>
 						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/>
 						<a class="rp" v-if="p.renote">RP:</a>
diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue
index 8aa32cec73..46e1b802b9 100644
--- a/src/client/app/desktop/views/components/sub-note-content.vue
+++ b/src/client/app/desktop/views/components/sub-note-content.vue
@@ -1,13 +1,14 @@
 <template>
 <div class="mk-sub-note-content">
 	<div class="body">
-		<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@hidden%</span>
+		<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
+		<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
 		<a class="reply" v-if="note.replyId">%fa:reply%</a>
 		<mk-note-html :text="note.text" :i="$store.state.i"/>
 		<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a>
 	</div>
 	<details v-if="note.media.length > 0">
-		<summary>({{ note.media.length }}%i18n:@media%)</summary>
+		<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>
 		<mk-media-list :media-list="note.media"/>
 	</details>
 	<details v-if="note.poll">
diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index 91b8c20111..8ab766e1dc 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -36,7 +36,8 @@
 		</header>
 		<div class="body">
 			<div class="text">
-				<span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span>
+				<span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span>
+				<span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span>
 				<mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/>
 			</div>
 			<div class="tags" v-if="p.tags && p.tags.length > 0">
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 35e1c24b07..997d83a6fe 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -41,7 +41,8 @@
 				</p>
 				<div class="content" v-show="p.cw == null || showContent">
 					<div class="text">
-						<span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span>
+						<span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span>
+						<span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span>
 						<a class="reply" v-if="p.reply">%fa:reply%</a>
 						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/>
 						<a class="rp" v-if="p.renote != null">RP:</a>
diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue
index 023dec70d2..4ad90b97df 100644
--- a/src/client/app/mobile/views/components/sub-note-content.vue
+++ b/src/client/app/mobile/views/components/sub-note-content.vue
@@ -1,13 +1,14 @@
 <template>
 <div class="mk-sub-note-content">
 	<div class="body">
-		<span v-if="note.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span>
+		<span v-if="note.isHidden" style="opacity: 0.5">(%i18n:@private%)</span>
+		<span v-if="note.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span>
 		<a class="reply" v-if="note.replyId">%fa:reply%</a>
 		<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
 		<a class="rp" v-if="note.renoteId">RP: ...</a>
 	</div>
 	<details v-if="note.media.length > 0">
-		<summary>({{ note.media.length }}個のメディア)</summary>
+		<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>
 		<mk-media-list :media-list="note.media"/>
 	</details>
 	<details v-if="note.poll">
diff --git a/src/remote/activitypub/kernel/delete/note.ts b/src/remote/activitypub/kernel/delete/note.ts
index b2868f69a3..1951982f69 100644
--- a/src/remote/activitypub/kernel/delete/note.ts
+++ b/src/remote/activitypub/kernel/delete/note.ts
@@ -2,6 +2,7 @@ import * as debug from 'debug';
 
 import Note from '../../../../models/note';
 import { IRemoteUser } from '../../../../models/user';
+import deleteNode from '../../../../services/note/delete';
 
 const log = debug('misskey:activitypub');
 
@@ -18,12 +19,5 @@ export default async function(actor: IRemoteUser, uri: string): Promise<void> {
 		throw new Error('投稿を削除しようとしているユーザーは投稿の作成者ではありません');
 	}
 
-	Note.update({ _id: note._id }, {
-		$set: {
-			deletedAt: new Date(),
-			text: null,
-			mediaIds: [],
-			poll: null
-		}
-	});
+	await deleteNode(actor, note);
 }
diff --git a/src/remote/activitypub/renderer/delete.ts b/src/remote/activitypub/renderer/delete.ts
new file mode 100644
index 0000000000..d15cb447e6
--- /dev/null
+++ b/src/remote/activitypub/renderer/delete.ts
@@ -0,0 +1,4 @@
+export default object => ({
+	type: 'Delete',
+	object
+});
diff --git a/src/renderers/get-note-summary.ts b/src/renderers/get-note-summary.ts
index 643e2d09ba..ec7c74cf9f 100644
--- a/src/renderers/get-note-summary.ts
+++ b/src/renderers/get-note-summary.ts
@@ -3,6 +3,10 @@
  * @param {*} note (packされた)投稿
  */
 const summarize = (note: any): string => {
+	if (note.deletedAt) {
+		return '(削除された投稿)';
+	}
+
 	if (note.isHidden) {
 		return '(非公開の投稿)';
 	}
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 892da3540f..908d9574a5 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -494,6 +494,11 @@ const endpoints: Endpoint[] = [
 		},
 		kind: 'note-write'
 	},
+	{
+		name: 'notes/delete',
+		withCredential: true,
+		kind: 'note-write'
+	},
 	{
 		name: 'notes/renotes'
 	},
diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts
new file mode 100644
index 0000000000..9bbb1541d6
--- /dev/null
+++ b/src/server/api/endpoints/notes/delete.ts
@@ -0,0 +1,26 @@
+import $ from 'cafy'; import ID from '../../../../cafy-id';
+import Note from '../../../../models/note';
+import deleteNote from '../../../../services/note/delete';
+
+/**
+ * Delete a note
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+	// Get 'noteId' parameter
+	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
+	if (noteIdErr) return rej('invalid noteId param');
+
+	// Fetch note
+	const note = await Note.findOne({
+		_id: noteId,
+		userId: user._id
+	});
+
+	if (note === null) {
+		return rej('note not found');
+	}
+
+	await deleteNote(user, note);
+
+	res();
+});
diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts
new file mode 100644
index 0000000000..793f0090be
--- /dev/null
+++ b/src/services/note/delete.ts
@@ -0,0 +1,44 @@
+import Note, { INote } from '../../models/note';
+import { IUser, isLocalUser } from '../../models/user';
+import { publishNoteStream } from '../../publishers/stream';
+import renderDelete from '../../remote/activitypub/renderer/delete';
+import pack from '../../remote/activitypub/renderer';
+import { deliver } from '../../queue';
+import Following from '../../models/following';
+import renderNote from '../../remote/activitypub/renderer/note';
+
+/**
+ * 投稿を削除します。
+ * @param user 投稿者
+ * @param note 投稿
+ */
+export default async function(user: IUser, note: INote) {
+	await Note.update({
+		_id: note._id,
+		userId: user._id
+	}, {
+		$set: {
+			deletedAt: new Date(),
+			text: null,
+			mediaIds: [],
+			poll: null
+		}
+	});
+
+	publishNoteStream(note._id, 'deleted');
+
+	//#region ローカルの投稿なら削除アクティビティを配送
+	if (isLocalUser(user)) {
+		const content = pack(renderDelete(await renderNote(note)));
+
+		const followings = await Following.find({
+			followeeId: user._id,
+			'_follower.host': { $ne: null }
+		});
+
+		followings.forEach(following => {
+			deliver(user, content, following._follower.inbox);
+		});
+	}
+	//#endregion
+}

From 0a7c0f30fdd96b11246485b3a98f608b2cfc7407 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 14:54:16 +0900
Subject: [PATCH 032/369] :art:

---
 src/client/app/desktop/views/components/note-preview.vue   | 7 +++----
 src/client/app/desktop/views/components/notes.note.sub.vue | 1 -
 src/client/app/desktop/views/components/notes.note.vue     | 2 --
 .../app/desktop/views/components/post-form-window.vue      | 2 +-
 src/client/app/mobile/views/components/note-preview.vue    | 6 +++++-
 src/client/app/mobile/views/components/note.sub.vue        | 1 -
 src/client/app/mobile/views/components/note.vue            | 2 --
 7 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue
index 302c5e803f..a25eedb8f7 100644
--- a/src/client/app/desktop/views/components/note-preview.vue
+++ b/src/client/app/desktop/views/components/note-preview.vue
@@ -42,9 +42,9 @@ root(isDark)
 	> .avatar
 		display block
 		float left
-		margin 0 16px 0 0
-		width 52px
-		height 52px
+		margin 0 12px 0 0
+		width 48px
+		height 48px
 		border-radius 8px
 
 	> .main
@@ -85,7 +85,6 @@ root(isDark)
 				cursor default
 				margin 0
 				padding 0
-				font-size 1.1em
 				color isDark ? #959ba7 : #717171
 
 .mk-note-preview[data-darkmode]
diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue
index 997e1d5050..467b503bd9 100644
--- a/src/client/app/desktop/views/components/notes.note.sub.vue
+++ b/src/client/app/desktop/views/components/notes.note.sub.vue
@@ -126,7 +126,6 @@ root(isDark)
 				cursor default
 				margin 0
 				padding 0
-				font-size 1.1em
 				color isDark ? #959ba7 : #717171
 
 				pre
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index f293ffacfb..570a100768 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -480,7 +480,6 @@ root(isDark)
 					margin 0
 					padding 0
 					overflow-wrap break-word
-					font-size 1.1em
 					color isDark ? #fff : #717171
 
 					> .text
@@ -507,7 +506,6 @@ root(isDark)
 						margin 0
 						padding 0
 						overflow-wrap break-word
-						font-size 1.1em
 						color isDark ? #fff : #717171
 
 						>>> .title
diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue
index 18bb39f9bc..c55d6f1a1e 100644
--- a/src/client/app/desktop/views/components/post-form-window.vue
+++ b/src/client/app/desktop/views/components/post-form-window.vue
@@ -71,6 +71,6 @@ export default Vue.extend({
 		content ')'
 
 .notePreview
-	margin 16px 22px
+	margin 16px 22px 0 22px
 
 </style>
diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index e328238da0..fc7520bac7 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -54,6 +54,11 @@ root(isDark)
 		height 48px
 		border-radius 8px
 
+		@media (max-width 500px)
+			margin 0 10px 0 0
+			width 44px
+			height 44px
+
 	> .main
 		float left
 		width calc(100% - 60px)
@@ -114,7 +119,6 @@ root(isDark)
 				cursor default
 				margin 0
 				padding 0
-				font-size 1.1em
 				color isDark ? #959ba7 : #717171
 
 .mk-note-preview[data-darkmode]
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index afdfe7d229..18d41cc7eb 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -147,7 +147,6 @@ root(isDark)
 				cursor default
 				margin 0
 				padding 0
-				font-size 1.1em
 				color isDark ? #959ba7 : #717171
 
 				pre
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 997d83a6fe..c3994197c4 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -429,7 +429,6 @@ root(isDark)
 					margin 0
 					padding 0
 					overflow-wrap break-word
-					font-size 1.1em
 					color isDark ? #fff : #717171
 
 					> .text
@@ -455,7 +454,6 @@ root(isDark)
 						margin 0
 						padding 0
 						overflow-wrap break-word
-						font-size 1.1em
 						color isDark ? #fff : #717171
 
 						>>> .title

From 858efafe77e15de84588d0d348487ee27324a68b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 14:59:55 +0900
Subject: [PATCH 033/369] :art:

---
 .../common/views/components/url-preview.vue   | 23 +++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue
index 028b911e24..38979871c1 100644
--- a/src/client/app/common/views/components/url-preview.vue
+++ b/src/client/app/common/views/components/url-preview.vue
@@ -68,7 +68,7 @@ iframe
 root(isDark)
 	> a
 		display block
-		font-size 16px
+		font-size 14px
 		border solid 1px isDark ? #191b1f : #eee
 		border-radius 4px
 		overflow hidden
@@ -136,8 +136,17 @@ root(isDark)
 					left 0
 					width 100%
 
+		@media (max-width 550px)
+			font-size 12px
+
+			> .thumbnail
+				height 80px
+
+			> article
+				padding 12px
+
 		@media (max-width 500px)
-			font-size 8px
+			font-size 10px
 
 			> .thumbnail
 				height 70px
@@ -145,6 +154,16 @@ root(isDark)
 			> article
 				padding 8px
 
+				> header
+					margin-bottom 4px
+
+				> footer
+					margin-top 4px
+
+					> img
+						width 12px
+						height 12px
+
 .mk-url-preview[data-darkmode]
 	root(true)
 

From f0c031ecdb7b830bbec731d9197072157e8fdb9e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 15:04:47 +0900
Subject: [PATCH 034/369] Fix bug

---
 src/client/app/common/views/components/welcome-timeline.vue  | 2 +-
 src/client/app/desktop/views/components/sub-note-content.vue | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue
index cad59d24f0..a9d558df66 100644
--- a/src/client/app/common/views/components/welcome-timeline.vue
+++ b/src/client/app/common/views/components/welcome-timeline.vue
@@ -13,7 +13,7 @@
 				</div>
 			</header>
 			<div class="text">
-				<mk-note-html :text="note.text"/>
+				<mk-note-html v-if="note.text" :text="note.text"/>
 			</div>
 		</div>
 	</div>
diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue
index 46e1b802b9..ec41329c4a 100644
--- a/src/client/app/desktop/views/components/sub-note-content.vue
+++ b/src/client/app/desktop/views/components/sub-note-content.vue
@@ -4,7 +4,7 @@
 		<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
 		<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
 		<a class="reply" v-if="note.replyId">%fa:reply%</a>
-		<mk-note-html :text="note.text" :i="$store.state.i"/>
+		<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
 		<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a>
 	</div>
 	<details v-if="note.media.length > 0">

From 95e5800b36d58b59529d018c74c03ff98a2a8d67 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 15:06:32 +0900
Subject: [PATCH 035/369] Improve RSS widget

---
 src/client/app/common/views/widgets/rss.vue | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue
index 9e2c6b6490..eca23d0226 100644
--- a/src/client/app/common/views/widgets/rss.vue
+++ b/src/client/app/common/views/widgets/rss.vue
@@ -19,12 +19,12 @@ import define from '../../../common/define-widget';
 export default define({
 	name: 'rss',
 	props: () => ({
-		compact: false
+		compact: false,
+		url: 'http://news.yahoo.co.jp/pickup/rss.xml'
 	})
 }).extend({
 	data() {
 		return {
-			url: 'http://news.yahoo.co.jp/pickup/rss.xml',
 			items: [],
 			fetching: true,
 			clock: null
@@ -43,7 +43,7 @@ export default define({
 			this.save();
 		},
 		fetch() {
-			fetch(`https://api.rss2json.com/v1/api.json?rss_url=${this.url}`, {
+			fetch(`https://api.rss2json.com/v1/api.json?rss_url=${this.props.url}`, {
 				cache: 'no-cache'
 			}).then(res => {
 				res.json().then(feed => {
@@ -53,7 +53,9 @@ export default define({
 			});
 		},
 		setting() {
-			alert('not implemented yet');
+			this.props.url =window.prompt('URL', this.props.url);
+			this.save();
+			this.fetch();
 		}
 	}
 });

From 83bbd6b64f59a9a4a672ffbf57bffdcb5d5accf3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 15:09:06 +0900
Subject: [PATCH 036/369] :art:

---
 src/client/app/desktop/views/components/notes.note.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index 570a100768..271332ba0b 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -348,7 +348,7 @@ root(isDark)
 	> .renote
 		display flex
 		align-items center
-		padding 16px 32px
+		padding 16px 32px 8px 32px
 		line-height 28px
 		white-space pre
 		color #9dbb00

From 39d05b75db78c1fb820ff65f30c2e37b8f78cfa4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 15:10:57 +0900
Subject: [PATCH 037/369] Fix bug

---
 src/client/app/common/views/widgets/rss.vue | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue
index eca23d0226..7ac453e450 100644
--- a/src/client/app/common/views/widgets/rss.vue
+++ b/src/client/app/common/views/widgets/rss.vue
@@ -53,9 +53,12 @@ export default define({
 			});
 		},
 		setting() {
-			this.props.url =window.prompt('URL', this.props.url);
-			this.save();
-			this.fetch();
+			const url = window.prompt('URL', this.props.url);
+			if (url && url != '') {
+				this.props.url = url;
+				this.save();
+				this.fetch();
+			}
 		}
 	}
 });

From b57dd8de4049680b132b5f51e1c6e76adeac4b08 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 15:14:45 +0900
Subject: [PATCH 038/369] 2.20.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 9a99154773..b3162d296b 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.19.0",
-	"clientVersion": "1.0.5840",
+	"version": "2.20.0",
+	"clientVersion": "1.0.5868",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 48a17629bbf668b3dabda4a2e866dc7f97179aa0 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 15:30:26 +0900
Subject: [PATCH 039/369] Fix

---
 locales/ja.yml                                     |  2 ++
 .../app/desktop/views/components/note-preview.vue  |  2 +-
 .../desktop/views/components/notes.note.sub.vue    |  8 ++++----
 .../app/mobile/views/components/note-preview.vue   |  3 +++
 .../app/mobile/views/components/note.sub.vue       | 14 +++++++-------
 5 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index d8bc94b293..8fc82d1680 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -379,6 +379,8 @@ desktop/views/components/notes.note.vue:
   renote: "Renote"
   add-reaction: "リアクション"
   detail: "詳細"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
 
 desktop/views/components/notes.vue:
   error: "読み込みに失敗しました。"
diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue
index a25eedb8f7..26c8a7d25c 100644
--- a/src/client/app/desktop/views/components/note-preview.vue
+++ b/src/client/app/desktop/views/components/note-preview.vue
@@ -49,7 +49,7 @@ root(isDark)
 
 	> .main
 		float left
-		width calc(100% - 68px)
+		width calc(100% - 60px)
 
 		> header
 			display flex
diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue
index 467b503bd9..ca8aaeede0 100644
--- a/src/client/app/desktop/views/components/notes.note.sub.vue
+++ b/src/client/app/desktop/views/components/notes.note.sub.vue
@@ -57,14 +57,14 @@ root(isDark)
 	> .avatar
 		display block
 		float left
-		margin 0 14px 0 0
-		width 52px
-		height 52px
+		margin 0 12px 0 0
+		width 48px
+		height 48px
 		border-radius 8px
 
 	> .main
 		float left
-		width calc(100% - 66px)
+		width calc(100% - 60px)
 
 		> header
 			display flex
diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index fc7520bac7..c3e57d3381 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -63,6 +63,9 @@ root(isDark)
 		float left
 		width calc(100% - 60px)
 
+		@media (max-width 500px)
+			width calc(100% - 54px)
+
 		> header
 			display flex
 			align-items baseline
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index 18d41cc7eb..9b9dd9e667 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -62,21 +62,21 @@ root(isDark)
 		display block
 		float left
 		margin 0 10px 0 0
-		width 44px
-		height 44px
+		width 42px
+		height 42px
 		border-radius 8px
 
 		@media (min-width 500px)
-			margin-right 16px
-			width 52px
-			height 52px
+			margin-right 14px
+			width 50px
+			height 50px
 
 	> .main
 		float left
-		width calc(100% - 54px)
+		width calc(100% - 52px)
 
 		@media (min-width 500px)
-			width calc(100% - 68px)
+			width calc(100% - 64px)
 
 		> header
 			display flex

From d1dd2d3c18f8878dad79d78297633b69793219d3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 15:30:47 +0900
Subject: [PATCH 040/369] 2.20.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index b3162d296b..328b72dfe3 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.20.0",
-	"clientVersion": "1.0.5868",
+	"version": "2.20.1",
+	"clientVersion": "1.0.5871",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From ba1b1a73b6aa6f7e821ae6cf3339f101699d32c3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 21:31:20 +0900
Subject: [PATCH 041/369] :v:

---
 locales/ja.yml                                |   6 +-
 src/client/app/base.pug                       |   2 +-
 .../app/common/views/components/forkit.vue    |   2 +-
 .../app/desktop/views/pages/welcome.vue       | 180 ++++--
 src/client/app/init.ts                        |   8 -
 src/client/assets/welcome-bg.dark.svg         |   1 +
 src/client/assets/welcome-bg.light.svg        |   1 +
 src/client/assets/welcome-bg.svg              | 579 ------------------
 src/client/assets/welcome-fg.svg              | 380 ------------
 9 files changed, 125 insertions(+), 1034 deletions(-)
 create mode 100644 src/client/assets/welcome-bg.dark.svg
 create mode 100644 src/client/assets/welcome-bg.light.svg
 delete mode 100644 src/client/assets/welcome-bg.svg
 delete mode 100644 src/client/assets/welcome-fg.svg

diff --git a/locales/ja.yml b/locales/ja.yml
index 8fc82d1680..44fa0ef538 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -3,7 +3,9 @@ meta:
   divider: ""
 
 common:
-  misskey: "Misskeyで皆と共有しよう。"
+  misskey: "A planet of fediverse"
+  about-title: "A ⭐ of fediverse."
+  about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
 
   time:
     unknown: "なぞのじかん"
@@ -631,6 +633,8 @@ desktop/views/components/window.vue:
   close: "閉じる"
 
 desktop/views/pages/welcome.vue:
+  about: "詳しく..."
+  gotit: "わかった"
   signin: "ログイン"
   signup: "新規登録"
   signin-button: "やってる"
diff --git a/src/client/app/base.pug b/src/client/app/base.pug
index c182fd6f64..a77a8a9595 100644
--- a/src/client/app/base.pug
+++ b/src/client/app/base.pug
@@ -19,7 +19,7 @@ html
 				| Misskey
 
 		block desc
-			meta(name='description' content='A SNS')
+			meta(name='description' content='A planet of fediverse')
 
 		block meta
 
diff --git a/src/client/app/common/views/components/forkit.vue b/src/client/app/common/views/components/forkit.vue
index 2a463ebfd7..bb71db19db 100644
--- a/src/client/app/common/views/components/forkit.vue
+++ b/src/client/app/common/views/components/forkit.vue
@@ -13,7 +13,7 @@
 
 .a
 	display block
-	position absolute
+	position fixed
 	top 0
 	right 0
 
diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index 91ad4b61c3..c406f9b0a4 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -4,9 +4,20 @@
 		<template v-if="$store.state.device.darkmode">%fa:moon%</template>
 		<template v-else>%fa:R moon%</template>
 	</button>
-	<main>
+	<main v-if="about" class="about">
+		<article>
+			<h1>%i18n:common.about-title%</h1>
+			<p v-html="'%i18n:common.about%'"></p>
+			<span class="gotit" @click="about = false">%i18n:@gotit%</span>
+		</article>
+	</main>
+	<main v-else class="index">
 		<img :src="$store.state.device.darkmode ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey">
-		<p><button class="signup" @click="signup">%i18n:@signup-button%</button><button class="signin" @click="signin">%i18n:@signin-button%</button></p>
+		<p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p>
+		<p class="account">
+			<button class="signup" @click="signup">%i18n:@signup-button%</button>
+			<button class="signin" @click="signin">%i18n:@signin-button%</button>
+		</p>
 
 		<div class="tl">
 			<header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header>
@@ -33,12 +44,12 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import { docsUrl, copyright, lang } from '../../../config';
+import { copyright } from '../../../config';
 
 export default Vue.extend({
 	data() {
 		return {
-			aboutUrl: `${docsUrl}/${lang}/about`,
+			about: false,
 			copyright
 		};
 	},
@@ -73,9 +84,12 @@ root(isDark)
 	display flex
 	flex-direction column
 	flex 1
+	background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg')
+	background-size cover
+	background-position center
 
 	> button
-		position absolute
+		position fixed
 		z-index 1
 		top 0
 		left 0
@@ -87,81 +101,119 @@ root(isDark)
 		flex 1
 		padding 64px 0 0 0
 		text-align center
-		color isDark ? #9aa4b3 : #555
 
-		> img
-			width 350px
+		&.about
+			color isDark ? #fff : #627574
 
-		> p
-			margin 8px 0
-			line-height 2em
+			> article
+				max-width 700px
+				margin 42px auto 0 auto
+				padding 64px
+				background isDark ? #282C37 : #fff
+				box-shadow 0 8px 32px rgba(#000, 0.15)
 
-			button
-				padding 8px 16px
-				font-size inherit
+				> h1
+					margin 0
+					font-variant small-caps
 
-			.signup
-				color $theme-color
-				border solid 2px $theme-color
-				border-radius 4px
+				> p
+					margin 20px 0
+					line-height 2em
 
-				&:focus
-					box-shadow 0 0 0 3px rgba($theme-color, 0.2)
+				> .gotit
+					color $theme-color
+					cursor pointer
 
-				&:hover
-					color $theme-color-foreground
-					background $theme-color
+					&:hover
+						text-decoration underline
 
-				&:active
-					color $theme-color-foreground
-					background darken($theme-color, 10%)
-					border-color darken($theme-color, 10%)
+		&.index
+			color isDark ? #9aa4b3 : #555
 
-			.signin
-				&:hover
-					color isDark ? #fff : #000
+			> img
+				width 350px
 
-		> .tl
-			margin 32px auto 0 auto
-			width 410px
-			text-align left
-			background isDark ? #313543 : #fff
-			border-radius 8px
-			box-shadow 0 8px 32px rgba(#000, 0.15)
-			overflow hidden
+			> .desc
+				margin -12px 0 24px 0
+				color isDark ? #fff : #555
 
-			> header
-				z-index 1
-				padding 12px 16px
-				color isDark ? #e3e5e8 : #888d94
-				box-shadow 0 1px 0px rgba(#000, 0.1)
+				> span
+					color $theme-color
+					cursor pointer
 
-				> div
-					position absolute
-					top 0
-					right 0
-					padding inherit
+					&:hover
+						text-decoration underline
 
-					> span
-						display inline-block
-						height 11px
-						width 11px
-						margin-left 6px
-						border-radius 100%
-						vertical-align middle
+			> .account
+				margin 8px 0
+				line-height 2em
 
-						&:nth-child(1)
-							background #5BCC8B
+				button
+					padding 8px 16px
+					font-size inherit
 
-						&:nth-child(2)
-							background #E6BB46
+				.signup
+					color $theme-color
+					border solid 2px $theme-color
+					border-radius 4px
 
-						&:nth-child(3)
-							background #DF7065
+					&:focus
+						box-shadow 0 0 0 3px rgba($theme-color, 0.2)
 
-			> .mk-welcome-timeline
-				max-height 350px
-				overflow auto
+					&:hover
+						color $theme-color-foreground
+						background $theme-color
+
+					&:active
+						color $theme-color-foreground
+						background darken($theme-color, 10%)
+						border-color darken($theme-color, 10%)
+
+				.signin
+					&:hover
+						color isDark ? #fff : #000
+
+			> .tl
+				margin 32px auto 0 auto
+				width 410px
+				text-align left
+				background isDark ? #313543 : #fff
+				border-radius 8px
+				box-shadow 0 8px 32px rgba(#000, 0.15)
+				overflow hidden
+
+				> header
+					z-index 1
+					padding 12px 16px
+					color isDark ? #e3e5e8 : #888d94
+					box-shadow 0 1px 0px rgba(#000, 0.1)
+
+					> div
+						position absolute
+						top 0
+						right 0
+						padding inherit
+
+						> span
+							display inline-block
+							height 11px
+							width 11px
+							margin-left 6px
+							border-radius 100%
+							vertical-align middle
+
+							&:nth-child(1)
+								background #5BCC8B
+
+							&:nth-child(2)
+								background #E6BB46
+
+							&:nth-child(3)
+								background #DF7065
+
+				> .mk-welcome-timeline
+					max-height 350px
+					overflow auto
 
 	> footer
 		font-size 12px
diff --git a/src/client/app/init.ts b/src/client/app/init.ts
index 58013ec5a8..043f26d0bc 100644
--- a/src/client/app/init.ts
+++ b/src/client/app/init.ts
@@ -67,14 +67,6 @@ const html = document.documentElement;
 html.setAttribute('lang', lang);
 //#endregion
 
-//#region Set description meta tag
-const head = document.getElementsByTagName('head')[0];
-const meta = document.createElement('meta');
-meta.setAttribute('name', 'description');
-meta.setAttribute('content', '%i18n:common.misskey%');
-head.appendChild(meta);
-//#endregion
-
 // iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする
 try {
 	localStorage.setItem('kyoppie', 'yuppie');
diff --git a/src/client/assets/welcome-bg.dark.svg b/src/client/assets/welcome-bg.dark.svg
new file mode 100644
index 0000000000..1866170327
--- /dev/null
+++ b/src/client/assets/welcome-bg.dark.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="900"><path d="M667,476L630,367L567,460Z" fill="#121931" stroke="#121931" stroke-width="1.51"/><path d="M630,367L576,311L567,460Z" fill="#121c31" stroke="#121c31" stroke-width="1.51"/><path d="M567,460L631,579L667,476Z" fill="#121731" stroke="#121731" stroke-width="1.51"/><path d="M567,460L556,584L631,579Z" fill="#131830" stroke="#131830" stroke-width="1.51"/><path d="M437,475L556,584L567,460Z" fill="#121a31" stroke="#121a31" stroke-width="1.51"/><path d="M667,476L773,349L630,367Z" fill="#121831" stroke="#121831" stroke-width="1.51"/><path d="M630,367L580,255L576,311Z" fill="#122031" stroke="#122031" stroke-width="1.51"/><path d="M813,438L773,349L667,476Z" fill="#121530" stroke="#121530" stroke-width="1.51"/><path d="M576,311L437,475L567,460Z" fill="#111d31" stroke="#111d31" stroke-width="1.51"/><path d="M642,193L580,255L630,367Z" fill="#112131" stroke="#112131" stroke-width="1.51"/><path d="M800,574L813,438L667,476Z" fill="#121330" stroke="#121330" stroke-width="1.51"/><path d="M400,299L437,475L576,311Z" fill="#122231" stroke="#122231" stroke-width="1.51"/><path d="M556,584L583,647L631,579Z" fill="#14162f" stroke="#14162f" stroke-width="1.51"/><path d="M631,579L800,574L667,476Z" fill="#121430" stroke="#121430" stroke-width="1.51"/><path d="M423,693L583,647L556,584Z" fill="#14192f" stroke="#14192f" stroke-width="1.51"/><path d="M653,680L800,574L631,579Z" fill="#13132f" stroke="#13132f" stroke-width="1.51"/><path d="M773,349L642,193L630,367Z" fill="#111d31" stroke="#111d31" stroke-width="1.51"/><path d="M813,438L874,423L773,349Z" fill="#131630" stroke="#131630" stroke-width="1.51"/><path d="M773,349L789,203L642,193Z" fill="#121f31" stroke="#121f31" stroke-width="1.51"/><path d="M906,568L874,423L813,438Z" fill="#13122f" stroke="#13122f" stroke-width="1.51"/><path d="M583,647L653,680L631,579Z" fill="#14152e" stroke="#14152e" stroke-width="1.51"/><path d="M449,219L400,299L576,311Z" fill="#112631" stroke="#112631" stroke-width="1.51"/><path d="M449,219L576,311L580,255Z" fill="#112431" stroke="#112431" stroke-width="1.51"/><path d="M437,475L411,599L556,584Z" fill="#131c30" stroke="#131c30" stroke-width="1.51"/><path d="M556,765L666,768L653,680Z" fill="#15142d" stroke="#15142d" stroke-width="1.51"/><path d="M327,557L411,599L437,475Z" fill="#131f30" stroke="#131f30" stroke-width="1.51"/><path d="M572,116L449,219L580,255Z" fill="#102731" stroke="#102731" stroke-width="1.51"/><path d="M920,229L789,203L773,349Z" fill="#131d30" stroke="#131d30" stroke-width="1.51"/><path d="M874,423L909,355L773,349Z" fill="#131730" stroke="#131730" stroke-width="1.51"/><path d="M1018,299L909,355L1040,413Z" fill="#14172e" stroke="#14172e" stroke-width="1.51"/><path d="M642,193L572,116L580,255Z" fill="#112631" stroke="#112631" stroke-width="1.51"/><path d="M802,140L639,121L642,193Z" fill="#112531" stroke="#112531" stroke-width="1.51"/><path d="M800,574L906,568L813,438Z" fill="#13122f" stroke="#13122f" stroke-width="1.51"/><path d="M860,653L906,568L800,574Z" fill="#14112e" stroke="#14112e" stroke-width="1.51"/><path d="M653,680L792,696L800,574Z" fill="#14112e" stroke="#14112e" stroke-width="1.51"/><path d="M639,121L572,116L642,193Z" fill="#102731" stroke="#102731" stroke-width="1.51"/><path d="M280,464L327,557L437,475Z" fill="#122131" stroke="#122131" stroke-width="1.51"/><path d="M792,696L860,653L800,574Z" fill="#15102d" stroke="#15102d" stroke-width="1.51"/><path d="M315,686L423,693L411,599Z" fill="#141d2f" stroke="#141d2f" stroke-width="1.51"/><path d="M411,599L423,693L556,584Z" fill="#141b2f" stroke="#141b2f" stroke-width="1.51"/><path d="M653,680L666,768L792,696Z" fill="#14112d" stroke="#14112d" stroke-width="1.51"/><path d="M400,299L298,362L437,475Z" fill="#112431" stroke="#112431" stroke-width="1.51"/><path d="M289,189L298,362L400,299Z" fill="#0f2a31" stroke="#0f2a31" stroke-width="1.51"/><path d="M556,765L653,680L583,647Z" fill="#15152e" stroke="#15152e" stroke-width="1.51"/><path d="M789,203L802,140L642,193Z" fill="#112231" stroke="#112231" stroke-width="1.51"/><path d="M920,229L802,140L789,203Z" fill="#132130" stroke="#132130" stroke-width="1.51"/><path d="M423,693L556,765L583,647Z" fill="#15182e" stroke="#15182e" stroke-width="1.51"/><path d="M298,362L280,464L437,475Z" fill="#112331" stroke="#112331" stroke-width="1.51"/><path d="M909,355L920,229L773,349Z" fill="#131a30" stroke="#131a30" stroke-width="1.51"/><path d="M1018,299L920,229L909,355Z" fill="#141a2f" stroke="#141a2f" stroke-width="1.51"/><path d="M675,877L748,809L666,768Z" fill="#17112d" stroke="#17112d" stroke-width="1.51"/><path d="M423,693L443,781L556,765Z" fill="#16192e" stroke="#16192e" stroke-width="1.51"/><path d="M336,786L443,781L423,693Z" fill="#161c2d" stroke="#161c2d" stroke-width="1.51"/><path d="M792,696L924,797L860,653Z" fill="#150e2c" stroke="#150e2c" stroke-width="1.51"/><path d="M666,768L748,809L792,696Z" fill="#150f2d" stroke="#150f2d" stroke-width="1.51"/><path d="M675,877L666,768L556,765Z" fill="#17132d" stroke="#17132d" stroke-width="1.51"/><path d="M327,557L315,686L411,599Z" fill="#141f2f" stroke="#141f2f" stroke-width="1.51"/><path d="M224,597L315,686L327,557Z" fill="#14222f" stroke="#14222f" stroke-width="1.51"/><path d="M566,23L421,77L572,116Z" fill="#132a2e" stroke="#132a2e" stroke-width="1.51"/><path d="M572,116L421,77L449,219Z" fill="#0e2d31" stroke="#0e2d31" stroke-width="1.51"/><path d="M449,219L289,189L400,299Z" fill="#0f2b31" stroke="#0f2b31" stroke-width="1.51"/><path d="M566,23L572,116L639,121Z" fill="#13282f" stroke="#13282f" stroke-width="1.51"/><path d="M644,-20L566,23L639,121Z" fill="#16272d" stroke="#16272d" stroke-width="1.51"/><path d="M328,133L289,189L449,219Z" fill="#0d2f31" stroke="#0d2f31" stroke-width="1.51"/><path d="M171,486L224,597L280,464Z" fill="#13232f" stroke="#13232f" stroke-width="1.51"/><path d="M1040,413L909,355L874,423Z" fill="#14152f" stroke="#14152f" stroke-width="1.51"/><path d="M920,229L902,89L802,140Z" fill="#132230" stroke="#132230" stroke-width="1.51"/><path d="M1020,585L906,568L1018,660Z" fill="#150f2c" stroke="#150f2c" stroke-width="1.51"/><path d="M1020,585L1040,413L906,568Z" fill="#14102d" stroke="#14102d" stroke-width="1.51"/><path d="M906,568L1040,413L874,423Z" fill="#13122f" stroke="#13122f" stroke-width="1.51"/><path d="M421,77L328,133L449,219Z" fill="#0d2f31" stroke="#0d2f31" stroke-width="1.51"/><path d="M1018,299L987,217L920,229Z" fill="#141d2f" stroke="#141d2f" stroke-width="1.51"/><path d="M755,-6L644,-20L639,121Z" fill="#16242d" stroke="#16242d" stroke-width="1.51"/><path d="M1018,660L906,568L860,653Z" fill="#15102c" stroke="#15102c" stroke-width="1.51"/><path d="M190,365L280,464L298,362Z" fill="#102731" stroke="#102731" stroke-width="1.51"/><path d="M280,464L224,597L327,557Z" fill="#122330" stroke="#122330" stroke-width="1.51"/><path d="M225,235L190,365L298,362Z" fill="#102b31" stroke="#102b31" stroke-width="1.51"/><path d="M1009,122L902,89L920,229Z" fill="#14222f" stroke="#14222f" stroke-width="1.51"/><path d="M289,189L225,235L298,362Z" fill="#0d2e31" stroke="#0d2e31" stroke-width="1.51"/><path d="M185,70L225,235L289,189Z" fill="#0c3330" stroke="#0c3330" stroke-width="1.51"/><path d="M527,877L675,877L556,765Z" fill="#19152d" stroke="#19152d" stroke-width="1.51"/><path d="M976,767L1018,660L860,653Z" fill="#160e2c" stroke="#160e2c" stroke-width="1.51"/><path d="M566,23L439,-17L421,77Z" fill="#152c2c" stroke="#152c2c" stroke-width="1.51"/><path d="M755,-6L639,121L802,140Z" fill="#14242f" stroke="#14242f" stroke-width="1.51"/><path d="M190,365L171,486L280,464Z" fill="#132430" stroke="#132430" stroke-width="1.51"/><path d="M902,89L755,-6L802,140Z" fill="#15232e" stroke="#15232e" stroke-width="1.51"/><path d="M924,797L792,696L748,809Z" fill="#160e2c" stroke="#160e2c" stroke-width="1.51"/><path d="M1020,585L1106,477L1040,413Z" fill="#14102d" stroke="#14102d" stroke-width="1.51"/><path d="M443,781L527,877L556,765Z" fill="#17182d" stroke="#17182d" stroke-width="1.51"/><path d="M427,924L527,877L443,781Z" fill="#1b192d" stroke="#1b192d" stroke-width="1.51"/><path d="M315,686L336,786L423,693Z" fill="#151e2e" stroke="#151e2e" stroke-width="1.51"/><path d="M201,784L336,786L315,686Z" fill="#16202d" stroke="#16202d" stroke-width="1.51"/><path d="M779,911L924,797L748,809Z" fill="#190e2c" stroke="#190e2c" stroke-width="1.51"/><path d="M421,77L296,-6L328,133Z" fill="#10312e" stroke="#10312e" stroke-width="1.51"/><path d="M328,133L185,70L289,189Z" fill="#093431" stroke="#093431" stroke-width="1.51"/><path d="M545,-110L439,-17L566,23Z" fill="#18292a" stroke="#18292a" stroke-width="1.51"/><path d="M1098,562L1106,477L1020,585Z" fill="#150f2d" stroke="#150f2d" stroke-width="1.51"/><path d="M1040,413L1149,365L1018,299Z" fill="#15162e" stroke="#15162e" stroke-width="1.51"/><path d="M1135,188L1009,122L987,217Z" fill="#14202e" stroke="#14202e" stroke-width="1.51"/><path d="M224,597L189,651L315,686Z" fill="#15222e" stroke="#15222e" stroke-width="1.51"/><path d="M122,584L189,651L224,597Z" fill="#16212d" stroke="#16212d" stroke-width="1.51"/><path d="M1095,646L1098,562L1020,585Z" fill="#160e2c" stroke="#160e2c" stroke-width="1.51"/><path d="M924,797L976,767L860,653Z" fill="#160d2b" stroke="#160d2b" stroke-width="1.51"/><path d="M1095,646L1020,585L1018,660Z" fill="#160e2b" stroke="#160e2b" stroke-width="1.51"/><path d="M902,89L855,-47L755,-6Z" fill="#18222b" stroke="#18222b" stroke-width="1.51"/><path d="M987,217L1009,122L920,229Z" fill="#14202f" stroke="#14202f" stroke-width="1.51"/><path d="M1135,188L987,217L1018,299Z" fill="#141c2e" stroke="#141c2e" stroke-width="1.51"/><path d="M675,877L779,911L748,809Z" fill="#1a102d" stroke="#1a102d" stroke-width="1.51"/><path d="M924,797L1032,900L976,767Z" fill="#190d2a" stroke="#190d2a" stroke-width="1.51"/><path d="M758,1032L779,911L675,877Z" fill="#1d102d" stroke="#1d102d" stroke-width="1.51"/><path d="M1153,782L1095,646L1018,660Z" fill="#170c2b" stroke="#170c2b" stroke-width="1.51"/><path d="M1262,481L1149,365L1106,477Z" fill="#15102d" stroke="#15102d" stroke-width="1.51"/><path d="M171,486L122,584L224,597Z" fill="#16222d" stroke="#16222d" stroke-width="1.51"/><path d="M70,425L122,584L171,486Z" fill="#17232c" stroke="#17232c" stroke-width="1.51"/><path d="M70,425L171,486L190,365Z" fill="#15242e" stroke="#15242e" stroke-width="1.51"/><path d="M527,877L566,1030L675,877Z" fill="#1d152d" stroke="#1d152d" stroke-width="1.51"/><path d="M336,786L350,882L443,781Z" fill="#181d2d" stroke="#181d2d" stroke-width="1.51"/><path d="M201,784L350,882L336,786Z" fill="#18202d" stroke="#18202d" stroke-width="1.51"/><path d="M201,784L315,686L189,651Z" fill="#15212d" stroke="#15212d" stroke-width="1.51"/><path d="M1106,477L1149,365L1040,413Z" fill="#14122d" stroke="#14122d" stroke-width="1.51"/><path d="M1262,481L1106,477L1098,562Z" fill="#150e2c" stroke="#150e2c" stroke-width="1.51"/><path d="M689,-114L545,-110L644,-20Z" fill="#1b2427" stroke="#1b2427" stroke-width="1.51"/><path d="M644,-20L545,-110L566,23Z" fill="#19272a" stroke="#19272a" stroke-width="1.51"/><path d="M1028,16L855,-47L902,89Z" fill="#19212a" stroke="#19212a" stroke-width="1.51"/><path d="M350,882L427,924L443,781Z" fill="#1b1c2d" stroke="#1b1c2d" stroke-width="1.51"/><path d="M439,-17L296,-6L421,77Z" fill="#142e2c" stroke="#142e2c" stroke-width="1.51"/><path d="M225,235L80,349L190,365Z" fill="#132a2e" stroke="#132a2e" stroke-width="1.51"/><path d="M689,-114L644,-20L755,-6Z" fill="#192229" stroke="#192229" stroke-width="1.51"/><path d="M439,-17L324,-108L296,-6Z" fill="#172e29" stroke="#172e29" stroke-width="1.51"/><path d="M753,-160L689,-114L755,-6Z" fill="#1c2127" stroke="#1c2127" stroke-width="1.51"/><path d="M90,203L80,349L225,235Z" fill="#132d2d" stroke="#132d2d" stroke-width="1.51"/><path d="M102,767L201,784L189,651Z" fill="#18202b" stroke="#18202b" stroke-width="1.51"/><path d="M80,349L70,425L190,365Z" fill="#16262d" stroke="#16262d" stroke-width="1.51"/><path d="M1009,122L1028,16L902,89Z" fill="#16212c" stroke="#16212c" stroke-width="1.51"/><path d="M1149,365L1135,188L1018,299Z" fill="#15192e" stroke="#15192e" stroke-width="1.51"/><path d="M296,-6L185,70L328,133Z" fill="#0f332e" stroke="#0f332e" stroke-width="1.51"/><path d="M779,911L893,937L924,797Z" fill="#1b0e2b" stroke="#1b0e2b" stroke-width="1.51"/><path d="M976,767L1153,782L1018,660Z" fill="#170c2a" stroke="#170c2a" stroke-width="1.51"/><path d="M758,1032L893,937L779,911Z" fill="#1f0f2c" stroke="#1f0f2c" stroke-width="1.51"/><path d="M1131,95L1028,16L1009,122Z" fill="#17212c" stroke="#17212c" stroke-width="1.51"/><path d="M855,-47L753,-160L755,-6Z" fill="#1b2128" stroke="#1b2128" stroke-width="1.51"/><path d="M123,103L90,203L225,235Z" fill="#11312e" stroke="#11312e" stroke-width="1.51"/><path d="M80,349L-14,363L70,425Z" fill="#18252b" stroke="#18252b" stroke-width="1.51"/><path d="M1028,16L881,-96L855,-47Z" fill="#1b2028" stroke="#1b2028" stroke-width="1.51"/><path d="M185,70L123,103L225,235Z" fill="#0e342e" stroke="#0e342e" stroke-width="1.51"/><path d="M118,-15L123,103L185,70Z" fill="#15322a" stroke="#15322a" stroke-width="1.51"/><path d="M296,-6L182,-12L185,70Z" fill="#13322a" stroke="#13322a" stroke-width="1.51"/><path d="M545,-110L463,-146L439,-17Z" fill="#1a2927" stroke="#1a2927" stroke-width="1.51"/><path d="M753,-160L463,-146L545,-110Z" fill="#1d2525" stroke="#1d2525" stroke-width="1.51"/><path d="M753,-160L545,-110L689,-114Z" fill="#1d2226" stroke="#1d2226" stroke-width="1.51"/><path d="M122,584L64,646L189,651Z" fill="#18212b" stroke="#18212b" stroke-width="1.51"/><path d="M-55,555L64,646L122,584Z" fill="#1a2029" stroke="#1a2029" stroke-width="1.51"/><path d="M465,1018L566,1030L527,877Z" fill="#20182d" stroke="#20182d" stroke-width="1.51"/><path d="M465,1018L527,877L427,924Z" fill="#1f1a2d" stroke="#1f1a2d" stroke-width="1.51"/><path d="M465,1018L427,924L298,1048Z" fill="#211c2d" stroke="#211c2d" stroke-width="1.51"/><path d="M881,-96L753,-160L855,-47Z" fill="#1c2026" stroke="#1c2026" stroke-width="1.51"/><path d="M1248,72L1131,95L1135,188Z" fill="#16212d" stroke="#16212d" stroke-width="1.51"/><path d="M1135,188L1131,95L1009,122Z" fill="#15222e" stroke="#15222e" stroke-width="1.51"/><path d="M298,1048L427,924L350,882Z" fill="#1f1e2d" stroke="#1f1e2d" stroke-width="1.51"/><path d="M463,-146L324,-108L439,-17Z" fill="#1a2c27" stroke="#1a2c27" stroke-width="1.51"/><path d="M696,1054L758,1032L675,877Z" fill="#20102d" stroke="#20102d" stroke-width="1.51"/><path d="M201,784L170,884L350,882Z" fill="#1b212d" stroke="#1b212d" stroke-width="1.51"/><path d="M64,646L102,767L189,651Z" fill="#18202a" stroke="#18202a" stroke-width="1.51"/><path d="M913,1005L1032,900L893,937Z" fill="#1f0d2b" stroke="#1f0d2b" stroke-width="1.51"/><path d="M893,937L1032,900L924,797Z" fill="#1c0d2b" stroke="#1c0d2b" stroke-width="1.51"/><path d="M207,-137L182,-12L296,-6Z" fill="#173127" stroke="#173127" stroke-width="1.51"/><path d="M566,1030L696,1054L675,877Z" fill="#20132d" stroke="#20132d" stroke-width="1.51"/><path d="M298,1048L696,1054L566,1030Z" fill="#23182d" stroke="#23182d" stroke-width="1.51"/><path d="M1089,882L1153,782L976,767Z" fill="#1a0b2a" stroke="#1a0b2a" stroke-width="1.51"/><path d="M1255,588L1262,481L1098,562Z" fill="#160d2c" stroke="#160d2c" stroke-width="1.51"/><path d="M70,425L-21,485L122,584Z" fill="#19222b" stroke="#19222b" stroke-width="1.51"/><path d="M-5,194L-14,363L80,349Z" fill="#18292a" stroke="#18292a" stroke-width="1.51"/><path d="M-5,194L80,349L90,203Z" fill="#162d2b" stroke="#162d2b" stroke-width="1.51"/><path d="M-5,194L90,203L123,103Z" fill="#13312b" stroke="#13312b" stroke-width="1.51"/><path d="M1255,588L1098,562L1095,646Z" fill="#170d2b" stroke="#170d2b" stroke-width="1.51"/><path d="M1149,365L1263,231L1135,188Z" fill="#161a2d" stroke="#161a2d" stroke-width="1.51"/><path d="M102,767L170,884L201,784Z" fill="#1b202a" stroke="#1b202a" stroke-width="1.51"/><path d="M758,1032L913,1005L893,937Z" fill="#200e2c" stroke="#200e2c" stroke-width="1.51"/><path d="M990,1060L913,1005L758,1032Z" fill="#220e2b" stroke="#220e2b" stroke-width="1.51"/><path d="M64,646L-24,765L102,767Z" fill="#1b1f27" stroke="#1b1f27" stroke-width="1.51"/><path d="M-14,363L-21,485L70,425Z" fill="#192329" stroke="#192329" stroke-width="1.51"/><path d="M1094,1029L1089,882L1032,900Z" fill="#1f0b2a" stroke="#1f0b2a" stroke-width="1.51"/><path d="M1032,900L1089,882L976,767Z" fill="#1b0c2a" stroke="#1b0c2a" stroke-width="1.51"/><path d="M1248,648L1255,588L1095,646Z" fill="#170c2a" stroke="#170c2a" stroke-width="1.51"/><path d="M1318,235L1271,354L1377,345Z" fill="#1b182d" stroke="#1b182d" stroke-width="1.51"/><path d="M1262,481L1271,354L1149,365Z" fill="#17122d" stroke="#17122d" stroke-width="1.51"/><path d="M1253,799L1248,648L1153,782Z" fill="#190a29" stroke="#190a29" stroke-width="1.51"/><path d="M1153,782L1248,648L1095,646Z" fill="#180b2a" stroke="#180b2a" stroke-width="1.51"/><path d="M1131,95L1110,-28L1028,16Z" fill="#192029" stroke="#192029" stroke-width="1.51"/><path d="M1028,16L971,-156L881,-96Z" fill="#1c1f26" stroke="#1c1f26" stroke-width="1.51"/><path d="M881,-96L971,-156L753,-160Z" fill="#1e1f24" stroke="#1e1f24" stroke-width="1.51"/><path d="M1248,72L1110,-28L1131,95Z" fill="#191f29" stroke="#191f29" stroke-width="1.51"/><path d="M1271,354L1263,231L1149,365Z" fill="#17172d" stroke="#17172d" stroke-width="1.51"/><path d="M-121,448L-55,555L-21,485Z" fill="#1c2027" stroke="#1c2027" stroke-width="1.51"/><path d="M-38,73L-5,194L123,103Z" fill="#153229" stroke="#153229" stroke-width="1.51"/><path d="M182,-12L118,-15L185,70Z" fill="#163228" stroke="#163228" stroke-width="1.51"/><path d="M207,-137L118,-15L182,-12Z" fill="#193125" stroke="#193125" stroke-width="1.51"/><path d="M1110,-28L971,-156L1028,16Z" fill="#1c1f26" stroke="#1c1f26" stroke-width="1.51"/><path d="M465,1018L298,1048L566,1030Z" fill="#231b2d" stroke="#231b2d" stroke-width="1.51"/><path d="M170,884L228,990L350,882Z" fill="#1e212d" stroke="#1e212d" stroke-width="1.51"/><path d="M93,915L228,990L170,884Z" fill="#20202a" stroke="#20202a" stroke-width="1.51"/><path d="M-21,485L-55,555L122,584Z" fill="#1a2129" stroke="#1a2129" stroke-width="1.51"/><path d="M102,767L93,915L170,884Z" fill="#1e2029" stroke="#1e2029" stroke-width="1.51"/><path d="M-121,448L-21,485L-14,363Z" fill="#1b2228" stroke="#1b2228" stroke-width="1.51"/><path d="M228,990L298,1048L350,882Z" fill="#21212d" stroke="#21212d" stroke-width="1.51"/><path d="M-55,555L-35,672L64,646Z" fill="#1b1f27" stroke="#1b1f27" stroke-width="1.51"/><path d="M324,-108L207,-137L296,-6Z" fill="#183127" stroke="#183127" stroke-width="1.51"/><path d="M463,-146L207,-137L324,-108Z" fill="#1a2e25" stroke="#1a2e25" stroke-width="1.51"/><path d="M73,-154L207,-137L463,-146Z" fill="#1a3024" stroke="#1a3024" stroke-width="1.51"/><path d="M-24,765L93,915L102,767Z" fill="#1d1f27" stroke="#1d1f27" stroke-width="1.51"/><path d="M228,990L72,1047L298,1048Z" fill="#25212b" stroke="#25212b" stroke-width="1.51"/><path d="M1110,-28L1136,-111L971,-156Z" fill="#1e1e24" stroke="#1e1e24" stroke-width="1.51"/><path d="M1263,231L1248,72L1135,188Z" fill="#171f2d" stroke="#171f2d" stroke-width="1.51"/><path d="M1263,231L1348,116L1248,72Z" fill="#1a212d" stroke="#1a212d" stroke-width="1.51"/><path d="M1271,354L1318,235L1263,231Z" fill="#19192d" stroke="#19192d" stroke-width="1.51"/><path d="M1377,345L1271,354L1386,431Z" fill="#1b142d" stroke="#1b142d" stroke-width="1.51"/><path d="M1355,543L1262,481L1255,588Z" fill="#190e2c" stroke="#190e2c" stroke-width="1.51"/><path d="M-132,680L-24,765L-35,672Z" fill="#1e1e25" stroke="#1e1e25" stroke-width="1.51"/><path d="M-35,672L-24,765L64,646Z" fill="#1c1e27" stroke="#1c1e27" stroke-width="1.51"/><path d="M913,1005L990,1060L1032,900Z" fill="#200d2a" stroke="#200d2a" stroke-width="1.51"/><path d="M1218,912L1253,799L1153,782Z" fill="#1c0a29" stroke="#1c0a29" stroke-width="1.51"/><path d="M696,1054L990,1060L758,1032Z" fill="#220f2c" stroke="#220f2c" stroke-width="1.51"/><path d="M-136,1054L990,1060L696,1054Z" fill="#24182d" stroke="#24182d" stroke-width="1.51"/><path d="M1218,912L1153,782L1089,882Z" fill="#1c0a29" stroke="#1c0a29" stroke-width="1.51"/><path d="M1248,648L1355,543L1255,588Z" fill="#190d2b" stroke="#190d2b" stroke-width="1.51"/><path d="M1367,710L1355,543L1248,648Z" fill="#1b0c2a" stroke="#1b0c2a" stroke-width="1.51"/><path d="M-55,555L-132,680L-35,672Z" fill="#1d1e25" stroke="#1d1e25" stroke-width="1.51"/><path d="M-131,315L-121,448L-14,363Z" fill="#1c2426" stroke="#1c2426" stroke-width="1.51"/><path d="M1246,-36L1136,-111L1110,-28Z" fill="#1d1e25" stroke="#1d1e25" stroke-width="1.51"/><path d="M118,-15L-38,73L123,103Z" fill="#183128" stroke="#183128" stroke-width="1.51"/><path d="M-5,194L-131,315L-14,363Z" fill="#1a2928" stroke="#1a2928" stroke-width="1.51"/><path d="M-39,7L-38,73L118,-15Z" fill="#1a3025" stroke="#1a3025" stroke-width="1.51"/><path d="M1324,-3L1246,-36L1248,72Z" fill="#1e1f28" stroke="#1e1f28" stroke-width="1.51"/><path d="M1386,431L1271,354L1262,481Z" fill="#19112d" stroke="#19112d" stroke-width="1.51"/><path d="M990,1060L1094,1029L1032,900Z" fill="#210c2a" stroke="#210c2a" stroke-width="1.51"/><path d="M-124,219L-131,315L-5,194Z" fill="#1a2b26" stroke="#1a2b26" stroke-width="1.51"/><path d="M1355,543L1386,431L1262,481Z" fill="#1b0f2c" stroke="#1b0f2c" stroke-width="1.51"/><path d="M1094,1029L1218,912L1089,882Z" fill="#1f0a29" stroke="#1f0a29" stroke-width="1.51"/><path d="M1253,799L1367,710L1248,648Z" fill="#1b0b29" stroke="#1b0b29" stroke-width="1.51"/><path d="M-38,73L-124,219L-5,194Z" fill="#183027" stroke="#183027" stroke-width="1.51"/><path d="M1248,72L1246,-36L1110,-28Z" fill="#1b1f27" stroke="#1b1f27" stroke-width="1.51"/><path d="M1348,116L1263,231L1318,235Z" fill="#1a1e2d" stroke="#1a1e2d" stroke-width="1.51"/><path d="M-38,73L-167,117L-124,219Z" fill="#193125" stroke="#193125" stroke-width="1.51"/><path d="M-7,-152L-39,7L118,-15Z" fill="#1d3021" stroke="#1d3021" stroke-width="1.51"/><path d="M1465,118L1348,116L1318,235Z" fill="#1d202d" stroke="#1d202d" stroke-width="1.51"/><path d="M-121,448L-165,529L-55,555Z" fill="#1d1f25" stroke="#1d1f25" stroke-width="1.51"/><path d="M-131,315L-165,529L-121,448Z" fill="#1d2125" stroke="#1d2125" stroke-width="1.51"/><path d="M-167,117L-165,529L-131,315Z" fill="#1d2724" stroke="#1d2724" stroke-width="1.51"/><path d="M1476,551L1473,419L1386,431Z" fill="#1e102d" stroke="#1e102d" stroke-width="1.51"/><path d="M1335,825L1367,710L1253,799Z" fill="#1d0a29" stroke="#1d0a29" stroke-width="1.51"/><path d="M-165,529L-132,680L-55,555Z" fill="#1e1f24" stroke="#1e1f24" stroke-width="1.51"/><path d="M-24,765L-15,943L93,915Z" fill="#211e26" stroke="#211e26" stroke-width="1.51"/><path d="M753,-160L73,-154L463,-146Z" fill="#1c2a24" stroke="#1c2a24" stroke-width="1.51"/><path d="M207,-137L73,-154L118,-15Z" fill="#1b3023" stroke="#1b3023" stroke-width="1.51"/><path d="M1218,912L1335,825L1253,799Z" fill="#1e0a29" stroke="#1e0a29" stroke-width="1.51"/><path d="M1344,904L1335,825L1218,912Z" fill="#200a29" stroke="#200a29" stroke-width="1.51"/><path d="M-175,829L-15,943L-24,765Z" fill="#211d23" stroke="#211d23" stroke-width="1.51"/><path d="M93,915L72,1047L228,990Z" fill="#242029" stroke="#242029" stroke-width="1.51"/><path d="M1094,1029L1223,992L1218,912Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1339,1016L1223,992L1094,1029Z" fill="#230a29" stroke="#230a29" stroke-width="1.51"/><path d="M1348,116L1324,-3L1248,72Z" fill="#1d202a" stroke="#1d202a" stroke-width="1.51"/><path d="M1246,-36L1241,-144L1136,-111Z" fill="#1f1d23" stroke="#1f1d23" stroke-width="1.51"/><path d="M-15,943L72,1047L93,915Z" fill="#241f27" stroke="#241f27" stroke-width="1.51"/><path d="M298,1048L-136,1054L696,1054Z" fill="#24212d" stroke="#24212d" stroke-width="1.51"/><path d="M1384,-153L1241,-144L1246,-36Z" fill="#211d23" stroke="#211d23" stroke-width="1.51"/><path d="M1136,-111L1241,-144L971,-156Z" fill="#1f1c22" stroke="#1f1c22" stroke-width="1.51"/><path d="M-124,219L-167,117L-131,315Z" fill="#1b2c25" stroke="#1b2c25" stroke-width="1.51"/><path d="M-117,3L-167,117L-38,73Z" fill="#1c3022" stroke="#1c3022" stroke-width="1.51"/><path d="M-117,3L-38,73L-39,7Z" fill="#1c3022" stroke="#1c3022" stroke-width="1.51"/><path d="M1501,228L1465,118L1318,235Z" fill="#1f1e2d" stroke="#1f1e2d" stroke-width="1.51"/><path d="M1348,116L1465,118L1324,-3Z" fill="#1f202b" stroke="#1f202b" stroke-width="1.51"/><path d="M1386,431L1476,362L1377,345Z" fill="#1d142d" stroke="#1d142d" stroke-width="1.51"/><path d="M1476,551L1386,431L1355,543Z" fill="#1d0e2c" stroke="#1d0e2c" stroke-width="1.51"/><path d="M1476,551L1355,543L1459,701Z" fill="#1e0d2b" stroke="#1e0d2b" stroke-width="1.51"/><path d="M-110,-95L-117,3L-39,7Z" fill="#1f2e1e" stroke="#1f2e1e" stroke-width="1.51"/><path d="M1473,419L1476,362L1386,431Z" fill="#1e132d" stroke="#1e132d" stroke-width="1.51"/><path d="M73,-154L-7,-152L118,-15Z" fill="#1e2f20" stroke="#1e2f20" stroke-width="1.51"/><path d="M1459,701L1355,543L1367,710Z" fill="#1d0c2a" stroke="#1d0c2a" stroke-width="1.51"/><path d="M1579,184L1501,228L1612,342Z" fill="#231c2d" stroke="#231c2d" stroke-width="1.51"/><path d="M1467,827L1459,701L1367,710Z" fill="#1f0a29" stroke="#1f0a29" stroke-width="1.51"/><path d="M1223,992L1344,904L1218,912Z" fill="#220a29" stroke="#220a29" stroke-width="1.51"/><path d="M-15,943L-43,1000L72,1047Z" fill="#261e25" stroke="#261e25" stroke-width="1.51"/><path d="M-145,939L-43,1000L-15,943Z" fill="#261e23" stroke="#261e23" stroke-width="1.51"/><path d="M1467,827L1367,710L1335,825Z" fill="#1f0a29" stroke="#1f0a29" stroke-width="1.51"/><path d="M-167,117L-175,829L-165,529Z" fill="#1e1f24" stroke="#1e1f24" stroke-width="1.51"/><path d="M-165,529L-175,829L-132,680Z" fill="#1f1d22" stroke="#1f1d22" stroke-width="1.51"/><path d="M-132,680L-175,829L-24,765Z" fill="#1e1c22" stroke="#1e1c22" stroke-width="1.51"/><path d="M1501,228L1318,235L1377,345Z" fill="#1d1a2d" stroke="#1d1a2d" stroke-width="1.51"/><path d="M1324,-3L1384,-153L1246,-36Z" fill="#211e25" stroke="#211e25" stroke-width="1.51"/><path d="M1476,362L1501,228L1377,345Z" fill="#1f182d" stroke="#1f182d" stroke-width="1.51"/><path d="M1567,465L1476,362L1473,419Z" fill="#20122d" stroke="#20122d" stroke-width="1.51"/><path d="M-7,-152L-110,-95L-39,7Z" fill="#1f2e1e" stroke="#1f2e1e" stroke-width="1.51"/><path d="M-117,3L-110,-95L-167,117Z" fill="#1e2f1f" stroke="#1e2f1f" stroke-width="1.51"/><path d="M-175,829L-145,939L-15,943Z" fill="#241d22" stroke="#241d22" stroke-width="1.51"/><path d="M1344,904L1467,827L1335,825Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1223,992L1339,1016L1344,904Z" fill="#240a29" stroke="#240a29" stroke-width="1.51"/><path d="M990,1060L1339,1016L1094,1029Z" fill="#220b29" stroke="#220b29" stroke-width="1.51"/><path d="M1484,941L1467,827L1344,904Z" fill="#240a29" stroke="#240a29" stroke-width="1.51"/><path d="M1582,529L1567,465L1476,551Z" fill="#210e2c" stroke="#210e2c" stroke-width="1.51"/><path d="M1476,551L1567,465L1473,419Z" fill="#200f2c" stroke="#200f2c" stroke-width="1.51"/><path d="M1582,529L1476,551L1577,710Z" fill="#220d2b" stroke="#220d2b" stroke-width="1.51"/><path d="M1481,-21L1324,-3L1465,118Z" fill="#222029" stroke="#222029" stroke-width="1.51"/><path d="M1481,-21L1384,-153L1324,-3Z" fill="#231e25" stroke="#231e25" stroke-width="1.51"/><path d="M1241,-144L1384,-153L971,-156Z" fill="#201c21" stroke="#201c21" stroke-width="1.51"/><path d="M971,-156L1384,-153L753,-160Z" fill="#1f1d22" stroke="#1f1d22" stroke-width="1.51"/><path d="M1577,710L1476,551L1459,701Z" fill="#210d2a" stroke="#210d2a" stroke-width="1.51"/><path d="M1501,228L1476,362L1612,342Z" fill="#21182d" stroke="#21182d" stroke-width="1.51"/><path d="M1579,184L1465,118L1501,228Z" fill="#211f2d" stroke="#211f2d" stroke-width="1.51"/><path d="M1568,-35L1481,-21L1465,118Z" fill="#252028" stroke="#252028" stroke-width="1.51"/><path d="M-175,829L-136,1054L-145,939Z" fill="#271d21" stroke="#271d21" stroke-width="1.51"/><path d="M-145,939L-136,1054L-43,1000Z" fill="#281d22" stroke="#281d22" stroke-width="1.51"/><path d="M-43,1000L-136,1054L72,1047Z" fill="#291f24" stroke="#291f24" stroke-width="1.51"/><path d="M72,1047L-136,1054L298,1048Z" fill="#272028" stroke="#272028" stroke-width="1.51"/><path d="M1612,342L1476,362L1567,465Z" fill="#21132d" stroke="#21132d" stroke-width="1.51"/><path d="M1582,529L1612,342L1567,465Z" fill="#22102d" stroke="#22102d" stroke-width="1.51"/><path d="M1582,529L1577,710L1612,342Z" fill="#220f2c" stroke="#220f2c" stroke-width="1.51"/><path d="M1565,807L1577,710L1459,701Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1565,807L1459,701L1467,827Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1456,1026L1484,941L1344,904Z" fill="#270a29" stroke="#270a29" stroke-width="1.51"/><path d="M1577,908L1565,807L1467,827Z" fill="#250a29" stroke="#250a29" stroke-width="1.51"/><path d="M1484,941L1577,908L1467,827Z" fill="#260a29" stroke="#260a29" stroke-width="1.51"/><path d="M1339,1016L1456,1026L1344,904Z" fill="#260a29" stroke="#260a29" stroke-width="1.51"/><path d="M990,1060L1456,1026L1339,1016Z" fill="#250a29" stroke="#250a29" stroke-width="1.51"/><path d="M1481,-21L1493,-148L1384,-153Z" fill="#261d23" stroke="#261d23" stroke-width="1.51"/><path d="M1568,-35L1493,-148L1481,-21Z" fill="#271e25" stroke="#271e25" stroke-width="1.51"/><path d="M1579,184L1618,111L1465,118Z" fill="#23222d" stroke="#23222d" stroke-width="1.51"/><path d="M1612,342L1618,111L1579,184Z" fill="#241e2d" stroke="#241e2d" stroke-width="1.51"/><path d="M1618,111L1568,-35L1465,118Z" fill="#25212a" stroke="#25212a" stroke-width="1.51"/><path d="M1568,1003L1577,908L1484,941Z" fill="#2a0a29" stroke="#2a0a29" stroke-width="1.51"/><path d="M1565,807L1577,908L1577,710Z" fill="#240a29" stroke="#240a29" stroke-width="1.51"/><path d="M1577,710L1577,908L1612,342Z" fill="#230d2a" stroke="#230d2a" stroke-width="1.51"/><path d="M1456,1026L1568,1003L1484,941Z" fill="#2a0a29" stroke="#2a0a29" stroke-width="1.51"/><path d="M1568,-35L1582,-127L1493,-148Z" fill="#281e23" stroke="#281e23" stroke-width="1.51"/><path d="M1618,111L1582,-127L1568,-35Z" fill="#281f26" stroke="#281f26" stroke-width="1.51"/></svg>
\ No newline at end of file
diff --git a/src/client/assets/welcome-bg.light.svg b/src/client/assets/welcome-bg.light.svg
new file mode 100644
index 0000000000..ebccb648ea
--- /dev/null
+++ b/src/client/assets/welcome-bg.light.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="900"><path d="M741,416L678,396L681,478Z" fill="#f4f4f3" stroke="#f4f4f3" stroke-width="1.51"/><path d="M681,478L777,499L741,416Z" fill="#f2f3f2" stroke="#f2f3f2" stroke-width="1.51"/><path d="M678,396L605,487L681,478Z" fill="#f3f3f2" stroke="#f3f3f2" stroke-width="1.51"/><path d="M681,478L683,560L777,499Z" fill="#edf1ee" stroke="#edf1ee" stroke-width="1.51"/><path d="M760,327L659,322L678,396Z" fill="#f1f1ef" stroke="#f1f1ef" stroke-width="1.51"/><path d="M678,396L571,389L605,487Z" fill="#f2f2f0" stroke="#f2f2f0" stroke-width="1.51"/><path d="M741,416L760,327L678,396Z" fill="#f3f2f1" stroke="#f3f2f1" stroke-width="1.51"/><path d="M854,398L760,327L741,416Z" fill="#eef0ec" stroke="#eef0ec" stroke-width="1.51"/><path d="M605,487L683,560L681,478Z" fill="#edf0ec" stroke="#edf0ec" stroke-width="1.51"/><path d="M659,322L571,389L678,396Z" fill="#f1f1ee" stroke="#f1f1ee" stroke-width="1.51"/><path d="M683,560L783,568L777,499Z" fill="#e7eee9" stroke="#e7eee9" stroke-width="1.51"/><path d="M777,499L854,398L741,416Z" fill="#eef2ef" stroke="#eef2ef" stroke-width="1.51"/><path d="M844,505L854,398L777,499Z" fill="#eaefeb" stroke="#eaefeb" stroke-width="1.51"/><path d="M783,568L844,505L777,499Z" fill="#e6ece7" stroke="#e6ece7" stroke-width="1.51"/><path d="M659,322L596,308L571,389Z" fill="#f0f0eb" stroke="#f0f0eb" stroke-width="1.51"/><path d="M597,246L596,308L659,322Z" fill="#efeee9" stroke="#efeee9" stroke-width="1.51"/><path d="M605,487L579,600L683,560Z" fill="#e7ede7" stroke="#e7ede7" stroke-width="1.51"/><path d="M571,389L512,495L605,487Z" fill="#f1f1ee" stroke="#f1f1ee" stroke-width="1.51"/><path d="M492,390L512,495L571,389Z" fill="#f0f0ec" stroke="#f0f0ec" stroke-width="1.51"/><path d="M760,327L745,238L659,322Z" fill="#f1f0ed" stroke="#f1f0ed" stroke-width="1.51"/><path d="M852,301L745,238L760,327Z" fill="#ebede7" stroke="#ebede7" stroke-width="1.51"/><path d="M512,495L579,600L605,487Z" fill="#e9ede7" stroke="#e9ede7" stroke-width="1.51"/><path d="M764,652L848,599L783,568Z" fill="#dce7de" stroke="#dce7de" stroke-width="1.51"/><path d="M854,398L852,301L760,327Z" fill="#eaeee8" stroke="#eaeee8" stroke-width="1.51"/><path d="M513,332L492,390L571,389Z" fill="#efeeea" stroke="#efeeea" stroke-width="1.51"/><path d="M596,308L513,332L571,389Z" fill="#efefe9" stroke="#efefe9" stroke-width="1.51"/><path d="M521,240L513,332L596,308Z" fill="#edede6" stroke="#edede6" stroke-width="1.51"/><path d="M655,216L597,246L659,322Z" fill="#eeeee8" stroke="#eeeee8" stroke-width="1.51"/><path d="M783,568L848,599L844,505Z" fill="#e0e9e1" stroke="#e0e9e1" stroke-width="1.51"/><path d="M844,505L926,479L854,398Z" fill="#e7ede8" stroke="#e7ede8" stroke-width="1.51"/><path d="M764,652L783,568L683,560Z" fill="#e2eae3" stroke="#e2eae3" stroke-width="1.51"/><path d="M745,238L655,216L659,322Z" fill="#efefea" stroke="#efefea" stroke-width="1.51"/><path d="M691,673L764,652L683,560Z" fill="#e0e9e1" stroke="#e0e9e1" stroke-width="1.51"/><path d="M930,580L926,479L844,505Z" fill="#dee8e0" stroke="#dee8e0" stroke-width="1.51"/><path d="M854,398L924,327L852,301Z" fill="#e5ebe3" stroke="#e5ebe3" stroke-width="1.51"/><path d="M926,479L932,405L854,398Z" fill="#e5ece6" stroke="#e5ece6" stroke-width="1.51"/><path d="M579,600L691,673L683,560Z" fill="#e1e9e1" stroke="#e1e9e1" stroke-width="1.51"/><path d="M852,301L854,250L745,238Z" fill="#e8ebe4" stroke="#e8ebe4" stroke-width="1.51"/><path d="M745,238L695,139L655,216Z" fill="#eeede7" stroke="#eeede7" stroke-width="1.51"/><path d="M932,252L854,250L852,301Z" fill="#e3e9df" stroke="#e3e9df" stroke-width="1.51"/><path d="M932,405L924,327L854,398Z" fill="#e4ebe3" stroke="#e4ebe3" stroke-width="1.51"/><path d="M512,495L484,563L579,600Z" fill="#e5ebe3" stroke="#e5ebe3" stroke-width="1.51"/><path d="M579,600L598,675L691,673Z" fill="#dce6dc" stroke="#dce6dc" stroke-width="1.51"/><path d="M424,483L484,563L512,495Z" fill="#e9ece5" stroke="#e9ece5" stroke-width="1.51"/><path d="M523,666L598,675L579,600Z" fill="#dbe6da" stroke="#dbe6da" stroke-width="1.51"/><path d="M597,246L521,240L596,308Z" fill="#edede6" stroke="#edede6" stroke-width="1.51"/><path d="M403,323L433,428L492,390Z" fill="#eeede7" stroke="#eeede7" stroke-width="1.51"/><path d="M509,138L521,240L597,246Z" fill="#ebeae2" stroke="#ebeae2" stroke-width="1.51"/><path d="M492,390L433,428L512,495Z" fill="#f0efec" stroke="#f0efec" stroke-width="1.51"/><path d="M403,323L492,390L513,332Z" fill="#edede7" stroke="#edede7" stroke-width="1.51"/><path d="M848,599L930,580L844,505Z" fill="#dce7dd" stroke="#dce7dd" stroke-width="1.51"/><path d="M926,479L1021,423L932,405Z" fill="#e1e9e2" stroke="#e1e9e2" stroke-width="1.51"/><path d="M914,673L930,580L848,599Z" fill="#d3e2d5" stroke="#d3e2d5" stroke-width="1.51"/><path d="M433,428L424,483L512,495Z" fill="#eeefe9" stroke="#eeefe9" stroke-width="1.51"/><path d="M439,658L523,666L484,563Z" fill="#dce5d9" stroke="#dce5d9" stroke-width="1.51"/><path d="M484,563L523,666L579,600Z" fill="#dee7dd" stroke="#dee7dd" stroke-width="1.51"/><path d="M764,652L859,684L848,599Z" fill="#d6e4d8" stroke="#d6e4d8" stroke-width="1.51"/><path d="M841,752L859,684L764,652Z" fill="#d0e0d3" stroke="#d0e0d3" stroke-width="1.51"/><path d="M771,770L764,652L691,673Z" fill="#d6e4d9" stroke="#d6e4d9" stroke-width="1.51"/><path d="M781,131L695,139L745,238Z" fill="#ecece5" stroke="#ecece5" stroke-width="1.51"/><path d="M924,327L932,252L852,301Z" fill="#e2e8df" stroke="#e2e8df" stroke-width="1.51"/><path d="M1000,247L932,252L924,327Z" fill="#dde6da" stroke="#dde6da" stroke-width="1.51"/><path d="M781,131L745,238L854,250Z" fill="#e8eae3" stroke="#e8eae3" stroke-width="1.51"/><path d="M655,216L610,125L597,246Z" fill="#ecece4" stroke="#ecece4" stroke-width="1.51"/><path d="M869,153L781,131L854,250Z" fill="#e4e8de" stroke="#e4e8de" stroke-width="1.51"/><path d="M521,240L403,323L513,332Z" fill="#ecebe4" stroke="#ecebe4" stroke-width="1.51"/><path d="M342,409L347,500L424,483Z" fill="#edede7" stroke="#edede7" stroke-width="1.51"/><path d="M930,580L1009,511L926,479Z" fill="#d9e6db" stroke="#d9e6db" stroke-width="1.51"/><path d="M932,405L1014,332L924,327Z" fill="#dfe8de" stroke="#dfe8de" stroke-width="1.51"/><path d="M1044,592L1009,511L930,580Z" fill="#d1e1d4" stroke="#d1e1d4" stroke-width="1.51"/><path d="M859,684L914,673L848,599Z" fill="#d1e1d4" stroke="#d1e1d4" stroke-width="1.51"/><path d="M1009,511L1021,423L926,479Z" fill="#dde7de" stroke="#dde7de" stroke-width="1.51"/><path d="M424,483L415,588L484,563Z" fill="#e5eae1" stroke="#e5eae1" stroke-width="1.51"/><path d="M347,500L415,588L424,483Z" fill="#e6eae1" stroke="#e6eae1" stroke-width="1.51"/><path d="M695,139L610,125L655,216Z" fill="#ecebe3" stroke="#ecebe3" stroke-width="1.51"/><path d="M521,240L403,213L403,323Z" fill="#eaeae1" stroke="#eaeae1" stroke-width="1.51"/><path d="M659,40L610,125L695,139Z" fill="#ebe7df" stroke="#ebe7df" stroke-width="1.51"/><path d="M598,675L697,764L691,673Z" fill="#d6e3d8" stroke="#d6e3d8" stroke-width="1.51"/><path d="M859,684L935,739L914,673Z" fill="#c9ddcd" stroke="#c9ddcd" stroke-width="1.51"/><path d="M523,666L582,742L598,675Z" fill="#d5e2d5" stroke="#d5e2d5" stroke-width="1.51"/><path d="M504,768L582,742L523,666Z" fill="#d1e0d1" stroke="#d1e0d1" stroke-width="1.51"/><path d="M582,742L697,764L598,675Z" fill="#d3e1d4" stroke="#d3e1d4" stroke-width="1.51"/><path d="M932,252L869,153L854,250Z" fill="#e1e7dd" stroke="#e1e7dd" stroke-width="1.51"/><path d="M1021,423L1014,332L932,405Z" fill="#dde7dd" stroke="#dde7dd" stroke-width="1.51"/><path d="M932,252L934,126L869,153Z" fill="#dee5d9" stroke="#dee5d9" stroke-width="1.51"/><path d="M697,764L771,770L691,673Z" fill="#d4e2d6" stroke="#d4e2d6" stroke-width="1.51"/><path d="M415,588L439,658L484,563Z" fill="#dee6da" stroke="#dee6da" stroke-width="1.51"/><path d="M771,770L841,752L764,652Z" fill="#cfe0d2" stroke="#cfe0d2" stroke-width="1.51"/><path d="M610,125L509,138L597,246Z" fill="#eaeae1" stroke="#eaeae1" stroke-width="1.51"/><path d="M1014,332L1000,247L924,327Z" fill="#dce6da" stroke="#dce6da" stroke-width="1.51"/><path d="M342,409L424,483L433,428Z" fill="#eeeee9" stroke="#eeeee9" stroke-width="1.51"/><path d="M415,588L317,676L439,658Z" fill="#d9e2d4" stroke="#d9e2d4" stroke-width="1.51"/><path d="M403,323L342,409L433,428Z" fill="#edece5" stroke="#edece5" stroke-width="1.51"/><path d="M318,300L342,409L403,323Z" fill="#ebebe2" stroke="#ebebe2" stroke-width="1.51"/><path d="M438,164L403,213L521,240Z" fill="#e9e9df" stroke="#e9e9df" stroke-width="1.51"/><path d="M1009,511L1102,487L1021,423Z" fill="#d7e5da" stroke="#d7e5da" stroke-width="1.51"/><path d="M1021,423L1106,419L1014,332Z" fill="#d9e4d9" stroke="#d9e4d9" stroke-width="1.51"/><path d="M1039,662L1044,592L930,580Z" fill="#cbddce" stroke="#cbddce" stroke-width="1.51"/><path d="M1039,662L930,580L914,673Z" fill="#ccdecf" stroke="#ccdecf" stroke-width="1.51"/><path d="M509,138L438,164L521,240Z" fill="#e9e9de" stroke="#e9e9de" stroke-width="1.51"/><path d="M841,752L935,739L859,684Z" fill="#c8dccc" stroke="#c8dccc" stroke-width="1.51"/><path d="M848,838L935,739L841,752Z" fill="#c3d9c8" stroke="#c3d9c8" stroke-width="1.51"/><path d="M439,658L504,768L523,666Z" fill="#d4e1d2" stroke="#d4e1d2" stroke-width="1.51"/><path d="M582,742L595,833L697,764Z" fill="#ceded0" stroke="#ceded0" stroke-width="1.51"/><path d="M697,764L752,857L771,770Z" fill="#cdded2" stroke="#cdded2" stroke-width="1.51"/><path d="M1000,247L934,126L932,252Z" fill="#dbe4d7" stroke="#dbe4d7" stroke-width="1.51"/><path d="M869,153L847,70L781,131Z" fill="#e4e5da" stroke="#e4e5da" stroke-width="1.51"/><path d="M754,40L659,40L695,139Z" fill="#ece5de" stroke="#ece5de" stroke-width="1.51"/><path d="M925,70L847,70L869,153Z" fill="#dfe1d5" stroke="#dfe1d5" stroke-width="1.51"/><path d="M610,125L596,39L509,138Z" fill="#e9e5dc" stroke="#e9e5dc" stroke-width="1.51"/><path d="M754,40L695,139L781,131Z" fill="#eae7df" stroke="#eae7df" stroke-width="1.51"/><path d="M509,138L481,39L438,164Z" fill="#e7e4d9" stroke="#e7e4d9" stroke-width="1.51"/><path d="M847,70L754,40L781,131Z" fill="#e6e3da" stroke="#e6e3da" stroke-width="1.51"/><path d="M439,658L431,757L504,768Z" fill="#d0dece" stroke="#d0dece" stroke-width="1.51"/><path d="M347,500L320,574L415,588Z" fill="#e2e8dd" stroke="#e2e8dd" stroke-width="1.51"/><path d="M252,484L320,574L347,500Z" fill="#e5e8de" stroke="#e5e8de" stroke-width="1.51"/><path d="M1044,592L1102,487L1009,511Z" fill="#d0e1d4" stroke="#d0e1d4" stroke-width="1.51"/><path d="M1014,332L1093,313L1000,247Z" fill="#d7e2d5" stroke="#d7e2d5" stroke-width="1.51"/><path d="M403,213L318,300L403,323Z" fill="#e9e9df" stroke="#e9e9df" stroke-width="1.51"/><path d="M342,409L252,484L347,500Z" fill="#ecece5" stroke="#ecece5" stroke-width="1.51"/><path d="M336,215L318,300L403,213Z" fill="#e8e8dd" stroke="#e8e8dd" stroke-width="1.51"/><path d="M1102,487L1106,419L1021,423Z" fill="#d8e5da" stroke="#d8e5da" stroke-width="1.51"/><path d="M1000,247L1035,167L934,126Z" fill="#d8e2d3" stroke="#d8e2d3" stroke-width="1.51"/><path d="M935,739L1039,662L914,673Z" fill="#c5dbc9" stroke="#c5dbc9" stroke-width="1.51"/><path d="M1044,592L1121,583L1102,487Z" fill="#cbdece" stroke="#cbdece" stroke-width="1.51"/><path d="M516,826L595,833L582,742Z" fill="#cbdcce" stroke="#cbdcce" stroke-width="1.51"/><path d="M771,770L848,838L841,752Z" fill="#c7dbcc" stroke="#c7dbcc" stroke-width="1.51"/><path d="M659,40L596,39L610,125Z" fill="#eae3db" stroke="#eae3db" stroke-width="1.51"/><path d="M661,-27L596,39L659,40Z" fill="#eadfd7" stroke="#eadfd7" stroke-width="1.51"/><path d="M1106,419L1093,313L1014,332Z" fill="#d6e3d6" stroke="#d6e3d6" stroke-width="1.51"/><path d="M504,768L516,826L582,742Z" fill="#ccddcd" stroke="#ccddcd" stroke-width="1.51"/><path d="M317,676L431,757L439,658Z" fill="#d2dfcf" stroke="#d2dfcf" stroke-width="1.51"/><path d="M595,833L691,858L697,764Z" fill="#cbddd1" stroke="#cbddd1" stroke-width="1.51"/><path d="M691,858L752,857L697,764Z" fill="#ccddd2" stroke="#ccddd2" stroke-width="1.51"/><path d="M353,127L403,213L438,164Z" fill="#e7e6db" stroke="#e7e6db" stroke-width="1.51"/><path d="M353,127L336,215L403,213Z" fill="#e6e6da" stroke="#e6e6da" stroke-width="1.51"/><path d="M752,857L848,838L771,770Z" fill="#c7dacd" stroke="#c7dacd" stroke-width="1.51"/><path d="M935,739L1021,771L1039,662Z" fill="#bfd7c3" stroke="#bfd7c3" stroke-width="1.51"/><path d="M934,126L925,70L869,153Z" fill="#dde1d5" stroke="#dde1d5" stroke-width="1.51"/><path d="M1121,236L1035,167L1000,247Z" fill="#d4e0d0" stroke="#d4e0d0" stroke-width="1.51"/><path d="M857,-32L751,-25L754,40Z" fill="#e6dcd3" stroke="#e6dcd3" stroke-width="1.51"/><path d="M1020,81L925,70L934,126Z" fill="#d9ddce" stroke="#d9ddce" stroke-width="1.51"/><path d="M426,848L516,826L504,768Z" fill="#c8d9ca" stroke="#c8d9ca" stroke-width="1.51"/><path d="M595,833L598,906L691,858Z" fill="#c7d9cd" stroke="#c7d9cd" stroke-width="1.51"/><path d="M1114,656L1121,583L1044,592Z" fill="#c4d9c8" stroke="#c4d9c8" stroke-width="1.51"/><path d="M1102,487L1185,403L1106,419Z" fill="#d3e2d6" stroke="#d3e2d6" stroke-width="1.51"/><path d="M239,415L342,409L232,341Z" fill="#ebeae1" stroke="#ebeae1" stroke-width="1.51"/><path d="M239,415L252,484L342,409Z" fill="#ecebe4" stroke="#ecebe4" stroke-width="1.51"/><path d="M320,574L317,676L415,588Z" fill="#dbe3d6" stroke="#dbe3d6" stroke-width="1.51"/><path d="M265,661L317,676L320,574Z" fill="#d8e1d2" stroke="#d8e1d2" stroke-width="1.51"/><path d="M481,907L598,906L516,826Z" fill="#c4d7ca" stroke="#c4d7ca" stroke-width="1.51"/><path d="M596,39L481,39L509,138Z" fill="#e8e2d8" stroke="#e8e2d8" stroke-width="1.51"/><path d="M232,341L342,409L318,300Z" fill="#eae9e1" stroke="#eae9e1" stroke-width="1.51"/><path d="M1039,662L1114,656L1044,592Z" fill="#c3d9c7" stroke="#c3d9c7" stroke-width="1.51"/><path d="M1003,828L1021,771L935,739Z" fill="#bad4c0" stroke="#bad4c0" stroke-width="1.51"/><path d="M754,40L751,-25L659,40Z" fill="#ebe1da" stroke="#ebe1da" stroke-width="1.51"/><path d="M596,39L496,-7L481,39Z" fill="#e8ddd4" stroke="#e8ddd4" stroke-width="1.51"/><path d="M857,-32L754,40L847,70Z" fill="#e4ddd3" stroke="#e4ddd3" stroke-width="1.51"/><path d="M425,40L353,127L438,164Z" fill="#e6e3d7" stroke="#e6e3d7" stroke-width="1.51"/><path d="M247,249L232,341L318,300Z" fill="#e8e6dc" stroke="#e8e6dc" stroke-width="1.51"/><path d="M751,-25L661,-27L659,40Z" fill="#ebded7" stroke="#ebded7" stroke-width="1.51"/><path d="M1093,313L1121,236L1000,247Z" fill="#d3e0d1" stroke="#d3e0d1" stroke-width="1.51"/><path d="M1035,167L1020,81L934,126Z" fill="#d6decf" stroke="#d6decf" stroke-width="1.51"/><path d="M1213,315L1121,236L1093,313Z" fill="#cedecd" stroke="#cedecd" stroke-width="1.51"/><path d="M1185,403L1093,313L1106,419Z" fill="#d2e1d3" stroke="#d2e1d3" stroke-width="1.51"/><path d="M1093,741L1114,656L1039,662Z" fill="#bcd5c1" stroke="#bcd5c1" stroke-width="1.51"/><path d="M247,249L318,300L336,215Z" fill="#e7e7dc" stroke="#e7e7dc" stroke-width="1.51"/><path d="M1114,139L1020,81L1035,167Z" fill="#d1dccb" stroke="#d1dccb" stroke-width="1.51"/><path d="M925,70L857,-32L847,70Z" fill="#dfdcd0" stroke="#dfdcd0" stroke-width="1.51"/><path d="M661,-27L577,-27L596,39Z" fill="#e9ddd4" stroke="#e9ddd4" stroke-width="1.51"/><path d="M426,848L504,768L431,757Z" fill="#cadaca" stroke="#cadaca" stroke-width="1.51"/><path d="M516,826L598,906L595,833Z" fill="#c6d9cc" stroke="#c6d9cc" stroke-width="1.51"/><path d="M691,858L757,921L752,857Z" fill="#c7dacf" stroke="#c7dacf" stroke-width="1.51"/><path d="M840,910L941,859L848,838Z" fill="#bcd4c5" stroke="#bcd4c5" stroke-width="1.51"/><path d="M496,-7L425,40L481,39Z" fill="#e7dcd2" stroke="#e7dcd2" stroke-width="1.51"/><path d="M481,39L425,40L438,164Z" fill="#e7e1d6" stroke="#e7e1d6" stroke-width="1.51"/><path d="M147,423L252,484L239,415Z" fill="#ece7e0" stroke="#ece7e0" stroke-width="1.51"/><path d="M164,575L241,587L252,484Z" fill="#e1e1d7" stroke="#e1e1d7" stroke-width="1.51"/><path d="M252,484L241,587L320,574Z" fill="#e1e5da" stroke="#e1e5da" stroke-width="1.51"/><path d="M265,661L319,736L317,676Z" fill="#d1ddcc" stroke="#d1ddcc" stroke-width="1.51"/><path d="M317,676L319,736L431,757Z" fill="#cfddcb" stroke="#cfddcb" stroke-width="1.51"/><path d="M1187,514L1102,487L1121,583Z" fill="#caddcd" stroke="#caddcd" stroke-width="1.51"/><path d="M1187,514L1185,403L1102,487Z" fill="#cfe0d3" stroke="#cfe0d3" stroke-width="1.51"/><path d="M848,838L941,859L935,739Z" fill="#bdd5c5" stroke="#bdd5c5" stroke-width="1.51"/><path d="M840,910L848,838L752,857Z" fill="#c1d7ca" stroke="#c1d7ca" stroke-width="1.51"/><path d="M577,-27L496,-7L596,39Z" fill="#e8dcd3" stroke="#e8dcd3" stroke-width="1.51"/><path d="M687,939L757,921L691,858Z" fill="#c5d9cf" stroke="#c5d9cf" stroke-width="1.51"/><path d="M241,587L265,661L320,574Z" fill="#dae2d3" stroke="#dae2d3" stroke-width="1.51"/><path d="M225,125L336,215L353,127Z" fill="#e5e4d7" stroke="#e5e4d7" stroke-width="1.51"/><path d="M225,125L247,249L336,215Z" fill="#e6e4d7" stroke="#e6e4d7" stroke-width="1.51"/><path d="M1184,577L1187,514L1121,583Z" fill="#c5dac9" stroke="#c5dac9" stroke-width="1.51"/><path d="M953,-21L857,-32L925,70Z" fill="#dcd8cb" stroke="#dcd8cb" stroke-width="1.51"/><path d="M751,-25L666,-95L661,-27Z" fill="#ebdad4" stroke="#ebdad4" stroke-width="1.51"/><path d="M661,-27L591,-101L577,-27Z" fill="#e9d9d0" stroke="#e9d9d0" stroke-width="1.51"/><path d="M757,921L840,910L752,857Z" fill="#c1d6cb" stroke="#c1d6cb" stroke-width="1.51"/><path d="M319,736L426,848L431,757Z" fill="#c9dac8" stroke="#c9dac8" stroke-width="1.51"/><path d="M1021,771L1093,741L1039,662Z" fill="#bad5bf" stroke="#bad5bf" stroke-width="1.51"/><path d="M941,859L1003,828L935,739Z" fill="#bad3c1" stroke="#bad3c1" stroke-width="1.51"/><path d="M1043,903L1003,828L941,859Z" fill="#b2cfbd" stroke="#b2cfbd" stroke-width="1.51"/><path d="M1110,818L1093,741L1021,771Z" fill="#b3d0b9" stroke="#b3d0b9" stroke-width="1.51"/><path d="M1114,656L1184,577L1121,583Z" fill="#c1d8c5" stroke="#c1d8c5" stroke-width="1.51"/><path d="M870,1015L917,930L840,910Z" fill="#b5cfc3" stroke="#b5cfc3" stroke-width="1.51"/><path d="M598,906L687,939L691,858Z" fill="#c5d8cd" stroke="#c5d8cd" stroke-width="1.51"/><path d="M683,991L687,939L598,906Z" fill="#c1d5cb" stroke="#c1d5cb" stroke-width="1.51"/><path d="M1184,688L1184,577L1114,656Z" fill="#bbd4c0" stroke="#bbd4c0" stroke-width="1.51"/><path d="M1016,-5L953,-21L925,70Z" fill="#d8d6c7" stroke="#d8d6c7" stroke-width="1.51"/><path d="M1121,236L1114,139L1035,167Z" fill="#d0ddcb" stroke="#d0ddcb" stroke-width="1.51"/><path d="M1190,163L1114,139L1121,236Z" fill="#ccdbc7" stroke="#ccdbc7" stroke-width="1.51"/><path d="M425,40L336,72L353,127Z" fill="#e5dfd3" stroke="#e5dfd3" stroke-width="1.51"/><path d="M343,-19L336,72L425,40Z" fill="#e5dbcf" stroke="#e5dbcf" stroke-width="1.51"/><path d="M426,848L481,907L516,826Z" fill="#c4d6c8" stroke="#c4d6c8" stroke-width="1.51"/><path d="M400,933L481,907L426,848Z" fill="#c1d4c6" stroke="#c1d4c6" stroke-width="1.51"/><path d="M1016,-5L925,70L1020,81Z" fill="#d6d8c9" stroke="#d6d8c9" stroke-width="1.51"/><path d="M1185,403L1213,315L1093,313Z" fill="#cedecf" stroke="#cedecf" stroke-width="1.51"/><path d="M1273,400L1213,315L1185,403Z" fill="#ccdccf" stroke="#ccdccf" stroke-width="1.51"/><path d="M1273,400L1185,403L1293,477Z" fill="#ccddd1" stroke="#ccddd1" stroke-width="1.51"/><path d="M577,-27L492,-108L496,-7Z" fill="#e7d7ce" stroke="#e7d7ce" stroke-width="1.51"/><path d="M496,-7L420,-42L425,40Z" fill="#e6dace" stroke="#e6dace" stroke-width="1.51"/><path d="M772,-110L666,-95L751,-25Z" fill="#ead8d2" stroke="#ead8d2" stroke-width="1.51"/><path d="M772,-110L751,-25L857,-32Z" fill="#e5d7ce" stroke="#e5d7ce" stroke-width="1.51"/><path d="M840,910L917,930L941,859Z" fill="#b7d1c2" stroke="#b7d1c2" stroke-width="1.51"/><path d="M1195,761L1184,688L1093,741Z" fill="#b1d0b7" stroke="#b1d0b7" stroke-width="1.51"/><path d="M754,1005L840,910L757,921Z" fill="#bdd4c9" stroke="#bdd4c9" stroke-width="1.51"/><path d="M1090,57L1016,-5L1020,81Z" fill="#d2d5c4" stroke="#d2d5c4" stroke-width="1.51"/><path d="M864,-125L772,-110L857,-32Z" fill="#e1d2c9" stroke="#e1d2c9" stroke-width="1.51"/><path d="M1114,139L1090,57L1020,81Z" fill="#cfd8c6" stroke="#cfd8c6" stroke-width="1.51"/><path d="M1184,73L1090,57L1114,139Z" fill="#cbd5c2" stroke="#cbd5c2" stroke-width="1.51"/><path d="M1293,477L1185,403L1187,514Z" fill="#ccded2" stroke="#ccded2" stroke-width="1.51"/><path d="M1093,741L1184,688L1114,656Z" fill="#b7d3bc" stroke="#b7d3bc" stroke-width="1.51"/><path d="M1110,818L1021,771L1003,828Z" fill="#b3d0bb" stroke="#b3d0bb" stroke-width="1.51"/><path d="M666,-95L591,-101L661,-27Z" fill="#e9d7cf" stroke="#e9d7cf" stroke-width="1.51"/><path d="M864,-125L857,-32L932,-133Z" fill="#ddcfc4" stroke="#ddcfc4" stroke-width="1.51"/><path d="M666,-95L772,-110L591,-101Z" fill="#e9d5ce" stroke="#e9d5ce" stroke-width="1.51"/><path d="M232,341L147,423L239,415Z" fill="#ebe6dd" stroke="#ebe6dd" stroke-width="1.51"/><path d="M241,587L157,669L265,661Z" fill="#d6ddcd" stroke="#d6ddcd" stroke-width="1.51"/><path d="M141,302L147,423L232,341Z" fill="#eae3d9" stroke="#eae3d9" stroke-width="1.51"/><path d="M165,251L232,341L247,249Z" fill="#e7e3d8" stroke="#e7e3d8" stroke-width="1.51"/><path d="M136,501L164,575L252,484Z" fill="#e4e1d7" stroke="#e4e1d7" stroke-width="1.51"/><path d="M265,661L243,762L319,736Z" fill="#cedac8" stroke="#cedac8" stroke-width="1.51"/><path d="M319,736L311,858L426,848Z" fill="#c6d7c6" stroke="#c6d7c6" stroke-width="1.51"/><path d="M492,-108L420,-42L496,-7Z" fill="#e6d6cb" stroke="#e6d6cb" stroke-width="1.51"/><path d="M1213,315L1208,214L1121,236Z" fill="#cbdbca" stroke="#cbdbca" stroke-width="1.51"/><path d="M687,939L754,1005L757,921Z" fill="#c0d6cd" stroke="#c0d6cd" stroke-width="1.51"/><path d="M606,1030L683,991L598,906Z" fill="#bed3c9" stroke="#bed3c9" stroke-width="1.51"/><path d="M1043,903L1110,818L1003,828Z" fill="#afcdb9" stroke="#afcdb9" stroke-width="1.51"/><path d="M170,746L243,762L265,661Z" fill="#cdd7c5" stroke="#cdd7c5" stroke-width="1.51"/><path d="M1208,214L1190,163L1121,236Z" fill="#cadac8" stroke="#cadac8" stroke-width="1.51"/><path d="M225,125L353,127L336,72Z" fill="#e4e1d3" stroke="#e4e1d3" stroke-width="1.51"/><path d="M225,125L165,251L247,249Z" fill="#e5e1d4" stroke="#e5e1d4" stroke-width="1.51"/><path d="M86,589L136,501L62,472Z" fill="#e3dcd2" stroke="#e3dcd2" stroke-width="1.51"/><path d="M147,423L136,501L252,484Z" fill="#eae4dd" stroke="#eae4dd" stroke-width="1.51"/><path d="M255,61L225,125L336,72Z" fill="#e4ddcf" stroke="#e4ddcf" stroke-width="1.51"/><path d="M683,991L754,1005L687,939Z" fill="#c0d5cc" stroke="#c0d5cc" stroke-width="1.51"/><path d="M516,1028L606,1030L598,906Z" fill="#bcd1c7" stroke="#bcd1c7" stroke-width="1.51"/><path d="M243,762L311,858L319,736Z" fill="#c7d7c4" stroke="#c7d7c4" stroke-width="1.51"/><path d="M1293,477L1187,514L1292,592Z" fill="#c3d8ca" stroke="#c3d8ca" stroke-width="1.51"/><path d="M1213,315L1302,245L1208,214Z" fill="#c7d9c9" stroke="#c7d9c9" stroke-width="1.51"/><path d="M165,251L141,302L232,341Z" fill="#e8e1d7" stroke="#e8e1d7" stroke-width="1.51"/><path d="M420,-42L343,-19L425,40Z" fill="#e5d8cd" stroke="#e5d8cd" stroke-width="1.51"/><path d="M412,-112L343,-19L420,-42Z" fill="#e4d4c8" stroke="#e4d4c8" stroke-width="1.51"/><path d="M1014,1027L1043,903L917,930Z" fill="#accaba" stroke="#accaba" stroke-width="1.51"/><path d="M917,930L1043,903L941,859Z" fill="#b2cebd" stroke="#b2cebd" stroke-width="1.51"/><path d="M311,858L400,933L426,848Z" fill="#c1d4c4" stroke="#c1d4c4" stroke-width="1.51"/><path d="M343,-19L255,61L336,72Z" fill="#e4dbcd" stroke="#e4dbcd" stroke-width="1.51"/><path d="M225,125L146,150L165,251Z" fill="#e5ded1" stroke="#e5ded1" stroke-width="1.51"/><path d="M591,-101L492,-108L577,-27Z" fill="#e7d5cc" stroke="#e7d5cc" stroke-width="1.51"/><path d="M772,-110L492,-108L591,-101Z" fill="#e8d4cc" stroke="#e8d4cc" stroke-width="1.51"/><path d="M932,-133L857,-32L953,-21Z" fill="#dbd1c5" stroke="#dbd1c5" stroke-width="1.51"/><path d="M772,-110L864,-125L492,-108Z" fill="#ead5ce" stroke="#ead5ce" stroke-width="1.51"/><path d="M243,762L256,859L311,858Z" fill="#c4d4c2" stroke="#c4d4c2" stroke-width="1.51"/><path d="M164,575L157,669L241,587Z" fill="#dadcce" stroke="#dadcce" stroke-width="1.51"/><path d="M86,589L157,669L164,575Z" fill="#d9d9cb" stroke="#d9d9cb" stroke-width="1.51"/><path d="M1200,836L1195,761L1110,818Z" fill="#aacab3" stroke="#aacab3" stroke-width="1.51"/><path d="M1110,818L1195,761L1093,741Z" fill="#afceb6" stroke="#afceb6" stroke-width="1.51"/><path d="M1292,592L1187,514L1184,577Z" fill="#c1d8c7" stroke="#c1d8c7" stroke-width="1.51"/><path d="M1292,592L1184,577L1287,654Z" fill="#b9d3c1" stroke="#b9d3c1" stroke-width="1.51"/><path d="M516,1028L598,906L481,907Z" fill="#bfd3c7" stroke="#bfd3c7" stroke-width="1.51"/><path d="M683,991L606,1030L754,1005Z" fill="#bcd2ca" stroke="#bcd2ca" stroke-width="1.51"/><path d="M754,1005L870,1015L840,910Z" fill="#b7d0c6" stroke="#b7d0c6" stroke-width="1.51"/><path d="M606,1030L870,1015L754,1005Z" fill="#bad2ca" stroke="#bad2ca" stroke-width="1.51"/><path d="M1022,-108L932,-133L953,-21Z" fill="#d7cdbf" stroke="#d7cdbf" stroke-width="1.51"/><path d="M1090,57L1087,-29L1016,-5Z" fill="#d0d1c0" stroke="#d0d1c0" stroke-width="1.51"/><path d="M1190,163L1184,73L1114,139Z" fill="#c9d7c3" stroke="#c9d7c3" stroke-width="1.51"/><path d="M1259,129L1184,73L1190,163Z" fill="#c6d4c2" stroke="#c6d4c2" stroke-width="1.51"/><path d="M1259,129L1190,163L1208,214Z" fill="#c6d7c5" stroke="#c6d7c5" stroke-width="1.51"/><path d="M1191,-40L1087,-29L1090,57Z" fill="#cbcdba" stroke="#cbcdba" stroke-width="1.51"/><path d="M1273,400L1301,336L1213,315Z" fill="#c9dacd" stroke="#c9dacd" stroke-width="1.51"/><path d="M1367,403L1301,336L1273,400Z" fill="#c7d9cd" stroke="#c7d9cd" stroke-width="1.51"/><path d="M1287,654L1184,577L1184,688Z" fill="#b8d3bf" stroke="#b8d3bf" stroke-width="1.51"/><path d="M1293,477L1367,403L1273,400Z" fill="#c8dbd0" stroke="#c8dbd0" stroke-width="1.51"/><path d="M178,821L256,859L243,762Z" fill="#c4d2bf" stroke="#c4d2bf" stroke-width="1.51"/><path d="M311,858L334,941L400,933Z" fill="#bed1c2" stroke="#bed1c2" stroke-width="1.51"/><path d="M157,669L170,746L265,661Z" fill="#d0d8c6" stroke="#d0d8c6" stroke-width="1.51"/><path d="M348,-127L412,-112L492,-108Z" fill="#e4cfc4" stroke="#e4cfc4" stroke-width="1.51"/><path d="M1022,-108L953,-21L1016,-5Z" fill="#d5cfc0" stroke="#d5cfc0" stroke-width="1.51"/><path d="M238,-42L163,72L255,61Z" fill="#e3d5c8" stroke="#e3d5c8" stroke-width="1.51"/><path d="M492,-108L412,-112L420,-42Z" fill="#e5d2c7" stroke="#e5d2c7" stroke-width="1.51"/><path d="M348,-127L492,-108L864,-125Z" fill="#e7d2c9" stroke="#e7d2c9" stroke-width="1.51"/><path d="M418,1011L481,907L400,933Z" fill="#bcd1c4" stroke="#bcd1c4" stroke-width="1.51"/><path d="M418,1011L516,1028L481,907Z" fill="#bad0c4" stroke="#bad0c4" stroke-width="1.51"/><path d="M260,932L334,941L311,858Z" fill="#bed1c1" stroke="#bed1c1" stroke-width="1.51"/><path d="M163,72L146,150L225,125Z" fill="#e4dacc" stroke="#e4dacc" stroke-width="1.51"/><path d="M63,247L75,313L141,302Z" fill="#e7dcd1" stroke="#e7dcd1" stroke-width="1.51"/><path d="M163,72L225,125L255,61Z" fill="#e3dacc" stroke="#e3dacc" stroke-width="1.51"/><path d="M1283,769L1287,654L1184,688Z" fill="#afcdb7" stroke="#afcdb7" stroke-width="1.51"/><path d="M1301,336L1302,245L1213,315Z" fill="#c7d9ca" stroke="#c7d9ca" stroke-width="1.51"/><path d="M1119,-104L1022,-108L1087,-29Z" fill="#cec9b7" stroke="#cec9b7" stroke-width="1.51"/><path d="M1087,-29L1022,-108L1016,-5Z" fill="#d1cdbd" stroke="#d1cdbd" stroke-width="1.51"/><path d="M136,501L86,589L164,575Z" fill="#e0dbd0" stroke="#e0dbd0" stroke-width="1.51"/><path d="M157,669L65,684L170,746Z" fill="#cfd3c1" stroke="#cfd3c1" stroke-width="1.51"/><path d="M62,472L136,501L147,423Z" fill="#eae1d9" stroke="#eae1d9" stroke-width="1.51"/><path d="M75,313L147,423L141,302Z" fill="#e9dfd6" stroke="#e9dfd6" stroke-width="1.51"/><path d="M1195,761L1283,769L1184,688Z" fill="#acccb5" stroke="#acccb5" stroke-width="1.51"/><path d="M1043,903L1124,911L1110,818Z" fill="#aac9b5" stroke="#aac9b5" stroke-width="1.51"/><path d="M1124,989L1124,911L1043,903Z" fill="#a5c6b3" stroke="#a5c6b3" stroke-width="1.51"/><path d="M63,247L141,302L165,251Z" fill="#e7ddd2" stroke="#e7ddd2" stroke-width="1.51"/><path d="M1191,-40L1119,-104L1087,-29Z" fill="#cac8b5" stroke="#cac8b5" stroke-width="1.51"/><path d="M1302,245L1259,129L1208,214Z" fill="#c5d7c5" stroke="#c5d7c5" stroke-width="1.51"/><path d="M60,406L62,472L147,423Z" fill="#ebe0d8" stroke="#ebe0d8" stroke-width="1.51"/><path d="M334,941L418,1011L400,933Z" fill="#bbcfc2" stroke="#bbcfc2" stroke-width="1.51"/><path d="M1124,911L1200,836L1110,818Z" fill="#a7c9b2" stroke="#a7c9b2" stroke-width="1.51"/><path d="M870,1015L950,1026L917,930Z" fill="#afccbe" stroke="#afccbe" stroke-width="1.51"/><path d="M606,1030L950,1026L870,1015Z" fill="#b5cec5" stroke="#b5cec5" stroke-width="1.51"/><path d="M75,313L60,406L147,423Z" fill="#e9ded6" stroke="#e9ded6" stroke-width="1.51"/><path d="M53,774L178,821L170,746Z" fill="#c7cebb" stroke="#c7cebb" stroke-width="1.51"/><path d="M170,746L178,821L243,762Z" fill="#c7d2bf" stroke="#c7d2bf" stroke-width="1.51"/><path d="M256,859L260,932L311,858Z" fill="#bfd1c0" stroke="#bfd1c0" stroke-width="1.51"/><path d="M334,941L312,1020L418,1011Z" fill="#b8cdc0" stroke="#b8cdc0" stroke-width="1.51"/><path d="M146,150L63,247L165,251Z" fill="#e5dccf" stroke="#e5dccf" stroke-width="1.51"/><path d="M238,-42L255,61L343,-19Z" fill="#e3d6c9" stroke="#e3d6c9" stroke-width="1.51"/><path d="M147,938L260,932L256,859Z" fill="#bdcdbc" stroke="#bdcdbc" stroke-width="1.51"/><path d="M412,-112L348,-127L343,-19Z" fill="#e3d1c5" stroke="#e3d1c5" stroke-width="1.51"/><path d="M932,-133L348,-127L864,-125Z" fill="#ead4cd" stroke="#ead4cd" stroke-width="1.51"/><path d="M-12,302L-6,427L60,406Z" fill="#e9d9d1" stroke="#e9d9d1" stroke-width="1.51"/><path d="M76,150L63,247L146,150Z" fill="#e4d9cc" stroke="#e4d9cc" stroke-width="1.51"/><path d="M249,-116L238,-42L343,-19Z" fill="#e2d1c4" stroke="#e2d1c4" stroke-width="1.51"/><path d="M1345,669L1350,584L1292,592Z" fill="#b5d0bf" stroke="#b5d0bf" stroke-width="1.51"/><path d="M1292,592L1350,584L1293,477Z" fill="#bdd5c6" stroke="#bdd5c6" stroke-width="1.51"/><path d="M1301,336L1367,325L1302,245Z" fill="#c4d7c9" stroke="#c4d7c9" stroke-width="1.51"/><path d="M1345,669L1292,592L1287,654Z" fill="#b3cfbd" stroke="#b3cfbd" stroke-width="1.51"/><path d="M1382,498L1367,403L1293,477Z" fill="#c6d9cf" stroke="#c6d9cf" stroke-width="1.51"/><path d="M1389,78L1261,67L1259,129Z" fill="#c1cebd" stroke="#c1cebd" stroke-width="1.51"/><path d="M950,1026L1014,1027L917,930Z" fill="#abc9bb" stroke="#abc9bb" stroke-width="1.51"/><path d="M1280,824L1195,761L1200,836Z" fill="#a7c8b1" stroke="#a7c8b1" stroke-width="1.51"/><path d="M606,1030L1014,1027L950,1026Z" fill="#b0ccc1" stroke="#b0ccc1" stroke-width="1.51"/><path d="M1280,824L1283,769L1195,761Z" fill="#a7c8b1" stroke="#a7c8b1" stroke-width="1.51"/><path d="M1187,933L1200,836L1124,911Z" fill="#a3c6b0" stroke="#a3c6b0" stroke-width="1.51"/><path d="M1259,129L1261,67L1184,73Z" fill="#c5d1be" stroke="#c5d1be" stroke-width="1.51"/><path d="M1354,168L1259,129L1302,245Z" fill="#c2d4c3" stroke="#c2d4c3" stroke-width="1.51"/><path d="M1367,403L1367,325L1301,336Z" fill="#c4d7cb" stroke="#c4d7cb" stroke-width="1.51"/><path d="M265,1033L312,1020L260,932Z" fill="#b6cbbd" stroke="#b6cbbd" stroke-width="1.51"/><path d="M86,589L65,684L157,669Z" fill="#d5d5c5" stroke="#d5d5c5" stroke-width="1.51"/><path d="M4,663L65,684L86,589Z" fill="#d5d2c2" stroke="#d5d2c2" stroke-width="1.51"/><path d="M-23,562L86,589L62,472Z" fill="#e1d7cd" stroke="#e1d7cd" stroke-width="1.51"/><path d="M1191,-40L1090,57L1184,73Z" fill="#c9cfbb" stroke="#c9cfbb" stroke-width="1.51"/><path d="M1022,-108L1119,-104L932,-133Z" fill="#d2c8b9" stroke="#d2c8b9" stroke-width="1.51"/><path d="M1261,67L1191,-40L1184,73Z" fill="#c6cdba" stroke="#c6cdba" stroke-width="1.51"/><path d="M1367,403L1456,317L1367,325Z" fill="#c1d5ca" stroke="#c1d5ca" stroke-width="1.51"/><path d="M1350,584L1382,498L1293,477Z" fill="#bfd5c9" stroke="#bfd5c9" stroke-width="1.51"/><path d="M1433,478L1382,498L1450,600Z" fill="#bad2c6" stroke="#bad2c6" stroke-width="1.51"/><path d="M1283,769L1345,669L1287,654Z" fill="#adcbb7" stroke="#adcbb7" stroke-width="1.51"/><path d="M163,72L76,150L146,150Z" fill="#e3d8ca" stroke="#e3d8ca" stroke-width="1.51"/><path d="M81,44L76,150L163,72Z" fill="#e3d4c6" stroke="#e3d4c6" stroke-width="1.51"/><path d="M1367,325L1367,247L1302,245Z" fill="#c2d5c7" stroke="#c2d5c7" stroke-width="1.51"/><path d="M1456,317L1367,247L1367,325Z" fill="#bfd3c7" stroke="#bfd3c7" stroke-width="1.51"/><path d="M1283,769L1382,751L1345,669Z" fill="#a7c8b3" stroke="#a7c8b3" stroke-width="1.51"/><path d="M1124,989L1187,933L1124,911Z" fill="#a0c4af" stroke="#a0c4af" stroke-width="1.51"/><path d="M1014,1027L1124,989L1043,903Z" fill="#a5c6b4" stroke="#a5c6b4" stroke-width="1.51"/><path d="M1299,904L1280,824L1200,836Z" fill="#a1c4af" stroke="#a1c4af" stroke-width="1.51"/><path d="M260,932L312,1020L334,941Z" fill="#b9cebf" stroke="#b9cebf" stroke-width="1.51"/><path d="M418,1011L312,1020L516,1028Z" fill="#b7cdc1" stroke="#b7cdc1" stroke-width="1.51"/><path d="M265,1033L260,932L177,999Z" fill="#b6c9ba" stroke="#b6c9ba" stroke-width="1.51"/><path d="M60,406L-6,427L62,472Z" fill="#eadcd5" stroke="#eadcd5" stroke-width="1.51"/><path d="M-12,302L60,406L75,313Z" fill="#e8dad1" stroke="#e8dad1" stroke-width="1.51"/><path d="M-12,302L75,313L63,247Z" fill="#e6d9ce" stroke="#e6d9ce" stroke-width="1.51"/><path d="M1367,247L1354,168L1302,245Z" fill="#c1d3c4" stroke="#c1d3c4" stroke-width="1.51"/><path d="M1261,67L1273,-26L1191,-40Z" fill="#c4c9b7" stroke="#c4c9b7" stroke-width="1.51"/><path d="M238,-42L175,-47L163,72Z" fill="#e2d0c3" stroke="#e2d0c3" stroke-width="1.51"/><path d="M348,-127L249,-116L343,-19Z" fill="#e2d0c3" stroke="#e2d0c3" stroke-width="1.51"/><path d="M249,-116L175,-47L238,-42Z" fill="#e1cdbf" stroke="#e1cdbf" stroke-width="1.51"/><path d="M-6,427L-23,477L62,472Z" fill="#eadbd4" stroke="#eadbd4" stroke-width="1.51"/><path d="M-94,493L-23,477L-6,427Z" fill="#e9d7d0" stroke="#e9d7d0" stroke-width="1.51"/><path d="M-18,229L-12,302L63,247Z" fill="#e5d6cb" stroke="#e5d6cb" stroke-width="1.51"/><path d="M-18,229L63,247L76,150Z" fill="#e4d6ca" stroke="#e4d6ca" stroke-width="1.51"/><path d="M65,684L53,774L170,746Z" fill="#cbcebc" stroke="#cbcebc" stroke-width="1.51"/><path d="M7,751L53,774L65,684Z" fill="#cacbb8" stroke="#cacbb8" stroke-width="1.51"/><path d="M-23,562L4,663L86,589Z" fill="#d9d2c5" stroke="#d9d2c5" stroke-width="1.51"/><path d="M175,-47L81,44L163,72Z" fill="#e2d0c2" stroke="#e2d0c2" stroke-width="1.51"/><path d="M-23,477L-23,562L62,472Z" fill="#e5d7ce" stroke="#e5d7ce" stroke-width="1.51"/><path d="M1382,498L1433,478L1367,403Z" fill="#c3d7ce" stroke="#c3d7ce" stroke-width="1.51"/><path d="M1367,247L1469,163L1354,168Z" fill="#bdd1c2" stroke="#bdd1c2" stroke-width="1.51"/><path d="M1450,600L1382,498L1350,584Z" fill="#b7d1c3" stroke="#b7d1c3" stroke-width="1.51"/><path d="M1450,600L1350,584L1345,669Z" fill="#b1cdbd" stroke="#b1cdbd" stroke-width="1.51"/><path d="M1362,-22L1273,-26L1261,67Z" fill="#c0c7b6" stroke="#c0c7b6" stroke-width="1.51"/><path d="M1191,-40L1204,-112L1119,-104Z" fill="#c7c4b1" stroke="#c7c4b1" stroke-width="1.51"/><path d="M312,1020L265,1033L516,1028Z" fill="#b5cbbf" stroke="#b5cbbf" stroke-width="1.51"/><path d="M516,1028L265,1033L606,1030Z" fill="#b7cdc2" stroke="#b7cdc2" stroke-width="1.51"/><path d="M606,1030L1286,1032L1014,1027Z" fill="#a8c7b9" stroke="#a8c7b9" stroke-width="1.51"/><path d="M147,938L256,859L178,821Z" fill="#c0cdbc" stroke="#c0cdbc" stroke-width="1.51"/><path d="M1259,-90L1204,-112L1191,-40Z" fill="#c5c3b0" stroke="#c5c3b0" stroke-width="1.51"/><path d="M1119,-104L1204,-112L932,-133Z" fill="#cdc5b4" stroke="#cdc5b4" stroke-width="1.51"/><path d="M53,774L86,858L178,821Z" fill="#c4cbb8" stroke="#c4cbb8" stroke-width="1.51"/><path d="M64,907L86,858L-13,828Z" fill="#c0c4b3" stroke="#c0c4b3" stroke-width="1.51"/><path d="M86,858L147,938L178,821Z" fill="#c0c9b8" stroke="#c0c9b8" stroke-width="1.51"/><path d="M-12,302L-87,319L-6,427Z" fill="#e8d5cd" stroke="#e8d5cd" stroke-width="1.51"/><path d="M-31,141L-18,229L76,150Z" fill="#e3d3c7" stroke="#e3d3c7" stroke-width="1.51"/><path d="M1014,1027L1181,1013L1124,989Z" fill="#9ec2b0" stroke="#9ec2b0" stroke-width="1.51"/><path d="M1124,989L1181,1013L1187,933Z" fill="#9dc1ad" stroke="#9dc1ad" stroke-width="1.51"/><path d="M1187,933L1299,904L1200,836Z" fill="#a0c3ae" stroke="#a0c3ae" stroke-width="1.51"/><path d="M1353,843L1283,769L1280,824Z" fill="#a2c4af" stroke="#a2c4af" stroke-width="1.51"/><path d="M1353,843L1382,751L1283,769Z" fill="#a2c5af" stroke="#a2c5af" stroke-width="1.51"/><path d="M1286,1032L1299,904L1187,933Z" fill="#99bfab" stroke="#99bfab" stroke-width="1.51"/><path d="M-13,828L7,751L-96,769Z" fill="#c6c4b1" stroke="#c6c4b1" stroke-width="1.51"/><path d="M4,663L7,751L65,684Z" fill="#cecdbb" stroke="#cecdbb" stroke-width="1.51"/><path d="M1362,-22L1259,-90L1273,-26Z" fill="#c1c3b1" stroke="#c1c3b1" stroke-width="1.51"/><path d="M1476,404L1456,317L1367,403Z" fill="#c0d4ca" stroke="#c0d4ca" stroke-width="1.51"/><path d="M1461,680L1450,600L1345,669Z" fill="#accab9" stroke="#accab9" stroke-width="1.51"/><path d="M1433,478L1476,404L1367,403Z" fill="#c2d6cd" stroke="#c2d6cd" stroke-width="1.51"/><path d="M1273,-26L1259,-90L1191,-40Z" fill="#c4c4b2" stroke="#c4c4b2" stroke-width="1.51"/><path d="M1389,78L1259,129L1354,168Z" fill="#bfd0bf" stroke="#bfd0bf" stroke-width="1.51"/><path d="M147,938L177,999L260,932Z" fill="#b9c8b9" stroke="#b9c8b9" stroke-width="1.51"/><path d="M71,1004L177,999L147,938Z" fill="#b7c3b4" stroke="#b7c3b4" stroke-width="1.51"/><path d="M64,907L147,938L86,858Z" fill="#bdc6b5" stroke="#bdc6b5" stroke-width="1.51"/><path d="M1299,904L1353,843L1280,824Z" fill="#9ec2ae" stroke="#9ec2ae" stroke-width="1.51"/><path d="M1382,751L1461,680L1345,669Z" fill="#a7c8b5" stroke="#a7c8b5" stroke-width="1.51"/><path d="M1469,163L1389,78L1354,168Z" fill="#bccfbe" stroke="#bccfbe" stroke-width="1.51"/><path d="M1532,489L1476,404L1433,478Z" fill="#bed4cc" stroke="#bed4cc" stroke-width="1.51"/><path d="M-10,82L-31,141L76,150Z" fill="#e2d1c3" stroke="#e2d1c3" stroke-width="1.51"/><path d="M-18,229L-87,319L-12,302Z" fill="#e6d4c9" stroke="#e6d4c9" stroke-width="1.51"/><path d="M-23,477L-94,493L-23,562Z" fill="#e3d4cb" stroke="#e3d4cb" stroke-width="1.51"/><path d="M-10,82L76,150L81,44Z" fill="#e2d0c2" stroke="#e2d0c2" stroke-width="1.51"/><path d="M-10,82L81,44L-6,-8Z" fill="#e1cabc" stroke="#e1cabc" stroke-width="1.51"/><path d="M1456,317L1469,252L1367,247Z" fill="#bdd2c5" stroke="#bdd2c5" stroke-width="1.51"/><path d="M1534,335L1469,252L1456,317Z" fill="#bbd0c5" stroke="#bbd0c5" stroke-width="1.51"/><path d="M-13,828L86,858L53,774Z" fill="#c3c7b5" stroke="#c3c7b5" stroke-width="1.51"/><path d="M58,-47L81,44L175,-47Z" fill="#e1cabd" stroke="#e1cabd" stroke-width="1.51"/><path d="M-93,222L-87,319L-18,229Z" fill="#e5d1c6" stroke="#e5d1c6" stroke-width="1.51"/><path d="M-23,562L-120,600L4,663Z" fill="#d8cec0" stroke="#d8cec0" stroke-width="1.51"/><path d="M249,-116L139,-128L175,-47Z" fill="#e1c8bb" stroke="#e1c8bb" stroke-width="1.51"/><path d="M348,-127L139,-128L249,-116Z" fill="#e1c9bc" stroke="#e1c9bc" stroke-width="1.51"/><path d="M932,-133L139,-128L348,-127Z" fill="#e5cfc5" stroke="#e5cfc5" stroke-width="1.51"/><path d="M-114,385L-94,493L-6,427Z" fill="#ead6ce" stroke="#ead6ce" stroke-width="1.51"/><path d="M7,751L-13,828L53,774Z" fill="#c6c7b4" stroke="#c6c7b4" stroke-width="1.51"/><path d="M1450,600L1532,489L1433,478Z" fill="#b7d0c5" stroke="#b7d0c5" stroke-width="1.51"/><path d="M1469,733L1461,680L1382,751Z" fill="#a3c5b1" stroke="#a3c5b1" stroke-width="1.51"/><path d="M94,-100L58,-47L175,-47Z" fill="#e1c6b9" stroke="#e1c6b9" stroke-width="1.51"/><path d="M1450,46L1362,-22L1389,78Z" fill="#bbc6b6" stroke="#bbc6b6" stroke-width="1.51"/><path d="M1389,78L1362,-22L1261,67Z" fill="#bfc9b8" stroke="#bfc9b8" stroke-width="1.51"/><path d="M139,-128L94,-100L175,-47Z" fill="#e0c5b8" stroke="#e0c5b8" stroke-width="1.51"/><path d="M-102,683L7,751L4,663Z" fill="#cec9b8" stroke="#cec9b8" stroke-width="1.51"/><path d="M-87,319L-114,385L-6,427Z" fill="#e8d4cc" stroke="#e8d4cc" stroke-width="1.51"/><path d="M-93,222L-114,385L-87,319Z" fill="#e6d1c7" stroke="#e6d1c7" stroke-width="1.51"/><path d="M1469,252L1469,163L1367,247Z" fill="#bcd0c2" stroke="#bcd0c2" stroke-width="1.51"/><path d="M1540,251L1469,163L1469,252Z" fill="#b8cec1" stroke="#b8cec1" stroke-width="1.51"/><path d="M-89,147L-31,141L-115,69Z" fill="#e1cbbe" stroke="#e1cbbe" stroke-width="1.51"/><path d="M-89,147L-93,222L-31,141Z" fill="#e2cec1" stroke="#e2cec1" stroke-width="1.51"/><path d="M-31,141L-93,222L-18,229Z" fill="#e3d1c4" stroke="#e3d1c4" stroke-width="1.51"/><path d="M1547,584L1532,489L1450,600Z" fill="#b1cdc1" stroke="#b1cdc1" stroke-width="1.51"/><path d="M1467,836L1469,733L1382,751Z" fill="#9ec2ae" stroke="#9ec2ae" stroke-width="1.51"/><path d="M1467,836L1382,751L1353,843Z" fill="#9dc1ad" stroke="#9dc1ad" stroke-width="1.51"/><path d="M1476,404L1534,335L1456,317Z" fill="#bcd1c7" stroke="#bcd1c7" stroke-width="1.51"/><path d="M1547,584L1450,600L1543,644Z" fill="#abc9bb" stroke="#abc9bb" stroke-width="1.51"/><path d="M58,-47L-6,-8L81,44Z" fill="#e1c7ba" stroke="#e1c7ba" stroke-width="1.51"/><path d="M0,-128L-6,-8L58,-47Z" fill="#e0c1b4" stroke="#e0c1b4" stroke-width="1.51"/><path d="M1299,904L1375,939L1353,843Z" fill="#99beac" stroke="#99beac" stroke-width="1.51"/><path d="M1181,1013L1286,1032L1187,933Z" fill="#98beab" stroke="#98beab" stroke-width="1.51"/><path d="M1014,1027L1286,1032L1181,1013Z" fill="#99beac" stroke="#99beac" stroke-width="1.51"/><path d="M265,1033L1286,1032L606,1030Z" fill="#bbd2cb" stroke="#bbd2cb" stroke-width="1.51"/><path d="M-94,493L-120,600L-23,562Z" fill="#dfcfc5" stroke="#dfcfc5" stroke-width="1.51"/><path d="M-114,385L-120,600L-94,493Z" fill="#e5d1c9" stroke="#e5d1c9" stroke-width="1.51"/><path d="M-120,600L-102,683L4,663Z" fill="#d4cabb" stroke="#d4cabb" stroke-width="1.51"/><path d="M1550,388L1534,335L1476,404Z" fill="#bbd1c8" stroke="#bbd1c8" stroke-width="1.51"/><path d="M-115,69L-31,141L-10,82Z" fill="#e1cabd" stroke="#e1cabd" stroke-width="1.51"/><path d="M-93,222L-115,69L-114,385Z" fill="#e3cdc2" stroke="#e3cdc2" stroke-width="1.51"/><path d="M1354,990L1375,939L1299,904Z" fill="#95bcaa" stroke="#95bcaa" stroke-width="1.51"/><path d="M1469,163L1450,46L1389,78Z" fill="#b9caba" stroke="#b9caba" stroke-width="1.51"/><path d="M1472,-5L1450,46L1521,65Z" fill="#b7c3b4" stroke="#b7c3b4" stroke-width="1.51"/><path d="M-19,934L64,907L-13,828Z" fill="#bec1b0" stroke="#bec1b0" stroke-width="1.51"/><path d="M-19,934L71,1004L64,907Z" fill="#b9bfb0" stroke="#b9bfb0" stroke-width="1.51"/><path d="M64,907L71,1004L147,938Z" fill="#b9c2b3" stroke="#b9c2b3" stroke-width="1.51"/><path d="M177,999L71,1004L265,1033Z" fill="#b5c4b6" stroke="#b5c4b6" stroke-width="1.51"/><path d="M1534,335L1540,251L1469,252Z" fill="#b8cec3" stroke="#b8cec3" stroke-width="1.51"/><path d="M1532,489L1550,388L1476,404Z" fill="#bcd3cb" stroke="#bcd3cb" stroke-width="1.51"/><path d="M1286,1032L1354,990L1299,904Z" fill="#94bcaa" stroke="#94bcaa" stroke-width="1.51"/><path d="M1543,644L1461,680L1532,755Z" fill="#a2c4b2" stroke="#a2c4b2" stroke-width="1.51"/><path d="M1543,644L1450,600L1461,680Z" fill="#a9c8b9" stroke="#a9c8b9" stroke-width="1.51"/><path d="M1532,489L1547,584L1550,388Z" fill="#b7d0c7" stroke="#b7d0c7" stroke-width="1.51"/><path d="M1467,836L1353,843L1457,919Z" fill="#97bdaa" stroke="#97bdaa" stroke-width="1.51"/><path d="M1550,388L1540,251L1534,335Z" fill="#b8cfc5" stroke="#b8cfc5" stroke-width="1.51"/><path d="M-102,683L-96,769L7,751Z" fill="#cac5b2" stroke="#cac5b2" stroke-width="1.51"/><path d="M-120,600L-96,769L-102,683Z" fill="#d0c6b5" stroke="#d0c6b5" stroke-width="1.51"/><path d="M1457,919L1353,843L1375,939Z" fill="#96bcab" stroke="#96bcab" stroke-width="1.51"/><path d="M1532,755L1461,680L1469,733Z" fill="#a0c3b0" stroke="#a0c3b0" stroke-width="1.51"/><path d="M1362,-22L1371,-117L1259,-90Z" fill="#bfbfae" stroke="#bfbfae" stroke-width="1.51"/><path d="M1259,-90L1371,-117L1204,-112Z" fill="#c1bead" stroke="#c1bead" stroke-width="1.51"/><path d="M1204,-112L1371,-117L932,-133Z" fill="#c7c1ae" stroke="#c7c1ae" stroke-width="1.51"/><path d="M1440,-114L1371,-117L1362,-22Z" fill="#bbbcac" stroke="#bbbcac" stroke-width="1.51"/><path d="M-88,822L-19,934L-13,828Z" fill="#c0bfae" stroke="#c0bfae" stroke-width="1.51"/><path d="M-96,769L-88,822L-13,828Z" fill="#c4c1ae" stroke="#c4c1ae" stroke-width="1.51"/><path d="M1521,65L1450,46L1469,163Z" fill="#b7c8b9" stroke="#b7c8b9" stroke-width="1.51"/><path d="M1450,46L1472,-5L1362,-22Z" fill="#bac2b3" stroke="#bac2b3" stroke-width="1.51"/><path d="M1467,836L1532,755L1469,733Z" fill="#9ac0ac" stroke="#9ac0ac" stroke-width="1.51"/><path d="M1530,858L1532,755L1467,836Z" fill="#96bdaa" stroke="#96bdaa" stroke-width="1.51"/><path d="M-85,-17L-115,69L-10,82Z" fill="#e0c5b8" stroke="#e0c5b8" stroke-width="1.51"/><path d="M-89,147L-115,69L-93,222Z" fill="#e1ccbf" stroke="#e1ccbf" stroke-width="1.51"/><path d="M-114,385L-115,69L-120,600Z" fill="#e7d0c8" stroke="#e7d0c8" stroke-width="1.51"/><path d="M-85,-17L-10,82L-6,-8Z" fill="#e0c4b8" stroke="#e0c4b8" stroke-width="1.51"/><path d="M1466,1010L1457,919L1375,939Z" fill="#8fb8a8" stroke="#8fb8a8" stroke-width="1.51"/><path d="M94,-100L0,-128L58,-47Z" fill="#dfc0b3" stroke="#dfc0b3" stroke-width="1.51"/><path d="M139,-128L0,-128L94,-100Z" fill="#dfbfb3" stroke="#dfbfb3" stroke-width="1.51"/><path d="M932,-133L0,-128L139,-128Z" fill="#e3cdc1" stroke="#e3cdc1" stroke-width="1.51"/><path d="M1556,125L1521,65L1469,163Z" fill="#b5c8ba" stroke="#b5c8ba" stroke-width="1.51"/><path d="M-80,-93L-85,-17L-6,-8Z" fill="#dfbeb1" stroke="#dfbeb1" stroke-width="1.51"/><path d="M1540,251L1556,125L1469,163Z" fill="#b6ccbe" stroke="#b6ccbe" stroke-width="1.51"/><path d="M1550,388L1556,125L1540,251Z" fill="#b6cdc2" stroke="#b6cdc2" stroke-width="1.51"/><path d="M1547,584L1556,125L1550,388Z" fill="#b9cfc7" stroke="#b9cfc7" stroke-width="1.51"/><path d="M-107,936L-24,996L-19,934Z" fill="#b8baab" stroke="#b8baab" stroke-width="1.51"/><path d="M-19,934L-24,996L71,1004Z" fill="#b7bcad" stroke="#b7bcad" stroke-width="1.51"/><path d="M71,1004L-106,993L265,1033Z" fill="#b4beb0" stroke="#b4beb0" stroke-width="1.51"/><path d="M1472,-5L1440,-114L1362,-22Z" fill="#babeae" stroke="#babeae" stroke-width="1.51"/><path d="M1536,-22L1440,-114L1472,-5Z" fill="#b7bcad" stroke="#b7bcad" stroke-width="1.51"/><path d="M1536,-22L1472,-5L1521,65Z" fill="#b5c0b1" stroke="#b5c0b1" stroke-width="1.51"/><path d="M1457,919L1530,858L1467,836Z" fill="#93bba9" stroke="#93bba9" stroke-width="1.51"/><path d="M1532,755L1530,858L1543,644Z" fill="#9abfac" stroke="#9abfac" stroke-width="1.51"/><path d="M1543,644L1531,1032L1547,584Z" fill="#99bfac" stroke="#99bfac" stroke-width="1.51"/><path d="M0,-128L-80,-93L-6,-8Z" fill="#dfbdb0" stroke="#dfbdb0" stroke-width="1.51"/><path d="M-85,-17L-80,-93L-115,69Z" fill="#dfbeb1" stroke="#dfbeb1" stroke-width="1.51"/><path d="M-88,822L-107,936L-19,934Z" fill="#bdbcab" stroke="#bdbcab" stroke-width="1.51"/><path d="M-96,769L-107,936L-88,822Z" fill="#c1bdab" stroke="#c1bdab" stroke-width="1.51"/><path d="M-120,600L-107,936L-96,769Z" fill="#c6c0ad" stroke="#c6c0ad" stroke-width="1.51"/><path d="M1556,125L1536,-22L1521,65Z" fill="#b3c2b4" stroke="#b3c2b4" stroke-width="1.51"/><path d="M1457,919L1530,924L1530,858Z" fill="#8fb8a8" stroke="#8fb8a8" stroke-width="1.51"/><path d="M1354,990L1466,1010L1375,939Z" fill="#8fb8a8" stroke="#8fb8a8" stroke-width="1.51"/><path d="M1286,1032L1466,1010L1354,990Z" fill="#8eb7a7" stroke="#8eb7a7" stroke-width="1.51"/><path d="M1466,1010L1530,924L1457,919Z" fill="#8cb6a7" stroke="#8cb6a7" stroke-width="1.51"/><path d="M1530,858L1530,924L1543,644Z" fill="#95bcaa" stroke="#95bcaa" stroke-width="1.51"/><path d="M-107,936L-106,993L-24,996Z" fill="#b7b7a8" stroke="#b7b7a8" stroke-width="1.51"/><path d="M-24,996L-106,993L71,1004Z" fill="#b5b9ab" stroke="#b5b9ab" stroke-width="1.51"/><path d="M-120,600L-106,993L-107,936Z" fill="#c1bcab" stroke="#c1bcab" stroke-width="1.51"/><path d="M1466,1010L1531,1032L1530,924Z" fill="#88b3a4" stroke="#88b3a4" stroke-width="1.51"/><path d="M1530,924L1531,1032L1543,644Z" fill="#91b9a8" stroke="#91b9a8" stroke-width="1.51"/><path d="M1286,1032L1531,1032L1466,1010Z" fill="#8ab4a5" stroke="#8ab4a5" stroke-width="1.51"/><path d="M265,1033L1531,1032L1286,1032Z" fill="#a3c4b4" stroke="#a3c4b4" stroke-width="1.51"/><path d="M1536,-22L1554,-129L1440,-114Z" fill="#b5b8a9" stroke="#b5b8a9" stroke-width="1.51"/><path d="M1440,-114L1554,-129L1371,-117Z" fill="#b7b7a8" stroke="#b7b7a8" stroke-width="1.51"/><path d="M1371,-117L1554,-129L932,-133Z" fill="#c1bdab" stroke="#c1bdab" stroke-width="1.51"/><path d="M1556,125L1554,-129L1536,-22Z" fill="#b3bdaf" stroke="#b3bdaf" stroke-width="1.51"/></svg>
\ No newline at end of file
diff --git a/src/client/assets/welcome-bg.svg b/src/client/assets/welcome-bg.svg
deleted file mode 100644
index ba8cd8dc0a..0000000000
--- a/src/client/assets/welcome-bg.svg
+++ /dev/null
@@ -1,579 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="1920"
-   height="1080"
-   viewBox="0 0 507.99999 285.75001"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.1 r15371"
-   sodipodi:docname="welcome-bg.svg">
-  <defs
-     id="defs2">
-    <pattern
-       inkscape:collect="always"
-       xlink:href="#Checkerboard"
-       id="pattern7194"
-       patternTransform="scale(1.3152942)" />
-    <linearGradient
-       id="linearGradient7169"
-       inkscape:collect="always">
-      <stop
-         id="stop7165"
-         offset="0"
-         style="stop-color:#eaeaea;stop-opacity:1" />
-      <stop
-         id="stop7167"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient7044">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop7040" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="1"
-         id="stop7042" />
-    </linearGradient>
-    <pattern
-       inkscape:collect="always"
-       xlink:href="#Checkerboard"
-       id="pattern7010"
-       patternTransform="matrix(1.673813,0,0,1.673813,-177.6001,-146.38611)" />
-    <pattern
-       inkscape:stockid="Checkerboard"
-       id="Checkerboard"
-       patternTransform="translate(0,0) scale(10,10)"
-       height="2"
-       width="2"
-       patternUnits="userSpaceOnUse"
-       inkscape:collect="always"
-       inkscape:isstock="true">
-      <rect
-         id="rect6201"
-         height="1"
-         width="1"
-         y="0"
-         x="0"
-         style="fill:black;stroke:none" />
-      <rect
-         id="rect6203"
-         height="1"
-         width="1"
-         y="1"
-         x="1"
-         style="fill:black;stroke:none" />
-    </pattern>
-    <linearGradient
-       id="linearGradient5406"
-       osb:paint="solid">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop5404" />
-    </linearGradient>
-    <pattern
-       patternUnits="userSpaceOnUse"
-       width="15.999999"
-       height="16.000025"
-       patternTransform="matrix(0.26458333,0,0,0.26458333,-16.933332,263.1333)"
-       id="pattern6465">
-      <path
-         d="m 8.0000542,8.0000126 h 7.9998878 c 3e-5,0 5.7e-5,3.78e-5 5.7e-5,3.78e-5 V 15.99995 c 0,3.7e-5 -2.7e-5,7.5e-5 -5.7e-5,7.5e-5 H 8.0000542 c -3.03e-5,0 -5.67e-5,-3.8e-5 -5.67e-5,-7.5e-5 V 8.0000504 c 0,0 2.64e-5,-3.78e-5 5.67e-5,-3.78e-5 z M 5.6692913e-5,0 H 7.9999408 c 3.02e-5,0 5.67e-5,3.7795275e-5 5.67e-5,7.5590551e-5 V 7.999937 c 0,3.78e-5 -2.65e-5,7.56e-5 -5.67e-5,7.56e-5 H 5.6692913e-5 C 2.2677165e-5,8.0000126 0,7.9999748 0,7.999937 V 7.5590551e-5 C 0,3.7795276e-5 2.2677165e-5,0 5.6692913e-5,0 Z"
-         style="opacity:1;fill:#db1545;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="rect6445-2"
-         inkscape:connector-curvature="0" />
-    </pattern>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7044"
-       id="linearGradient6476"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.223659,0,0,2.5556636,-579.27357,808.39)"
-       x1="86.490868"
-       y1="-216.62756"
-       x2="176.77992"
-       y2="-216.62756" />
-    <mask
-       maskUnits="userSpaceOnUse"
-       id="mask6472">
-      <rect
-         transform="rotate(-90)"
-         y="-0.91986513"
-         x="-300.45657"
-         height="511.36566"
-         width="291.06116"
-         id="rect6474"
-         style="opacity:1;fill:url(#linearGradient6476);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.92238116;stroke-miterlimit:4;stroke-dasharray:none" />
-    </mask>
-    <pattern
-       patternUnits="userSpaceOnUse"
-       width="2340.7208"
-       height="2340.7236"
-       patternTransform="matrix(0.26458333,0,0,0.26458333,-63.499801,-58.601683)"
-       id="pattern7142">
-      <path
-         d="m 1170.3684,1170.3628 h 1170.3448 c 0,0 0.01,0 0.01,0 v 1170.3457 c 0,0 0,0.011 -0.01,0.011 H 1170.3684 c 0,0 -0.01,0 -0.01,-0.011 v -1170.344 c 0,0 0,0 0.01,0 z M 0.00869291,1.1338583e-5 H 1170.352 c 0,0 0.01,0.0052913414 0.01,0.01096063142 V 1170.3511 c 0,0 0,0.011 -0.01,0.011 H 0.00869291 C 0.00340157,1170.3625 0,1170.3549 0,1170.3511 V 0.01096063 C 0,0.00566929 0.00312945,0 0.00869291,0 Z"
-         style="opacity:1;fill:#763971;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2340.72119141;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path7135"
-         inkscape:connector-curvature="0" />
-    </pattern>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7169"
-       id="linearGradient7157"
-       x1="-3.631536"
-       y1="155.11069"
-       x2="511.52777"
-       y2="155.11069"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.184742,0,0,6.5696504,-17.948376,-1979.8074)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7169"
-       id="linearGradient7200"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.57804632,0,0,1.73822,6.5011419,-523.82404)"
-       x1="-3.631536"
-       y1="155.11069"
-       x2="511.52777"
-       y2="155.11069" />
-    <mask
-       maskUnits="userSpaceOnUse"
-       id="mask7196">
-      <rect
-         transform="rotate(90)"
-         y="-512.56537"
-         x="4.4019437"
-         height="516.7157"
-         width="297.78595"
-         id="rect7198"
-         style="opacity:1;fill:url(#linearGradient7200);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.1217103;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    </mask>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#1e1d65"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.84705882"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.79170474"
-     inkscape:cx="1093.7227"
-     inkscape:cy="695.27372"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer5"
-     showgrid="true"
-     units="px"
-     inkscape:pagecheckerboard="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1017"
-     inkscape:window-x="-8"
-     inkscape:window-y="1072"
-     inkscape:window-maximized="1"
-     objecttolerance="1"
-     guidetolerance="10000"
-     gridtolerance="10000"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:snap-bbox-midpoints="true"
-     showguides="false"
-     inkscape:lockguides="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid6443"
-       spacingx="2.1166667"
-       spacingy="2.1166667"
-       empspacing="4"
-       color="#3f3fff"
-       opacity="0.1254902"
-       enabled="false" />
-    <sodipodi:guide
-       position="-69.219003,3.872392"
-       orientation="1,0"
-       id="guide6508"
-       inkscape:locked="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="レイヤー 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-11.249983)"
-     style="display:inline"
-     sodipodi:insensitive="true">
-    <rect
-       style="display:inline;opacity:0.2;fill:url(#pattern7194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect7178"
-       width="568.07599"
-       height="367.82269"
-       x="-37.871731"
-       y="-52.665051"
-       mask="url(#mask7196)" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="レイヤー 2"
-     style="display:inline">
-    <rect
-       transform="translate(0,-11.249983)"
-       style="opacity:0.5;fill:none;stroke:none;stroke-width:140.99996948"
-       width="596.8999"
-       height="596.90082"
-       x="-63.49987"
-       y="-58.600021"
-       id="rect6468"
-       mask="url(#mask6472)" />
-    <path
-       transform="translate(0,-11.249983)"
-       sodipodi:type="star"
-       style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6921"
-       sodipodi:sides="4"
-       sodipodi:cx="117.63232"
-       sodipodi:cy="102.13793"
-       sodipodi:r1="5.7652407"
-       sodipodi:r2="2.8826203"
-       sodipodi:arg1="1.4464413"
-       sodipodi:arg2="2.2318395"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 118.34741,107.85865 -2.48485,-3.44532 -3.95096,-1.56031 3.44531,-2.48485 1.56032,-3.950959 2.48484,3.445318 3.95097,1.560311 -3.44532,2.48485 z"
-       inkscape:transform-center-x="1.481982e-006"
-       inkscape:transform-center-y="-1.1450451e-006" />
-    <path
-       transform="translate(0,-11.249983)"
-       sodipodi:type="star"
-       style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6923"
-       sodipodi:sides="4"
-       sodipodi:cx="317.5"
-       sodipodi:cy="75.679596"
-       sodipodi:r1="3.949214"
-       sodipodi:r2="1.974607"
-       sodipodi:arg1="1.6614562"
-       sodipodi:arg2="2.4468544"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 317.14246,79.612591 -1.1594,-2.668882 -2.41606,-1.621658 2.66889,-1.15939 1.62165,-2.41606 1.1594,2.668882 2.41606,1.621658 -2.66889,1.15939 z"
-       inkscape:transform-center-x="4.0000001e-006" />
-    <path
-       transform="translate(0,-11.249983)"
-       sodipodi:type="star"
-       style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6925"
-       sodipodi:sides="4"
-       sodipodi:cx="230.97409"
-       sodipodi:cy="57.802349"
-       sodipodi:r1="2.2613134"
-       sodipodi:r2="1.1306567"
-       sodipodi:arg1="1.2490458"
-       sodipodi:arg2="2.0344439"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 231.68918,59.947619 -1.22073,-1.13398 -1.63963,-0.2962 1.13398,-1.220735 0.2962,-1.639625 1.22074,1.13398 1.63962,0.2962 -1.13398,1.220735 z"
-       inkscape:transform-center-x="2.9099099e-006" />
-    <path
-       transform="translate(0,-11.249983)"
-       sodipodi:type="star"
-       style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6927"
-       sodipodi:sides="4"
-       sodipodi:cx="260.65033"
-       sodipodi:cy="106.42847"
-       sodipodi:r1="1.59899"
-       sodipodi:r2="0.79949504"
-       sodipodi:arg1="2.0344439"
-       sodipodi:arg2="2.8198421"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 259.93524,107.85865 -0.0434,-1.17736 -0.67171,-0.96791 1.17736,-0.0434 0.96791,-0.67171 0.0434,1.17735 0.67171,0.96792 -1.17736,0.0434 z"
-       inkscape:transform-center-x="3.2837838e-006"
-       inkscape:transform-center-y="-1.1990991e-006" />
-    <path
-       sodipodi:type="star"
-       style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6925-2"
-       sodipodi:sides="4"
-       sodipodi:cx="87.956078"
-       sodipodi:cy="127.16609"
-       sodipodi:r1="2.2613134"
-       sodipodi:r2="1.1306567"
-       sodipodi:arg1="1.2490458"
-       sodipodi:arg2="2.0344439"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 88.671168,129.31136 -1.220735,-1.13398 -1.639626,-0.2962 1.13398,-1.22073 0.296201,-1.63963 1.220735,1.13398 1.639625,0.2962 -1.13398,1.22074 z"
-       inkscape:transform-center-x="2.4830149e-006"
-       transform="matrix(0.91666666,0,0,1,7.1509006,-11.249983)" />
-    <ellipse
-       style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.06383465"
-       id="path5313-3-7"
-       cx="178.44102"
-       cy="110.95996"
-       rx="21.691566"
-       ry="5.0825601"
-       transform="rotate(-1.570553,-410.38805,-5.6250559)" />
-    <ellipse
-       style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.08063243"
-       id="path5313-3-7-5"
-       cx="200.1326"
-       cy="116.80371"
-       rx="27.399597"
-       ry="6.4200115"
-       transform="rotate(-1.570553,-410.38805,-5.6250559)" />
-    <ellipse
-       style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.06734787"
-       id="path5313-3-7-2"
-       cx="-429.23041"
-       cy="90.631134"
-       rx="24.144913"
-       ry="5.0825605"
-       transform="matrix(-0.99537478,-0.09606802,-0.09606802,0.99537478,0,-11.249983)" />
-    <ellipse
-       style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.08507013"
-       id="path5313-3-7-5-9"
-       cx="-405.08548"
-       cy="96.474884"
-       rx="30.498529"
-       ry="6.4200115"
-       transform="matrix(-0.99537478,-0.09606802,-0.09606802,0.99537478,0,-11.249983)" />
-    <ellipse
-       style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.05208009"
-       id="path5313-3-7-2-9"
-       cx="-46.428764"
-       cy="163.90004"
-       rx="18.893074"
-       ry="3.884198"
-       transform="matrix(-0.99073724,0.13579293,0.14607844,0.98927301,0,-11.249983)" />
-    <ellipse
-       style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.06578472"
-       id="path5313-3-7-5-9-1"
-       cx="-27.535677"
-       cy="168.36595"
-       rx="23.864695"
-       ry="4.9063048"
-       transform="matrix(-0.99073724,0.13579293,0.14607844,0.98927301,0,-11.249983)" />
-    <path
-       transform="translate(0,-11.249983)"
-       sodipodi:type="star"
-       style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6923-9"
-       sodipodi:sides="4"
-       sodipodi:cx="459.82239"
-       sodipodi:cy="139.8455"
-       sodipodi:r1="3.949214"
-       sodipodi:r2="1.9746071"
-       sodipodi:arg1="1.6614562"
-       sodipodi:arg2="2.4468544"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 459.46484,143.7785 -1.15939,-2.66888 -2.41606,-1.62166 2.66889,-1.15939 1.62165,-2.41606 1.15939,2.66888 2.41606,1.62166 -2.66888,1.15939 z"
-       inkscape:transform-center-x="4.0000001e-006" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.81509405;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5229"
-       cx="192.18326"
-       cy="74.677902"
-       r="2.7216933" />
-    <path
-       sodipodi:type="star"
-       style="fill:#ffffff;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6923-8"
-       sodipodi:sides="4"
-       sodipodi:cx="53.989292"
-       sodipodi:cy="88.908768"
-       sodipodi:r1="3.949214"
-       sodipodi:r2="1.9746071"
-       sodipodi:arg1="1.6614562"
-       sodipodi:arg2="2.4468544"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 53.631747,92.841763 -1.15939,-2.668883 -2.41606,-1.621657 2.668883,-1.159391 1.621657,-2.41606 1.15939,2.668883 2.416061,1.621658 -2.668883,1.15939 z"
-       inkscape:transform-center-x="2.0634674e-006"
-       transform="matrix(0.61390676,-0.48689202,0.48689202,0.61390676,-23.159158,48.648961)"
-       inkscape:transform-center-y="1.4320049e-006" />
-    <path
-       sodipodi:type="star"
-       style="fill:#ffffff;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path6923-8-3"
-       sodipodi:sides="4"
-       sodipodi:cx="53.989292"
-       sodipodi:cy="88.908768"
-       sodipodi:r1="3.949214"
-       sodipodi:r2="1.9746071"
-       sodipodi:arg1="1.6614562"
-       sodipodi:arg2="2.4468544"
-       inkscape:flatsided="false"
-       inkscape:rounded="0"
-       inkscape:randomized="0"
-       d="m 53.631747,92.841763 -1.15939,-2.668883 -2.41606,-1.621657 2.668883,-1.159391 1.621657,-2.41606 1.15939,2.668883 2.416061,1.621658 -2.668883,1.15939 z"
-       inkscape:transform-center-x="3.0260172e-006"
-       transform="matrix(0.58032639,0.43093706,-0.43093706,0.58032639,446.58431,23.35553)"
-       inkscape:transform-center-y="-1.3594204e-006" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28035584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5229-6"
-       cx="347.17841"
-       cy="36.709366"
-       r="0.9361406" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28035584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5229-6-5"
-       cx="116.0927"
-       cy="42.136036"
-       r="0.9361406" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.55002564;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5229-0"
-       cx="456.28247"
-       cy="47.488548"
-       r="1.8365992" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer5"
-     inkscape:label="レイヤー 4"
-     style="display:none">
-    <path
-       transform="translate(0,-11.249983)"
-       style="display:inline;fill:#ffff7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none"
-       d="m 377.25876,69.781182 a 18.234796,18.234796 0 0 1 8.1747,15.19442 18.234796,18.234796 0 0 1 -18.23455,18.235058 18.234796,18.234796 0 0 1 -10.14098,-3.08921 20.380066,20.380066 0 0 0 17.64905,10.2402 20.380066,20.380066 0 0 0 20.38015,-20.380152 20.380066,20.380066 0 0 0 -17.82837,-20.200316 z"
-       id="path6914"
-       inkscape:connector-curvature="0" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer4"
-     inkscape:label="レイヤー 3"
-     style="display:none">
-    <circle
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.36438358;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5306"
-       cx="168.31279"
-       cy="2.1908164"
-       r="36.253109" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.39123487px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 201.1259,19.428383 2.66976,2.617062 1.21734,-1.978474 -0.34264,5.194221 -4.15215,2.110811 1.0283,-1.928856 -2.76172,-2.210044 z"
-       id="path5168"
-       inkscape:connector-curvature="0" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89719725px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 196.25421,26.631949 6.0286,8.817373 -3.70059,3.384671 -1.84127,-4.638447 -2.48924,2.916491 -2.23471,-6.507119 z"
-       id="path5174"
-       inkscape:connector-curvature="0" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000500;fill-opacity:1;stroke:none;stroke-width:0.05121958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 187.00695,34.050482 1.26268,2.214392 1.44195,-0.54357 1.31981,0.86123 0.21375,1.739039 -1.36828,1.61618 -1.80409,0.265403 -1.1589,-1.059687 -0.23516,-1.721875 1.11047,-0.916698 -0.43413,-0.680502 -0.4102,0.997264 0.74387,1.070883 -0.49255,1.027197 -1.26776,0.228606 -0.5501,-0.871237 0.15467,-0.82956 0.93559,-0.424446 0.58058,-1.450625 -0.75664,-1.131455 z"
-       id="path6985"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.04695854px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 203.23593,14.367789 4.43345,3.766934 0.87976,-0.995725 0.46812,0.475437 -0.80488,0.995031 0.83731,0.705238 0.86731,-0.962102 0.50998,0.516259 -0.87206,0.921255 0.99505,0.941692 -0.44277,0.42746 -0.91483,-0.900095 -0.8367,0.879711 -0.43031,-0.474867 0.78065,-0.831436 -0.86665,-0.779727 -0.81136,0.912638 -0.55866,-0.483362 0.8179,-0.927279 -4.48211,-3.638676 z"
-       id="path6891-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       style="display:inline;opacity:0.05;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.58045781px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 204.43932,-5.3971152 6.34563,7.5781721 -3.73895,4.9604312 0.33681,4.6546149 -5.20345,5.793617 c 2.83273,-8.049795 3.31033,-11.8140092 3.09986,-18.9271334 z"
-       id="path5208"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.11183073px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 205.60259,0.56695919 1.24493,0.127049 0.0916,-0.59592195 0.28719,0.07174803 -0.065,0.56786179 0.62071,0.0788993 -0.0423,0.36840374 -0.62423,-0.048236 -0.0804,0.8381885 0.52004,0.075191 -0.0192,0.3709729 -0.5764,-0.058257 -0.10087,0.8125312 0.54747,0.039404 -0.04,0.4153104 -0.5593,-0.071919 -0.0636,0.6224815 -0.3736,0.00386 0.0816,-0.6437327 -1.20305,-0.1533942 0.0499,-0.3674909 1.2006,0.1064631 0.11092,-0.7647515 -1.19622,-0.1448386 0.027,-0.3701253 1.23042,0.1176518 0.12327,-0.8721654 -1.26199,-0.1134749 z"
-       id="path7229"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccccccccccc" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.16325578px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 204.68821,9.1424652 1.78173,-0.049987 -1.44996,0.7563273 1.12166,0.7127945 -1.34099,0.0029 0.93885,1.309289 -1.59949,-0.942185 z"
-       id="path7212-4-6"
-       inkscape:connector-curvature="0" />
-    <path
-       style="display:inline;opacity:0.05;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.71902335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 180.87434,36.932251 -8.12162,8.095249 -6.61262,-3.934427 -5.68596,1.043018 -7.6496,-6.371879 c 10.33078,4.527622 19.43137,4.062311 28.0698,1.168039 z"
-       id="path5208-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.04569969px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 156.79314,37.138611 -0.83209,5.600235 1.27513,0.214749 -0.15211,0.631281 -1.23602,-0.153244 -0.15211,1.0545 1.24093,0.221743 -0.16427,0.686859 -1.20964,-0.246683 -0.26626,1.306416 -0.58089,-0.145968 0.27316,-1.218758 -1.15712,-0.238846 0.17092,-0.599741 1.08842,0.21735 0.19853,-1.117028 -1.17126,-0.200972 0.11204,-0.710141 1.18676,0.198837 0.70106,-5.574493 z"
-       id="path6891-8-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.84177661px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 143.96364,29.933272 -4.59686,9.216397 3.65156,2.834687 1.22043,-4.692866 2.51661,2.524357 1.39851,-6.542721 z"
-       id="path5174-1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.56489706px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 142.60658,28.70585 -2.96842,6.930652 -3.79379,-3.925042 4.56394,-5.124749 z"
-       id="path5285"
-       inkscape:connector-curvature="0" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.35393918px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 137.9306,23.319484 -3.42616,1.224261 1.2143,1.906916 -4.40128,-2.508612 -0.0822,-4.53226 1.25123,1.720316 3.10894,-1.477793 z"
-       id="path5168-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000500;fill-opacity:1;stroke:none;stroke-width:0.0498465px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 132.55595,11.444656 -2.31852,0.882408 0.30663,1.468015 -1.02588,1.140069 -1.70428,-0.05499 -1.34908,-1.557886 0.015,-1.774566 1.1926,-0.955614 1.69096,0.03182 0.7151,1.205156 0.71942,-0.315492 -0.89748,-0.543864 -1.14121,0.554849 -0.91394,-0.627513 -0.0299,-1.2533405 0.92017,-0.3984462 0.77453,0.2730438 0.26797,0.9632459 1.30792,0.775623 1.20137,-0.558052 z"
-       id="path6985-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15882961px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 131.32384,2.4817954 -1.6313,-0.4305236 1.16551,1.0474206 -1.19547,0.453907 1.23564,0.290212 -1.16202,1.0740836 1.68796,-0.5749329 z"
-       id="path7212-4-6-8"
-       inkscape:connector-curvature="0" />
-    <path
-       style="display:inline;opacity:0.05;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.55575538px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 137.04207,-21.420699 -7.13207,5.035868 1.31743,5.70794 -2.10914,4.1341529 2.26645,6.93249012 c 0.67636,-8.23493742 2.69888,-15.39599902 5.65733,-21.81045102 z"
-       id="path5208-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-  </g>
-</svg>
diff --git a/src/client/assets/welcome-fg.svg b/src/client/assets/welcome-fg.svg
deleted file mode 100644
index 5c795c3027..0000000000
--- a/src/client/assets/welcome-fg.svg
+++ /dev/null
@@ -1,380 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="1920"
-   height="1080"
-   viewBox="0 0 507.99999 285.75001"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.1 r15371"
-   sodipodi:docname="welcome-fg.svg">
-  <defs
-     id="defs2">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient7044">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop7040" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="1"
-         id="stop7042" />
-    </linearGradient>
-    <pattern
-       inkscape:collect="always"
-       xlink:href="#Checkerboard"
-       id="pattern7010"
-       patternTransform="matrix(1.673813,0,0,1.673813,-177.6001,-146.38611)" />
-    <pattern
-       inkscape:stockid="Checkerboard"
-       id="Checkerboard"
-       patternTransform="translate(0,0) scale(10,10)"
-       height="2"
-       width="2"
-       patternUnits="userSpaceOnUse"
-       inkscape:collect="always">
-      <rect
-         id="rect6201"
-         height="1"
-         width="1"
-         y="0"
-         x="0"
-         style="fill:black;stroke:none" />
-      <rect
-         id="rect6203"
-         height="1"
-         width="1"
-         y="1"
-         x="1"
-         style="fill:black;stroke:none" />
-    </pattern>
-    <linearGradient
-       id="linearGradient5406"
-       osb:paint="solid">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop5404" />
-    </linearGradient>
-    <pattern
-       patternUnits="userSpaceOnUse"
-       width="15.999999"
-       height="16.000025"
-       patternTransform="matrix(0.26458333,0,0,0.26458333,-16.933332,263.1333)"
-       id="pattern6465">
-      <path
-         d="m 8.0000542,8.0000126 h 7.9998878 c 3e-5,0 5.7e-5,3.78e-5 5.7e-5,3.78e-5 V 15.99995 c 0,3.7e-5 -2.7e-5,7.5e-5 -5.7e-5,7.5e-5 H 8.0000542 c -3.03e-5,0 -5.67e-5,-3.8e-5 -5.67e-5,-7.5e-5 V 8.0000504 c 0,0 2.64e-5,-3.78e-5 5.67e-5,-3.78e-5 z M 5.6692913e-5,0 H 7.9999408 c 3.02e-5,0 5.67e-5,3.7795275e-5 5.67e-5,7.5590551e-5 V 7.999937 c 0,3.78e-5 -2.65e-5,7.56e-5 -5.67e-5,7.56e-5 H 5.6692913e-5 C 2.2677165e-5,8.0000126 0,7.9999748 0,7.999937 V 7.5590551e-5 C 0,3.7795276e-5 2.2677165e-5,0 5.6692913e-5,0 Z"
-         style="opacity:1;fill:#db1545;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="rect6445-2"
-         inkscape:connector-curvature="0" />
-    </pattern>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7044"
-       id="linearGradient6476"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.223659,0,0,2.5556636,-579.27357,808.39)"
-       x1="86.490868"
-       y1="-216.62756"
-       x2="176.77992"
-       y2="-216.62756" />
-    <mask
-       maskUnits="userSpaceOnUse"
-       id="mask6472">
-      <rect
-         transform="rotate(-90)"
-         y="-0.91986513"
-         x="-300.45657"
-         height="511.36566"
-         width="291.06116"
-         id="rect6474"
-         style="opacity:1;fill:url(#linearGradient6476);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.92238116;stroke-miterlimit:4;stroke-dasharray:none" />
-    </mask>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#1e1d65"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.84705882"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.6363961"
-     inkscape:cx="720.54406"
-     inkscape:cy="371.58659"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     units="px"
-     inkscape:pagecheckerboard="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1057"
-     inkscape:window-x="1912"
-     inkscape:window-y="1143"
-     inkscape:window-maximized="1"
-     objecttolerance="1"
-     guidetolerance="10000"
-     gridtolerance="10000"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:snap-bbox-midpoints="true"
-     showguides="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid6443"
-       spacingx="2.1166667"
-       spacingy="2.1166667"
-       empspacing="4"
-       color="#3f3fff"
-       opacity="0.1254902"
-       enabled="false" />
-    <sodipodi:guide
-       position="-69.219003,3.872392"
-       orientation="1,0"
-       id="guide6508"
-       inkscape:locked="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="Back"
-     style="display:inline">
-    <path
-       style="fill:#253276;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 500.58203,825.29688 -54.2207,18.9121 18.91406,56.74219 -45.39258,10.08594 -11.34765,-39.08789 -46.6543,12.60937 13.87109,34.04493 -55.48047,15.13086 -12.60937,-44.13086 -47.91406,13.86914 13.86914,44.13086 -32.78321,11.3496 17.65235,35.30469 278.66211,-63.04492 z m -11.0957,26.45312 0.44726,11.5918 -12.03711,2.67382 -3.5664,-9.80664 z m 4.90429,24.51953 0.89258,9.80859 -9.36328,2.67383 -4.45703,-9.36133 z m -201.5,32.09766 v 11.14453 l -8.4707,1.7832 -4.9043,-8.91601 z"
-       id="path4522"
-       inkscape:connector-curvature="0"
-       transform="scale(0.26458333)" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#253276;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 381.65643,238.28361 -47.37344,16.34717 116.09827,29.02457 -14.01186,-23.68672 -31.02626,-0.33362 z"
-       id="path4520"
-       inkscape:connector-curvature="0" />
-  </g>
-  <g
-     inkscape:label="Ground"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-11.249983)"
-     style="display:inline">
-    <circle
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:1.99730551"
-       id="path5392"
-       cx="253.06117"
-       cy="887.61829"
-       r="642.68146" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer3"
-     inkscape:label="Front">
-    <path
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 565.38867,666.80078 -115.20508,24.36914 70.24414,231.09766 121.20118,-18.97656 8.61523,-148.01368 -76.28906,21.625 z m -30.15234,38.82813 3.09765,47.0625 -11.44531,2.49414 -9.14062,-46.10743 z m -26.41211,5.20898 10.30664,46.03906 -9.47852,2.06641 -17.14257,-44.88672 z m 41.45508,65.93945 2.80078,44.04493 -12.50391,3.40234 L 532.1543,781.75 Z m -25.15039,6.90039 9.4414,42.18165 -9.54297,2.59765 -13.99804,-40.91015 z m 85.48242,50.83789 1,42.35938 -22.15235,4.89648 -4.53906,-41.66406 z m -54.21485,10.16797 4.54102,41.66211 -7.67188,1.89649 -8.07421,-40.73047 z m -16.66992,4.20899 9.05469,40.45703 -8.88477,2.19727 -12.02734,-39.66016 z"
-       id="path5398"
-       transform="scale(0.26458333)"
-       inkscape:connector-curvature="0" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 329.51477,199.15082 -32.04286,18.26817 12.8142,1.28619 -6.02656,28.18505 32.94792,3.49531 0.51681,-27.76301 11.91226,1.00737 z m -14.10711,25.93826 6.27123,0.90288 -1.15019,5.4805 -6.00929,-0.898 z m 13.58524,2.09643 0.42171,5.50053 -6.35262,-0.44337 1.22618,-5.67857 z m -15.04127,5.73678 6.21844,0.90138 -1.87301,4.94347 -5.07899,-0.81761 z m 8.80707,1.53673 6.3403,1.10313 0.43128,4.98637 -7.83808,-1.19409 z"
-       id="path6874"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccccccccccc" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 366.28967,254.78298 7.49431,-30.40441 -7.41388,-2.66046 1.18763,-3.36104 7.21205,2.27141 1.38362,-5.73044 -7.20912,-2.66047 1.28561,-3.65794 7.01313,2.7643 2.17341,-7.01022 3.35519,1.48161 -2.1734,6.51147 6.70747,2.66046 -1.28564,3.16213 -6.31255,-2.46154 -1.68638,6.02735 6.80837,2.46447 -0.9887,3.84808 -6.90052,-2.47031 -6.71038,30.41026 z"
-       id="path6891"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 74.047433,217.56203 -1.20251,0.65577 2.314585,6.84299 -4.564578,1.31517 13.625009,41.10395 21.186821,-5.50251 -7.183542,-43.56323 -22.044649,6.35259 z m 16.734379,10.06088 1.478463,10.23607 -8.339026,1.96939 -3.82509,-9.42992 z m 3.780131,14.55519 0.781863,9.82627 -7.001121,1.81797 -3.593063,-9.29297 z"
-       id="path6944"
-       inkscape:connector-curvature="0" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.24600939px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 43.603475,280.06036 -10.564819,-28.58824 -6.574764,2.28618 -0.916385,-3.37337 6.23111,-2.47535 -2.011396,-5.37101 -6.431418,2.16468 -1.002197,-3.66725 6.348194,-1.96596 -2.123972,-6.85578 3.11982,-0.81419 1.86458,6.45975 6.080155,-1.86705 0.744318,3.27357 -5.700174,1.79072 1.953823,5.78639 6.048884,-2.08256 1.308957,3.64208 -6.116434,2.13257 11.116753,28.12778 z"
-       id="path6891-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 411.98753,264.70523 3.91734,-12.57157 -7.13355,-3.53259 -1.396,-8.02014 5.81668,-6.93436 10.92618,-0.52461 7.35863,5.88054 0.0806,8.11138 -5.67524,6.95564 -7.37536,-0.96565 -1.04168,4.03744 5.21293,-1.96321 1.42492,-6.58308 5.61592,-1.7579 5.33002,3.98422 -1.35343,5.14755 -3.67857,2.33882 -4.89966,-2.03926 -7.52592,2.91667 -1.60892,6.84465 z"
-       id="path6985"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.27861062px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 438.77767,272.41521 -0.009,-2.99656 1.24656,2.44908 1.28337,-1.87551 -0.0534,2.25473 2.30831,-1.55949 -1.70125,2.67579 z"
-       id="path7212"
-       inkscape:connector-curvature="0" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.29395995px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 387.1467,259.13862 -0.3913,-3.17093 1.60741,2.46066 1.09423,-2.12083 0.23196,2.39229 2.19942,-1.8946 -1.42637,3.01207 z"
-       id="path7212-4"
-       inkscape:connector-curvature="0" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 457.96894,278.42384 1.02302,-2.77836 -1.31183,-0.56021 0.33336,-0.616 1.26318,0.48291 0.54568,-1.37607 0.81934,0.31324 -0.47741,1.4022 1.87364,0.67714 0.47795,-1.14765 0.83893,0.26207 -0.47245,1.28672 1.80283,0.70884 0.41215,-1.23149 0.92825,0.33529 -0.49337,1.23952 1.38917,0.51162 -0.21081,0.85845 -1.42731,-0.56527 -1.05878,2.6669 -0.81279,-0.33034 0.94975,-2.68892 -1.68742,-0.7038 -1.03512,2.65627 -0.83236,-0.27915 0.99293,-2.75061 -1.92628,-0.79522 -1.00194,2.82543 z"
-       id="path7229"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccccccccccc" />
-    <path
-       transform="translate(0,-11.249983)"
-       id="path7233"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.3185696px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 73.482785,265.42476 4.944364,-1.72314 -0.207904,-0.52164 -2.012479,0.86151 -0.0213,-0.63037 -0.837931,0.3339 0.324488,0.46118 -2.371778,0.68852 z m 0.497305,0.21764 4.223597,-1.35549 0.556753,4.37406 -2.879727,0.92419 z"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 156.55184,206.61884 0.47605,-0.20403 1.0201,8.90891 -0.47605,0.20402 z"
-       id="path7236"
-       inkscape:connector-curvature="0" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 160.97229,209.47512 0.20402,4.96451 0.47605,-0.068 0.068,-5.03251 z"
-       id="path7238"
-       inkscape:connector-curvature="0" />
-    <path
-       transform="translate(0,-11.249983)"
-       style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.34364724px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 23.838748,287.33572 -2.186787,-3.04882 3.027872,1.63785 -0.07842,-2.79635 1.585239,2.33549 1.177306,-3.18042 0.241718,3.90016 z"
-       id="path7212-4-6"
-       inkscape:connector-curvature="0" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.5;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535"
-       cx="120.03474"
-       cy="193.66763"
-       r="2.5126758" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.5;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-2"
-       cx="97.333473"
-       cy="218.84901"
-       r="2.5126758" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.5;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-24"
-       cx="70.128021"
-       cy="226.19046"
-       r="2.5126758" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.25;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.41842699;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-25"
-       cx="118.05532"
-       cy="234.83446"
-       r="1.6838019" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.5;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3186785;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-9"
-       cx="110.59546"
-       cy="252.2408"
-       r="1.5653913" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.5;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3186785;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-9-7"
-       cx="122.43651"
-       cy="242.53113"
-       r="1.5653913" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.5;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3186785;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-9-2"
-       cx="64.415337"
-       cy="265.26596"
-       r="1.5653913" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.1;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-24-4"
-       cx="69.61615"
-       cy="226.18503"
-       r="7.648705" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.1;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-24-4-4"
-       cx="97.333473"
-       cy="218.84901"
-       r="7.648705" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.1;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-24-4-2"
-       cx="119.52941"
-       cy="193.50121"
-       r="7.648705" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.02999998;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13750315;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-9-2-6"
-       cx="64.415337"
-       cy="265.26596"
-       r="4.9115925" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.02999998;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13750315;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-9-2-6-7"
-       cx="110.59546"
-       cy="252.2408"
-       r="4.9115925" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.02999998;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13750315;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-9-2-6-3"
-       cx="122.43651"
-       cy="242.53113"
-       r="4.9115925" />
-    <circle
-       transform="translate(0,-11.249983)"
-       style="opacity:0.05;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4535-24-4-4-8"
-       cx="117.52492"
-       cy="234.88242"
-       r="7.648705" />
-  </g>
-</svg>

From abe14c1665286d2a7ef84fa05dc3d8162d074ec1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 21:33:36 +0900
Subject: [PATCH 042/369] :art:

---
 src/client/app/desktop/views/pages/welcome.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index c406f9b0a4..03a60dd487 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -108,7 +108,7 @@ root(isDark)
 			> article
 				max-width 700px
 				margin 42px auto 0 auto
-				padding 64px
+				padding 64px 82px
 				background isDark ? #282C37 : #fff
 				box-shadow 0 8px 32px rgba(#000, 0.15)
 

From 3f9e5fffbe2418c906e567b4922fa3ac3571984c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 21:43:21 +0900
Subject: [PATCH 043/369] Fix bug

---
 src/server/api/endpoints/notes/local-timeline.ts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index e7ebe5d960..64118e1f14 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -57,6 +57,9 @@ module.exports = async (params, user, app) => {
 			$nin: mutedUserIds
 		},
 
+		// public only
+		visibility: 'public',
+
 		// local
 		'_user.host': null
 	} as any;

From 5a76716b5a92723edeb510d6594477f97819530e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 21:43:33 +0900
Subject: [PATCH 044/369] home

---
 src/server/api/service/github.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts
index cd9760a36d..da33648a16 100644
--- a/src/server/api/service/github.ts
+++ b/src/server/api/service/github.ts
@@ -25,7 +25,7 @@ const post = async text => {
 		}
 	}
 
-	createNote(bot, { text });
+	createNote(bot, { text, visibility: 'home' });
 };
 
 // Init router

From 0ca2c313ecc89595abc333e08185056095dd1d1f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 21:45:14 +0900
Subject: [PATCH 045/369] 2.21.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 328b72dfe3..6b3a21c2bc 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.20.1",
-	"clientVersion": "1.0.5871",
+	"version": "2.21.0",
+	"clientVersion": "1.0.5903",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 43eb8bd99b09532b76de30b257bf02f47525fe69 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 21:59:57 +0900
Subject: [PATCH 046/369] =?UTF-8?q?notes/local-timeline=20=E3=81=A8=20note?=
 =?UTF-8?q?s/global-timeline=20=E3=81=AE=E3=82=B5=E3=82=A4=E3=83=B3?=
 =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=92=E4=B8=8D=E8=A6=81=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/server/api/endpoints.ts                   |  2 --
 .../api/endpoints/notes/global-timeline.ts    | 32 +++++++++++--------
 .../api/endpoints/notes/local-timeline.ts     | 31 ++++++++++--------
 3 files changed, 36 insertions(+), 29 deletions(-)

diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 908d9574a5..c1ac4777b6 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -515,7 +515,6 @@ const endpoints: Endpoint[] = [
 	},
 	{
 		name: 'notes/local-timeline',
-		withCredential: true,
 		limit: {
 			duration: ms('10minutes'),
 			max: 100
@@ -523,7 +522,6 @@ const endpoints: Endpoint[] = [
 	},
 	{
 		name: 'notes/global-timeline',
-		withCredential: true,
 		limit: {
 			duration: ms('10minutes'),
 			max: 100
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index d22a1763de..7cf06c3af1 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -9,7 +9,7 @@ import { pack } from '../../../../models/note';
 /**
  * Get timeline of global
  */
-module.exports = async (params, user, app) => {
+module.exports = async (params, user) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
@@ -36,9 +36,9 @@ module.exports = async (params, user, app) => {
 	}
 
 	// ミュートしているユーザーを取得
-	const mutedUserIds = (await Mute.find({
+	const mutedUserIds = user ? (await Mute.find({
 		muterId: user._id
-	})).map(m => m.muteeId);
+	})).map(m => m.muteeId) : null;
 
 	//#region Construct query
 	const sort = {
@@ -46,18 +46,24 @@ module.exports = async (params, user, app) => {
 	};
 
 	const query = {
-		// mute
-		userId: {
-			$nin: mutedUserIds
-		},
-		'_reply.userId': {
-			$nin: mutedUserIds
-		},
-		'_renote.userId': {
-			$nin: mutedUserIds
-		}
+		// public only
+		visibility: 'public'
 	} as any;
 
+	if (mutedUserIds && mutedUserIds.length > 0) {
+		query.userId = {
+			$nin: mutedUserIds
+		};
+
+		query['_reply.userId'] = {
+			$nin: mutedUserIds
+		};
+
+		query['_renote.userId'] = {
+			$nin: mutedUserIds
+		};
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index 64118e1f14..7d01de3d43 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -9,7 +9,7 @@ import { pack } from '../../../../models/note';
 /**
  * Get timeline of local
  */
-module.exports = async (params, user, app) => {
+module.exports = async (params, user) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
@@ -36,9 +36,9 @@ module.exports = async (params, user, app) => {
 	}
 
 	// ミュートしているユーザーを取得
-	const mutedUserIds = (await Mute.find({
+	const mutedUserIds = user ? (await Mute.find({
 		muterId: user._id
-	})).map(m => m.muteeId);
+	})).map(m => m.muteeId) : null;
 
 	//#region Construct query
 	const sort = {
@@ -46,17 +46,6 @@ module.exports = async (params, user, app) => {
 	};
 
 	const query = {
-		// mute
-		userId: {
-			$nin: mutedUserIds
-		},
-		'_reply.userId': {
-			$nin: mutedUserIds
-		},
-		'_renote.userId': {
-			$nin: mutedUserIds
-		},
-
 		// public only
 		visibility: 'public',
 
@@ -64,6 +53,20 @@ module.exports = async (params, user, app) => {
 		'_user.host': null
 	} as any;
 
+	if (mutedUserIds && mutedUserIds.length > 0) {
+		query.userId = {
+			$nin: mutedUserIds
+		};
+
+		query['_reply.userId'] = {
+			$nin: mutedUserIds
+		};
+
+		query['_renote.userId'] = {
+			$nin: mutedUserIds
+		};
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {

From 5d82443389d02b1645533cf4d8d12f1ae114179d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 28 May 2018 22:00:29 +0900
Subject: [PATCH 047/369] 2.21.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 6b3a21c2bc..3b3da1810a 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.21.0",
+	"version": "2.21.1",
 	"clientVersion": "1.0.5903",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From bd1f3a2f0196214248e8a259f8aacfe3e8259c19 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 00:36:52 +0900
Subject: [PATCH 048/369] #1579

---
 src/models/note.ts                        |  1 +
 src/server/api/endpoints/notes/replies.ts | 26 +++--------------------
 src/services/note/create.ts               | 18 ++++++++++++++++
 3 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/src/models/note.ts b/src/models/note.ts
index 5d7bab3833..ad8c1565f0 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -77,6 +77,7 @@ export type INote = {
 		host: string;
 		inbox?: string;
 	};
+	_replyIds?: mongo.ObjectID[];
 };
 
 /**
diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts
index 11d221d8f7..7261d3dbf6 100644
--- a/src/server/api/endpoints/notes/replies.ts
+++ b/src/server/api/endpoints/notes/replies.ts
@@ -1,15 +1,8 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note, { pack } from '../../../../models/note';
 
 /**
- * Show a replies of a note
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
+ * GEt replies of a note
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
@@ -24,10 +17,6 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset);
 	if (offsetErr) return rej('invalid offset param');
 
-	// Get 'sort' parameter
-	const [sort = 'desc', sortError] = $.str.optional().or('desc asc').get(params.sort);
-	if (sortError) return rej('invalid sort param');
-
 	// Lookup note
 	const note = await Note.findOne({
 		_id: noteId
@@ -37,17 +26,8 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		return rej('note not found');
 	}
 
-	// Issue query
-	const replies = await Note
-		.find({ replyId: note._id }, {
-			limit: limit,
-			skip: offset,
-			sort: {
-				_id: sort == 'asc' ? 1 : -1
-			}
-		});
+	const ids = note._replyIds.slice(offset, offset + limit);
 
 	// Serialize
-	res(await Promise.all(replies.map(async note =>
-		await pack(note, user))));
+	res(await Promise.all(ids.map(id => pack(id, user))));
 });
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index b9ff1f679b..37d21fecad 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -172,6 +172,24 @@ export default async (user: IUser, data: {
 		}
 	});
 
+	if (data.reply) {
+		Note.update({ _id: data.reply._id }, {
+			$push: {
+				_replyIds: note._id
+			}
+		});
+	}
+
+	const isQuote = data.renote && (data.text || data.poll || data.media);
+
+	if (isQuote) {
+		Note.update({ _id: data.renote._id }, {
+			$push: {
+				_quoteIds: note._id
+			}
+		});
+	}
+
 	// Serialize
 	const noteObj = await pack(note);
 

From 973b1e42ef41e842cecce2a11f6b8dd8b50f767b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 00:38:07 +0900
Subject: [PATCH 049/369] typo

---
 src/server/api/endpoints/notes/replies.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts
index 7261d3dbf6..f407f3bd56 100644
--- a/src/server/api/endpoints/notes/replies.ts
+++ b/src/server/api/endpoints/notes/replies.ts
@@ -2,7 +2,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note, { pack } from '../../../../models/note';
 
 /**
- * GEt replies of a note
+ * Get replies of a note
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter

From ab16fb3a3fff96a4fa2bc1fc0e56a87c129a4625 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 01:22:39 +0900
Subject: [PATCH 050/369] #1634

---
 .../app/common/scripts/streaming/home.ts      | 24 +++++++++
 .../components/ui.header.notifications.vue    | 39 ++------------
 .../app/mobile/views/components/ui.header.vue | 52 +++++--------------
 .../app/mobile/views/components/ui.nav.vue    | 52 +++++--------------
 src/publishers/notify.ts                      |  8 +++
 .../api/common/read-messaging-message.ts      |  8 +++
 src/server/api/common/read-notification.ts    |  8 +++
 src/server/api/endpoints.ts                   | 10 ----
 .../api/endpoints/messaging/messages.ts       |  7 ---
 .../endpoints/messaging/messages/create.ts    |  7 +++
 src/server/api/endpoints/messaging/unread.ts  | 29 -----------
 .../notifications/get_unread_count.ts         | 28 ----------
 .../notifications/mark_as_read_all.ts         | 11 ++--
 13 files changed, 92 insertions(+), 191 deletions(-)
 delete mode 100644 src/server/api/endpoints/messaging/unread.ts
 delete mode 100644 src/server/api/endpoints/notifications/get_unread_count.ts

diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts
index 2715b9e0e9..50bbb56896 100644
--- a/src/client/app/common/scripts/streaming/home.ts
+++ b/src/client/app/common/scripts/streaming/home.ts
@@ -28,6 +28,30 @@ export class HomeStream extends Stream {
 			os.store.dispatch('mergeMe', i);
 		});
 
+		this.on('read_all_notifications', () => {
+			os.store.dispatch('mergeMe', {
+				hasUnreadNotification: false
+			});
+		});
+
+		this.on('unread_notification', () => {
+			os.store.dispatch('mergeMe', {
+				hasUnreadNotification: true
+			});
+		});
+
+		this.on('read_all_messaging_messages', () => {
+			os.store.dispatch('mergeMe', {
+				hasUnreadMessagingMessage: false
+			});
+		});
+
+		this.on('unread_messaging_message', () => {
+			os.store.dispatch('mergeMe', {
+				hasUnreadMessagingMessage: true
+			});
+		});
+
 		this.on('clientSettingUpdated', x => {
 			os.store.commit('settings/set', {
 				key: x.key,
diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue
index 9eaaa62c61..59a16df9ec 100644
--- a/src/client/app/desktop/views/components/ui.header.notifications.vue
+++ b/src/client/app/desktop/views/components/ui.header.notifications.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="notifications">
 	<button :data-active="isOpen" @click="toggle" title="%i18n:@title%">
-		%fa:R bell%<template v-if="hasUnreadNotifications">%fa:circle%</template>
+		%fa:R bell%<template v-if="hasUnreadNotification">%fa:circle%</template>
 	</button>
 	<div class="pop" v-if="isOpen">
 		<mk-notifications/>
@@ -16,44 +16,15 @@ import contains from '../../../common/scripts/contains';
 export default Vue.extend({
 	data() {
 		return {
-			isOpen: false,
-			hasUnreadNotifications: false,
-			connection: null,
-			connectionId: null
+			isOpen: false
 		};
 	},
-	mounted() {
-		if (this.$store.getters.isSignedIn) {
-			this.connection = (this as any).os.stream.getConnection();
-			this.connectionId = (this as any).os.stream.use();
-
-			this.connection.on('read_all_notifications', this.onReadAllNotifications);
-			this.connection.on('unread_notification', this.onUnreadNotification);
-
-			// Fetch count of unread notifications
-			(this as any).api('notifications/get_unread_count').then(res => {
-				if (res.count > 0) {
-					this.hasUnreadNotifications = true;
-				}
-			});
-		}
-	},
-	beforeDestroy() {
-		if (this.$store.getters.isSignedIn) {
-			this.connection.off('read_all_notifications', this.onReadAllNotifications);
-			this.connection.off('unread_notification', this.onUnreadNotification);
-			(this as any).os.stream.dispose(this.connectionId);
+	computed: {
+		hasUnreadNotification(): boolean {
+			return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
 		}
 	},
 	methods: {
-		onReadAllNotifications() {
-			this.hasUnreadNotifications = false;
-		},
-
-		onUnreadNotification() {
-			this.hasUnreadNotifications = true;
-		},
-
 		toggle() {
 			this.isOpen ? this.close() : this.open();
 		},
diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue
index 09aa18f769..c72b15fb8b 100644
--- a/src/client/app/mobile/views/components/ui.header.vue
+++ b/src/client/app/mobile/views/components/ui.header.vue
@@ -6,7 +6,7 @@
 		<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p>
 		<div class="content" ref="mainContainer">
 			<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
-			<template v-if="hasUnreadNotifications || hasUnreadMessagingMessages || hasGameInvitations">%fa:circle%</template>
+			<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
 			<h1>
 				<slot>Misskey</slot>
 			</h1>
@@ -25,13 +25,19 @@ export default Vue.extend({
 	props: ['func'],
 	data() {
 		return {
-			hasUnreadNotifications: false,
-			hasUnreadMessagingMessages: false,
-			hasGameInvitations: false,
+			hasGameInvitation: false,
 			connection: null,
 			connectionId: null
 		};
 	},
+	computed: {
+		hasUnreadNotification(): boolean {
+			return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
+		},
+		hasUnreadMessagingMessage(): boolean {
+			return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
+		}
+	},
 	mounted() {
 		this.$store.commit('setUiHeaderHeight', 48);
 
@@ -39,27 +45,9 @@ export default Vue.extend({
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
-			this.connection.on('read_all_notifications', this.onReadAllNotifications);
-			this.connection.on('unread_notification', this.onUnreadNotification);
-			this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
-			this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
 			this.connection.on('othello_invited', this.onOthelloInvited);
 			this.connection.on('othello_no_invites', this.onOthelloNoInvites);
 
-			// Fetch count of unread notifications
-			(this as any).api('notifications/get_unread_count').then(res => {
-				if (res.count > 0) {
-					this.hasUnreadNotifications = true;
-				}
-			});
-
-			// Fetch count of unread messaging messages
-			(this as any).api('messaging/unread').then(res => {
-				if (res.count > 0) {
-					this.hasUnreadMessagingMessages = true;
-				}
-			});
-
 			const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
 			const isHisasiburi = ago >= 3600;
 			this.$store.state.i.lastUsedAt = new Date();
@@ -110,33 +98,17 @@ export default Vue.extend({
 	},
 	beforeDestroy() {
 		if (this.$store.getters.isSignedIn) {
-			this.connection.off('read_all_notifications', this.onReadAllNotifications);
-			this.connection.off('unread_notification', this.onUnreadNotification);
-			this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
-			this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
 			this.connection.off('othello_invited', this.onOthelloInvited);
 			this.connection.off('othello_no_invites', this.onOthelloNoInvites);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
 	},
 	methods: {
-		onReadAllNotifications() {
-			this.hasUnreadNotifications = false;
-		},
-		onUnreadNotification() {
-			this.hasUnreadNotifications = true;
-		},
-		onReadAllMessagingMessages() {
-			this.hasUnreadMessagingMessages = false;
-		},
-		onUnreadMessagingMessage() {
-			this.hasUnreadMessagingMessages = true;
-		},
 		onOthelloInvited() {
-			this.hasGameInvitations = true;
+			this.hasGameInvitation = true;
 		},
 		onOthelloNoInvites() {
-			this.hasGameInvitations = false;
+			this.hasGameInvitation = false;
 		}
 	}
 });
diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index 5f0cc831cc..de8c21e795 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -16,7 +16,7 @@
 			<div class="links">
 				<ul>
 					<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li>
-					<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotifications">%fa:circle%</template>%fa:angle-right%</router-link></li>
+					<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitations">%fa:circle%</template>%fa:angle-right%</router-link></li>
 				</ul>
@@ -46,47 +46,31 @@ export default Vue.extend({
 	props: ['isOpen'],
 	data() {
 		return {
-			hasUnreadNotifications: false,
-			hasUnreadMessagingMessages: false,
-			hasGameInvitations: false,
+			hasGameInvitation: false,
 			connection: null,
 			connectionId: null,
 			aboutUrl: `${docsUrl}/${lang}/about`
 		};
 	},
+	computed: {
+		hasUnreadNotification(): boolean {
+			return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
+		},
+		hasUnreadMessagingMessage(): boolean {
+			return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
+		}
+	},
 	mounted() {
 		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
-			this.connection.on('read_all_notifications', this.onReadAllNotifications);
-			this.connection.on('unread_notification', this.onUnreadNotification);
-			this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
-			this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
 			this.connection.on('othello_invited', this.onOthelloInvited);
 			this.connection.on('othello_no_invites', this.onOthelloNoInvites);
-
-			// Fetch count of unread notifications
-			(this as any).api('notifications/get_unread_count').then(res => {
-				if (res.count > 0) {
-					this.hasUnreadNotifications = true;
-				}
-			});
-
-			// Fetch count of unread messaging messages
-			(this as any).api('messaging/unread').then(res => {
-				if (res.count > 0) {
-					this.hasUnreadMessagingMessages = true;
-				}
-			});
 		}
 	},
 	beforeDestroy() {
 		if (this.$store.getters.isSignedIn) {
-			this.connection.off('read_all_notifications', this.onReadAllNotifications);
-			this.connection.off('unread_notification', this.onUnreadNotification);
-			this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
-			this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
 			this.connection.off('othello_invited', this.onOthelloInvited);
 			this.connection.off('othello_no_invites', this.onOthelloNoInvites);
 			(this as any).os.stream.dispose(this.connectionId);
@@ -98,23 +82,11 @@ export default Vue.extend({
 			if (query == null || query == '') return;
 			this.$router.push('/search?q=' + encodeURIComponent(query));
 		},
-		onReadAllNotifications() {
-			this.hasUnreadNotifications = false;
-		},
-		onUnreadNotification() {
-			this.hasUnreadNotifications = true;
-		},
-		onReadAllMessagingMessages() {
-			this.hasUnreadMessagingMessages = false;
-		},
-		onUnreadMessagingMessage() {
-			this.hasUnreadMessagingMessages = true;
-		},
 		onOthelloInvited() {
-			this.hasGameInvitations = true;
+			this.hasGameInvitation = true;
 		},
 		onOthelloNoInvites() {
-			this.hasGameInvitations = false;
+			this.hasGameInvitation = false;
 		},
 		dark() {
 			this.$store.commit('device/set', {
diff --git a/src/publishers/notify.ts b/src/publishers/notify.ts
index 2b89515d42..0e480ef010 100644
--- a/src/publishers/notify.ts
+++ b/src/publishers/notify.ts
@@ -3,6 +3,7 @@ import Notification from '../models/notification';
 import Mute from '../models/mute';
 import { pack } from '../models/notification';
 import stream from './stream';
+import User from '../models/user';
 
 export default (
 	notifiee: mongo.ObjectID,
@@ -29,6 +30,13 @@ export default (
 	stream(notifiee, 'notification',
 		await pack(notification));
 
+	// Update flag
+	User.update({ _id: notifiee }, {
+		$set: {
+			hasUnreadNotification: true
+		}
+	});
+
 	// 3秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する
 	setTimeout(async () => {
 		const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true });
diff --git a/src/server/api/common/read-messaging-message.ts b/src/server/api/common/read-messaging-message.ts
index 28854e186e..fd5e9f242c 100644
--- a/src/server/api/common/read-messaging-message.ts
+++ b/src/server/api/common/read-messaging-message.ts
@@ -4,6 +4,7 @@ import { IMessagingMessage as IMessage } from '../../../models/messaging-message
 import publishUserStream from '../../../publishers/stream';
 import { publishMessagingStream } from '../../../publishers/stream';
 import { publishMessagingIndexStream } from '../../../publishers/stream';
+import User from '../../../models/user';
 
 /**
  * Mark as read message(s)
@@ -62,6 +63,13 @@ export default (
 		});
 
 	if (count == 0) {
+		// Update flag
+		User.update({ _id: userId }, {
+			$set: {
+				hasUnreadMessagingMessage: false
+			}
+		});
+
 		// 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行
 		publishUserStream(userId, 'read_all_messaging_messages');
 	}
diff --git a/src/server/api/common/read-notification.ts b/src/server/api/common/read-notification.ts
index cdb87a4114..6505c58c39 100644
--- a/src/server/api/common/read-notification.ts
+++ b/src/server/api/common/read-notification.ts
@@ -2,6 +2,7 @@ import * as mongo from 'mongodb';
 import { default as Notification, INotification } from '../../../models/notification';
 import publishUserStream from '../../../publishers/stream';
 import Mute from '../../../models/mute';
+import User from '../../../models/user';
 
 /**
  * Mark as read notification(s)
@@ -57,6 +58,13 @@ export default (
 		});
 
 	if (count == 0) {
+		// Update flag
+		User.update({ _id: userId }, {
+			$set: {
+				hasUnreadNotification: false
+			}
+		});
+
 		// 全ての(いままで未読だった)通知を(これで)読みましたよというイベントを発行
 		publishUserStream(userId, 'read_all_notifications');
 	}
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index c1ac4777b6..b4ab65eb16 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -279,11 +279,6 @@ const endpoints: Endpoint[] = [
 		kind: 'account/read'
 	},
 
-	{
-		name: 'notifications/get_unread_count',
-		withCredential: true,
-		kind: 'notification-read'
-	},
 	{
 		name: 'notifications/delete',
 		withCredential: true,
@@ -610,11 +605,6 @@ const endpoints: Endpoint[] = [
 		withCredential: true,
 		kind: 'messaging-read'
 	},
-	{
-		name: 'messaging/unread',
-		withCredential: true,
-		kind: 'messaging-read'
-	},
 	{
 		name: 'messaging/messages',
 		withCredential: true,
diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts
index 0338aba68a..9c3a48334b 100644
--- a/src/server/api/endpoints/messaging/messages.ts
+++ b/src/server/api/endpoints/messaging/messages.ts
@@ -1,6 +1,3 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Message from '../../../../models/messaging-message';
 import User from '../../../../models/user';
@@ -9,10 +6,6 @@ import read from '../../common/read-messaging-message';
 
 /**
  * Get messages
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts
index db471839e7..41238de1e1 100644
--- a/src/server/api/endpoints/messaging/messages/create.ts
+++ b/src/server/api/endpoints/messaging/messages/create.ts
@@ -91,6 +91,13 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	publishMessagingIndexStream(message.recipientId, 'message', messageObj);
 	publishUserStream(message.recipientId, 'messaging_message', messageObj);
 
+	// Update flag
+	User.update({ _id: recipient._id }, {
+		$set: {
+			hasUnreadMessagingMessage: true
+		}
+	});
+
 	// 3秒経っても(今回作成した)メッセージが既読にならなかったら「未読のメッセージがありますよ」イベントを発行する
 	setTimeout(async () => {
 		const freshMessage = await Message.findOne({ _id: message._id }, { isRead: true });
diff --git a/src/server/api/endpoints/messaging/unread.ts b/src/server/api/endpoints/messaging/unread.ts
deleted file mode 100644
index 1d83af501d..0000000000
--- a/src/server/api/endpoints/messaging/unread.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Module dependencies
- */
-import Message from '../../../../models/messaging-message';
-import Mute from '../../../../models/mute';
-
-/**
- * Get count of unread messages
- */
-module.exports = (params, user) => new Promise(async (res, rej) => {
-	const mute = await Mute.find({
-		muterId: user._id,
-		deletedAt: { $exists: false }
-	});
-	const mutedUserIds = mute.map(m => m.muteeId);
-
-	const count = await Message
-		.count({
-			userId: {
-				$nin: mutedUserIds
-			},
-			recipientId: user._id,
-			isRead: false
-		});
-
-	res({
-		count: count
-	});
-});
diff --git a/src/server/api/endpoints/notifications/get_unread_count.ts b/src/server/api/endpoints/notifications/get_unread_count.ts
deleted file mode 100644
index 9766366ff1..0000000000
--- a/src/server/api/endpoints/notifications/get_unread_count.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Module dependencies
- */
-import Notification from '../../../../models/notification';
-import Mute from '../../../../models/mute';
-
-/**
- * Get count of unread notifications
- */
-module.exports = (params, user) => new Promise(async (res, rej) => {
-	const mute = await Mute.find({
-		muterId: user._id
-	});
-	const mutedUserIds = mute.map(m => m.muteeId);
-
-	const count = await Notification
-		.count({
-			notifieeId: user._id,
-			notifierId: {
-				$nin: mutedUserIds
-			},
-			isRead: false
-		});
-
-	res({
-		count: count
-	});
-});
diff --git a/src/server/api/endpoints/notifications/mark_as_read_all.ts b/src/server/api/endpoints/notifications/mark_as_read_all.ts
index dce3cb4663..7a48ca3e62 100644
--- a/src/server/api/endpoints/notifications/mark_as_read_all.ts
+++ b/src/server/api/endpoints/notifications/mark_as_read_all.ts
@@ -1,8 +1,6 @@
-/**
- * Module dependencies
- */
 import Notification from '../../../../models/notification';
 import event from '../../../../publishers/stream';
+import User from '../../../../models/user';
 
 /**
  * Mark as read all notifications
@@ -23,6 +21,13 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Response
 	res();
 
+	// Update flag
+	User.update({ _id: user._id }, {
+		$set: {
+			hasUnreadNotification: false
+		}
+	});
+
 	// 全ての通知を読みましたよというイベントを発行
 	event(user._id, 'read_all_notifications');
 });

From 016386b350e8bc97ec5ee9686567c2fb844066d2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 01:25:54 +0900
Subject: [PATCH 051/369] :v:

---
 src/models/user.ts | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/models/user.ts b/src/models/user.ts
index 74ddcc77f9..11eafe05ea 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -84,6 +84,8 @@ export interface ILocalUser extends IUserBase {
 	twoFactorTempSecret?: string;
 	clientSettings: any;
 	settings: any;
+	hasUnreadNotification: boolean;
+	hasUnreadMessagingMessage: boolean;
 }
 
 export interface IRemoteUser extends IUserBase {
@@ -387,8 +389,9 @@ export const pack = (
 	if (!meId || !meId.equals(_user.id) || !opts.detail) {
 		delete _user.avatarId;
 		delete _user.bannerId;
-
 		delete _user.driveCapacity;
+		delete _user.hasUnreadMessagingMessage;
+		delete _user.hasUnreadNotification;
 	}
 
 	if (meId && !meId.equals(_user.id)) {

From 8f79f862b90b4f8bbdfed8115ceb2c2764b6eb16 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 01:44:15 +0900
Subject: [PATCH 052/369] :pizza:

---
 locales/ja.yml                                | 12 +++--
 .../desktop/views/components/post-form.vue    | 12 ++++-
 .../app/desktop/views/widgets/post-form.vue   | 13 +++++-
 .../app/mobile/views/components/post-form.vue | 46 ++++++++++++++++---
 4 files changed, 70 insertions(+), 13 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 44fa0ef538..c02422e81a 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -39,6 +39,13 @@ common:
     confused: "こまこまのこまり"
     pudding: "Pudding"
 
+  note-placeholders:
+    a: "今どうしてる?"
+    b: "何かありましたか?"
+    c: "言いたいことは?"
+    d: "ここに書いてください"
+    e: "あなたが書くのを待っています..."
+
   delete: "削除"
   loading: "読み込み中"
   ok: "わかった"
@@ -393,10 +400,9 @@ desktop/views/components/notifications.vue:
   empty: "ありません!"
 
 desktop/views/components/post-form.vue:
-  note-placeholder: "いまどうしてる?"
   reply-placeholder: "この投稿への返信..."
   quote-placeholder: "この投稿を引用..."
-  note: "投稿"
+  submit: "投稿"
   reply: "返信"
   renote: "Renote"
   posted: "投稿しました!"
@@ -718,7 +724,6 @@ desktop/views/widgets/polls.vue:
 desktop/views/widgets/post-form.vue:
   title: "投稿"
   note: "投稿"
-  placeholder: "いまどうしてる?"
 
 desktop/views/widgets/profile.vue:
   update-banner: "クリックでバナー編集"
@@ -819,7 +824,6 @@ mobile/views/components/post-form.vue:
   renote: "Renote"
   renote-placeholder: "この投稿を引用... (オプション)"
   reply-placeholder: "この投稿への返信..."
-  note-placeholder: "いまどうしてる?"
   cw-placeholder: "内容への注釈 (オプション)"
   location-alert: "お使いの端末は位置情報に対応していません"
   error: "エラー"
diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index 8eec677b06..ad829065b0 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -86,11 +86,19 @@ export default Vue.extend({
 		},
 
 		placeholder(): string {
+			const x = [
+				'%i18n:common.note-placeholders.a%',
+				'%i18n:common.note-placeholders.b%',
+				'%i18n:common.note-placeholders.c%',
+				'%i18n:common.note-placeholders.d%',
+				'%i18n:common.note-placeholders.e%'
+			][Math.floor(Math.random() * 5)];
+
 			return this.renote
 				? '%i18n:@quote-placeholder%'
 				: this.reply
 					? '%i18n:@reply-placeholder%'
-					: '%i18n:@note-placeholder%';
+					: x;
 		},
 
 		submitText(): string {
@@ -98,7 +106,7 @@ export default Vue.extend({
 				? '%i18n:@renote%'
 				: this.reply
 					? '%i18n:@reply%'
-					: '%i18n:@note%';
+					: '%i18n:@submit%';
 		},
 
 		canPost(): boolean {
diff --git a/src/client/app/desktop/views/widgets/post-form.vue b/src/client/app/desktop/views/widgets/post-form.vue
index 69b21ad37a..fb4adf70b8 100644
--- a/src/client/app/desktop/views/widgets/post-form.vue
+++ b/src/client/app/desktop/views/widgets/post-form.vue
@@ -3,7 +3,7 @@
 	<template v-if="props.design == 0">
 		<p class="title">%fa:pencil-alt%%i18n:@title%</p>
 	</template>
-	<textarea :disabled="posting" v-model="text" @keydown="onKeydown" placeholder="%i18n:@placeholder%"></textarea>
+	<textarea :disabled="posting" v-model="text" @keydown="onKeydown" :placeholder="placeholder"></textarea>
 	<button @click="post" :disabled="posting">%i18n:@note%</button>
 </div>
 </template>
@@ -22,6 +22,17 @@ export default define({
 			text: ''
 		};
 	},
+	computed: {
+		placeholder(): string {
+			return [
+				'%i18n:common.note-placeholders.a%',
+				'%i18n:common.note-placeholders.b%',
+				'%i18n:common.note-placeholders.c%',
+				'%i18n:common.note-placeholders.d%',
+				'%i18n:common.note-placeholders.e%'
+			][Math.floor(Math.random() * 5)];
+		}
+	},
 	methods: {
 		func() {
 			if (this.props.design == 1) {
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index f5badb48cc..61f0462659 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -5,11 +5,7 @@
 		<div>
 			<span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span>
 			<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
-			<button class="submit" :disabled="posting" @click="post">
-				<template v-if="reply">%i18n:@reply%</template>
-				<template v-else-if="renote">%i18n:@renote%</template>
-				<template v-else>%i18n:@submit%</template>
-			</button>
+			<button class="submit" :disabled="posting" @click="post">{{ submitText }}</button>
 		</div>
 	</header>
 	<div class="form">
@@ -20,7 +16,7 @@
 			<a @click="addVisibleUser">+%i18n:@add-visible-user%</a>
 		</div>
 		<input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%">
-		<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea>
+		<textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder"></textarea>
 		<div class="attaches" v-show="files.length != 0">
 			<x-draggable class="files" :list="files" :options="{ animation: 150 }">
 				<div class="file" v-for="file in files" :key="file.id">
@@ -74,6 +70,44 @@ export default Vue.extend({
 		};
 	},
 
+	computed: {
+		draftId(): string {
+			return this.renote
+				? 'renote:' + this.renote.id
+				: this.reply
+					? 'reply:' + this.reply.id
+					: 'note';
+		},
+
+		placeholder(): string {
+			const x = [
+				'%i18n:common.note-placeholders.a%',
+				'%i18n:common.note-placeholders.b%',
+				'%i18n:common.note-placeholders.c%',
+				'%i18n:common.note-placeholders.d%',
+				'%i18n:common.note-placeholders.e%'
+			][Math.floor(Math.random() * 5)];
+
+			return this.renote
+				? '%i18n:@quote-placeholder%'
+				: this.reply
+					? '%i18n:@reply-placeholder%'
+					: x;
+		},
+
+		submitText(): string {
+			return this.renote
+				? '%i18n:@renote%'
+				: this.reply
+					? '%i18n:@reply%'
+					: '%i18n:@submit%';
+		},
+
+		canPost(): boolean {
+			return !this.posting && (this.text.length != 0 || this.files.length != 0 || this.poll || this.renote);
+		}
+	},
+
 	mounted() {
 		if (this.reply && this.reply.user.host != null) {
 			this.text = `@${this.reply.user.username}@${this.reply.user.host} `;

From afc2efee1b70e2999d5069aa6fbd96cd4fc12377 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 01:50:01 +0900
Subject: [PATCH 053/369] :v:

---
 src/server/api/endpoints/notes.ts | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts
index 21946d1bd3..e6fe80ac8a 100644
--- a/src/server/api/endpoints/notes.ts
+++ b/src/server/api/endpoints/notes.ts
@@ -53,7 +53,9 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	const sort = {
 		_id: -1
 	};
-	const query = {} as any;
+	const query = {
+		visibility: 'public'
+	} as any;
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {

From 2ddbca464131708961c5436a38cec5af1220c861 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 01:55:32 +0900
Subject: [PATCH 054/369] Fix bug

---
 src/client/app/auth/views/index.vue | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue
index e53bbd026f..8f4f5fd8c5 100644
--- a/src/client/app/auth/views/index.vue
+++ b/src/client/app/auth/views/index.vue
@@ -51,7 +51,7 @@ export default Vue.extend({
 		}
 	},
 	mounted() {
-		if (!this.$root.$data.$store.getters.isSignedIn) return;
+		if (!this.$store.getters.isSignedIn) return;
 
 		// Fetch session
 		(this as any).api('auth/session/show', {
@@ -72,6 +72,7 @@ export default Vue.extend({
 			}
 		}).catch(error => {
 			this.state = 'fetch-session-error';
+			this.fetching = false;
 		});
 	},
 	methods: {

From e5431648fd1136df26388b496cf9ba9b3066c001 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 02:00:45 +0900
Subject: [PATCH 055/369] :v:

---
 locales/ja.yml                                        | 7 ++++---
 src/client/app/desktop/views/components/post-form.vue | 8 +++++---
 src/client/app/desktop/views/widgets/post-form.vue    | 8 +++++---
 src/client/app/mobile/views/components/post-form.vue  | 8 +++++---
 4 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index c02422e81a..677cb13298 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -42,9 +42,10 @@ common:
   note-placeholders:
     a: "今どうしてる?"
     b: "何かありましたか?"
-    c: "言いたいことは?"
-    d: "ここに書いてください"
-    e: "あなたが書くのを待っています..."
+    c: "何をお考えですか?"
+    d: "言いたいことは?"
+    e: "ここに書いてください"
+    f: "あなたが書くのを待っています..."
 
   delete: "削除"
   loading: "読み込み中"
diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index ad829065b0..7b2adfe707 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -86,13 +86,15 @@ export default Vue.extend({
 		},
 
 		placeholder(): string {
-			const x = [
+			const xs = [
 				'%i18n:common.note-placeholders.a%',
 				'%i18n:common.note-placeholders.b%',
 				'%i18n:common.note-placeholders.c%',
 				'%i18n:common.note-placeholders.d%',
-				'%i18n:common.note-placeholders.e%'
-			][Math.floor(Math.random() * 5)];
+				'%i18n:common.note-placeholders.e%',
+				'%i18n:common.note-placeholders.f%'
+			];
+			const x = xs[Math.floor(Math.random() * xs.length)];
 
 			return this.renote
 				? '%i18n:@quote-placeholder%'
diff --git a/src/client/app/desktop/views/widgets/post-form.vue b/src/client/app/desktop/views/widgets/post-form.vue
index fb4adf70b8..3c4ade0e81 100644
--- a/src/client/app/desktop/views/widgets/post-form.vue
+++ b/src/client/app/desktop/views/widgets/post-form.vue
@@ -24,13 +24,15 @@ export default define({
 	},
 	computed: {
 		placeholder(): string {
-			return [
+			const xs = [
 				'%i18n:common.note-placeholders.a%',
 				'%i18n:common.note-placeholders.b%',
 				'%i18n:common.note-placeholders.c%',
 				'%i18n:common.note-placeholders.d%',
-				'%i18n:common.note-placeholders.e%'
-			][Math.floor(Math.random() * 5)];
+				'%i18n:common.note-placeholders.e%',
+				'%i18n:common.note-placeholders.f%'
+			];
+			return xs[Math.floor(Math.random() * xs.length)];
 		}
 	},
 	methods: {
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index 61f0462659..beacb1721b 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -80,13 +80,15 @@ export default Vue.extend({
 		},
 
 		placeholder(): string {
-			const x = [
+			const xs = [
 				'%i18n:common.note-placeholders.a%',
 				'%i18n:common.note-placeholders.b%',
 				'%i18n:common.note-placeholders.c%',
 				'%i18n:common.note-placeholders.d%',
-				'%i18n:common.note-placeholders.e%'
-			][Math.floor(Math.random() * 5)];
+				'%i18n:common.note-placeholders.e%',
+				'%i18n:common.note-placeholders.f%'
+			];
+			const x = xs[Math.floor(Math.random() * xs.length)];
 
 			return this.renote
 				? '%i18n:@quote-placeholder%'

From 8c9977c136d98706615469a10e3fa34671736d72 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 02:20:40 +0900
Subject: [PATCH 056/369] :art:

---
 assets/mi.svg                                 |  24 ++-
 .../app/desktop/assets/header-icon.dark.svg   | 150 ++++++++++++++++++
 .../app/desktop/assets/header-icon.light.svg  | 150 ++++++++++++++++++
 .../app/desktop/assets/header-logo-white.svg  |  25 ---
 src/client/app/desktop/assets/header-logo.svg |  25 ---
 .../desktop/views/components/ui.header.vue    |   4 +-
 .../app/desktop/views/pages/welcome.vue       |   2 +-
 .../client/assets/title.dark.svg              |   0
 .../client/assets/title.light.svg             |   0
 9 files changed, 312 insertions(+), 68 deletions(-)
 create mode 100644 src/client/app/desktop/assets/header-icon.dark.svg
 create mode 100644 src/client/app/desktop/assets/header-icon.light.svg
 delete mode 100644 src/client/app/desktop/assets/header-logo-white.svg
 delete mode 100644 src/client/app/desktop/assets/header-logo.svg
 rename assets/title-dark.svg => src/client/assets/title.dark.svg (100%)
 rename assets/title.svg => src/client/assets/title.light.svg (100%)

diff --git a/assets/mi.svg b/assets/mi.svg
index d4f7cf7e9e..44e5c74d0c 100644
--- a/assets/mi.svg
+++ b/assets/mi.svg
@@ -69,7 +69,7 @@
      inkscape:cx="232.39583"
      inkscape:cy="251.50613"
      inkscape:document-units="px"
-     inkscape:current-layer="layer1"
+     inkscape:current-layer="g4502"
      showgrid="true"
      units="px"
      inkscape:snap-bbox="true"
@@ -79,7 +79,7 @@
      inkscape:snap-center="true"
      inkscape:snap-page="true"
      inkscape:window-width="1920"
-     inkscape:window-height="1017"
+     inkscape:window-height="1027"
      inkscape:window-x="-8"
      inkscape:window-y="1072"
      inkscape:window-maximized="1"
@@ -111,7 +111,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -124,25 +124,19 @@
        id="g4502"
        transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
       <g
-         style="fill:#2fa1bb;fill-opacity:0.94117647"
+         style="fill:#000000;fill-opacity:1"
          transform="translate(-1.3333333e-6,-1.3439941e-6)"
          id="g5125">
         <g
            transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
            id="text4489"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa1bb;fill-opacity:0.94117647;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
            aria-label="Mi">
           <path
-             sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
-             inkscape:connector-curvature="0"
-             id="path5210"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:0.94117647;stroke-width:0.28950602px"
-             d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path5212"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:0.94117647;stroke-width:0.28950602px"
-             d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:1.09609616px"
+             d="M 62.474609 76.585938 C 54.999059 76.585938 47.878825 77.832365 41.115234 80.324219 C 29.011968 84.595952 19.044417 92.249798 11.212891 103.28516 C 3.7373405 113.96451 0 125.88934 0 139.06055 L 0 372.93945 C 0 390.02642 6.0510264 404.79858 18.154297 417.25781 C 30.613543 429.36108 45.387643 435.41406 62.474609 435.41406 C 79.917556 435.41406 94.689698 429.36108 106.79297 417.25781 C 119.25222 404.79858 125.48242 390.02642 125.48242 372.93945 L 125.48242 330.4082 C 125.61683 321.19698 135.10492 323.61391 139.90039 330.4082 C 148.8815 345.96215 167.92265 359.32062 190.0918 359.24414 C 212.26095 359.16778 230.67374 348.20715 240.28516 330.4082 C 243.92497 326.11557 254.18418 318.80145 255.23633 330.4082 L 255.23633 372.93945 C 255.23633 390.02642 261.28735 404.79858 273.39062 417.25781 C 285.84985 429.36108 300.62397 435.41406 317.71094 435.41406 C 335.15388 435.41406 349.92603 429.36108 362.0293 417.25781 C 374.48853 404.79858 380.71875 390.02642 380.71875 372.93945 L 380.71875 139.06055 C 380.71875 125.88934 376.80415 113.96451 368.97266 103.28516 C 361.49709 92.249798 351.70678 84.595952 339.60352 80.324219 C 332.48396 77.832365 325.3637 76.585938 318.24414 76.585938 C 299.02128 76.585938 282.82549 84.062587 269.6543 99.013672 C 262.53473 107.20121 258.79542 111.11761 258.43945 110.76172 C 258.43945 110.76172 207.67587 172.14495 206.25195 173.21289 C 204.82804 174.2808 200.11102 182.44531 190.0918 182.44531 C 180.07257 182.44531 175.89071 174.2808 174.4668 173.21289 C 173.04288 172.14495 122.2793 110.76172 122.2793 110.76172 C 121.21136 110.40575 117.29484 106.48923 110.53125 99.013672 C 97.716024 84.062587 81.697447 76.585938 62.474609 76.585938 z M 457.53516 76.585938 C 442.58406 76.585937 429.7692 81.926117 419.08984 92.605469 C 408.76646 102.92885 403.60547 115.56648 403.60547 130.51758 C 403.60547 145.46868 408.76646 158.28354 419.08984 168.96289 C 429.7692 179.28627 442.58406 184.44922 457.53516 184.44922 C 472.48625 184.44922 485.30112 179.28627 495.98047 168.96289 C 506.65982 158.28354 512 145.46868 512 130.51758 C 512 115.56648 506.65982 102.92885 495.98047 92.605469 C 485.30112 81.926117 472.48625 76.585938 457.53516 76.585938 z M 458.06836 195.12695 C 443.11726 195.12695 430.3024 200.46713 419.62305 211.14648 C 408.94369 221.82584 403.60547 234.6407 403.60547 249.5918 L 403.60547 381.48242 C 403.60547 396.43352 408.94369 409.24838 419.62305 419.92773 C 430.3024 430.25112 443.11726 435.41406 458.06836 435.41406 C 473.01946 435.41406 485.65709 430.25112 495.98047 419.92773 C 506.65982 409.24838 512 396.43352 512 381.48242 L 512 249.5918 C 512 234.6407 506.65982 221.82584 495.98047 211.14648 C 485.65709 200.46713 473.01946 195.12695 458.06836 195.12695 z "
+             transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
+             id="path5210" />
         </g>
       </g>
     </g>
diff --git a/src/client/app/desktop/assets/header-icon.dark.svg b/src/client/app/desktop/assets/header-icon.dark.svg
new file mode 100644
index 0000000000..fa42856fa5
--- /dev/null
+++ b/src/client/app/desktop/assets/header-icon.dark.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="512"
+   height="512"
+   viewBox="0 0 135.46667 135.46667"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="header-icon.dark.svg"
+   inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
+   inkscape:export-xdpi="6"
+   inkscape:export-ydpi="6">
+  <defs
+     id="defs2">
+    <inkscape:path-effect
+       effect="simplify"
+       id="path-effect5115"
+       is_visible="true"
+       steps="1"
+       threshold="0.000408163"
+       smooth_angles="360"
+       helper_size="0"
+       simplify_individual_paths="false"
+       simplify_just_coalesce="false"
+       simplifyindividualpaths="false"
+       simplifyJustCoalesce="false" />
+    <inkscape:path-effect
+       effect="simplify"
+       id="path-effect5111"
+       is_visible="true"
+       steps="1"
+       threshold="0.000408163"
+       smooth_angles="360"
+       helper_size="0"
+       simplify_individual_paths="false"
+       simplify_just_coalesce="false"
+       simplifyindividualpaths="false"
+       simplifyJustCoalesce="false" />
+    <inkscape:path-effect
+       effect="simplify"
+       id="path-effect5104"
+       is_visible="true"
+       steps="1"
+       threshold="0.000408163"
+       smooth_angles="360"
+       helper_size="0"
+       simplify_individual_paths="false"
+       simplify_just_coalesce="false"
+       simplifyindividualpaths="false"
+       simplifyJustCoalesce="false" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4142136"
+     inkscape:cx="114.309"
+     inkscape:cy="251.50613"
+     inkscape:document-units="px"
+     inkscape:current-layer="g4502"
+     showgrid="true"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="false"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-center="true"
+     inkscape:snap-page="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1027"
+     inkscape:window-x="-8"
+     inkscape:window-y="1072"
+     inkscape:window-maximized="1"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-midpoints="true"
+     inkscape:object-paths="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     objecttolerance="1"
+     guidetolerance="1"
+     inkscape:snap-nodes="false"
+     inkscape:snap-others="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4504"
+       spacingx="4.2333334"
+       spacingy="4.2333334"
+       empcolor="#ff3fff"
+       empopacity="0.25098039"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="レイヤー 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-30.809093,-111.78601)">
+    <g
+       id="g4502"
+       transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
+      <g
+         style="fill:#ffffff;fill-opacity:1"
+         transform="translate(-1.3333333e-6,-1.3439941e-6)"
+         id="g5125">
+        <g
+           transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
+           id="text4489"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           aria-label="Mi">
+          <path
+             sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
+             inkscape:connector-curvature="0"
+             id="path5210"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px"
+             d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path5212"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px"
+             d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/src/client/app/desktop/assets/header-icon.light.svg b/src/client/app/desktop/assets/header-icon.light.svg
new file mode 100644
index 0000000000..61e2026243
--- /dev/null
+++ b/src/client/app/desktop/assets/header-icon.light.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="512"
+   height="512"
+   viewBox="0 0 135.46667 135.46667"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="header-icon.light.svg"
+   inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
+   inkscape:export-xdpi="6"
+   inkscape:export-ydpi="6">
+  <defs
+     id="defs2">
+    <inkscape:path-effect
+       effect="simplify"
+       id="path-effect5115"
+       is_visible="true"
+       steps="1"
+       threshold="0.000408163"
+       smooth_angles="360"
+       helper_size="0"
+       simplify_individual_paths="false"
+       simplify_just_coalesce="false"
+       simplifyindividualpaths="false"
+       simplifyJustCoalesce="false" />
+    <inkscape:path-effect
+       effect="simplify"
+       id="path-effect5111"
+       is_visible="true"
+       steps="1"
+       threshold="0.000408163"
+       smooth_angles="360"
+       helper_size="0"
+       simplify_individual_paths="false"
+       simplify_just_coalesce="false"
+       simplifyindividualpaths="false"
+       simplifyJustCoalesce="false" />
+    <inkscape:path-effect
+       effect="simplify"
+       id="path-effect5104"
+       is_visible="true"
+       steps="1"
+       threshold="0.000408163"
+       smooth_angles="360"
+       helper_size="0"
+       simplify_individual_paths="false"
+       simplify_just_coalesce="false"
+       simplifyindividualpaths="false"
+       simplifyJustCoalesce="false" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4142136"
+     inkscape:cx="114.309"
+     inkscape:cy="251.50613"
+     inkscape:document-units="px"
+     inkscape:current-layer="g4502"
+     showgrid="true"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="false"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-center="true"
+     inkscape:snap-page="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1027"
+     inkscape:window-x="-8"
+     inkscape:window-y="1072"
+     inkscape:window-maximized="1"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-midpoints="true"
+     inkscape:object-paths="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     objecttolerance="1"
+     guidetolerance="1"
+     inkscape:snap-nodes="false"
+     inkscape:snap-others="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4504"
+       spacingx="4.2333334"
+       spacingy="4.2333334"
+       empcolor="#ff3fff"
+       empopacity="0.25098039"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="レイヤー 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-30.809093,-111.78601)">
+    <g
+       id="g4502"
+       transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
+      <g
+         style="fill:#000000;fill-opacity:1"
+         transform="translate(-1.3333333e-6,-1.3439941e-6)"
+         id="g5125">
+        <g
+           transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
+           id="text4489"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           aria-label="Mi">
+          <path
+             sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
+             inkscape:connector-curvature="0"
+             id="path5210"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:0.28950602px"
+             d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path5212"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:0.28950602px"
+             d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/src/client/app/desktop/assets/header-logo-white.svg b/src/client/app/desktop/assets/header-logo-white.svg
deleted file mode 100644
index 8082edb30d..0000000000
--- a/src/client/app/desktop/assets/header-logo-white.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve">
-<circle fill="#FFFFFF" cx="128" cy="153.6" r="19.201"/>
-<circle fill="#FFFFFF" cx="51.2" cy="153.6" r="19.2"/>
-<circle fill="#FFFFFF" cx="204.8" cy="153.6" r="19.2"/>
-<polyline fill="none" stroke="#FFFFFF" stroke-width="16" stroke-linejoin="round" stroke-miterlimit="10" points="51.2,153.6 
-	89.601,102.4 128,153.6 166.4,102.4 204.799,153.6 "/>
-<circle fill="#FFFFFF" cx="89.6" cy="102.4" r="19.2"/>
-<circle fill="#FFFFFF" cx="166.4" cy="102.4" r="19.199"/>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/src/client/app/desktop/assets/header-logo.svg b/src/client/app/desktop/assets/header-logo.svg
deleted file mode 100644
index 3a2207954a..0000000000
--- a/src/client/app/desktop/assets/header-logo.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve">
-<circle cx="128" cy="153.6" r="19.201"/>
-<circle cx="51.2" cy="153.6" r="19.2"/>
-<circle cx="204.8" cy="153.6" r="19.2"/>
-<polyline fill="none" stroke="#000000" stroke-width="16" stroke-linejoin="round" stroke-miterlimit="10" points="51.2,153.6 
-	89.601,102.4 128,153.6 166.4,102.4 204.799,153.6 "/>
-<circle cx="89.6" cy="102.4" r="19.2"/>
-<circle cx="166.4" cy="102.4" r="19.199"/>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue
index 34464bf4b2..7045790054 100644
--- a/src/client/app/desktop/views/components/ui.header.vue
+++ b/src/client/app/desktop/views/components/ui.header.vue
@@ -150,8 +150,8 @@ root(isDark)
 					display block
 					width 100%
 					height 48px
-					background-image url(/assets/desktop/header-logo.svg)
-					background-size 46px
+					background-image isDark ? url('/assets/desktop/header-icon.dark.svg') : url('/assets/desktop/header-icon.light.svg')
+					background-size 24px
 					background-position center
 					background-repeat no-repeat
 					opacity 0.3
diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index 03a60dd487..1bb791b68c 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -12,7 +12,7 @@
 		</article>
 	</main>
 	<main v-else class="index">
-		<img :src="$store.state.device.darkmode ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey">
+		<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey">
 		<p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p>
 		<p class="account">
 			<button class="signup" @click="signup">%i18n:@signup-button%</button>
diff --git a/assets/title-dark.svg b/src/client/assets/title.dark.svg
similarity index 100%
rename from assets/title-dark.svg
rename to src/client/assets/title.dark.svg
diff --git a/assets/title.svg b/src/client/assets/title.light.svg
similarity index 100%
rename from assets/title.svg
rename to src/client/assets/title.light.svg

From 9f1385b03a64594a2609af1013637ac003f4ae33 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 02:26:13 +0900
Subject: [PATCH 057/369] 2.22.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 3b3da1810a..37caf8b01c 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.21.1",
-	"clientVersion": "1.0.5903",
+	"version": "2.22.0",
+	"clientVersion": "1.0.5939",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 9d27fa7eaa8ce80233f333b24e093fc39ffb1d2a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 02:31:32 +0900
Subject: [PATCH 058/369] Fix bug

---
 .../views/components/ui.header.nav.vue        | 27 +++++--------------
 1 file changed, 6 insertions(+), 21 deletions(-)

diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue
index 201b04b039..4780c57cb4 100644
--- a/src/client/app/desktop/views/components/ui.header.nav.vue
+++ b/src/client/app/desktop/views/components/ui.header.nav.vue
@@ -12,7 +12,7 @@
 				<a @click="messaging">
 					%fa:comments%
 					<p>%i18n:@messaging%</p>
-					<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>
+					<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>
 				</a>
 			</li>
 			<li class="game">
@@ -35,48 +35,33 @@ import MkGameWindow from './game-window.vue';
 export default Vue.extend({
 	data() {
 		return {
-			hasUnreadMessagingMessages: false,
 			hasGameInvitations: false,
 			connection: null,
 			connectionId: null
 		};
 	},
+	computed: {
+		hasUnreadMessagingMessage(): boolean {
+			return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
+		}
+	},
 	mounted() {
 		if (this.$store.getters.isSignedIn) {
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
-			this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
-			this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
 			this.connection.on('othello_invited', this.onOthelloInvited);
 			this.connection.on('othello_no_invites', this.onOthelloNoInvites);
-
-			// Fetch count of unread messaging messages
-			(this as any).api('messaging/unread').then(res => {
-				if (res.count > 0) {
-					this.hasUnreadMessagingMessages = true;
-				}
-			});
 		}
 	},
 	beforeDestroy() {
 		if (this.$store.getters.isSignedIn) {
-			this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
-			this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
 			this.connection.off('othello_invited', this.onOthelloInvited);
 			this.connection.off('othello_no_invites', this.onOthelloNoInvites);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
 	},
 	methods: {
-		onUnreadMessagingMessage() {
-			this.hasUnreadMessagingMessages = true;
-		},
-
-		onReadAllMessagingMessages() {
-			this.hasUnreadMessagingMessages = false;
-		},
-
 		onOthelloInvited() {
 			this.hasGameInvitations = true;
 		},

From 12b13e974c377d02bb8d41840fd43faba04074f1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 02:36:57 +0900
Subject: [PATCH 059/369] :art:

---
 src/client/app/desktop/style.styl | 53 ++++++++++---------------------
 1 file changed, 16 insertions(+), 37 deletions(-)

diff --git a/src/client/app/desktop/style.styl b/src/client/app/desktop/style.styl
index ea48fbee3d..f2a60955fd 100644
--- a/src/client/app/desktop/style.styl
+++ b/src/client/app/desktop/style.styl
@@ -6,44 +6,27 @@
 *::input-placeholder
 	color #D8CBC5
 
-*
-	&:focus
-		outline none
-
-	&::scrollbar
-		width 5px
-		background transparent
-
-		&:horizontal
-			height 5px
-
-	&::scrollbar-button
-		width 0
-		height 0
-		background rgba(0, 0, 0, 0.2)
-
-	&::scrollbar-piece
-		background transparent
-
-		&:start
-			background transparent
-
-	&::scrollbar-thumb
-		background rgba(0, 0, 0, 0.2)
-
-		&:hover
-			background rgba(0, 0, 0, 0.4)
-
-		&:active
-			background $theme-color
-
-	&::scrollbar-corner
-		background rgba(0, 0, 0, 0.2)
+*:focus
+	outline none
 
 html
 	height 100%
 	background #f7f7f7
 
+	&, *
+		&::-webkit-scrollbar
+			width 6px
+			height 6px
+
+		&::-webkit-scrollbar-thumb
+			background rgba(0, 0, 0, 0.2)
+
+			&:hover
+				background rgba(0, 0, 0, 0.4)
+
+			&:active
+				background $theme-color
+
 	&[data-darkmode]
 		background #191B22
 
@@ -51,10 +34,6 @@ html
 			&::-webkit-scrollbar-track
 				background-color #282C37
 
-			&::-webkit-scrollbar
-				width 6px
-				height 6px
-
 			&::-webkit-scrollbar-thumb
 				background-color #454954
 

From 281971f4a496429eedcc45997bcae61500dcef14 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 02:37:31 +0900
Subject: [PATCH 060/369] 2.22.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 37caf8b01c..0a8f61646c 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.22.0",
-	"clientVersion": "1.0.5939",
+	"version": "2.22.1",
+	"clientVersion": "1.0.5942",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From a0a4ce4dd9d649839da7862e206f47d1c27de2c2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:25:28 +0900
Subject: [PATCH 061/369] Fix bug

---
 src/server/api/endpoints/notes/replies.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts
index f407f3bd56..608027f6b1 100644
--- a/src/server/api/endpoints/notes/replies.ts
+++ b/src/server/api/endpoints/notes/replies.ts
@@ -26,7 +26,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		return rej('note not found');
 	}
 
-	const ids = note._replyIds.slice(offset, offset + limit);
+	const ids = (note._replyIds || []).slice(offset, offset + limit);
 
 	// Serialize
 	res(await Promise.all(ids.map(id => pack(id, user))));

From f557407589abe8049b931f7b7e6db26d441ae796 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:29:02 +0900
Subject: [PATCH 062/369] Fix bug

---
 src/client/app/mobile/views/components/note-detail.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index 8ab766e1dc..d4606c0313 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -172,7 +172,7 @@ export default Vue.extend({
 	},
 
 	methods: {
-		fetchContext() {
+		fetchConversation() {
 			this.conversationFetching = true;
 
 			// Fetch conversation

From 3c2d72f6119a73f83057834ef6ff1ed69ac57c6b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:32:55 +0900
Subject: [PATCH 063/369] Fix bug

---
 src/client/app/mobile/views/components/ui.nav.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index de8c21e795..033372ffef 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -17,8 +17,8 @@
 				<ul>
 					<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
-					<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>%fa:angle-right%</router-link></li>
-					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitations">%fa:circle%</template>%fa:angle-right%</router-link></li>
+					<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
+					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
 				</ul>
 				<ul>
 					<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li>

From c351ba782081fe541dd7368e6e265d883115ecdf Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:36:45 +0900
Subject: [PATCH 064/369] Fix

---
 locales/ja.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 677cb13298..d727b01185 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -823,7 +823,7 @@ mobile/views/components/post-form.vue:
   submit: "投稿"
   reply: "返信"
   renote: "Renote"
-  renote-placeholder: "この投稿を引用... (オプション)"
+  quote-placeholder: "この投稿を引用... (オプション)"
   reply-placeholder: "この投稿への返信..."
   cw-placeholder: "内容への注釈 (オプション)"
   location-alert: "お使いの端末は位置情報に対応していません"

From 4c54d68fad8a821da39d6c33ba0b749382df3dca Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:38:24 +0900
Subject: [PATCH 065/369] Darken

---
 .../desktop/views/components/ui-notification.vue   | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/client/app/desktop/views/components/ui-notification.vue b/src/client/app/desktop/views/components/ui-notification.vue
index 9983f02c5e..68413914c0 100644
--- a/src/client/app/desktop/views/components/ui-notification.vue
+++ b/src/client/app/desktop/views/components/ui-notification.vue
@@ -36,7 +36,7 @@ export default Vue.extend({
 </script>
 
 <style lang="stylus" scoped>
-.mk-ui-notification
+root(isDark)
 	display block
 	position fixed
 	z-index 10000
@@ -46,10 +46,10 @@ export default Vue.extend({
 	margin 0 auto
 	padding 128px 0 0 0
 	width 500px
-	color rgba(#000, 0.6)
-	background rgba(#fff, 0.9)
+	color rgba(isDark ? #fff : #000, 0.6)
+	background rgba(isDark ? #282C37 : #fff, 0.9)
 	border-radius 0 0 8px 8px
-	box-shadow 0 2px 4px rgba(#000, 0.2)
+	box-shadow 0 2px 4px rgba(#000, isDark ? 0.4 : 0.2)
 	transform translateY(-64px)
 	opacity 0
 
@@ -58,4 +58,10 @@ export default Vue.extend({
 		line-height 64px
 		text-align center
 
+.mk-ui-notification[data-darkmode]
+	root(true)
+
+.mk-ui-notification:not([data-darkmode])
+	root(false)
+
 </style>

From 11409b723e8aca66d3b32a08a3c295427ee735ab Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:45:01 +0900
Subject: [PATCH 066/369] :art:

---
 .../common/views/components/media-list.vue    | 85 +++++++++++--------
 1 file changed, 48 insertions(+), 37 deletions(-)

diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue
index ff9d5e1022..384f6cd27c 100644
--- a/src/client/app/common/views/components/media-list.vue
+++ b/src/client/app/common/views/components/media-list.vue
@@ -1,9 +1,11 @@
 <template>
-<div class="mk-media-list" :data-count="mediaList.length">
-	<template v-for="media in mediaList">
-		<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
-		<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
-	</template>
+<div class="mk-media-list">
+	<div :data-count="mediaList.length">
+		<template v-for="media in mediaList">
+			<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
+			<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
+		</template>
+	</div>
 </div>
 </template>
 
@@ -24,41 +26,50 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 .mk-media-list
-	display grid
-	grid-gap 4px
-	height 256px
+	width 100%
 
-	@media (max-width 500px)
-		height 192px
+	&:before
+		content ''
+		display block
+		padding-top 56.25% // 16:9
+
+	> div
+		position absolute
+		top 0
+		left 0
+		right 0
+		bottom 0
+		display grid
+		grid-gap 4px
+
+		&[data-count="1"]
+			grid-template-rows 1fr
+		&[data-count="2"]
+			grid-template-columns 1fr 1fr
+			grid-template-rows 1fr
+		&[data-count="3"]
+			grid-template-columns 1fr 0.5fr
+			grid-template-rows 1fr 1fr
+			:nth-child(1)
+				grid-row 1 / 3
+			:nth-child(3)
+				grid-column 2 / 3
+				grid-row 2/3
+		&[data-count="4"]
+			grid-template-columns 1fr 1fr
+			grid-template-rows 1fr 1fr
 
-	&[data-count="1"]
-		grid-template-rows 1fr
-	&[data-count="2"]
-		grid-template-columns 1fr 1fr
-		grid-template-rows 1fr
-	&[data-count="3"]
-		grid-template-columns 1fr 0.5fr
-		grid-template-rows 1fr 1fr
 		:nth-child(1)
-			grid-row 1 / 3
-		:nth-child(3)
+			grid-column 1 / 2
+			grid-row 1 / 2
+		:nth-child(2)
 			grid-column 2 / 3
-			grid-row 2/3
-	&[data-count="4"]
-		grid-template-columns 1fr 1fr
-		grid-template-rows 1fr 1fr
-
-	:nth-child(1)
-		grid-column 1 / 2
-		grid-row 1 / 2
-	:nth-child(2)
-		grid-column 2 / 3
-		grid-row 1 / 2
-	:nth-child(3)
-		grid-column 1 / 2
-		grid-row 2 / 3
-	:nth-child(4)
-		grid-column 2 / 3
-		grid-row 2 / 3
+			grid-row 1 / 2
+		:nth-child(3)
+			grid-column 1 / 2
+			grid-row 2 / 3
+		:nth-child(4)
+			grid-column 2 / 3
+			grid-row 2 / 3
 
 </style>

From 72f2b92d4f3eacab36c099e82ac8a1b06160038f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:53:28 +0900
Subject: [PATCH 067/369] :v:

---
 src/client/app/common/views/components/media-list.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue
index 384f6cd27c..6df2aa3226 100644
--- a/src/client/app/common/views/components/media-list.vue
+++ b/src/client/app/common/views/components/media-list.vue
@@ -37,8 +37,8 @@ export default Vue.extend({
 		position absolute
 		top 0
 		left 0
-		right 0
 		bottom 0
+		right 0
 		display grid
 		grid-gap 4px
 

From b375bbc75cb8398ad79d1275c7b1d4d9b29a9d1c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 11:53:59 +0900
Subject: [PATCH 068/369] 2.22.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 0a8f61646c..0dac414b2e 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.22.1",
-	"clientVersion": "1.0.5942",
+	"version": "2.22.2",
+	"clientVersion": "1.0.5963",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From fb28b238cfa780b1c82ad23295b09898f24c1374 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 13:21:38 +0900
Subject: [PATCH 069/369] Add workaround for Safari bug

---
 .../app/common/views/components/media-list.vue       | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue
index 6df2aa3226..c6cb667165 100644
--- a/src/client/app/common/views/components/media-list.vue
+++ b/src/client/app/common/views/components/media-list.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="mk-media-list">
-	<div :data-count="mediaList.length">
+	<div :data-count="mediaList.length" ref="grid">
 		<template v-for="media in mediaList">
 			<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
 			<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
@@ -20,6 +20,10 @@ export default Vue.extend({
 		raw: {
 			default: false
 		}
+	},
+	mounted() {
+		// for Safari bug
+		this.$refs.grid.style.height = `${this.$refs.grid.clientHeight}px`;
 	}
 });
 </script>
@@ -36,9 +40,9 @@ export default Vue.extend({
 	> div
 		position absolute
 		top 0
-		left 0
-		bottom 0
 		right 0
+		bottom 0
+		left 0
 		display grid
 		grid-gap 4px
 
@@ -54,7 +58,7 @@ export default Vue.extend({
 				grid-row 1 / 3
 			:nth-child(3)
 				grid-column 2 / 3
-				grid-row 2/3
+				grid-row 2 / 3
 		&[data-count="4"]
 			grid-template-columns 1fr 1fr
 			grid-template-rows 1fr 1fr

From 0e7c0fd52880e995cd2b67b29ec8ab3b7a973169 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 13:22:29 +0900
Subject: [PATCH 070/369] 2.22.3

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 0dac414b2e..58f2cebfaf 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.22.2",
-	"clientVersion": "1.0.5963",
+	"version": "2.22.3",
+	"clientVersion": "1.0.5965",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 366b7ef9460fd01051d61bb2d93af440c620bf01 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 14:22:15 +0900
Subject: [PATCH 071/369] :art:

---
 src/client/app/desktop/views/components/note-detail.vue | 2 --
 src/client/app/desktop/views/pages/favorites.vue        | 5 ++++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue
index 63b2150110..a8accaf531 100644
--- a/src/client/app/desktop/views/components/note-detail.vue
+++ b/src/client/app/desktop/views/components/note-detail.vue
@@ -218,8 +218,6 @@ export default Vue.extend({
 @import '~const.styl'
 
 root(isDark)
-	margin 0 auto
-	padding 0
 	overflow hidden
 	text-align left
 	background isDark ? #282C37 : #fff
diff --git a/src/client/app/desktop/views/pages/favorites.vue b/src/client/app/desktop/views/pages/favorites.vue
index 71d36cdf2b..8adb9412f2 100644
--- a/src/client/app/desktop/views/pages/favorites.vue
+++ b/src/client/app/desktop/views/pages/favorites.vue
@@ -2,7 +2,7 @@
 <mk-ui>
 	<main v-if="!fetching">
 		<template v-for="favorite in favorites">
-			<mk-note-detail :note="favorite.note" :key="favorite.note.id"/>
+			<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
 		</template>
 		<a v-if="existMore" @click="more">%i18n:@more%</a>
 	</main>
@@ -70,4 +70,7 @@ main
 	margin 0 auto
 	padding 16px
 	max-width 700px
+
+	> .post
+		margin-bottom 16px
 </style>

From da52f980c4e3cca48d0da47903cc8b6b5e12949e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 14:42:29 +0900
Subject: [PATCH 072/369] :v:

---
 locales/ja.yml                                |  8 ++
 src/client/app/mobile/script.ts               |  2 +
 .../mobile/views/components/note-detail.vue   |  2 -
 .../app/mobile/views/components/ui.nav.vue    |  7 +-
 .../app/mobile/views/pages/favorites.vue      | 94 +++++++++++++++++++
 5 files changed, 107 insertions(+), 6 deletions(-)
 create mode 100644 src/client/app/mobile/views/pages/favorites.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index d727b01185..366a030c99 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -846,6 +846,10 @@ mobile/views/components/ui.nav.vue:
   messaging: "メッセージ"
   search: "検索"
   drive: "ドライブ"
+  favorites: "お気に入り"
+  widgets: "ウィジェット"
+  game: "ゲーム"
+  darkmode: "ダークモード"
   settings: "設定"
   about: "Misskeyについて"
 
@@ -859,8 +863,12 @@ mobile/views/components/users-list.vue:
   known: "知り合い"
   load-more: "もっと"
 
+mobile/views/pages/favorites.vue:
+  title: "お気に入り"
+
 mobile/views/pages/drive.vue:
   drive: "ドライブ"
+  more: "もっと見る"
 
 mobile/views/pages/followers.vue:
   followers-of: "{}のフォロワー"
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index 5418aac090..4c3d8fc3bd 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -36,6 +36,7 @@ import MkNote from './views/pages/note.vue';
 import MkSearch from './views/pages/search.vue';
 import MkFollowers from './views/pages/followers.vue';
 import MkFollowing from './views/pages/following.vue';
+import MkFavorites from './views/pages/favorites.vue';
 import MkSettings from './views/pages/settings.vue';
 import MkOthello from './views/pages/othello.vue';
 
@@ -72,6 +73,7 @@ init((launch) => {
 			{ path: '/signup', name: 'signup', component: MkSignup },
 			{ path: '/i/settings', name: 'settings', component: MkSettings },
 			{ path: '/i/notifications', name: 'notifications', component: MkNotifications },
+			{ path: '/i/favorites', name: 'favorites', component: MkFavorites },
 			{ path: '/i/widgets', name: 'widgets', component: MkWidgets },
 			{ path: '/i/messaging', name: 'messaging', component: MkMessaging },
 			{ path: '/i/messaging/:user', component: MkMessagingRoom },
diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index d4606c0313..211ca27f1c 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -216,8 +216,6 @@ export default Vue.extend({
 
 root(isDark)
 	overflow hidden
-	margin 0 auto
-	padding 0
 	width 100%
 	text-align left
 	background isDark ? #282C37 : #fff
diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index 033372ffef..dd1b9c8e25 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -18,18 +18,17 @@
 					<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
-					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
+					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
 				</ul>
 				<ul>
 					<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li>
+					<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li>
 				</ul>
 				<ul>
 					<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>
-				</ul>
-				<ul>
 					<li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
-					<li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li>
+					<li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li>
 				</ul>
 			</div>
 			<a :href="aboutUrl"><p class="about">%i18n:@about%</p></a>
diff --git a/src/client/app/mobile/views/pages/favorites.vue b/src/client/app/mobile/views/pages/favorites.vue
new file mode 100644
index 0000000000..c4edd9d970
--- /dev/null
+++ b/src/client/app/mobile/views/pages/favorites.vue
@@ -0,0 +1,94 @@
+<template>
+<mk-ui>
+	<span slot="header">%fa:star%%i18n:@title%</span>
+
+	<main>
+		<template v-for="favorite in favorites">
+			<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
+		</template>
+		<a v-if="existMore" @click="more">%i18n:@more%</a>
+	</main>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import Progress from '../../../common/scripts/loading';
+
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			favorites: [],
+			existMore: false,
+			moreFetching: false
+		};
+	},
+	created() {
+		this.fetch();
+	},
+	mounted() {
+		document.title = 'Misskey | %i18n:@notifications%';
+	},
+	methods: {
+		fetch() {
+			Progress.start();
+			this.fetching = true;
+
+			(this as any).api('i/favorites', {
+				limit: 11
+			}).then(favorites => {
+				if (favorites.length == 11) {
+					this.existMore = true;
+					favorites.pop();
+				}
+
+				this.favorites = favorites;
+				this.fetching = false;
+
+				Progress.done();
+			});
+		},
+		more() {
+			this.moreFetching = true;
+			(this as any).api('i/favorites', {
+				limit: 11,
+				maxId: this.favorites[this.favorites.length - 1].id
+			}).then(favorites => {
+				if (favorites.length == 11) {
+					this.existMore = true;
+					favorites.pop();
+				} else {
+					this.existMore = false;
+				}
+
+				this.favorites = this.favorites.concat(favorites);
+				this.moreFetching = false;
+			});
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+main
+	width 100%
+	max-width 680px
+	margin 0 auto
+	padding 8px
+
+	> .post
+		margin-bottom 8px
+
+	@media (min-width 500px)
+		padding 16px
+
+		> .post
+			margin-bottom 16px
+
+	@media (min-width 600px)
+		padding 32px
+
+</style>

From 4ecc8c799d7d2765c2593ab6d3f08b93ad3d0b14 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 15:21:03 +0900
Subject: [PATCH 073/369] :art:

---
 .../desktop/views/components/note-preview.vue | 40 ++++++++----
 .../views/components/notes.note.sub.vue       | 12 ++--
 .../desktop/views/components/notes.note.vue   | 12 ++--
 .../mobile/views/components/note-preview.vue  | 64 +++++++++++++------
 .../app/mobile/views/components/note.sub.vue  | 36 ++++++-----
 .../app/mobile/views/components/note.vue      | 30 ++++-----
 6 files changed, 112 insertions(+), 82 deletions(-)

diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue
index 26c8a7d25c..1d9ee2cd0a 100644
--- a/src/client/app/desktop/views/components/note-preview.vue
+++ b/src/client/app/desktop/views/components/note-preview.vue
@@ -5,9 +5,18 @@
 		<header>
 			<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
 			<span class="username"><mk-acct :user="note.user"/></span>
-			<router-link class="time" :to="note | notePage">
-				<mk-time :time="note.createdAt"/>
-			</router-link>
+			<div class="info">
+				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
+				<router-link class="created-at" :to="note | notePage">
+					<mk-time :time="note.createdAt"/>
+				</router-link>
+				<span class="visibility" v-if="note.visibility != 'public'">
+					<template v-if="note.visibility == 'home'">%fa:home%</template>
+					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
+					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
+					<template v-if="note.visibility == 'private'">%fa:lock%</template>
+				</span>
+			</div>
 		</header>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
@@ -32,24 +41,20 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 root(isDark)
+	display flex
 	font-size 0.9em
 
-	&:after
-		content ""
-		display block
-		clear both
-
 	> .avatar
+		flex-shrink 0
 		display block
-		float left
 		margin 0 12px 0 0
 		width 48px
 		height 48px
 		border-radius 8px
 
 	> .main
-		float left
-		width calc(100% - 60px)
+		flex 1
+		min-width 0
 
 		> header
 			display flex
@@ -75,9 +80,18 @@ root(isDark)
 				text-overflow ellipsis
 				color isDark ? #606984 : #d1d8da
 
-			> .time
+			> .info
 				margin-left auto
-				color isDark ? #606984 : #b2b8bb
+				font-size 0.9em
+
+				> *
+					color isDark ? #606984 : #b2b8bb
+
+				> .mobile
+					margin-right 6px
+
+				> .visibility
+					margin-left 6px
 
 		> .body
 
diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue
index ca8aaeede0..4938b7984e 100644
--- a/src/client/app/desktop/views/components/notes.note.sub.vue
+++ b/src/client/app/desktop/views/components/notes.note.sub.vue
@@ -44,27 +44,23 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 root(isDark)
+	display flex
 	margin 0
 	padding 16px 32px
 	font-size 0.9em
 	background isDark ? #21242d : #fcfcfc
 
-	&:after
-		content ""
-		display block
-		clear both
-
 	> .avatar
+		flex-shrink 0
 		display block
-		float left
 		margin 0 12px 0 0
 		width 48px
 		height 48px
 		border-radius 8px
 
 	> .main
-		float left
-		width calc(100% - 60px)
+		flex 1
+		min-width 0
 
 		> header
 			display flex
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index 271332ba0b..5f4b0532a8 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -387,20 +387,16 @@ root(isDark)
 			padding-top 8px
 
 	> article
+		display flex
 		padding 28px 32px 18px 32px
 
-		&:after
-			content ""
-			display block
-			clear both
-
 		&:hover
 			> .main > footer > button
 				color isDark ? #707b97 : #888
 
 		> .avatar
+			flex-shrink 0
 			display block
-			float left
 			margin 0 16px 10px 0
 			width 58px
 			height 58px
@@ -410,8 +406,8 @@ root(isDark)
 			//top 74px
 
 		> .main
-			float left
-			width calc(100% - 74px)
+			flex 1
+			min-width 0
 
 			> header
 				display flex
diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index c3e57d3381..77ca99e978 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -9,9 +9,18 @@
 			<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
 			<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
 			<span class="username"><mk-acct :user="note.user"/></span>
-			<router-link class="time" :to="note | notePage">
-				<mk-time :time="note.createdAt"/>
-			</router-link>
+			<div class="info">
+				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
+				<router-link class="created-at" :to="note | notePage">
+					<mk-time :time="note.createdAt"/>
+				</router-link>
+				<span class="visibility" v-if="note.visibility != 'public'">
+					<template v-if="note.visibility == 'home'">%fa:home%</template>
+					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
+					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
+					<template v-if="note.visibility == 'private'">%fa:lock%</template>
+				</span>
+			</div>
 		</header>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
@@ -30,14 +39,16 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 root(isDark)
+	display flex
 	margin 0
 	padding 0
-	font-size 0.9em
+	font-size 10px
 
-	&:after
-		content ""
-		display block
-		clear both
+	@media (min-width 350px)
+		font-size 12px
+
+	@media (min-width 500px)
+		font-size 14px
 
 	&.smart
 		> .main
@@ -47,24 +58,26 @@ root(isDark)
 				align-items center
 
 	> .avatar
+		flex-shrink 0
 		display block
-		float left
-		margin 0 12px 0 0
-		width 48px
-		height 48px
+		margin 0 10px 0 0
+		width 40px
+		height 40px
 		border-radius 8px
 
-		@media (max-width 500px)
+		@media (min-width 350px)
 			margin 0 10px 0 0
 			width 44px
 			height 44px
 
-	> .main
-		float left
-		width calc(100% - 60px)
+		@media (min-width 500px)
+			margin 0 12px 0 0
+			width 48px
+			height 48px
 
-		@media (max-width 500px)
-			width calc(100% - 54px)
+	> .main
+		flex 1
+		min-width 0
 
 		> header
 			display flex
@@ -97,7 +110,7 @@ root(isDark)
 				align-self center
 				margin 0 0.5em 0 0
 				padding 1px 6px
-				font-size 10px
+				font-size 0.8em
 				color isDark ? #758188 : #aaa
 				border solid 1px isDark ? #57616f : #ddd
 				border-radius 3px
@@ -112,9 +125,18 @@ root(isDark)
 				text-overflow ellipsis
 				color isDark ? #606984 : #d1d8da
 
-			> .time
+			> .info
 				margin-left auto
-				color isDark ? #606984 : #b2b8bb
+				font-size 0.9em
+
+				> *
+					color isDark ? #606984 : #b2b8bb
+
+				> .mobile
+					margin-right 6px
+
+				> .visibility
+					margin-left 6px
 
 		> .body
 
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index 9b9dd9e667..a0084e6c29 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -39,10 +39,17 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 root(isDark)
+	display flex
 	padding 16px
-	font-size 0.9em
+	font-size 10px
 	background isDark ? #21242d : #fcfcfc
 
+	@media (min-width 350px)
+		font-size 12px
+
+	@media (min-width 500px)
+		font-size 14px
+
 	@media (min-width 600px)
 		padding 24px 32px
 
@@ -53,30 +60,27 @@ root(isDark)
 			> header
 				align-items center
 
-	&:after
-		content ""
-		display block
-		clear both
-
 	> .avatar
+		flex-shrink 0
 		display block
-		float left
-		margin 0 10px 0 0
-		width 42px
-		height 42px
+		margin 0 8px 0 0
+		width 38px
+		height 38px
 		border-radius 8px
 
+		@media (min-width 350px)
+			margin-right 10px
+			width 42px
+			height 42px
+
 		@media (min-width 500px)
 			margin-right 14px
 			width 50px
 			height 50px
 
 	> .main
-		float left
-		width calc(100% - 52px)
-
-		@media (min-width 500px)
-			width calc(100% - 64px)
+		flex 1
+		min-width 0
 
 		> header
 			display flex
@@ -112,7 +116,7 @@ root(isDark)
 				align-self center
 				margin 0 0.5em 0 0
 				padding 1px 5px
-				font-size 10px
+				font-size 0.8em
 				color isDark ? #758188 : #aaa
 				border solid 1px isDark ? #57616f : #ddd
 				border-radius 3px
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index c3994197c4..34326e12f3 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -269,8 +269,6 @@ root(isDark)
 	&.smart
 		> article
 			> .main
-				width 100%
-
 				> header
 					align-items center
 					margin-bottom 4px
@@ -328,27 +326,28 @@ root(isDark)
 			padding-top 8px
 
 	> article
+		display flex
 		padding 16px 16px 9px
 
 		@media (min-width 600px)
 			padding 32px 32px 22px
 
-		&:after
-			content ""
-			display block
-			clear both
-
 		> .avatar
+			flex-shrink 0
 			display block
-			float left
 			margin 0 10px 8px 0
-			width 48px
-			height 48px
+			width 42px
+			height 42px
 			border-radius 6px
 			//position -webkit-sticky
 			//position sticky
 			//top 62px
 
+			@media (min-width 350px)
+				width 48px
+				height 48px
+				border-radius 6px
+
 			@media (min-width 500px)
 				margin-right 16px
 				width 58px
@@ -356,11 +355,8 @@ root(isDark)
 				border-radius 8px
 
 		> .main
-			float left
-			width calc(100% - 58px)
-
-			@media (min-width 500px)
-				width calc(100% - 74px)
+			flex 1
+			min-width 0
 
 			> header
 				display flex
@@ -393,7 +389,7 @@ root(isDark)
 					align-self center
 					margin 0 0.5em 0 0
 					padding 1px 6px
-					font-size 12px
+					font-size 0.8em
 					color isDark ? #758188 : #aaa
 					border solid 1px isDark ? #57616f : #ddd
 					border-radius 3px
@@ -422,6 +418,8 @@ root(isDark)
 						margin-left 6px
 
 			> .body
+				@media (min-width 700px)
+					font-size 1.1em
 
 				> .cw
 					cursor default

From a426f4c7bdad92a2153c5e228003ee3a2170d43d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 15:38:48 +0900
Subject: [PATCH 074/369] nanka iroiro

---
 locales/ja.yml                                |   4 -
 .../common/views/components/media-list.vue    |   2 +-
 .../views/components/note-detail.sub.vue      | 124 ------------------
 .../desktop/views/components/note-detail.vue  |   2 +-
 .../views/components/notes.note.sub.vue       |   2 -
 .../views/components/note-detail.sub.vue      | 101 --------------
 .../mobile/views/components/note-detail.vue   |   2 +-
 .../app/mobile/views/components/note.sub.vue  |  15 ++-
 8 files changed, 14 insertions(+), 238 deletions(-)
 delete mode 100644 src/client/app/desktop/views/components/note-detail.sub.vue
 delete mode 100644 src/client/app/mobile/views/components/note-detail.sub.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index 366a030c99..b1df6dd859 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -379,10 +379,6 @@ desktop/views/components/note-detail.vue:
   renote: "Renote"
   add-reaction: "リアクション"
 
-desktop/views/components/note-detail.sub.vue:
-  private: "この投稿は非公開です"
-  deleted: "この投稿は削除されました"
-
 desktop/views/components/notes.note.vue:
   reposted-by: "{}がRenote"
   reply: "返信"
diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue
index c6cb667165..2f8a1943ad 100644
--- a/src/client/app/common/views/components/media-list.vue
+++ b/src/client/app/common/views/components/media-list.vue
@@ -23,7 +23,7 @@ export default Vue.extend({
 	},
 	mounted() {
 		// for Safari bug
-		this.$refs.grid.style.height = `${this.$refs.grid.clientHeight}px`;
+		this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
 	}
 });
 </script>
diff --git a/src/client/app/desktop/views/components/note-detail.sub.vue b/src/client/app/desktop/views/components/note-detail.sub.vue
deleted file mode 100644
index 00e54ff1a6..0000000000
--- a/src/client/app/desktop/views/components/note-detail.sub.vue
+++ /dev/null
@@ -1,124 +0,0 @@
-<template>
-<div class="sub" :title="title">
-	<mk-avatar class="avatar" :user="note.user"/>
-	<div class="main">
-		<header>
-			<div class="left">
-				<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
-				<span class="username"><mk-acct :user="note.user"/></span>
-			</div>
-			<div class="right">
-				<router-link class="time" :to="note | notePage">
-					<mk-time :time="note.createdAt"/>
-				</router-link>
-			</div>
-		</header>
-		<div class="body">
-			<div class="text">
-				<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
-				<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
-				<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
-			</div>
-			<div class="media" v-if="note.mediaIds.length > 0">
-				<mk-media-list :media-list="note.media"/>
-			</div>
-		</div>
-	</div>
-</div>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-import dateStringify from '../../../common/scripts/date-stringify';
-
-export default Vue.extend({
-	props: ['note'],
-	computed: {
-		title(): string {
-			return dateStringify(this.note.createdAt);
-		}
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-root(isDark)
-	margin 0
-	padding 20px 32px
-	background isDark ? #21242d : #fdfdfd
-
-	&:after
-		content ""
-		display block
-		clear both
-
-	&:hover
-		> .main > footer > button
-			color #888
-
-	> .avatar
-		display block
-		float left
-		margin 0 16px 0 0
-		width 44px
-		height 44px
-		border-radius 4px
-
-	> .main
-		float left
-		width calc(100% - 60px)
-
-		> header
-			margin-bottom 4px
-			white-space nowrap
-
-			&:after
-				content ""
-				display block
-				clear both
-
-			> .left
-				float left
-
-				> .name
-					display inline
-					margin 0
-					padding 0
-					color isDark ? #fff : #777
-					font-size 1em
-					font-weight 700
-					text-align left
-					text-decoration none
-
-					&:hover
-						text-decoration underline
-
-				> .username
-					text-align left
-					margin 0 0 0 8px
-					color isDark ? #606984 : #ccc
-
-			> .right
-				float right
-
-				> .time
-					font-size 0.9em
-					color isDark ? #606984 : #c0c0c0
-
-		> .body
-			> .text
-				cursor default
-				display block
-				margin 0
-				padding 0
-				overflow-wrap break-word
-				font-size 1em
-				color isDark ? #959ba7 : #717171
-
-.sub[data-darkmode]
-	root(true)
-
-.sub:not([data-darkmode])
-	root(false)
-
-</style>
diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue
index a8accaf531..2f28d223dd 100644
--- a/src/client/app/desktop/views/components/note-detail.vue
+++ b/src/client/app/desktop/views/components/note-detail.vue
@@ -89,7 +89,7 @@ import MkPostFormWindow from './post-form-window.vue';
 import MkRenoteFormWindow from './renote-form-window.vue';
 import MkNoteMenu from '../../../common/views/components/note-menu.vue';
 import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
-import XSub from './note-detail.sub.vue';
+import XSub from './notes.note.sub.vue';
 
 export default Vue.extend({
 	components: {
diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue
index 4938b7984e..827112ecd8 100644
--- a/src/client/app/desktop/views/components/notes.note.sub.vue
+++ b/src/client/app/desktop/views/components/notes.note.sub.vue
@@ -115,8 +115,6 @@ root(isDark)
 					margin-left 6px
 
 		> .body
-			max-height 128px
-			overflow hidden
 
 			> .text
 				cursor default
diff --git a/src/client/app/mobile/views/components/note-detail.sub.vue b/src/client/app/mobile/views/components/note-detail.sub.vue
deleted file mode 100644
index 3ad5af1719..0000000000
--- a/src/client/app/mobile/views/components/note-detail.sub.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-<template>
-<div class="root sub">
-	<mk-avatar class="avatar" :user="note.user"/>
-	<div class="main">
-		<header>
-			<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
-			<span class="username"><mk-acct :user="note.user"/></span>
-			<router-link class="time" :to="note | notePage">
-				<mk-time :time="note.createdAt"/>
-			</router-link>
-		</header>
-		<div class="body">
-			<mk-sub-note-content class="text" :note="note"/>
-		</div>
-	</div>
-</div>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-
-export default Vue.extend({
-	props: ['note']
-});
-</script>
-
-<style lang="stylus" scoped>
-root(isDark)
-	padding 8px
-	font-size 0.9em
-	background isDark ? #21242d : #fdfdfd
-
-	@media (min-width 500px)
-		padding 12px
-
-	@media (min-width 600px)
-		padding 24px 32px
-
-	&:after
-		content ""
-		display block
-		clear both
-
-	> .avatar
-		display block
-		float left
-		margin 0 12px 0 0
-		width 48px
-		height 48px
-		border-radius 8px
-
-	> .main
-		float left
-		width calc(100% - 60px)
-
-		> header
-			display flex
-			align-items baseline
-			margin-bottom 4px
-			white-space nowrap
-
-			> .name
-				display block
-				margin 0 .5em 0 0
-				padding 0
-				overflow hidden
-				color isDark ? #fff : #607073
-				font-size 1em
-				font-weight 700
-				text-align left
-				text-decoration none
-				text-overflow ellipsis
-
-				&:hover
-					text-decoration underline
-
-			> .username
-				text-align left
-				margin 0 .5em 0 0
-				color isDark ? #606984 : #d1d8da
-
-			> .time
-				margin-left auto
-				color isDark ? #606984 : #b2b8bb
-
-		> .body
-
-			> .text
-				cursor default
-				margin 0
-				padding 0
-				font-size 1.1em
-				color isDark ? #959ba7 : #717171
-
-.root.sub[data-darkmode]
-	root(true)
-
-.root.sub:not([data-darkmode])
-	root(false)
-
-</style>
diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index 211ca27f1c..bdbb8876df 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -87,7 +87,7 @@ import parse from '../../../../../text/parse';
 
 import MkNoteMenu from '../../../common/views/components/note-menu.vue';
 import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
-import XSub from './note-detail.sub.vue';
+import XSub from './note.sub.vue';
 
 export default Vue.extend({
 	components: {
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index a0084e6c29..f487b7647e 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -33,7 +33,17 @@
 import Vue from 'vue';
 
 export default Vue.extend({
-	props: ['note']
+	props: {
+		note: {
+			type: Object,
+			required: true
+		},
+		// TODO
+		truncate: {
+			type: Boolean,
+			default: true
+		}
+	}
 });
 </script>
 
@@ -144,11 +154,8 @@ root(isDark)
 					margin-left 6px
 
 		> .body
-			max-height 128px
-			overflow hidden
 
 			> .text
-				cursor default
 				margin 0
 				padding 0
 				color isDark ? #959ba7 : #717171

From 69f07cb015bfa9d0463ab4aa9fbab961ac60d6eb Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 15:41:49 +0900
Subject: [PATCH 075/369] Fix bug

---
 src/client/app/desktop/views/components/sub-note-content.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue
index ec41329c4a..45ce6a6f8f 100644
--- a/src/client/app/desktop/views/components/sub-note-content.vue
+++ b/src/client/app/desktop/views/components/sub-note-content.vue
@@ -5,7 +5,7 @@
 		<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
 		<a class="reply" v-if="note.replyId">%fa:reply%</a>
 		<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
-		<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a>
+		<a class="rp" v-if="note.renoteId" :href="`/notes/${note.renoteId}`">RP: ...</a>
 	</div>
 	<details v-if="note.media.length > 0">
 		<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>

From 47a6188097ba69ca4306e6a517daab7f7fff51c3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 15:43:24 +0900
Subject: [PATCH 076/369] 2.23.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 58f2cebfaf..71225193bc 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.22.3",
-	"clientVersion": "1.0.5965",
+	"version": "2.23.0",
+	"clientVersion": "1.0.5993",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 2b9acc239e0dc176f78ed532eabbc3864761bf47 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 17:10:59 +0900
Subject: [PATCH 077/369] Fix bug

---
 src/client/app/auth/views/index.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue
index 8f4f5fd8c5..826bcd125d 100644
--- a/src/client/app/auth/views/index.vue
+++ b/src/client/app/auth/views/index.vue
@@ -62,7 +62,7 @@ export default Vue.extend({
 
 			// 既に連携していた場合
 			if (this.session.app.isAuthorized) {
-				this.$root.$data.os.api('auth/accept', {
+				(this as any).api('auth/accept', {
 					token: this.session.token
 				}).then(() => {
 					this.accepted();

From 2127bf32c223c23a571a585da853132f9a7801c8 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 17:11:48 +0900
Subject: [PATCH 078/369] 2.23.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 71225193bc..8705f0f293 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.23.0",
-	"clientVersion": "1.0.5993",
+	"version": "2.23.1",
+	"clientVersion": "1.0.5995",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 72e8660ae38e7728c7637321171d4f0d5290fe4e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 19:03:03 +0900
Subject: [PATCH 079/369] :art:

---
 src/client/app/mobile/views/components/ui.nav.vue | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index dd1b9c8e25..7e22ac4f84 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -180,6 +180,8 @@ root(isDark)
 
 				> [data-fa]:first-child
 					margin-right 0.5em
+					width 20px
+					text-align center
 
 				> [data-fa].circle
 					margin-left 6px

From 70c0b1d8c043e04f21e4a82a399bf5041a47fe18 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 19:13:49 +0900
Subject: [PATCH 080/369] :art:

---
 src/client/app/desktop/views/pages/welcome.vue | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index 1bb791b68c..cecd7e3a90 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -80,6 +80,8 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
+@import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css);
+
 root(isDark)
 	display flex
 	flex-direction column
@@ -103,6 +105,7 @@ root(isDark)
 		text-align center
 
 		&.about
+			font-family 'Noto Sans JP'
 			color isDark ? #fff : #627574
 
 			> article
@@ -114,7 +117,7 @@ root(isDark)
 
 				> h1
 					margin 0
-					font-variant small-caps
+					font-weight 900
 
 				> p
 					margin 20px 0

From 125765faa629144b2f701f9fb926b090275e6546 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 21:46:02 +0900
Subject: [PATCH 081/369] Fix bug

---
 src/client/app/boot.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/client/app/boot.js b/src/client/app/boot.js
index 7b884c8a54..08c3fdeaee 100644
--- a/src/client/app/boot.js
+++ b/src/client/app/boot.js
@@ -32,9 +32,9 @@
 	//#region Detect app name
 	let app = null;
 
-	if (url.pathname == '/docs') app = 'docs';
-	if (url.pathname == '/dev') app = 'dev';
-	if (url.pathname == '/auth') app = 'auth';
+	if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs';
+	if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev';
+	if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth';
 	//#endregion
 
 	//#region Detect the user language

From d05aee19f2a8261de7a07314ce17da8968f3f579 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 21:46:30 +0900
Subject: [PATCH 082/369] 2.23.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 8705f0f293..16d8127414 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.23.1",
-	"clientVersion": "1.0.5995",
+	"version": "2.23.2",
+	"clientVersion": "1.0.5999",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 95d0d0047a1710b7b9b0dd988aad8bf7d55d348e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 22:43:03 +0900
Subject: [PATCH 083/369] =?UTF-8?q?=E6=99=82=E8=A8=88=E3=82=92SVG=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../desktop/views/components/analog-clock.vue | 165 ++++++++++--------
 1 file changed, 88 insertions(+), 77 deletions(-)

diff --git a/src/client/app/desktop/views/components/analog-clock.vue b/src/client/app/desktop/views/components/analog-clock.vue
index 81eec81598..7b5caf9f27 100644
--- a/src/client/app/desktop/views/components/analog-clock.vue
+++ b/src/client/app/desktop/views/components/analog-clock.vue
@@ -1,24 +1,103 @@
 <template>
-<canvas class="mk-analog-clock" ref="canvas" width="256" height="256"></canvas>
+<svg class="mk-analog-clock" viewBox="0 0 10 10" preserveAspectRatio="none">
+	<line v-for="angle, i in graduations"
+		:x1="5 + (Math.sin(angle) * (5 - graduationsPadding))"
+		:y1="5 - (Math.cos(angle) * (5 - graduationsPadding))"
+		:x2="5 + (Math.sin(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))"
+		:y2="5 - (Math.cos(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))"
+		:stroke="i % 5 == 0 ? longGraduationColor : shortGraduationColor"
+		stroke-width="0.05"/>
+
+	<line
+		x1="5"
+		y1="5"
+		:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
+		:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
+		:stroke="sHandColor"
+		stroke-width="0.05"/>
+	<line
+		x1="5"
+		y1="5"
+		:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
+		:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
+		:stroke="mHandColor"
+		stroke-width="0.1"/>
+	<line
+		x1="5"
+		y1="5"
+		:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
+		:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
+		:stroke="hHandColor"
+		stroke-width="0.1"/>
+</svg>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
 import { themeColor } from '../../../config';
 
-const Vec2 = function(this: any, x, y) {
-	this.x = x;
-	this.y = y;
-};
-
 export default Vue.extend({
 	data() {
 		return {
-			clock: null
+			now: new Date(),
+			clock: null,
+
+			graduationsPadding: 0.5,
+			longGraduationLength: 0.3,
+			shortGraduationLength: 0.15,
+			handsPadding: 1,
+			hHandLengthRatio: 0.75,
+			mHandLengthRatio: 1,
+			sHandLengthRatio: 1,
 		};
 	},
+	computed: {
+		longGraduationColor(): string {
+			return 'rgba(255, 255, 255, 0.3)';
+		},
+		shortGraduationColor(): string {
+			return 'rgba(255, 255, 255, 0.2)';
+		},
+		sHandColor(): string {
+			return 'rgba(255, 255, 255, 0.5)';
+		},
+		mHandColor(): string {
+			return '#fff';
+		},
+		hHandColor(): string {
+			return themeColor;
+		},
+
+		s(): number {
+			return this.now.getSeconds();
+		},
+		m(): number {
+			return this.now.getMinutes();
+		},
+		h(): number {
+			return this.now.getHours();
+		},
+		hAngle(): number {
+			return Math.PI * (this.h % 12 + this.m / 60) / 6;
+		},
+		mAngle(): number {
+			return Math.PI * (this.m + this.s / 60) / 30;
+		},
+		sAngle(): number {
+			return Math.PI * this.s / 30;
+		},
+
+		graduations(): any {
+			const angles = [];
+			for (let i = 0; i < 60; i++) {
+				const angle = Math.PI * i / 30;
+				angles.push(angle);
+			}
+
+			return angles;
+		}
+	},
 	mounted() {
-		this.tick();
 		this.clock = setInterval(this.tick, 1000);
 	},
 	beforeDestroy() {
@@ -26,75 +105,7 @@ export default Vue.extend({
 	},
 	methods: {
 		tick() {
-			const canv = this.$refs.canvas as any;
-
-			const now = new Date();
-			const s = now.getSeconds();
-			const m = now.getMinutes();
-			const h = now.getHours();
-
-			const ctx = canv.getContext('2d');
-			const canvW = canv.width;
-			const canvH = canv.height;
-			ctx.clearRect(0, 0, canvW, canvH);
-
-			{ // 背景
-				const center = Math.min((canvW / 2), (canvH / 2));
-				const lineStart =    center * 0.90;
-				const shortLineEnd = center * 0.87;
-				const longLineEnd =  center * 0.84;
-				for (let i = 0; i < 60; i++) {
-					const angle = Math.PI * i / 30;
-					const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
-					ctx.beginPath();
-					ctx.lineWidth = 1;
-					ctx.moveTo((canvW / 2) + uv.x * lineStart, (canvH / 2) + uv.y * lineStart);
-					if (i % 5 == 0) {
-						ctx.strokeStyle = 'rgba(255, 255, 255, 0.2)';
-						ctx.lineTo((canvW / 2) + uv.x * longLineEnd, (canvH / 2) + uv.y * longLineEnd);
-					} else {
-						ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';
-						ctx.lineTo((canvW / 2) + uv.x * shortLineEnd, (canvH / 2) + uv.y * shortLineEnd);
-					}
-					ctx.stroke();
-				}
-			}
-
-			{ // 分
-				const angle = Math.PI * (m + s / 60) / 30;
-				const length = Math.min(canvW, canvH) / 2.6;
-				const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
-				ctx.beginPath();
-				ctx.strokeStyle = '#ffffff';
-				ctx.lineWidth = 2;
-				ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
-				ctx.lineTo(canvW / 2 + uv.x * length,     canvH / 2 + uv.y * length);
-				ctx.stroke();
-			}
-
-			{ // 時
-				const angle = Math.PI * (h % 12 + m / 60) / 6;
-				const length = Math.min(canvW, canvH) / 4;
-				const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
-				ctx.beginPath();
-				ctx.strokeStyle = themeColor;
-				ctx.lineWidth = 2;
-				ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
-				ctx.lineTo(canvW / 2 + uv.x * length,     canvH / 2 + uv.y * length);
-				ctx.stroke();
-			}
-
-			{ // 秒
-				const angle = Math.PI * s / 30;
-				const length = Math.min(canvW, canvH) / 2.6;
-				const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
-				ctx.beginPath();
-				ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';
-				ctx.lineWidth = 1;
-				ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
-				ctx.lineTo(canvW / 2 + uv.x * length,     canvH / 2 + uv.y * length);
-				ctx.stroke();
-			}
+			this.now = new Date();
 		}
 	}
 });

From 3d231c34561448d2fa96897bf789b22a1150d423 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 22:56:05 +0900
Subject: [PATCH 084/369] Fix

---
 .../app/desktop/views/components/analog-clock.vue | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/client/app/desktop/views/components/analog-clock.vue b/src/client/app/desktop/views/components/analog-clock.vue
index 7b5caf9f27..365a8cdaf5 100644
--- a/src/client/app/desktop/views/components/analog-clock.vue
+++ b/src/client/app/desktop/views/components/analog-clock.vue
@@ -9,22 +9,22 @@
 		stroke-width="0.05"/>
 
 	<line
-		x1="5"
-		y1="5"
+		:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
+		:y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))"
 		:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
 		:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
 		:stroke="sHandColor"
 		stroke-width="0.05"/>
 	<line
-		x1="5"
-		y1="5"
+		:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
+		:y1="5 + (Math.cos(mAngle) * (mHandLengthRatio * handsTailLength))"
 		:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
 		:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
 		:stroke="mHandColor"
 		stroke-width="0.1"/>
 	<line
-		x1="5"
-		y1="5"
+		:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
+		:y1="5 + (Math.cos(hAngle) * (hHandLengthRatio * handsTailLength))"
 		:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
 		:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
 		:stroke="hHandColor"
@@ -46,9 +46,10 @@ export default Vue.extend({
 			longGraduationLength: 0.3,
 			shortGraduationLength: 0.15,
 			handsPadding: 1,
+			handsTailLength: 0.7,
 			hHandLengthRatio: 0.75,
 			mHandLengthRatio: 1,
-			sHandLengthRatio: 1,
+			sHandLengthRatio: 1
 		};
 	},
 	computed: {

From ae9bfd69b030cef7e90befeb748f7897ef89bcbd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 23:13:39 +0900
Subject: [PATCH 085/369] Add analog clock widget

---
 locales/ja.yml                                |  1 +
 .../views/components/analog-clock.vue         | 18 +++++---
 .../app/common/views/components/index.ts      |  2 +
 .../app/common/views/widgets/analog-clock.vue | 41 +++++++++++++++++++
 src/client/app/common/views/widgets/index.ts  |  2 +
 .../app/desktop/views/components/home.vue     |  1 +
 .../app/desktop/views/components/index.ts     |  2 -
 .../views/components/ui.header.clock.vue      |  2 +-
 src/client/app/mobile/views/pages/widgets.vue |  1 +
 9 files changed, 61 insertions(+), 9 deletions(-)
 rename src/client/app/{desktop => common}/views/components/analog-clock.vue (90%)
 create mode 100644 src/client/app/common/views/widgets/analog-clock.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index b1df6dd859..78353fb993 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -54,6 +54,7 @@ common:
   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
 
   widgets:
+    analog-clock: "アナログ時計"
     profile: "プロフィール"
     calendar: "カレンダー"
     timemachine: "カレンダー(タイムマシン)"
diff --git a/src/client/app/desktop/views/components/analog-clock.vue b/src/client/app/common/views/components/analog-clock.vue
similarity index 90%
rename from src/client/app/desktop/views/components/analog-clock.vue
rename to src/client/app/common/views/components/analog-clock.vue
index 365a8cdaf5..e25a1fcadf 100644
--- a/src/client/app/desktop/views/components/analog-clock.vue
+++ b/src/client/app/common/views/components/analog-clock.vue
@@ -37,6 +37,12 @@ import Vue from 'vue';
 import { themeColor } from '../../../config';
 
 export default Vue.extend({
+	props: {
+		dark: {
+			type: Boolean,
+			default: false
+		}
+	},
 	data() {
 		return {
 			now: new Date(),
@@ -54,16 +60,17 @@ export default Vue.extend({
 	},
 	computed: {
 		longGraduationColor(): string {
-			return 'rgba(255, 255, 255, 0.3)';
+			return this.dark ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)';
 		},
 		shortGraduationColor(): string {
-			return 'rgba(255, 255, 255, 0.2)';
+			return this.dark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)';
 		},
+
 		sHandColor(): string {
-			return 'rgba(255, 255, 255, 0.5)';
+			return this.dark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.3)';
 		},
 		mHandColor(): string {
-			return '#fff';
+			return this.dark ? '#fff' : '#777';
 		},
 		hHandColor(): string {
 			return themeColor;
@@ -78,6 +85,7 @@ export default Vue.extend({
 		h(): number {
 			return this.now.getHours();
 		},
+
 		hAngle(): number {
 			return Math.PI * (this.h % 12 + this.m / 60) / 6;
 		},
@@ -115,6 +123,4 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 .mk-analog-clock
 	display block
-	width 256px
-	height 256px
 </style>
diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index c1a7bc61d7..df74f5ddfb 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -1,5 +1,6 @@
 import Vue from 'vue';
 
+import analogClock from './analog-clock.vue';
 import signin from './signin.vue';
 import signup from './signup.vue';
 import forkit from './forkit.vue';
@@ -27,6 +28,7 @@ import Switch from './switch.vue';
 import Othello from './othello.vue';
 import welcomeTimeline from './welcome-timeline.vue';
 
+Vue.component('mk-analog-clock', analogClock);
 Vue.component('mk-signin', signin);
 Vue.component('mk-signup', signup);
 Vue.component('mk-forkit', forkit);
diff --git a/src/client/app/common/views/widgets/analog-clock.vue b/src/client/app/common/views/widgets/analog-clock.vue
new file mode 100644
index 0000000000..b1177d4ddf
--- /dev/null
+++ b/src/client/app/common/views/widgets/analog-clock.vue
@@ -0,0 +1,41 @@
+<template>
+<div class="mkw-analog-clock">
+	<mk-widget-container :naked="props.naked" :show-header="false">
+		<div class="mkw-analog-clock--body">
+			<mk-analog-clock :dark="$store.state.device.darkmode"/>
+		</div>
+	</mk-widget-container>
+</div>
+</template>
+
+<script lang="ts">
+import define from '../../../common/define-widget';
+export default define({
+	name: 'analog-clock',
+	props: () => ({
+		naked: false
+	})
+}).extend({
+	methods: {
+		func() {
+			this.props.naked = !this.props.naked;
+			this.save();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	.mkw-analog-clock--body
+		padding 8px
+
+.mkw-analog-clock[data-darkmode]
+	root(true)
+
+.mkw-analog-clock:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts
index 7ef4e02092..a4cabc43ba 100644
--- a/src/client/app/common/views/widgets/index.ts
+++ b/src/client/app/common/views/widgets/index.ts
@@ -1,5 +1,6 @@
 import Vue from 'vue';
 
+import wAnalogClock from './analog-clock.vue';
 import wVersion from './version.vue';
 import wRss from './rss.vue';
 import wServer from './server.vue';
@@ -12,6 +13,7 @@ import wTips from './tips.vue';
 import wDonation from './donation.vue';
 import wNav from './nav.vue';
 
+Vue.component('mkw-analog-clock', wAnalogClock);
 Vue.component('mkw-nav', wNav);
 Vue.component('mkw-calendar', wCalendar);
 Vue.component('mkw-photo-stream', wPhotoStream);
diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index f51fed7454..9f6cf9614a 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -7,6 +7,7 @@
 				<p>%i18n:@add-widget%</p>
 				<select v-model="widgetAdderSelected">
 					<option value="profile">%i18n:common.widgets.profile%</option>
+					<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
 					<option value="calendar">%i18n:common.widgets.calendar%</option>
 					<option value="timemachine">%i18n:common.widgets.timemachine%</option>
 					<option value="activity">%i18n:common.widgets.activity%</option>
diff --git a/src/client/app/desktop/views/components/index.ts b/src/client/app/desktop/views/components/index.ts
index f58d0706df..7b7a38afa2 100644
--- a/src/client/app/desktop/views/components/index.ts
+++ b/src/client/app/desktop/views/components/index.ts
@@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue';
 import window from './window.vue';
 import noteFormWindow from './post-form-window.vue';
 import renoteFormWindow from './renote-form-window.vue';
-import analogClock from './analog-clock.vue';
 import ellipsisIcon from './ellipsis-icon.vue';
 import mediaImage from './media-image.vue';
 import mediaImageDialog from './media-image-dialog.vue';
@@ -40,7 +39,6 @@ Vue.component('mk-sub-note-content', subNoteContent);
 Vue.component('mk-window', window);
 Vue.component('mk-post-form-window', noteFormWindow);
 Vue.component('mk-renote-form-window', renoteFormWindow);
-Vue.component('mk-analog-clock', analogClock);
 Vue.component('mk-ellipsis-icon', ellipsisIcon);
 Vue.component('mk-media-image', mediaImage);
 Vue.component('mk-media-image-dialog', mediaImageDialog);
diff --git a/src/client/app/desktop/views/components/ui.header.clock.vue b/src/client/app/desktop/views/components/ui.header.clock.vue
index cd23a67506..1c3f12f2f2 100644
--- a/src/client/app/desktop/views/components/ui.header.clock.vue
+++ b/src/client/app/desktop/views/components/ui.header.clock.vue
@@ -8,7 +8,7 @@
 		</time>
 	</div>
 	<div class="content">
-		<mk-analog-clock/>
+		<mk-analog-clock :dark="true"/>
 	</div>
 </div>
 </template>
diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue
index 9d047fa635..a0893770e8 100644
--- a/src/client/app/mobile/views/pages/widgets.vue
+++ b/src/client/app/mobile/views/pages/widgets.vue
@@ -9,6 +9,7 @@
 			<header>
 				<select v-model="widgetAdderSelected">
 					<option value="profile">%i18n:common.widgets.profile%</option>
+					<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
 					<option value="calendar">%i18n:common.widgets.calendar%</option>
 					<option value="activity">%i18n:common.widgets.activity%</option>
 					<option value="rss">%i18n:common.widgets.rss%</option>

From 161b9602f41b4d4287ad98f0333688930f92a81f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 23:56:44 +0900
Subject: [PATCH 086/369] Fix bug

---
 src/client/app/auth/script.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/client/app/auth/script.ts b/src/client/app/auth/script.ts
index 20f59bf033..fd985c46ad 100644
--- a/src/client/app/auth/script.ts
+++ b/src/client/app/auth/script.ts
@@ -20,6 +20,7 @@ init(launch => {
 	// Init router
 	const router = new VueRouter({
 		mode: 'history',
+		base: '/auth/',
 		routes: [
 			{ path: '/:token', component: Index },
 		]

From 854814c226932cc8f8dbaa953845d4002619a349 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 29 May 2018 23:57:25 +0900
Subject: [PATCH 087/369] 2.24.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 16d8127414..b67ddf586d 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.23.2",
-	"clientVersion": "1.0.5999",
+	"version": "2.24.0",
+	"clientVersion": "1.0.6017",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From ef75f12abe84de70d31b8227fac5ce6c22bd5b28 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 00:15:32 +0900
Subject: [PATCH 088/369] Fix bug

---
 src/client/app/desktop/views/components/drive.file.vue   | 2 +-
 src/client/app/desktop/views/components/drive.folder.vue | 2 +-
 src/client/app/desktop/views/components/drive.vue        | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue
index fe8f57bc5f..62a189d849 100644
--- a/src/client/app/desktop/views/components/drive.file.vue
+++ b/src/client/app/desktop/views/components/drive.file.vue
@@ -62,7 +62,7 @@ export default Vue.extend({
 
 		onContextmenu(e) {
 			this.isContextmenuShowing = true;
-			contextmenu(e, [{
+			contextmenu((this as any).os)(e, [{
 				type: 'item',
 				text: '%i18n:@contextmenu.rename%',
 				icon: '%fa:i-cursor%',
diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue
index 16f474f4e0..06f2b3f80c 100644
--- a/src/client/app/desktop/views/components/drive.folder.vue
+++ b/src/client/app/desktop/views/components/drive.folder.vue
@@ -52,7 +52,7 @@ export default Vue.extend({
 
 		onContextmenu(e) {
 			this.isContextmenuShowing = true;
-			contextmenu(e, [{
+			contextmenu((this as any).os)(e, [{
 				type: 'item',
 				text: '%i18n:@contextmenu.move-to-this-folder%',
 				icon: '%fa:arrow-right%',
diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue
index cae40f306c..9a738070f1 100644
--- a/src/client/app/desktop/views/components/drive.vue
+++ b/src/client/app/desktop/views/components/drive.vue
@@ -136,7 +136,7 @@ export default Vue.extend({
 	},
 	methods: {
 		onContextmenu(e) {
-			contextmenu(e, [{
+			contextmenu((this as any).os)(e, [{
 				type: 'item',
 				text: '%i18n:@contextmenu.create-folder%',
 				icon: '%fa:R folder%',

From 248acaee75df8e4513dc504804e7bb9b5b117550 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 00:16:03 +0900
Subject: [PATCH 089/369] 2.24.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index b67ddf586d..ee438d6c0b 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.24.0",
-	"clientVersion": "1.0.6017",
+	"version": "2.24.1",
+	"clientVersion": "1.0.6019",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From fa56a44d8538a4ef3561796485bb9a6e84598e79 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 04:07:23 +0900
Subject: [PATCH 090/369] :art:

---
 .../common/views/components/analog-clock.vue  | 23 ++++++++++---------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/client/app/common/views/components/analog-clock.vue b/src/client/app/common/views/components/analog-clock.vue
index e25a1fcadf..53fb2a8dad 100644
--- a/src/client/app/common/views/components/analog-clock.vue
+++ b/src/client/app/common/views/components/analog-clock.vue
@@ -1,12 +1,10 @@
 <template>
 <svg class="mk-analog-clock" viewBox="0 0 10 10" preserveAspectRatio="none">
-	<line v-for="angle, i in graduations"
-		:x1="5 + (Math.sin(angle) * (5 - graduationsPadding))"
-		:y1="5 - (Math.cos(angle) * (5 - graduationsPadding))"
-		:x2="5 + (Math.sin(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))"
-		:y2="5 - (Math.cos(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))"
-		:stroke="i % 5 == 0 ? longGraduationColor : shortGraduationColor"
-		stroke-width="0.05"/>
+	<circle v-for="angle, i in graduations"
+		:cx="5 + (Math.sin(angle) * (5 - graduationsPadding))"
+		:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
+		:r="i % 5 == 0 ? 0.125 : 0.05"
+		:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"/>
 
 	<line
 		:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
@@ -43,14 +41,13 @@ export default Vue.extend({
 			default: false
 		}
 	},
+
 	data() {
 		return {
 			now: new Date(),
 			clock: null,
 
 			graduationsPadding: 0.5,
-			longGraduationLength: 0.3,
-			shortGraduationLength: 0.15,
 			handsPadding: 1,
 			handsTailLength: 0.7,
 			hHandLengthRatio: 0.75,
@@ -58,11 +55,12 @@ export default Vue.extend({
 			sHandLengthRatio: 1
 		};
 	},
+
 	computed: {
-		longGraduationColor(): string {
+		majorGraduationColor(): string {
 			return this.dark ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)';
 		},
-		shortGraduationColor(): string {
+		minorGraduationColor(): string {
 			return this.dark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)';
 		},
 
@@ -106,12 +104,15 @@ export default Vue.extend({
 			return angles;
 		}
 	},
+
 	mounted() {
 		this.clock = setInterval(this.tick, 1000);
 	},
+
 	beforeDestroy() {
 		clearInterval(this.clock);
 	},
+
 	methods: {
 		tick() {
 			this.now = new Date();

From 9069a99a15ec7c5481079aeea728a3ad18eddd36 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 04:45:27 +0900
Subject: [PATCH 091/369] wip

---
 locales/ja.yml                                |  7 +-
 src/client/app/mobile/script.ts               |  4 ++
 .../app/mobile/views/components/ui.nav.vue    | 12 ++--
 .../app/mobile/views/pages/user-list.vue      | 63 +++++++++++++++++
 .../app/mobile/views/pages/user-lists.vue     | 68 +++++++++++++++++++
 5 files changed, 149 insertions(+), 5 deletions(-)
 create mode 100644 src/client/app/mobile/views/pages/user-list.vue
 create mode 100644 src/client/app/mobile/views/pages/user-lists.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index 78353fb993..f72058e123 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -838,12 +838,13 @@ mobile/views/components/timeline.vue:
   load-more: "もっと"
 
 mobile/views/components/ui.nav.vue:
-  home: "ホーム"
+  timeline: "タイムライン"
   notifications: "通知"
   messaging: "メッセージ"
   search: "検索"
   drive: "ドライブ"
   favorites: "お気に入り"
+  user-lists: "リスト"
   widgets: "ウィジェット"
   game: "ゲーム"
   darkmode: "ダークモード"
@@ -863,6 +864,10 @@ mobile/views/components/users-list.vue:
 mobile/views/pages/favorites.vue:
   title: "お気に入り"
 
+mobile/views/pages/user-lists.vue:
+  title: "リスト"
+  enter-list-name: "リスト名を入力してください"
+
 mobile/views/pages/drive.vue:
   drive: "ドライブ"
   more: "もっと見る"
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index 4c3d8fc3bd..607ff63711 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -37,6 +37,8 @@ import MkSearch from './views/pages/search.vue';
 import MkFollowers from './views/pages/followers.vue';
 import MkFollowing from './views/pages/following.vue';
 import MkFavorites from './views/pages/favorites.vue';
+import MkUserLists from './views/pages/user-lists.vue';
+import MkUserList from './views/pages/user-list.vue';
 import MkSettings from './views/pages/settings.vue';
 import MkOthello from './views/pages/othello.vue';
 
@@ -74,6 +76,8 @@ init((launch) => {
 			{ path: '/i/settings', name: 'settings', component: MkSettings },
 			{ path: '/i/notifications', name: 'notifications', component: MkNotifications },
 			{ path: '/i/favorites', name: 'favorites', component: MkFavorites },
+			{ path: '/i/lists', name: 'user-lists', component: MkUserLists },
+			{ path: '/i/lists/:list', name: 'user-list', component: MkUserList },
 			{ path: '/i/widgets', name: 'widgets', component: MkWidgets },
 			{ path: '/i/messaging', name: 'messaging', component: MkMessaging },
 			{ path: '/i/messaging/:user', component: MkMessagingRoom },
diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index 7e22ac4f84..11a8f7ab97 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -15,14 +15,15 @@
 			</router-link>
 			<div class="links">
 				<ul>
-					<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li>
+					<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@timeline%%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
 				</ul>
 				<ul>
-					<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li>
+					<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li>
+					<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li>
 				</ul>
 				<ul>
@@ -157,7 +158,10 @@ root(isDark)
 		&:first-child
 			margin-top 0
 
-		li
+		&:last-child
+			margin-bottom 0
+
+		> li
 			display block
 			font-size 1em
 			line-height 1em
@@ -199,7 +203,7 @@ root(isDark)
 					opacity 0.5
 
 	.about
-		margin 0
+		margin 0 0 8px 0
 		padding 1em 0
 		text-align center
 		font-size 0.8em
diff --git a/src/client/app/mobile/views/pages/user-list.vue b/src/client/app/mobile/views/pages/user-list.vue
new file mode 100644
index 0000000000..7440dbcb64
--- /dev/null
+++ b/src/client/app/mobile/views/pages/user-list.vue
@@ -0,0 +1,63 @@
+<template>
+<mk-ui>
+	<span slot="header" v-if="!fetching">%fa:list%{{ list.title }}</span>
+
+	<main v-if="!fetching">
+		<ul>
+			<li v-for="user in list.users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li>
+		</ul>
+	</main>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import Progress from '../../../common/scripts/loading';
+
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			list: null
+		};
+	},
+	watch: {
+		$route: 'fetch'
+	},
+	created() {
+		this.fetch();
+	},
+	methods: {
+		fetch() {
+			Progress.start();
+			this.fetching = true;
+
+			(this as any).api('users/lists/show', {
+				listId: this.$route.params.list
+			}).then(list => {
+				this.list = list;
+				this.fetching = false;
+
+				Progress.done();
+			});
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+main
+	width 100%
+	max-width 680px
+	margin 0 auto
+	padding 8px
+
+	@media (min-width 500px)
+		padding 16px
+
+	@media (min-width 600px)
+		padding 32px
+
+</style>
diff --git a/src/client/app/mobile/views/pages/user-lists.vue b/src/client/app/mobile/views/pages/user-lists.vue
new file mode 100644
index 0000000000..288295677e
--- /dev/null
+++ b/src/client/app/mobile/views/pages/user-lists.vue
@@ -0,0 +1,68 @@
+<template>
+<mk-ui>
+	<span slot="header">%fa:list%%i18n:@title%</span>
+	<template slot="func"><button @click="fn">%fa:plus%</button></template>
+
+	<main>
+		<ul>
+			<li v-for="list in lists" :key="list.id"><router-link :to="`/i/lists/${list.id}`">{{ list.title }}</router-link></li>
+		</ul>
+	</main>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import Progress from '../../../common/scripts/loading';
+
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			lists: []
+		};
+	},
+	mounted() {
+		document.title = 'Misskey | %i18n:@title%';
+
+		Progress.start();
+
+		(this as any).api('users/lists/list').then(lists => {
+			this.fetching = false;
+			this.lists = lists;
+
+			Progress.done();
+		});
+	},
+	methods: {
+		fn() {
+			(this as any).apis.input({
+				title: '%i18n:@enter-list-name%',
+			}).then(async title => {
+				const list = await (this as any).api('users/lists/create', {
+					title
+				});
+
+				this.$router.push('/i/lists/' + list.id);
+			});
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+main
+	width 100%
+	max-width 680px
+	margin 0 auto
+	padding 8px
+
+	@media (min-width 500px)
+		padding 16px
+
+	@media (min-width 600px)
+		padding 32px
+
+</style>

From 5d2caa456d671d5f2847f659104e2abf7292a5f2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 04:46:50 +0900
Subject: [PATCH 092/369] :art:

---
 src/client/app/common/views/widgets/memo.vue | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue
index 3f599c82a0..30f0d3b009 100644
--- a/src/client/app/common/views/widgets/memo.vue
+++ b/src/client/app/common/views/widgets/memo.vue
@@ -73,6 +73,7 @@ root(isDark)
 			background isDark ? #282c37 : #fff
 			border none
 			border-bottom solid 1px isDark ? #1c2023 : #eee
+			border-radius 0
 
 		> button
 			display block

From dd943923179b464eee0a6ac28ad0938aab11d60a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 05:02:56 +0900
Subject: [PATCH 093/369] 2.24.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index ee438d6c0b..5acb4bb715 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.24.1",
-	"clientVersion": "1.0.6019",
+	"version": "2.24.2",
+	"clientVersion": "1.0.6035",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From ea223bab511733ff10b14b879996438b7c529716 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 18:13:20 +0900
Subject: [PATCH 094/369] Fix bug

---
 src/client/app/mobile/views/pages/user-list.vue | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/client/app/mobile/views/pages/user-list.vue b/src/client/app/mobile/views/pages/user-list.vue
index 7440dbcb64..1c6a829cd5 100644
--- a/src/client/app/mobile/views/pages/user-list.vue
+++ b/src/client/app/mobile/views/pages/user-list.vue
@@ -4,7 +4,7 @@
 
 	<main v-if="!fetching">
 		<ul>
-			<li v-for="user in list.users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li>
+			<li v-for="user in users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li>
 		</ul>
 	</main>
 </mk-ui>
@@ -18,7 +18,8 @@ export default Vue.extend({
 	data() {
 		return {
 			fetching: true,
-			list: null
+			list: null,
+			users: null
 		};
 	},
 	watch: {
@@ -39,6 +40,12 @@ export default Vue.extend({
 				this.fetching = false;
 
 				Progress.done();
+
+				(this as any).api('users/show', {
+					userIds: this.list.userIds
+				}).then(users => {
+					this.users = users;
+				});
 			});
 		}
 	}

From 5fb2f7749d758571b1f7fab0ca3eb88f5c3da255 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marcin=20Miko=C5=82ajczak?= <me@m4sk.in>
Date: Wed, 30 May 2018 12:13:51 +0000
Subject: [PATCH 095/369] fix typo

---
 locales/ja.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index f72058e123..400b79ab69 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -551,7 +551,7 @@ desktop/views/components/settings.api.vue:
   token: "Token:"
   enter-password: "パスワードを入力してください"
 
-desktop/views/components/settings.app.vue:
+desktop/views/components/settings.apps.vue:
   no-apps: "連携しているアプリケーションはありません"
 
 desktop/views/components/settings.mute.vue:

From 7dd7de8ff66868543e2faf86fbb7ad2a00240352 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 23:05:24 +0900
Subject: [PATCH 096/369] Update endpoints.ts

---
 src/server/api/endpoints.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index b4ab65eb16..196f3adebc 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -555,7 +555,7 @@ const endpoints: Endpoint[] = [
 		withCredential: true,
 		limit: {
 			duration: ms('1hour'),
-			max: 100
+			max: 300
 		},
 		kind: 'reaction-write'
 	},

From c23bbf81f10d9772d9313e4a9f4a8839f381c409 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 30 May 2018 23:08:26 +0900
Subject: [PATCH 097/369] 2.24.3

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 5acb4bb715..f28a0645af 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.24.2",
-	"clientVersion": "1.0.6035",
+	"version": "2.24.3",
+	"clientVersion": "1.0.6055",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 111dbdcd7f269c8ff9e266fedd9d18b60faea88a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 31 May 2018 16:38:05 +0900
Subject: [PATCH 098/369] Fix

---
 .../views/components/post-form-window.vue     | 64 +++++++++++--------
 1 file changed, 39 insertions(+), 25 deletions(-)

diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue
index c55d6f1a1e..51a416e281 100644
--- a/src/client/app/desktop/views/components/post-form-window.vue
+++ b/src/client/app/desktop/views/components/post-form-window.vue
@@ -1,21 +1,23 @@
 <template>
-<mk-window ref="window" is-modal @closed="$destroy">
-	<span slot="header">
-		<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span>
+<mk-window class="mk-post-form-window" ref="window" is-modal @closed="$destroy">
+	<span slot="header" class="mk-post-form-window--header">
+		<span class="icon" v-if="geo">%fa:map-marker-alt%</span>
 		<span v-if="!reply">%i18n:@note%</span>
 		<span v-if="reply">%i18n:@reply%</span>
-		<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
-		<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
+		<span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
+		<span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
 	</span>
 
-	<mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/>
-	<mk-post-form ref="form"
-		:reply="reply"
-		@posted="onPosted"
-		@change-uploadings="onChangeUploadings"
-		@change-attached-media="onChangeMedia"
-		@geo-attached="onGeoAttached"
-		@geo-dettached="onGeoDettached"/>
+	<div class="mk-post-form-window--body">
+		<mk-note-preview v-if="reply" class="notePreview" :note="reply"/>
+		<mk-post-form ref="form"
+			:reply="reply"
+			@posted="onPosted"
+			@change-uploadings="onChangeUploadings"
+			@change-attached-media="onChangeMedia"
+			@geo-attached="onGeoAttached"
+			@geo-dettached="onGeoDettached"/>
+	</div>
 </mk-window>
 </template>
 
@@ -56,21 +58,33 @@ export default Vue.extend({
 });
 </script>
 
-<style lang="stylus" module>
-.icon
-	margin-right 8px
+<style lang="stylus" scoped>
+root(isDark)
+	.mk-post-form-window--header
+		.icon
+			margin-right 8px
 
-.count
-	margin-left 8px
-	opacity 0.8
+		.count
+			margin-left 8px
+			opacity 0.8
 
-	&:before
-		content '('
+			&:before
+				content '('
 
-	&:after
-		content ')'
+			&:after
+				content ')'
 
-.notePreview
-	margin 16px 22px 0 22px
+	.mk-post-form-window--body
+		.notePreview
+			if isDark
+				margin 16px 22px 0 22px
+			else
+				margin 16px 22px
+
+.mk-post-form-window[data-darkmode]
+	root(true)
+
+.mk-post-form-window:not([data-darkmode])
+	root(false)
 
 </style>

From d32d95918ca512db21baf88696d2afc73219eab3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 31 May 2018 16:44:11 +0900
Subject: [PATCH 099/369] :art:

---
 src/client/app/desktop/views/components/home.vue | 14 ++++++++++----
 src/client/app/desktop/views/components/ui.vue   | 10 ++++++++--
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index 9f6cf9614a..636ed871c7 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -63,9 +63,8 @@
 				<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
 			</div>
 			<div class="main">
-				<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/>
-				<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
-				<mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/>
+				<mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/>
+				<mk-timeline class="tl" cref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
 			</div>
 		</template>
 	</div>
@@ -299,11 +298,18 @@ root(isDark)
 			width calc(100% - 275px * 2)
 			order 2
 
-			.mk-post-form
+			> .form
 				margin-bottom 16px
 				border solid 1px rgba(#000, 0.075)
 				border-radius 4px
 
+			@media (max-width 700px)
+				padding 0
+
+				> .tl
+					border none
+					border-radius 0
+
 		> *:not(.main)
 			width 275px
 			padding 16px 0 16px 0
diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue
index b6dd22c1f8..32cc71e4b0 100644
--- a/src/client/app/desktop/views/components/ui.vue
+++ b/src/client/app/desktop/views/components/ui.vue
@@ -1,6 +1,6 @@
 <template>
-<div>
-	<x-header/>
+<div class="mk-ui">
+	<x-header class="header"/>
 	<div class="content">
 		<slot></slot>
 	</div>
@@ -35,3 +35,9 @@ export default Vue.extend({
 });
 </script>
 
+<style lang="stylus" scoped>
+.mk-ui
+	> .header
+		@media (max-width 1000px)
+			display none
+</style>

From 9599a3123987b94def83c5d70e7dd4ddcc6bf649 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 31 May 2018 18:08:47 +0900
Subject: [PATCH 100/369] wip

---
 src/models/follow-requests.ts | 50 +++++++++++++++++++++++++++++++++++
 src/models/user.ts            | 21 +++++++++++++++
 2 files changed, 71 insertions(+)
 create mode 100644 src/models/follow-requests.ts

diff --git a/src/models/follow-requests.ts b/src/models/follow-requests.ts
new file mode 100644
index 0000000000..0de4b8e3af
--- /dev/null
+++ b/src/models/follow-requests.ts
@@ -0,0 +1,50 @@
+import * as mongo from 'mongodb';
+import db from '../db/mongodb';
+
+const FollowRequest = db.get<IFollowRequest>('followRequests');
+FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true });
+export default FollowRequest;
+
+export type IFollowRequest = {
+	_id: mongo.ObjectID;
+	createdAt: Date;
+	followeeId: mongo.ObjectID;
+	followerId: mongo.ObjectID;
+
+	// 非正規化
+	_followee: {
+		host: string;
+		inbox?: string;
+	},
+	_follower: {
+		host: string;
+		inbox?: string;
+	}
+};
+
+/**
+ * FollowRequestを物理削除します
+ */
+export async function deleteFollowRequest(followRequest: string | mongo.ObjectID | IFollowRequest) {
+	let f: IFollowRequest;
+
+	// Populate
+	if (mongo.ObjectID.prototype.isPrototypeOf(followRequest)) {
+		f = await FollowRequest.findOne({
+			_id: followRequest
+		});
+	} else if (typeof followRequest === 'string') {
+		f = await FollowRequest.findOne({
+			_id: new mongo.ObjectID(followRequest)
+		});
+	} else {
+		f = followRequest as IFollowRequest;
+	}
+
+	if (f == null) return;
+
+	// このFollowingを削除
+	await FollowRequest.remove({
+		_id: f._id
+	});
+}
diff --git a/src/models/user.ts b/src/models/user.ts
index 11eafe05ea..8dfd783a9f 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -22,6 +22,7 @@ import FollowedLog, { deleteFollowedLog } from './followed-log';
 import SwSubscription, { deleteSwSubscription } from './sw-subscription';
 import Notification, { deleteNotification } from './notification';
 import UserList, { deleteUserList } from './user-list';
+import FollowRequest, { deleteFollowRequest } from './follow-requests';
 
 const User = db.get<IUser>('users');
 
@@ -50,7 +51,17 @@ type IUserBase = {
 	data: any;
 	description: string;
 	pinnedNoteId: mongo.ObjectID;
+
+	/**
+	 * 凍結されているか否か
+	 */
 	isSuspended: boolean;
+
+	/**
+	 * 鍵アカウントか否か
+	 */
+	isLocked: boolean;
+
 	host: string;
 };
 
@@ -240,6 +251,16 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) {
 		await Following.find({ followeeId: u._id })
 	).map(x => deleteFollowing(x)));
 
+	// このユーザーのFollowRequestをすべて削除
+	await Promise.all((
+		await FollowRequest.find({ followerId: u._id })
+	).map(x => deleteFollowRequest(x)));
+
+	// このユーザーへのFollowRequestをすべて削除
+	await Promise.all((
+		await FollowRequest.find({ followeeId: u._id })
+	).map(x => deleteFollowRequest(x)));
+
 	// このユーザーのFollowingLogをすべて削除
 	await Promise.all((
 		await FollowingLog.find({ userId: u._id })

From 51929fb60786dbb1af0471e40e834adfe1c37b21 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 31 May 2018 18:11:28 +0900
Subject: [PATCH 101/369] typo

---
 src/models/{follow-requests.ts => follow-request.ts} | 0
 src/models/user.ts                                   | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename src/models/{follow-requests.ts => follow-request.ts} (100%)

diff --git a/src/models/follow-requests.ts b/src/models/follow-request.ts
similarity index 100%
rename from src/models/follow-requests.ts
rename to src/models/follow-request.ts
diff --git a/src/models/user.ts b/src/models/user.ts
index 8dfd783a9f..aa051517f1 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -22,7 +22,7 @@ import FollowedLog, { deleteFollowedLog } from './followed-log';
 import SwSubscription, { deleteSwSubscription } from './sw-subscription';
 import Notification, { deleteNotification } from './notification';
 import UserList, { deleteUserList } from './user-list';
-import FollowRequest, { deleteFollowRequest } from './follow-requests';
+import FollowRequest, { deleteFollowRequest } from './follow-request';
 
 const User = db.get<IUser>('users');
 

From bd758a156ef81b628900930731042ee5b0ffb44f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 31 May 2018 18:34:15 +0900
Subject: [PATCH 102/369] wip

---
 src/remote/activitypub/models/person.ts   | 1 +
 src/remote/activitypub/renderer/person.ts | 4 +++-
 src/remote/activitypub/type.ts            | 1 +
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index 33280f3d89..b720c445c6 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -93,6 +93,7 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
 			notesCount,
 			name: person.name,
 			driveCapacity: 1024 * 1024 * 8, // 8MiB
+			isLocked: person.manuallyApprovesFollowers,
 			username: person.preferredUsername,
 			usernameLower: person.preferredUsername.toLowerCase(),
 			host,
diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts
index 424305f8d3..b2ac885f46 100644
--- a/src/remote/activitypub/renderer/person.ts
+++ b/src/remote/activitypub/renderer/person.ts
@@ -1,8 +1,9 @@
 import renderImage from './image';
 import renderKey from './key';
 import config from '../../../config';
+import { ILocalUser } from '../../../models/user';
 
-export default user => {
+export default (user: ILocalUser) => {
 	const id = `${config.url}/users/${user._id}`;
 
 	return {
@@ -17,6 +18,7 @@ export default user => {
 		summary: user.description,
 		icon: user.avatarId && renderImage({ _id: user.avatarId }),
 		image: user.bannerId && renderImage({ _id: user.bannerId }),
+		manuallyApprovesFollowers: user.isLocked,
 		publicKey: renderKey(user)
 	};
 };
diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts
index ca38ec2227..77e6bc3045 100644
--- a/src/remote/activitypub/type.ts
+++ b/src/remote/activitypub/type.ts
@@ -45,6 +45,7 @@ export interface IPerson extends IObject {
 	type: 'Person';
 	name: string;
 	preferredUsername: string;
+	manuallyApprovesFollowers: boolean;
 	inbox: string;
 	publicKey: any;
 	followers: any;

From 51255bb4467d7f797686639d785edf0eede846ec Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 31 May 2018 22:56:02 +0900
Subject: [PATCH 103/369] wip

---
 .../activitypub/kernel/accept/follow.ts       |  27 ++++
 src/remote/activitypub/kernel/accept/index.ts |  35 +++++
 src/remote/activitypub/renderer/follow.ts     |   8 +-
 src/server/api/endpoints/i/update.ts          |  47 +++---
 src/services/following/create.ts              | 141 +++++++++++-------
 src/services/following/delete.ts              |   2 +-
 .../user/accept-all-follow-requests.ts        |  18 +++
 src/services/user/accept-follow-request.ts    |  64 ++++++++
 8 files changed, 259 insertions(+), 83 deletions(-)
 create mode 100644 src/remote/activitypub/kernel/accept/follow.ts
 create mode 100644 src/remote/activitypub/kernel/accept/index.ts
 create mode 100644 src/services/user/accept-all-follow-requests.ts
 create mode 100644 src/services/user/accept-follow-request.ts

diff --git a/src/remote/activitypub/kernel/accept/follow.ts b/src/remote/activitypub/kernel/accept/follow.ts
new file mode 100644
index 0000000000..9d425419ab
--- /dev/null
+++ b/src/remote/activitypub/kernel/accept/follow.ts
@@ -0,0 +1,27 @@
+import * as mongo from 'mongodb';
+import User, { IRemoteUser } from '../../../../models/user';
+import config from '../../../../config';
+import accept from '../../../../services/user/accept-follow-request';
+import { IFollow } from '../../type';
+
+export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
+	const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
+
+	if (!id.startsWith(config.url + '/')) {
+		return null;
+	}
+
+	const follower = await User.findOne({
+		_id: new mongo.ObjectID(id.split('/').pop())
+	});
+
+	if (follower === null) {
+		throw new Error('follower not found');
+	}
+
+	if (follower.host != null) {
+		throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません');
+	}
+
+	await accept(actor, follower);
+};
diff --git a/src/remote/activitypub/kernel/accept/index.ts b/src/remote/activitypub/kernel/accept/index.ts
new file mode 100644
index 0000000000..b647df022e
--- /dev/null
+++ b/src/remote/activitypub/kernel/accept/index.ts
@@ -0,0 +1,35 @@
+import * as debug from 'debug';
+
+import Resolver from '../../resolver';
+import { IRemoteUser } from '../../../../models/user';
+import acceptFollow from './follow';
+import { IAccept } from '../../type';
+
+const log = debug('misskey:activitypub');
+
+export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => {
+	const uri = activity.id || activity;
+
+	log(`Accept: ${uri}`);
+
+	const resolver = new Resolver();
+
+	let object;
+
+	try {
+		object = await resolver.resolve(activity.object);
+	} catch (e) {
+		log(`Resolution failed: ${e}`);
+		throw e;
+	}
+
+	switch (object.type) {
+	case 'Follow':
+	acceptFollow(resolver, actor, activity, object);
+		break;
+
+	default:
+		console.warn(`Unknown accept type: ${object.type}`);
+		break;
+	}
+};
diff --git a/src/remote/activitypub/renderer/follow.ts b/src/remote/activitypub/renderer/follow.ts
index bf8eeff06b..522422bcff 100644
--- a/src/remote/activitypub/renderer/follow.ts
+++ b/src/remote/activitypub/renderer/follow.ts
@@ -1,8 +1,8 @@
 import config from '../../../config';
-import { IRemoteUser, ILocalUser } from '../../../models/user';
+import { IUser, isLocalUser } from '../../../models/user';
 
-export default (follower: ILocalUser, followee: IRemoteUser) => ({
+export default (follower: IUser, followee: IUser) => ({
 	type: 'Follow',
-	actor: `${config.url}/users/${follower._id}`,
-	object: followee.uri
+	actor: isLocalUser(follower) ? `${config.url}/users/${follower._id}` : follower.uri,
+	object: isLocalUser(followee) ? `${config.url}/users/${followee._id}` : followee.uri
 });
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 6e0c5b8515..5ca54d013c 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -12,50 +12,57 @@ import DriveFile from '../../../../models/drive-file';
 module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 	const isSecure = user != null && app == null;
 
+	const updates = {} as any;
+
 	// Get 'name' parameter
 	const [name, nameErr] = $.str.optional().nullable().pipe(isValidName).get(params.name);
 	if (nameErr) return rej('invalid name param');
-	if (name) user.name = name;
+	if (name) updates.name = name;
 
 	// Get 'description' parameter
 	const [description, descriptionErr] = $.str.optional().nullable().pipe(isValidDescription).get(params.description);
 	if (descriptionErr) return rej('invalid description param');
-	if (description !== undefined) user.description = description;
+	if (description !== undefined) updates.description = description;
 
 	// Get 'location' parameter
 	const [location, locationErr] = $.str.optional().nullable().pipe(isValidLocation).get(params.location);
 	if (locationErr) return rej('invalid location param');
-	if (location !== undefined) user.profile.location = location;
+	if (location !== undefined) updates.profile.location = location;
 
 	// Get 'birthday' parameter
 	const [birthday, birthdayErr] = $.str.optional().nullable().pipe(isValidBirthday).get(params.birthday);
 	if (birthdayErr) return rej('invalid birthday param');
-	if (birthday !== undefined) user.profile.birthday = birthday;
+	if (birthday !== undefined) updates.profile.birthday = birthday;
 
 	// Get 'avatarId' parameter
 	const [avatarId, avatarIdErr] = $.type(ID).optional().get(params.avatarId);
 	if (avatarIdErr) return rej('invalid avatarId param');
-	if (avatarId) user.avatarId = avatarId;
+	if (avatarId) updates.avatarId = avatarId;
 
 	// Get 'bannerId' parameter
 	const [bannerId, bannerIdErr] = $.type(ID).optional().get(params.bannerId);
 	if (bannerIdErr) return rej('invalid bannerId param');
-	if (bannerId) user.bannerId = bannerId;
+	if (bannerId) updates.bannerId = bannerId;
+
+	// Get 'isLocked' parameter
+	const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked);
+	if (isLockedErr) return rej('invalid isLocked param');
+	if (isLocked != null) updates.isLocked = isLocked;
 
 	// Get 'isBot' parameter
 	const [isBot, isBotErr] = $.bool.optional().get(params.isBot);
 	if (isBotErr) return rej('invalid isBot param');
-	if (isBot != null) user.isBot = isBot;
+	if (isBot != null) updates.isBot = isBot;
 
 	// Get 'isCat' parameter
 	const [isCat, isCatErr] = $.bool.optional().get(params.isCat);
 	if (isCatErr) return rej('invalid isCat param');
-	if (isCat != null) user.isCat = isCat;
+	if (isCat != null) updates.isCat = isCat;
 
 	// Get 'autoWatch' parameter
 	const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch);
 	if (autoWatchErr) return rej('invalid autoWatch param');
-	if (autoWatch != null) user.settings.autoWatch = autoWatch;
+	if (autoWatch != null) updates.settings.autoWatch = autoWatch;
 
 	if (avatarId) {
 		const avatar = await DriveFile.findOne({
@@ -63,7 +70,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 		});
 
 		if (avatar != null && avatar.metadata.properties.avgColor) {
-			user.avatarColor = avatar.metadata.properties.avgColor;
+			updates.avatarColor = avatar.metadata.properties.avgColor;
 		}
 	}
 
@@ -73,23 +80,12 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 		});
 
 		if (banner != null && banner.metadata.properties.avgColor) {
-			user.bannerColor = banner.metadata.properties.avgColor;
+			updates.bannerColor = banner.metadata.properties.avgColor;
 		}
 	}
 
 	await User.update(user._id, {
-		$set: {
-			name: user.name,
-			description: user.description,
-			avatarId: user.avatarId,
-			avatarColor: user.avatarColor,
-			bannerId: user.bannerId,
-			bannerColor: user.bannerColor,
-			profile: user.profile,
-			isBot: user.isBot,
-			isCat: user.isCat,
-			settings: user.settings
-		}
+		$set: updates
 	});
 
 	// Serialize
@@ -103,4 +99,9 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 
 	// Publish i updated event
 	event(user._id, 'i_updated', iObj);
+
+	// 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認
+	if (user.isLocked && isLocked === false) {
+		acceptAllFollowRequests(user);
+	}
 });
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index 3424c55dae..03a8f399e8 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -8,72 +8,103 @@ import pack from '../../remote/activitypub/renderer';
 import renderFollow from '../../remote/activitypub/renderer/follow';
 import renderAccept from '../../remote/activitypub/renderer/accept';
 import { deliver } from '../../queue';
+import FollowRequest from '../../models/follow-request';
 
-export default async function(follower: IUser, followee: IUser, activity?) {
-	const following = await Following.insert({
-		createdAt: new Date(),
-		followerId: follower._id,
-		followeeId: followee._id,
-		stalk: true,
+export default async function(follower: IUser, followee: IUser) {
+	if (followee.isLocked) {
+		await FollowRequest.insert({
+			createdAt: new Date(),
+			followerId: follower._id,
+			followeeId: followee._id,
 
-		// 非正規化
-		_follower: {
-			host: follower.host,
-			inbox: isRemoteUser(follower) ? follower.inbox : undefined
-		},
-		_followee: {
-			host: followee.host,
-			inbox: isRemoteUser(followee) ? followee.inbox : undefined
+			// 非正規化
+			_follower: {
+				host: follower.host,
+				inbox: isRemoteUser(follower) ? follower.inbox : undefined
+			},
+			_followee: {
+				host: followee.host,
+				inbox: isRemoteUser(followee) ? followee.inbox : undefined
+			}
+		});
+
+		// Publish reciveRequest event
+		if (isLocalUser(followee)) {
+			packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)),
+
+			// 通知を作成
+			notify(followee._id, follower._id, 'reciveRequest');
 		}
-	});
 
-	//#region Increment following count
-	User.update({ _id: follower._id }, {
-		$inc: {
-			followingCount: 1
+		if (isLocalUser(follower) && isRemoteUser(followee)) {
+			const content = pack(renderFollow(follower, followee));
+			deliver(follower, content, followee.inbox);
 		}
-	});
+	} else {
+		const following = await Following.insert({
+			createdAt: new Date(),
+			followerId: follower._id,
+			followeeId: followee._id,
 
-	FollowingLog.insert({
-		createdAt: following.createdAt,
-		userId: follower._id,
-		count: follower.followingCount + 1
-	});
-	//#endregion
+			// 非正規化
+			_follower: {
+				host: follower.host,
+				inbox: isRemoteUser(follower) ? follower.inbox : undefined
+			},
+			_followee: {
+				host: followee.host,
+				inbox: isRemoteUser(followee) ? followee.inbox : undefined
+			}
+		});
 
-	//#region Increment followers count
-	User.update({ _id: followee._id }, {
-		$inc: {
-			followersCount: 1
+		//#region Increment following count
+		User.update({ _id: follower._id }, {
+			$inc: {
+				followingCount: 1
+			}
+		});
+
+		FollowingLog.insert({
+			createdAt: following.createdAt,
+			userId: follower._id,
+			count: follower.followingCount + 1
+		});
+		//#endregion
+
+		//#region Increment followers count
+		User.update({ _id: followee._id }, {
+			$inc: {
+				followersCount: 1
+			}
+		});
+		FollowedLog.insert({
+			createdAt: following.createdAt,
+			userId: followee._id,
+			count: followee.followersCount + 1
+		});
+		//#endregion
+
+		// Publish follow event
+		if (isLocalUser(follower)) {
+			packUser(followee, follower).then(packed => event(follower._id, 'follow', packed));
 		}
-	});
-	FollowedLog.insert({
-		createdAt: following.createdAt,
-		userId: followee._id,
-		count: followee.followersCount + 1
-	});
-	//#endregion
 
-	// Publish follow event
-	if (isLocalUser(follower)) {
-		packUser(followee, follower).then(packed => event(follower._id, 'follow', packed));
-	}
+		// Publish followed event
+		if (isLocalUser(followee)) {
+			packUser(follower, followee).then(packed => event(followee._id, 'followed', packed)),
 
-	// Publish followed event
-	if (isLocalUser(followee)) {
-		packUser(follower, followee).then(packed => event(followee._id, 'followed', packed)),
+			// 通知を作成
+			notify(followee._id, follower._id, 'follow');
+		}
 
-		// 通知を作成
-		notify(followee._id, follower._id, 'follow');
-	}
+		if (isLocalUser(follower) && isRemoteUser(followee)) {
+			const content = pack(renderFollow(follower, followee));
+			deliver(follower, content, followee.inbox);
+		}
 
-	if (isLocalUser(follower) && isRemoteUser(followee)) {
-		const content = pack(renderFollow(follower, followee));
-		deliver(follower, content, followee.inbox);
-	}
-
-	if (isRemoteUser(follower) && isLocalUser(followee)) {
-		const content = pack(renderAccept(activity));
-		deliver(followee, content, follower.inbox);
+		if (isRemoteUser(follower) && isLocalUser(followee)) {
+			const content = pack(renderAccept(renderFollow(follower, followee)));
+			deliver(followee, content, follower.inbox);
+		}
 	}
 }
diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts
index c0c99fbed5..4fc5d42476 100644
--- a/src/services/following/delete.ts
+++ b/src/services/following/delete.ts
@@ -8,7 +8,7 @@ import renderFollow from '../../remote/activitypub/renderer/follow';
 import renderUndo from '../../remote/activitypub/renderer/undo';
 import { deliver } from '../../queue';
 
-export default async function(follower: IUser, followee: IUser, activity?) {
+export default async function(follower: IUser, followee: IUser) {
 	const following = await Following.findOne({
 		followerId: follower._id,
 		followeeId: followee._id
diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/user/accept-all-follow-requests.ts
new file mode 100644
index 0000000000..fbb221e772
--- /dev/null
+++ b/src/services/user/accept-all-follow-requests.ts
@@ -0,0 +1,18 @@
+import User, { IUser } from "../../models/user";
+import FollowRequest from "../../models/follow-request";
+import accept from './accept-follow-request';
+
+/**
+ * 指定したユーザー宛てのフォローリクエストをすべて承認
+ * @param user ユーザー
+ */
+export default async function(user: IUser) {
+	const requests = await FollowRequest.find({
+		followeeId: user._id
+	});
+
+	requests.forEach(async request => {
+		const follower = await User.findOne({ _id: request.followerId });
+		accept(user, follower);
+	});
+}
diff --git a/src/services/user/accept-follow-request.ts b/src/services/user/accept-follow-request.ts
new file mode 100644
index 0000000000..8b5c82c84e
--- /dev/null
+++ b/src/services/user/accept-follow-request.ts
@@ -0,0 +1,64 @@
+import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user";
+import FollowRequest from "../../models/follow-request";
+import pack from '../../remote/activitypub/renderer';
+import renderFollow from '../../remote/activitypub/renderer/follow';
+import renderAccept from '../../remote/activitypub/renderer/accept';
+import { deliver } from '../../queue';
+import Following from "../../models/following";
+import FollowingLog from "../../models/following-log";
+import FollowedLog from "../../models/followed-log";
+
+export default async function(followee: IUser, follower: IUser) {
+	const following = await Following.insert({
+		createdAt: new Date(),
+		followerId: follower._id,
+		followeeId: followee._id,
+
+		// 非正規化
+		_follower: {
+			host: follower.host,
+			inbox: isRemoteUser(follower) ? follower.inbox : undefined
+		},
+		_followee: {
+			host: followee.host,
+			inbox: isRemoteUser(followee) ? followee.inbox : undefined
+		}
+	});
+
+	if (isRemoteUser(follower)) {
+		const content = pack(renderAccept(renderFollow(follower, followee)));
+		deliver(followee as ILocalUser, content, follower.inbox);
+	}
+
+	FollowRequest.remove({
+		followeeId: followee._id,
+		followerId: follower._id
+	});
+
+	//#region Increment following count
+	User.update({ _id: follower._id }, {
+		$inc: {
+			followingCount: 1
+		}
+	});
+
+	FollowingLog.insert({
+		createdAt: following.createdAt,
+		userId: follower._id,
+		count: follower.followingCount + 1
+	});
+	//#endregion
+
+	//#region Increment followers count
+	User.update({ _id: followee._id }, {
+		$inc: {
+			followersCount: 1
+		}
+	});
+	FollowedLog.insert({
+		createdAt: following.createdAt,
+		userId: followee._id,
+		count: followee.followersCount + 1
+	});
+	//#endregion
+}

From 35115607bc7eb1ff974c7f7c4d9f14bc8377ee6e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 1 Jun 2018 00:42:37 +0900
Subject: [PATCH 104/369] wip

---
 src/models/user.ts                            | 13 ++++++-
 src/remote/activitypub/kernel/accept/index.ts |  2 +-
 src/remote/activitypub/kernel/index.ts        |  8 ++++-
 .../activitypub/kernel/reject/follow.ts       | 27 ++++++++++++++
 src/remote/activitypub/kernel/reject/index.ts | 35 +++++++++++++++++++
 src/remote/activitypub/renderer/reject.ts     |  4 +++
 src/remote/activitypub/type.ts                |  5 +++
 .../api/endpoints/users/recommendation.ts     |  1 +
 src/services/user/reject-follow-request.ts    | 18 ++++++++++
 9 files changed, 110 insertions(+), 3 deletions(-)
 create mode 100644 src/remote/activitypub/kernel/reject/follow.ts
 create mode 100644 src/remote/activitypub/kernel/reject/index.ts
 create mode 100644 src/remote/activitypub/renderer/reject.ts
 create mode 100644 src/services/user/reject-follow-request.ts

diff --git a/src/models/user.ts b/src/models/user.ts
index aa051517f1..4186241a59 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -416,7 +416,7 @@ export const pack = (
 	}
 
 	if (meId && !meId.equals(_user.id)) {
-		const [following1, following2, mute] = await Promise.all([
+		const [following1, following2, followReq1, followReq2, mute] = await Promise.all([
 			Following.findOne({
 				followerId: meId,
 				followeeId: _user.id
@@ -425,6 +425,14 @@ export const pack = (
 				followerId: _user.id,
 				followeeId: meId
 			}),
+			_user.isLocked ? FollowRequest.findOne({
+				followerId: meId,
+				followeeId: _user.id
+			}) : Promise.resolve(null),
+			FollowRequest.findOne({
+				followerId: _user.id,
+				followeeId: meId
+			}),
 			Mute.findOne({
 				muterId: meId,
 				muteeId: _user.id
@@ -435,6 +443,9 @@ export const pack = (
 		_user.isFollowing = following1 !== null;
 		_user.isStalking = following1 && following1.stalk;
 
+		_user.hasPendingFollowRequestFromYou = followReq1 !== null;
+		_user.hasPendingFollowRequestToYou = followReq2 !== null;
+
 		// Whether the user is followed
 		_user.isFollowed = following2 !== null;
 
diff --git a/src/remote/activitypub/kernel/accept/index.ts b/src/remote/activitypub/kernel/accept/index.ts
index b647df022e..2f9d646d14 100644
--- a/src/remote/activitypub/kernel/accept/index.ts
+++ b/src/remote/activitypub/kernel/accept/index.ts
@@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => {
 
 	switch (object.type) {
 	case 'Follow':
-	acceptFollow(resolver, actor, activity, object);
+		acceptFollow(actor, object);
 		break;
 
 	default:
diff --git a/src/remote/activitypub/kernel/index.ts b/src/remote/activitypub/kernel/index.ts
index 15ea9494ae..752a9bd2e2 100644
--- a/src/remote/activitypub/kernel/index.ts
+++ b/src/remote/activitypub/kernel/index.ts
@@ -6,6 +6,8 @@ import follow from './follow';
 import undo from './undo';
 import like from './like';
 import announce from './announce';
+import accept from './accept';
+import reject from './reject';
 
 const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
 	switch (activity.type) {
@@ -22,7 +24,11 @@ const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
 		break;
 
 	case 'Accept':
-		// noop
+		await accept(actor, activity);
+		break;
+
+	case 'Reject':
+		await reject(actor, activity);
 		break;
 
 	case 'Announce':
diff --git a/src/remote/activitypub/kernel/reject/follow.ts b/src/remote/activitypub/kernel/reject/follow.ts
new file mode 100644
index 0000000000..862f3def3b
--- /dev/null
+++ b/src/remote/activitypub/kernel/reject/follow.ts
@@ -0,0 +1,27 @@
+import * as mongo from 'mongodb';
+import User, { IRemoteUser } from '../../../../models/user';
+import config from '../../../../config';
+import reject from '../../../../services/user/reject-follow-request';
+import { IFollow } from '../../type';
+
+export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
+	const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
+
+	if (!id.startsWith(config.url + '/')) {
+		return null;
+	}
+
+	const follower = await User.findOne({
+		_id: new mongo.ObjectID(id.split('/').pop())
+	});
+
+	if (follower === null) {
+		throw new Error('follower not found');
+	}
+
+	if (follower.host != null) {
+		throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません');
+	}
+
+	await reject(actor, follower);
+};
diff --git a/src/remote/activitypub/kernel/reject/index.ts b/src/remote/activitypub/kernel/reject/index.ts
new file mode 100644
index 0000000000..a82c3fd61e
--- /dev/null
+++ b/src/remote/activitypub/kernel/reject/index.ts
@@ -0,0 +1,35 @@
+import * as debug from 'debug';
+
+import Resolver from '../../resolver';
+import { IRemoteUser } from '../../../../models/user';
+import rejectFollow from './follow';
+import { IReject } from '../../type';
+
+const log = debug('misskey:activitypub');
+
+export default async (actor: IRemoteUser, activity: IReject): Promise<void> => {
+	const uri = activity.id || activity;
+
+	log(`Reject: ${uri}`);
+
+	const resolver = new Resolver();
+
+	let object;
+
+	try {
+		object = await resolver.resolve(activity.object);
+	} catch (e) {
+		log(`Resolution failed: ${e}`);
+		throw e;
+	}
+
+	switch (object.type) {
+	case 'Follow':
+		rejectFollow(actor, object);
+		break;
+
+	default:
+		console.warn(`Unknown reject type: ${object.type}`);
+		break;
+	}
+};
diff --git a/src/remote/activitypub/renderer/reject.ts b/src/remote/activitypub/renderer/reject.ts
new file mode 100644
index 0000000000..29c998a6b4
--- /dev/null
+++ b/src/remote/activitypub/renderer/reject.ts
@@ -0,0 +1,4 @@
+export default object => ({
+	type: 'Reject',
+	object
+});
diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts
index 77e6bc3045..13e1969b4e 100644
--- a/src/remote/activitypub/type.ts
+++ b/src/remote/activitypub/type.ts
@@ -83,6 +83,10 @@ export interface IAccept extends IActivity {
 	type: 'Accept';
 }
 
+export interface IReject extends IActivity {
+	type: 'Reject';
+}
+
 export interface ILike extends IActivity {
 	type: 'Like';
 	_misskey_reaction: string;
@@ -100,5 +104,6 @@ export type Object =
 	IUndo |
 	IFollow |
 	IAccept |
+	IReject |
 	ILike |
 	IAnnounce;
diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts
index 620ae17ca2..23821a552f 100644
--- a/src/server/api/endpoints/users/recommendation.ts
+++ b/src/server/api/endpoints/users/recommendation.ts
@@ -36,6 +36,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
 			_id: {
 				$nin: followingIds.concat(mutedUserIds)
 			},
+			isLocked: false,
 			$or: [{
 				lastUsedAt: {
 					$gte: new Date(Date.now() - ms('7days'))
diff --git a/src/services/user/reject-follow-request.ts b/src/services/user/reject-follow-request.ts
new file mode 100644
index 0000000000..32965a1556
--- /dev/null
+++ b/src/services/user/reject-follow-request.ts
@@ -0,0 +1,18 @@
+import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user";
+import FollowRequest from "../../models/follow-request";
+import pack from '../../remote/activitypub/renderer';
+import renderFollow from '../../remote/activitypub/renderer/follow';
+import renderReject from '../../remote/activitypub/renderer/reject';
+import { deliver } from '../../queue';
+
+export default async function(followee: IUser, follower: IUser) {
+	if (isRemoteUser(follower)) {
+		const content = pack(renderReject(renderFollow(follower, followee)));
+		deliver(followee as ILocalUser, content, follower.inbox);
+	}
+
+	FollowRequest.remove({
+		followeeId: followee._id,
+		followerId: follower._id
+	});
+}

From bae44b47086d8a0f0c8f96254b9453a29490a508 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 1 Jun 2018 01:12:02 +0900
Subject: [PATCH 105/369] wip

---
 src/models/user.ts                              | 5 +++++
 src/server/api/endpoints/i/update.ts            | 1 +
 src/services/following/create.ts                | 6 ++++++
 src/services/user/accept-all-follow-requests.ts | 6 ++++++
 src/services/user/reject-follow-request.ts      | 8 +++++++-
 5 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/models/user.ts b/src/models/user.ts
index 4186241a59..0e06512dae 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -62,6 +62,11 @@ type IUserBase = {
 	 */
 	isLocked: boolean;
 
+	/**
+	 * このアカウントに届いているフォローリクエストの数
+	 */
+	pendingReceivedFollowRequestsCount: number;
+
 	host: string;
 };
 
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 5ca54d013c..103cd3ac36 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -5,6 +5,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id';
 import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 import DriveFile from '../../../../models/drive-file';
+import acceptAllFollowRequests from '../../../../services/user/accept-all-follow-requests';
 
 /**
  * Update myself
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index 03a8f399e8..39cecfddfb 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -28,6 +28,12 @@ export default async function(follower: IUser, followee: IUser) {
 			}
 		});
 
+		User.update({ _id: followee._id }, {
+			$inc: {
+				pendingReceivedFollowRequestsCount: 1
+			}
+		});
+
 		// Publish reciveRequest event
 		if (isLocalUser(followee)) {
 			packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)),
diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/user/accept-all-follow-requests.ts
index fbb221e772..397a0d7ec2 100644
--- a/src/services/user/accept-all-follow-requests.ts
+++ b/src/services/user/accept-all-follow-requests.ts
@@ -15,4 +15,10 @@ export default async function(user: IUser) {
 		const follower = await User.findOne({ _id: request.followerId });
 		accept(user, follower);
 	});
+
+	User.update({ _id: user._id }, {
+		$set: {
+			pendingReceivedFollowRequestsCount: 0
+		}
+	});
 }
diff --git a/src/services/user/reject-follow-request.ts b/src/services/user/reject-follow-request.ts
index 32965a1556..c6388f53e1 100644
--- a/src/services/user/reject-follow-request.ts
+++ b/src/services/user/reject-follow-request.ts
@@ -11,8 +11,14 @@ export default async function(followee: IUser, follower: IUser) {
 		deliver(followee as ILocalUser, content, follower.inbox);
 	}
 
-	FollowRequest.remove({
+	await FollowRequest.remove({
 		followeeId: followee._id,
 		followerId: follower._id
 	});
+
+	User.update({ _id: followee._id }, {
+		$inc: {
+			pendingReceivedFollowRequestsCount: -1
+		}
+	});
 }

From 0be790fa31d28f7efc0d0b5b847c5c93a60f0dbd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 1 Jun 2018 21:55:27 +0900
Subject: [PATCH 106/369] wip

---
 .../views/components/notifications.vue        | 21 +++++++++++
 .../views/components/notification-preview.vue | 35 ++++++++++++-------
 .../mobile/views/components/notification.vue  | 15 ++++++++
 src/server/api/endpoints.ts                   | 10 ++++++
 .../api/endpoints/following/request/accept.ts | 26 ++++++++++++++
 .../api/endpoints/following/request/reject.ts | 26 ++++++++++++++
 6 files changed, 120 insertions(+), 13 deletions(-)
 create mode 100644 src/server/api/endpoints/following/request/accept.ts
 create mode 100644 src/server/api/endpoints/following/request/reject.ts

diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue
index 5564dad623..aff21b14d8 100644
--- a/src/client/app/desktop/views/components/notifications.vue
+++ b/src/client/app/desktop/views/components/notifications.vue
@@ -5,6 +5,7 @@
 			<template v-for="(notification, i) in _notifications">
 				<div class="notification" :class="notification.type" :key="notification.id">
 					<mk-time :time="notification.createdAt"/>
+
 					<template v-if="notification.type == 'reaction'">
 						<mk-avatar class="avatar" :user="notification.user"/>
 						<div class="text">
@@ -17,6 +18,7 @@
 							</router-link>
 						</div>
 					</template>
+
 					<template v-if="notification.type == 'renote'">
 						<mk-avatar class="avatar" :user="notification.note.user"/>
 						<div class="text">
@@ -28,6 +30,7 @@
 							</router-link>
 						</div>
 					</template>
+
 					<template v-if="notification.type == 'quote'">
 						<mk-avatar class="avatar" :user="notification.note.user"/>
 						<div class="text">
@@ -37,6 +40,7 @@
 							<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
 						</div>
 					</template>
+
 					<template v-if="notification.type == 'follow'">
 						<mk-avatar class="avatar" :user="notification.user"/>
 						<div class="text">
@@ -45,6 +49,16 @@
 							</p>
 						</div>
 					</template>
+
+					<template v-if="notification.type == 'followRequest'">
+						<mk-avatar class="avatar" :user="notification.user"/>
+						<div class="text">
+							<p>%fa:user-clock%
+								<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
+							</p>
+						</div>
+					</template>
+
 					<template v-if="notification.type == 'reply'">
 						<mk-avatar class="avatar" :user="notification.note.user"/>
 						<div class="text">
@@ -54,6 +68,7 @@
 							<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
 						</div>
 					</template>
+
 					<template v-if="notification.type == 'mention'">
 						<mk-avatar class="avatar" :user="notification.note.user"/>
 						<div class="text">
@@ -63,6 +78,7 @@
 							<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
 						</div>
 					</template>
+
 					<template v-if="notification.type == 'poll_vote'">
 						<mk-avatar class="avatar" :user="notification.user"/>
 						<div class="text">
@@ -73,6 +89,7 @@
 						</div>
 					</template>
 				</div>
+
 				<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
 					<span>%fa:angle-up%{{ notification._datetext }}</span>
 					<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
@@ -251,6 +268,10 @@ root(isDark)
 					.text p i
 						color #53c7ce
 
+				&.followRequest
+					.text p i
+						color #888
+
 				&.reply, &.mention
 					.text p i
 						color #555
diff --git a/src/client/app/mobile/views/components/notification-preview.vue b/src/client/app/mobile/views/components/notification-preview.vue
index d39b2fbf9f..b1f6fd1495 100644
--- a/src/client/app/mobile/views/components/notification-preview.vue
+++ b/src/client/app/mobile/views/components/notification-preview.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mk-notification-preview" :class="notification.type">
 	<template v-if="notification.type == 'reaction'">
-		<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<mk-avatar class="avatar" :user="notification.user"/>
 		<div class="text">
 			<p><mk-reaction-icon :reaction="notification.reaction"/>{{ notification.user | userName }}</p>
 			<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
@@ -9,7 +9,7 @@
 	</template>
 
 	<template v-if="notification.type == 'renote'">
-		<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<mk-avatar class="avatar" :user="notification.note.user"/>
 		<div class="text">
 			<p>%fa:retweet%{{ notification.note.user | userName }}</p>
 			<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%</p>
@@ -17,7 +17,7 @@
 	</template>
 
 	<template v-if="notification.type == 'quote'">
-		<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<mk-avatar class="avatar" :user="notification.note.user"/>
 		<div class="text">
 			<p>%fa:quote-left%{{ notification.note.user | userName }}</p>
 			<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
@@ -25,14 +25,21 @@
 	</template>
 
 	<template v-if="notification.type == 'follow'">
-		<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<mk-avatar class="avatar" :user="notification.user"/>
 		<div class="text">
 			<p>%fa:user-plus%{{ notification.user | userName }}</p>
 		</div>
 	</template>
 
+	<template v-if="notification.type == 'followRequest'">
+		<mk-avatar class="avatar" :user="notification.user"/>
+		<div class="text">
+			<p>%fa:user-clock%{{ notification.user | userName }}</p>
+		</div>
+	</template>
+
 	<template v-if="notification.type == 'reply'">
-		<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<mk-avatar class="avatar" :user="notification.note.user"/>
 		<div class="text">
 			<p>%fa:reply%{{ notification.note.user | userName }}</p>
 			<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
@@ -40,7 +47,7 @@
 	</template>
 
 	<template v-if="notification.type == 'mention'">
-		<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<mk-avatar class="avatar" :user="notification.note.user"/>
 		<div class="text">
 			<p>%fa:at%{{ notification.note.user | userName }}</p>
 			<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
@@ -48,7 +55,7 @@
 	</template>
 
 	<template v-if="notification.type == 'poll_vote'">
-		<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
+		<mk-avatar class="avatar" :user="notification.user"/>
 		<div class="text">
 			<p>%fa:chart-pie%{{ notification.user | userName }}</p>
 			<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
@@ -83,16 +90,14 @@ export default Vue.extend({
 		display block
 		clear both
 
-	img
+	> .avatar
 		display block
 		float left
-		min-width 36px
-		min-height 36px
-		max-width 36px
-		max-height 36px
+		width 36px
+		height 36px
 		border-radius 6px
 
-	.text
+	> .text
 		float right
 		width calc(100% - 36px)
 		padding-left 8px
@@ -120,6 +125,10 @@ export default Vue.extend({
 		.text p i
 			color #53c7ce
 
+	&.followRequest
+		.text p i
+			color #888
+
 	&.reply, &.mention
 		.text p i
 			color #fff
diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue
index c1b37563ce..da69fc79cc 100644
--- a/src/client/app/mobile/views/components/notification.vue
+++ b/src/client/app/mobile/views/components/notification.vue
@@ -40,6 +40,17 @@
 		</div>
 	</div>
 
+	<div class="notification followRequest" v-if="notification.type == 'followRequest'">
+		<mk-avatar class="avatar" :user="notification.user"/>
+		<div>
+			<header>
+				%fa:user-clock%
+				<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
+				<mk-time :time="notification.createdAt"/>
+			</header>
+		</div>
+	</div>
+
 	<div class="notification poll_vote" v-if="notification.type == 'poll_vote'">
 		<mk-avatar class="avatar" :user="notification.user"/>
 		<div>
@@ -156,6 +167,10 @@ root(isDark)
 			> div > header i
 				color #53c7ce
 
+		&.followRequest
+			> div > header i
+				color #888
+
 .mk-notification[data-darkmode]
 	root(true)
 
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 196f3adebc..bd8f30b38f 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -448,6 +448,16 @@ const endpoints: Endpoint[] = [
 		},
 		kind: 'following-write'
 	},
+	{
+		name: 'following/request/accept',
+		withCredential: true,
+		kind: 'following-write'
+	},
+	{
+		name: 'following/request/reject',
+		withCredential: true,
+		kind: 'following-write'
+	},
 	{
 		name: 'following/stalk',
 		withCredential: true,
diff --git a/src/server/api/endpoints/following/request/accept.ts b/src/server/api/endpoints/following/request/accept.ts
new file mode 100644
index 0000000000..bf0aff4b77
--- /dev/null
+++ b/src/server/api/endpoints/following/request/accept.ts
@@ -0,0 +1,26 @@
+import $ from 'cafy'; import ID from '../../../../../cafy-id';
+import acceptFollowRequest from '../../../../../services/user/accept-follow-request';
+import User from '../../../../../models/user';
+
+/**
+ * Accept a follow request
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+	// Get 'followerId' parameter
+	const [followerId, followerIdErr] = $.type(ID).get(params.followerId);
+	if (followerIdErr) return rej('invalid followerId param');
+
+	// Fetch follower
+	const follower = await User.findOne({
+		_id: followerId
+	});
+
+	if (follower === null) {
+		return rej('follower not found');
+	}
+
+	await acceptFollowRequest(user, follower);
+
+	// Send response
+	res();
+});
diff --git a/src/server/api/endpoints/following/request/reject.ts b/src/server/api/endpoints/following/request/reject.ts
new file mode 100644
index 0000000000..5a995e1962
--- /dev/null
+++ b/src/server/api/endpoints/following/request/reject.ts
@@ -0,0 +1,26 @@
+import $ from 'cafy'; import ID from '../../../../../cafy-id';
+import rejectFollowRequest from '../../../../../services/user/reject-follow-request';
+import User from '../../../../../models/user';
+
+/**
+ * Reject a follow request
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+	// Get 'followerId' parameter
+	const [followerId, followerIdErr] = $.type(ID).get(params.followerId);
+	if (followerIdErr) return rej('invalid followerId param');
+
+	// Fetch follower
+	const follower = await User.findOne({
+		_id: followerId
+	});
+
+	if (follower === null) {
+		return rej('follower not found');
+	}
+
+	await rejectFollowRequest(user, follower);
+
+	// Send response
+	res();
+});

From 924119651ad5b1d812d7744eb16649b4bd94d8f0 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 1 Jun 2018 23:37:19 +0900
Subject: [PATCH 107/369] Merge branch 'master' into locked-account

---
 locales/en.yml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/locales/en.yml b/locales/en.yml
index 089070b5b8..b223f677dc 100644
--- a/locales/en.yml
+++ b/locales/en.yml
@@ -5,7 +5,7 @@ meta:
 common:
   misskey: "A planet of fediverse"
   about-title: "A ⭐ of fediverse."
-  about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging social media platform</b>. Because it exists within Fediverse (a universe which organizes various social media platforms), you can reciprocally link with other social media platforms. Why don't you get away from the hustle and bustle of the city for a while, and dive into a new Internet?"
+  about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within Fediverse (a universe where various social media platforms are organized) it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
   time:
     unknown: "unknown"
     future: "future"
@@ -438,11 +438,11 @@ desktop/views/components/settings.vue:
   do-update: "Check for update"
   update-settings: "Advanced settings"
   prevent-update: "Postpone updates (not recommended)"
-  prevent-update-desc: "You may reflect updates even if you select this setting. This setting is valid only this device."
+  prevent-update-desc: "Even if you turn this setting on updates may apply. This setting is valid only for this device."
   no-updates: "No updates available"
   no-updates-desc: "Your Misskey is up to date."
   update-available: "New version is available!"
-  update-available-desc: "To reload the page and updates are applied."
+  update-available-desc: "The updates will apply if you reload the page again."
   advanced-settings: "Advanced"
   debug-mode: "Enable the debug mode"
   debug-mode-desc: "This setting is stored in the browser."
@@ -477,7 +477,7 @@ desktop/views/components/settings.api.vue:
   token: "Token:"
   enter-password: "Please enter the password"
 desktop/views/components/settings.apps.vue:
-  no-apps: "No authorized apps"
+  no-apps: "No linked applications"
 desktop/views/components/settings.mute.vue:
   no-users: "No muted users"
 desktop/views/components/settings.password.vue:

From 484d17f53f26ff3e8961d86f03ef94f62f8f62ed Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 00:15:17 +0900
Subject: [PATCH 108/369] wip

---
 .../mobile/views/components/follow-button.vue | 49 ++++++++++++-------
 src/client/app/mobile/views/pages/user.vue    |  1 -
 .../activitypub/kernel/accept/follow.ts       |  2 +-
 src/remote/activitypub/kernel/follow.ts       |  2 +-
 .../activitypub/kernel/reject/follow.ts       |  2 +-
 src/remote/activitypub/kernel/undo/follow.ts  |  2 +-
 src/server/activitypub.ts                     | 19 +++++--
 src/server/api/endpoints.ts                   |  4 +-
 .../following/{request => requests}/accept.ts |  2 +-
 .../following/{request => requests}/reject.ts |  2 +-
 src/server/api/endpoints/i/update.ts          |  2 +-
 .../requests/accept-all.ts}                   |  6 +--
 .../requests/accept.ts}                       | 18 +++----
 .../requests/reject.ts}                       | 12 ++---
 14 files changed, 73 insertions(+), 50 deletions(-)
 rename src/server/api/endpoints/following/{request => requests}/accept.ts (87%)
 rename src/server/api/endpoints/following/{request => requests}/reject.ts (87%)
 rename src/services/{user/accept-all-follow-requests.ts => following/requests/accept-all.ts} (75%)
 rename src/services/{user/accept-follow-request.ts => following/requests/accept.ts} (68%)
 rename src/services/{user/reject-follow-request.ts => following/requests/reject.ts} (52%)

diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue
index a6b5cf0556..9c363d7164 100644
--- a/src/client/app/mobile/views/components/follow-button.vue
+++ b/src/client/app/mobile/views/components/follow-button.vue
@@ -1,13 +1,16 @@
 <template>
 <button class="mk-follow-button"
-	:class="{ wait: wait, follow: !user.isFollowing, unfollow: user.isFollowing }"
+	:class="{ wait: wait, following: user.isFollowing, unfollow: user.isFollowing }"
 	@click="onClick"
 	:disabled="wait"
 >
-	<template v-if="!wait && user.isFollowing">%fa:minus%</template>
-	<template v-if="!wait && !user.isFollowing">%fa:plus%</template>
-	<template v-if="wait">%fa:spinner .pulse .fw%</template>
-	{{ user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%' }}
+	<template v-if="!wait">
+		<template v-if="user.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template>
+		<template v-else-if="user.isFollowing">%fa:minus% %i18n:@unfollow%</template>
+		<template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template>
+		<template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template>
+	</template>
+	<template v-else>%fa:spinner .pulse .fw%</template>
 </button>
 </template>
 
@@ -66,15 +69,27 @@ export default Vue.extend({
 					this.wait = false;
 				});
 			} else {
-				(this as any).api('following/create', {
-					userId: this.user.id
-				}).then(() => {
-					this.user.isFollowing = true;
-				}).catch(err => {
-					console.error(err);
-				}).then(() => {
-					this.wait = false;
-				});
+				if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) {
+					(this as any).api('following/requests/cancel', {
+						userId: this.user.id
+					}).then(() => {
+						this.user.hasPendingFollowRequestFromYou = false;
+					}).catch(err => {
+						console.error(err);
+					}).then(() => {
+						this.wait = false;
+					});
+				} else {
+					(this as any).api('following/create', {
+						userId: this.user.id
+					}).then(() => {
+						this.user.isFollowing = true;
+					}).catch(err => {
+						console.error(err);
+					}).then(() => {
+						this.wait = false;
+					});
+				}
 			}
 		}
 	}
@@ -90,11 +105,11 @@ export default Vue.extend({
 	cursor pointer
 	padding 0 16px
 	margin 0
-	height inherit
-	font-size 16px
+	line-height 36px
+	font-size 14px
 	outline none
 	border solid 1px $theme-color
-	border-radius 4px
+	border-radius 36px
 
 	*
 		pointer-events none
diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue
index b3b820650c..3d37015906 100644
--- a/src/client/app/mobile/views/pages/user.vue
+++ b/src/client/app/mobile/views/pages/user.vue
@@ -184,7 +184,6 @@ root(isDark)
 
 				> .mk-follow-button
 					float right
-					height 40px
 
 			> .title
 				margin 8px 0
diff --git a/src/remote/activitypub/kernel/accept/follow.ts b/src/remote/activitypub/kernel/accept/follow.ts
index 9d425419ab..0f414ba321 100644
--- a/src/remote/activitypub/kernel/accept/follow.ts
+++ b/src/remote/activitypub/kernel/accept/follow.ts
@@ -1,7 +1,7 @@
 import * as mongo from 'mongodb';
 import User, { IRemoteUser } from '../../../../models/user';
 import config from '../../../../config';
-import accept from '../../../../services/user/accept-follow-request';
+import accept from '../../../../services/following/requests/accept';
 import { IFollow } from '../../type';
 
 export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
diff --git a/src/remote/activitypub/kernel/follow.ts b/src/remote/activitypub/kernel/follow.ts
index 7e31eb32ea..464f8582b7 100644
--- a/src/remote/activitypub/kernel/follow.ts
+++ b/src/remote/activitypub/kernel/follow.ts
@@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
 		throw new Error('フォローしようとしているユーザーはローカルユーザーではありません');
 	}
 
-	await follow(actor, followee, activity);
+	await follow(actor, followee);
 };
diff --git a/src/remote/activitypub/kernel/reject/follow.ts b/src/remote/activitypub/kernel/reject/follow.ts
index 862f3def3b..c139865d0e 100644
--- a/src/remote/activitypub/kernel/reject/follow.ts
+++ b/src/remote/activitypub/kernel/reject/follow.ts
@@ -1,7 +1,7 @@
 import * as mongo from 'mongodb';
 import User, { IRemoteUser } from '../../../../models/user';
 import config from '../../../../config';
-import reject from '../../../../services/user/reject-follow-request';
+import reject from '../../../../services/following/requests/reject';
 import { IFollow } from '../../type';
 
 export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
diff --git a/src/remote/activitypub/kernel/undo/follow.ts b/src/remote/activitypub/kernel/undo/follow.ts
index c0b10c1898..763d5723c4 100644
--- a/src/remote/activitypub/kernel/undo/follow.ts
+++ b/src/remote/activitypub/kernel/undo/follow.ts
@@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
 		throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません');
 	}
 
-	await unfollow(actor, followee, activity);
+	await unfollow(actor, followee);
 };
diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts
index 3c07a3e2f2..c846e28c07 100644
--- a/src/server/activitypub.ts
+++ b/src/server/activitypub.ts
@@ -7,7 +7,7 @@ const httpSignature = require('http-signature');
 import { createHttp } from '../queue';
 import pack from '../remote/activitypub/renderer';
 import Note from '../models/note';
-import User, { isLocalUser } from '../models/user';
+import User, { isLocalUser, ILocalUser } from '../models/user';
 import renderNote from '../remote/activitypub/renderer/note';
 import renderKey from '../remote/activitypub/renderer/key';
 import renderPerson from '../remote/activitypub/renderer/person';
@@ -69,7 +69,10 @@ router.get('/notes/:note', async (ctx, next) => {
 router.get('/users/:user/outbox', async ctx => {
 	const userId = new mongo.ObjectID(ctx.params.user);
 
-	const user = await User.findOne({ _id: userId });
+	const user = await User.findOne({
+		_id: userId,
+		host: null
+	});
 
 	if (user === null) {
 		ctx.status = 404;
@@ -91,7 +94,10 @@ router.get('/users/:user/outbox', async ctx => {
 router.get('/users/:user/publickey', async ctx => {
 	const userId = new mongo.ObjectID(ctx.params.user);
 
-	const user = await User.findOne({ _id: userId });
+	const user = await User.findOne({
+		_id: userId,
+		host: null
+	});
 
 	if (user === null) {
 		ctx.status = 404;
@@ -109,14 +115,17 @@ router.get('/users/:user/publickey', async ctx => {
 router.get('/users/:user', async ctx => {
 	const userId = new mongo.ObjectID(ctx.params.user);
 
-	const user = await User.findOne({ _id: userId });
+	const user = await User.findOne({
+		_id: userId,
+		host: null
+	});
 
 	if (user === null) {
 		ctx.status = 404;
 		return;
 	}
 
-	ctx.body = pack(renderPerson(user));
+	ctx.body = pack(renderPerson(user as ILocalUser));
 });
 
 // follow form
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index bd8f30b38f..ad51a249bf 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -449,12 +449,12 @@ const endpoints: Endpoint[] = [
 		kind: 'following-write'
 	},
 	{
-		name: 'following/request/accept',
+		name: 'following/requests/accept',
 		withCredential: true,
 		kind: 'following-write'
 	},
 	{
-		name: 'following/request/reject',
+		name: 'following/requests/reject',
 		withCredential: true,
 		kind: 'following-write'
 	},
diff --git a/src/server/api/endpoints/following/request/accept.ts b/src/server/api/endpoints/following/requests/accept.ts
similarity index 87%
rename from src/server/api/endpoints/following/request/accept.ts
rename to src/server/api/endpoints/following/requests/accept.ts
index bf0aff4b77..f8df3b7850 100644
--- a/src/server/api/endpoints/following/request/accept.ts
+++ b/src/server/api/endpoints/following/requests/accept.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
-import acceptFollowRequest from '../../../../../services/user/accept-follow-request';
+import acceptFollowRequest from '../../../../../services/following/requests/accept';
 import User from '../../../../../models/user';
 
 /**
diff --git a/src/server/api/endpoints/following/request/reject.ts b/src/server/api/endpoints/following/requests/reject.ts
similarity index 87%
rename from src/server/api/endpoints/following/request/reject.ts
rename to src/server/api/endpoints/following/requests/reject.ts
index 5a995e1962..4900127a57 100644
--- a/src/server/api/endpoints/following/request/reject.ts
+++ b/src/server/api/endpoints/following/requests/reject.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
-import rejectFollowRequest from '../../../../../services/user/reject-follow-request';
+import rejectFollowRequest from '../../../../../services/following/requests/reject';
 import User from '../../../../../models/user';
 
 /**
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 103cd3ac36..8ee3c84861 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -5,7 +5,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id';
 import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 import DriveFile from '../../../../models/drive-file';
-import acceptAllFollowRequests from '../../../../services/user/accept-all-follow-requests';
+import acceptAllFollowRequests from '../../../../services/following/requests/accept-all';
 
 /**
  * Update myself
diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/following/requests/accept-all.ts
similarity index 75%
rename from src/services/user/accept-all-follow-requests.ts
rename to src/services/following/requests/accept-all.ts
index 397a0d7ec2..9708d9e658 100644
--- a/src/services/user/accept-all-follow-requests.ts
+++ b/src/services/following/requests/accept-all.ts
@@ -1,6 +1,6 @@
-import User, { IUser } from "../../models/user";
-import FollowRequest from "../../models/follow-request";
-import accept from './accept-follow-request';
+import User, { IUser } from "../../../models/user";
+import FollowRequest from "../../../models/follow-request";
+import accept from './accept';
 
 /**
  * 指定したユーザー宛てのフォローリクエストをすべて承認
diff --git a/src/services/user/accept-follow-request.ts b/src/services/following/requests/accept.ts
similarity index 68%
rename from src/services/user/accept-follow-request.ts
rename to src/services/following/requests/accept.ts
index 8b5c82c84e..2dff9b01fe 100644
--- a/src/services/user/accept-follow-request.ts
+++ b/src/services/following/requests/accept.ts
@@ -1,12 +1,12 @@
-import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user";
-import FollowRequest from "../../models/follow-request";
-import pack from '../../remote/activitypub/renderer';
-import renderFollow from '../../remote/activitypub/renderer/follow';
-import renderAccept from '../../remote/activitypub/renderer/accept';
-import { deliver } from '../../queue';
-import Following from "../../models/following";
-import FollowingLog from "../../models/following-log";
-import FollowedLog from "../../models/followed-log";
+import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user";
+import FollowRequest from "../../../models/follow-request";
+import pack from '../../../remote/activitypub/renderer';
+import renderFollow from '../../../remote/activitypub/renderer/follow';
+import renderAccept from '../../../remote/activitypub/renderer/accept';
+import { deliver } from '../../../queue';
+import Following from "../../../models/following";
+import FollowingLog from "../../../models/following-log";
+import FollowedLog from "../../../models/followed-log";
 
 export default async function(followee: IUser, follower: IUser) {
 	const following = await Following.insert({
diff --git a/src/services/user/reject-follow-request.ts b/src/services/following/requests/reject.ts
similarity index 52%
rename from src/services/user/reject-follow-request.ts
rename to src/services/following/requests/reject.ts
index c6388f53e1..acd419d0ee 100644
--- a/src/services/user/reject-follow-request.ts
+++ b/src/services/following/requests/reject.ts
@@ -1,9 +1,9 @@
-import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user";
-import FollowRequest from "../../models/follow-request";
-import pack from '../../remote/activitypub/renderer';
-import renderFollow from '../../remote/activitypub/renderer/follow';
-import renderReject from '../../remote/activitypub/renderer/reject';
-import { deliver } from '../../queue';
+import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user";
+import FollowRequest from "../../../models/follow-request";
+import pack from '../../../remote/activitypub/renderer';
+import renderFollow from '../../../remote/activitypub/renderer/follow';
+import renderReject from '../../../remote/activitypub/renderer/reject';
+import { deliver } from '../../../queue';
 
 export default async function(followee: IUser, follower: IUser) {
 	if (isRemoteUser(follower)) {

From f14571dc42532c269e606f810ec2af03a3baeba5 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 00:38:31 +0900
Subject: [PATCH 109/369] wip

---
 src/remote/activitypub/kernel/undo/follow.ts | 13 +++++-
 src/services/following/create.ts             | 37 +---------------
 src/services/following/requests/cancel.ts    | 24 ++++++++++
 src/services/following/requests/create.ts    | 46 ++++++++++++++++++++
 4 files changed, 84 insertions(+), 36 deletions(-)
 create mode 100644 src/services/following/requests/cancel.ts
 create mode 100644 src/services/following/requests/create.ts

diff --git a/src/remote/activitypub/kernel/undo/follow.ts b/src/remote/activitypub/kernel/undo/follow.ts
index 763d5723c4..7377984616 100644
--- a/src/remote/activitypub/kernel/undo/follow.ts
+++ b/src/remote/activitypub/kernel/undo/follow.ts
@@ -2,7 +2,9 @@ import * as mongo from 'mongodb';
 import User, { IRemoteUser } from '../../../../models/user';
 import config from '../../../../config';
 import unfollow from '../../../../services/following/delete';
+import cancelRequest from '../../../../services/following/requests/cancel';
 import { IFollow } from '../../type';
+import FollowRequest from '../../../../models/follow-request';
 
 export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
 	const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
@@ -23,5 +25,14 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
 		throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません');
 	}
 
-	await unfollow(actor, followee);
+	const req = await FollowRequest.findOne({
+		followerId: actor._id,
+		followeeId: followee._id
+	});
+
+	if (req) {
+		await cancelRequest(actor, followee);
+	} else {
+		await unfollow(actor, followee);
+	}
 };
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index 39cecfddfb..03db72c332 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -8,44 +8,11 @@ import pack from '../../remote/activitypub/renderer';
 import renderFollow from '../../remote/activitypub/renderer/follow';
 import renderAccept from '../../remote/activitypub/renderer/accept';
 import { deliver } from '../../queue';
-import FollowRequest from '../../models/follow-request';
+import createFollowRequest from './requests/create';
 
 export default async function(follower: IUser, followee: IUser) {
 	if (followee.isLocked) {
-		await FollowRequest.insert({
-			createdAt: new Date(),
-			followerId: follower._id,
-			followeeId: followee._id,
-
-			// 非正規化
-			_follower: {
-				host: follower.host,
-				inbox: isRemoteUser(follower) ? follower.inbox : undefined
-			},
-			_followee: {
-				host: followee.host,
-				inbox: isRemoteUser(followee) ? followee.inbox : undefined
-			}
-		});
-
-		User.update({ _id: followee._id }, {
-			$inc: {
-				pendingReceivedFollowRequestsCount: 1
-			}
-		});
-
-		// Publish reciveRequest event
-		if (isLocalUser(followee)) {
-			packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)),
-
-			// 通知を作成
-			notify(followee._id, follower._id, 'reciveRequest');
-		}
-
-		if (isLocalUser(follower) && isRemoteUser(followee)) {
-			const content = pack(renderFollow(follower, followee));
-			deliver(follower, content, followee.inbox);
-		}
+		await createFollowRequest(follower, followee);
 	} else {
 		const following = await Following.insert({
 			createdAt: new Date(),
diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts
new file mode 100644
index 0000000000..840f70264c
--- /dev/null
+++ b/src/services/following/requests/cancel.ts
@@ -0,0 +1,24 @@
+import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user";
+import FollowRequest from "../../../models/follow-request";
+import pack from '../../../remote/activitypub/renderer';
+import renderFollow from '../../../remote/activitypub/renderer/follow';
+import renderUndo from '../../../remote/activitypub/renderer/undo';
+import { deliver } from '../../../queue';
+
+export default async function(followee: IUser, follower: IUser) {
+	if (isRemoteUser(followee)) {
+		const content = pack(renderUndo(renderFollow(follower, followee)));
+		deliver(follower as ILocalUser, content, followee.inbox);
+	}
+
+	await FollowRequest.remove({
+		followeeId: followee._id,
+		followerId: follower._id
+	});
+
+	User.update({ _id: followee._id }, {
+		$inc: {
+			pendingReceivedFollowRequestsCount: -1
+		}
+	});
+}
diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts
new file mode 100644
index 0000000000..1285c21ea8
--- /dev/null
+++ b/src/services/following/requests/create.ts
@@ -0,0 +1,46 @@
+import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../../models/user';
+import event from '../../../publishers/stream';
+import notify from '../../../publishers/notify';
+import pack from '../../../remote/activitypub/renderer';
+import renderFollow from '../../../remote/activitypub/renderer/follow';
+import { deliver } from '../../../queue';
+import FollowRequest from '../../../models/follow-request';
+
+export default async function(follower: IUser, followee: IUser) {
+	if (!followee.isLocked) throw '対象のアカウントは鍵アカウントではありません';
+
+	await FollowRequest.insert({
+		createdAt: new Date(),
+		followerId: follower._id,
+		followeeId: followee._id,
+
+		// 非正規化
+		_follower: {
+			host: follower.host,
+			inbox: isRemoteUser(follower) ? follower.inbox : undefined
+		},
+		_followee: {
+			host: followee.host,
+			inbox: isRemoteUser(followee) ? followee.inbox : undefined
+		}
+	});
+
+	User.update({ _id: followee._id }, {
+		$inc: {
+			pendingReceivedFollowRequestsCount: 1
+		}
+	});
+
+	// Publish reciveRequest event
+	if (isLocalUser(followee)) {
+		packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)),
+
+		// 通知を作成
+		notify(followee._id, follower._id, 'reciveRequest');
+	}
+
+	if (isLocalUser(follower) && isRemoteUser(followee)) {
+		const content = pack(renderFollow(follower, followee));
+		deliver(follower, content, followee.inbox);
+	}
+}

From a26c19cbd2f3e9efbe9155895cd01e803e8c7b59 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 00:51:20 +0900
Subject: [PATCH 110/369] wip

---
 .../views/components/settings.profile.vue     | 11 +++++-
 src/models/follow-request.ts                  | 37 +++++++++++++++++++
 src/server/api/endpoints.ts                   | 10 +++++
 .../endpoints/following/requests/cancel.ts    | 26 +++++++++++++
 .../api/endpoints/following/requests/list.ts  | 14 +++++++
 5 files changed, 97 insertions(+), 1 deletion(-)
 create mode 100644 src/server/api/endpoints/following/requests/cancel.ts
 create mode 100644 src/server/api/endpoints/following/requests/list.ts

diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue
index 9932cbf7db..0b3a25f389 100644
--- a/src/client/app/desktop/views/components/settings.profile.vue
+++ b/src/client/app/desktop/views/components/settings.profile.vue
@@ -23,7 +23,11 @@
 	</label>
 	<button class="ui primary" @click="save">%i18n:@save%</button>
 	<section>
-		<h2>その他</h2>
+		<h2>%i18n:@locked-account%</h2>
+		<mk-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked" text="%i18n:@is-locked%"/>
+	</section>
+	<section>
+		<h2>%i18n:@other%</h2>
 		<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
 		<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
 	</section>
@@ -62,6 +66,11 @@ export default Vue.extend({
 				(this as any).apis.notify('プロフィールを更新しました');
 			});
 		},
+		onChangeIsLocked() {
+			(this as any).api('i/update', {
+				isLocked: this.$store.state.i.isLocked
+			});
+		},
 		onChangeIsBot() {
 			(this as any).api('i/update', {
 				isBot: this.$store.state.i.isBot
diff --git a/src/models/follow-request.ts b/src/models/follow-request.ts
index 0de4b8e3af..0cdb8b4f47 100644
--- a/src/models/follow-request.ts
+++ b/src/models/follow-request.ts
@@ -1,5 +1,7 @@
 import * as mongo from 'mongodb';
+import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
+import { pack as packUser } from './user';
 
 const FollowRequest = db.get<IFollowRequest>('followRequests');
 FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true });
@@ -48,3 +50,38 @@ export async function deleteFollowRequest(followRequest: string | mongo.ObjectID
 		_id: f._id
 	});
 }
+
+/**
+ * Pack a request for API response
+ */
+export const pack = (
+	request: any,
+	me?: any
+) => new Promise<any>(async (resolve, reject) => {
+	let _request: any;
+
+	// Populate the request if 'request' is ID
+	if (mongo.ObjectID.prototype.isPrototypeOf(request)) {
+		_request = await FollowRequest.findOne({
+			_id: request
+		});
+	} else if (typeof request === 'string') {
+		_request = await FollowRequest.findOne({
+			_id: new mongo.ObjectID(request)
+		});
+	} else {
+		_request = deepcopy(request);
+	}
+
+	// Rename _id to id
+	_request.id = _request._id;
+	delete _request._id;
+
+	// Populate follower
+	_request.followerId = await packUser(_request.followerId, me);
+
+	// Populate followee
+	_request.followeeId = await packUser(_request.followeeId, me);
+
+	resolve(_request);
+});
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index ad51a249bf..e9392d236b 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -458,6 +458,16 @@ const endpoints: Endpoint[] = [
 		withCredential: true,
 		kind: 'following-write'
 	},
+	{
+		name: 'following/requests/cancel',
+		withCredential: true,
+		kind: 'following-write'
+	},
+	{
+		name: 'following/requests/list',
+		withCredential: true,
+		kind: 'following-read'
+	},
 	{
 		name: 'following/stalk',
 		withCredential: true,
diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts
new file mode 100644
index 0000000000..417422e06b
--- /dev/null
+++ b/src/server/api/endpoints/following/requests/cancel.ts
@@ -0,0 +1,26 @@
+import $ from 'cafy'; import ID from '../../../../../cafy-id';
+import cancelFollowRequest from '../../../../../services/following/requests/cancel';
+import User from '../../../../../models/user';
+
+/**
+ * Cancel a follow request
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+	// Get 'followerId' parameter
+	const [followerId, followerIdErr] = $.type(ID).get(params.followerId);
+	if (followerIdErr) return rej('invalid followerId param');
+
+	// Fetch follower
+	const follower = await User.findOne({
+		_id: followerId
+	});
+
+	if (follower === null) {
+		return rej('follower not found');
+	}
+
+	await cancelFollowRequest(user, follower);
+
+	// Send response
+	res();
+});
diff --git a/src/server/api/endpoints/following/requests/list.ts b/src/server/api/endpoints/following/requests/list.ts
new file mode 100644
index 0000000000..e8364335d1
--- /dev/null
+++ b/src/server/api/endpoints/following/requests/list.ts
@@ -0,0 +1,14 @@
+//import $ from 'cafy'; import ID from '../../../../../cafy-id';
+import FollowRequest, { pack } from '../../../../../models/follow-request';
+
+/**
+ * Get all pending received follow requests
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+	const reqs = await FollowRequest.find({
+		followeeId: user._id
+	});
+
+	// Send response
+	res(await Promise.all(reqs.map(req => pack(req))));
+});

From 2752319e50dd77dd4a22b974a5a8933a377b8b50 Mon Sep 17 00:00:00 2001
From: Angristan <Angristan@users.noreply.github.com>
Date: Fri, 1 Jun 2018 20:24:30 +0200
Subject: [PATCH 111/369] Update build docs

Fix #1474
---
 docs/setup.en.md | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/docs/setup.en.md b/docs/setup.en.md
index 8dde4d00d6..d5c54334b6 100644
--- a/docs/setup.en.md
+++ b/docs/setup.en.md
@@ -47,12 +47,12 @@ You need to generate config file via `npm run config` command.
 
 *5.* Build Misskey
 ----------------------------------------------------------------
-We need to use `node-gyp` to build the `crypto` module.
 
-1. `npm install -g node-gyp`
-2. `node-gyp configure`
-3. `node-gyp build`
-4. `npm run build`
+If you're on Debian, you will need to install the `build-essential` package.
+
+Then build misskey:
+
+`npm run build`
 
 *6.* That is it.
 ----------------------------------------------------------------

From 8d78ee08c111b09479484c53e63fb32a1721b848 Mon Sep 17 00:00:00 2001
From: Angristan <Angristan@users.noreply.github.com>
Date: Fri, 1 Jun 2018 20:52:47 +0200
Subject: [PATCH 112/369] Cover multiple cases

---
 docs/setup.en.md | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/docs/setup.en.md b/docs/setup.en.md
index d5c54334b6..28e025521b 100644
--- a/docs/setup.en.md
+++ b/docs/setup.en.md
@@ -48,12 +48,19 @@ You need to generate config file via `npm run config` command.
 *5.* Build Misskey
 ----------------------------------------------------------------
 
-If you're on Debian, you will need to install the `build-essential` package.
-
-Then build misskey:
+Build misskey with the following:
 
 `npm run build`
 
+If you're on Debian, you will need to install the `build-essential` package.
+
+If you're still encountering errors about some modules, use node-gyp:
+
+1. `npm install -g node-gyp`
+2. `node-gyp configure`
+3. `node-gyp build`
+4. `npm run build`
+
 *6.* That is it.
 ----------------------------------------------------------------
 Well done! Now, you have an environment that run to Misskey.

From 56fa24e40166f59482d25ebc04a8335a60b072ff Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 12:58:56 +0900
Subject: [PATCH 113/369] wip

---
 .../views/components/notifications.vue        |  4 +-
 .../mobile/views/components/follow-button.vue | 84 +++++++++----------
 .../views/components/notification-preview.vue |  4 +-
 .../mobile/views/components/notification.vue  |  4 +-
 src/server/api/endpoints/following/create.ts  |  4 +-
 src/server/api/endpoints/following/delete.ts  |  4 +-
 .../endpoints/following/requests/accept.ts    |  6 +-
 .../endpoints/following/requests/cancel.ts    | 22 ++---
 .../endpoints/following/requests/reject.ts    |  6 +-
 src/services/following/requests/create.ts     |  4 +-
 10 files changed, 67 insertions(+), 75 deletions(-)

diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue
index aff21b14d8..368655095f 100644
--- a/src/client/app/desktop/views/components/notifications.vue
+++ b/src/client/app/desktop/views/components/notifications.vue
@@ -50,7 +50,7 @@
 						</div>
 					</template>
 
-					<template v-if="notification.type == 'followRequest'">
+					<template v-if="notification.type == 'reciveFollowRequest'">
 						<mk-avatar class="avatar" :user="notification.user"/>
 						<div class="text">
 							<p>%fa:user-clock%
@@ -268,7 +268,7 @@ root(isDark)
 					.text p i
 						color #53c7ce
 
-				&.followRequest
+				&.reciveFollowRequest
 					.text p i
 						color #888
 
diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue
index 9c363d7164..a247db95f6 100644
--- a/src/client/app/mobile/views/components/follow-button.vue
+++ b/src/client/app/mobile/views/components/follow-button.vue
@@ -1,14 +1,14 @@
 <template>
 <button class="mk-follow-button"
-	:class="{ wait: wait, following: user.isFollowing, unfollow: user.isFollowing }"
+	:class="{ wait: wait, following: u.isFollowing }"
 	@click="onClick"
 	:disabled="wait"
 >
 	<template v-if="!wait">
-		<template v-if="user.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template>
-		<template v-else-if="user.isFollowing">%fa:minus% %i18n:@unfollow%</template>
-		<template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template>
-		<template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template>
+		<template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template>
+		<template v-else-if="u.isFollowing">%fa:minus% %i18n:@unfollow%</template>
+		<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus% %i18n:@follow-request%</template>
+		<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus% %i18n:@follow%</template>
 	</template>
 	<template v-else>%fa:spinner .pulse .fw%</template>
 </button>
@@ -25,6 +25,7 @@ export default Vue.extend({
 	},
 	data() {
 		return {
+			u: this.user,
 			wait: false,
 			connection: null,
 			connectionId: null
@@ -45,51 +46,44 @@ export default Vue.extend({
 	methods: {
 
 		onFollow(user) {
-			if (user.id == this.user.id) {
-				this.user.isFollowing = user.isFollowing;
+			if (user.id == this.u.id) {
+				this.u.isFollowing = user.isFollowing;
 			}
 		},
 
 		onUnfollow(user) {
-			if (user.id == this.user.id) {
-				this.user.isFollowing = user.isFollowing;
+			if (user.id == this.u.id) {
+				this.u.isFollowing = user.isFollowing;
 			}
 		},
 
-		onClick() {
+		async onClick() {
 			this.wait = true;
-			if (this.user.isFollowing) {
-				(this as any).api('following/delete', {
-					userId: this.user.id
-				}).then(() => {
-					this.user.isFollowing = false;
-				}).catch(err => {
-					console.error(err);
-				}).then(() => {
-					this.wait = false;
-				});
-			} else {
-				if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) {
-					(this as any).api('following/requests/cancel', {
-						userId: this.user.id
-					}).then(() => {
-						this.user.hasPendingFollowRequestFromYou = false;
-					}).catch(err => {
-						console.error(err);
-					}).then(() => {
-						this.wait = false;
+
+			try {
+				if (this.u.isFollowing) {
+					this.u = await (this as any).api('following/delete', {
+						userId: this.u.id
 					});
 				} else {
-					(this as any).api('following/create', {
-						userId: this.user.id
-					}).then(() => {
-						this.user.isFollowing = true;
-					}).catch(err => {
-						console.error(err);
-					}).then(() => {
-						this.wait = false;
-					});
+					if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
+						this.u = await (this as any).api('following/requests/cancel', {
+							userId: this.u.id
+						});
+					} else if (this.u.isLocked) {
+						this.u = await (this as any).api('following/create', {
+							userId: this.u.id
+						});
+					} else {
+						this.u = await (this as any).api('following/create', {
+							userId: this.user.id
+						});
+					}
 				}
+			} catch (e) {
+				console.error(e);
+			} finally {
+				this.wait = false;
 			}
 		}
 	}
@@ -107,6 +101,8 @@ export default Vue.extend({
 	margin 0
 	line-height 36px
 	font-size 14px
+	color $theme-color
+	background transparent
 	outline none
 	border solid 1px $theme-color
 	border-radius 36px
@@ -114,9 +110,9 @@ export default Vue.extend({
 	*
 		pointer-events none
 
-	&.follow
-		color $theme-color
-		background transparent
+	&.following
+		color $theme-color-foreground
+		background $theme-color
 
 		&:hover
 			background rgba($theme-color, 0.1)
@@ -124,10 +120,6 @@ export default Vue.extend({
 		&:active
 			background rgba($theme-color, 0.2)
 
-	&.unfollow
-		color $theme-color-foreground
-		background $theme-color
-
 	&.wait
 		cursor wait !important
 		opacity 0.7
diff --git a/src/client/app/mobile/views/components/notification-preview.vue b/src/client/app/mobile/views/components/notification-preview.vue
index b1f6fd1495..6046f77242 100644
--- a/src/client/app/mobile/views/components/notification-preview.vue
+++ b/src/client/app/mobile/views/components/notification-preview.vue
@@ -31,7 +31,7 @@
 		</div>
 	</template>
 
-	<template v-if="notification.type == 'followRequest'">
+	<template v-if="notification.type == 'reciveFollowRequest'">
 		<mk-avatar class="avatar" :user="notification.user"/>
 		<div class="text">
 			<p>%fa:user-clock%{{ notification.user | userName }}</p>
@@ -125,7 +125,7 @@ export default Vue.extend({
 		.text p i
 			color #53c7ce
 
-	&.followRequest
+	&.reciveFollowRequest
 		.text p i
 			color #888
 
diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue
index da69fc79cc..8109bef38e 100644
--- a/src/client/app/mobile/views/components/notification.vue
+++ b/src/client/app/mobile/views/components/notification.vue
@@ -40,7 +40,7 @@
 		</div>
 	</div>
 
-	<div class="notification followRequest" v-if="notification.type == 'followRequest'">
+	<div class="notification followRequest" v-if="notification.type == 'reciveFollowRequest'">
 		<mk-avatar class="avatar" :user="notification.user"/>
 		<div>
 			<header>
@@ -167,7 +167,7 @@ root(isDark)
 			> div > header i
 				color #53c7ce
 
-		&.followRequest
+		&.reciveFollowRequest
 			> div > header i
 				color #888
 
diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts
index 766a8c03d0..48205232e6 100644
--- a/src/server/api/endpoints/following/create.ts
+++ b/src/server/api/endpoints/following/create.ts
@@ -2,7 +2,7 @@
  * Module dependencies
  */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User from '../../../../models/user';
+import User, { pack } from '../../../../models/user';
 import Following from '../../../../models/following';
 import create from '../../../../services/following/create';
 
@@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	create(follower, followee);
 
 	// Send response
-	res();
+	res(await pack(followee, user));
 });
diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts
index 396b19a6f6..f4030c247a 100644
--- a/src/server/api/endpoints/following/delete.ts
+++ b/src/server/api/endpoints/following/delete.ts
@@ -2,7 +2,7 @@
  * Module dependencies
  */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User from '../../../../models/user';
+import User, { pack } from '../../../../models/user';
 import Following from '../../../../models/following';
 import deleteFollowing from '../../../../services/following/delete';
 
@@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	deleteFollowing(follower, followee);
 
 	// Send response
-	res();
+	res(await pack(followee, user));
 });
diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts
index f8df3b7850..705d3b161a 100644
--- a/src/server/api/endpoints/following/requests/accept.ts
+++ b/src/server/api/endpoints/following/requests/accept.ts
@@ -6,9 +6,9 @@ import User from '../../../../../models/user';
  * Accept a follow request
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
-	// Get 'followerId' parameter
-	const [followerId, followerIdErr] = $.type(ID).get(params.followerId);
-	if (followerIdErr) return rej('invalid followerId param');
+	// Get 'userId' parameter
+	const [followerId, followerIdErr] = $.type(ID).get(params.userId);
+	if (followerIdErr) return rej('invalid userId param');
 
 	// Fetch follower
 	const follower = await User.findOne({
diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts
index 417422e06b..388a54890b 100644
--- a/src/server/api/endpoints/following/requests/cancel.ts
+++ b/src/server/api/endpoints/following/requests/cancel.ts
@@ -1,26 +1,26 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import cancelFollowRequest from '../../../../../services/following/requests/cancel';
-import User from '../../../../../models/user';
+import User, { pack } from '../../../../../models/user';
 
 /**
  * Cancel a follow request
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
-	// Get 'followerId' parameter
-	const [followerId, followerIdErr] = $.type(ID).get(params.followerId);
-	if (followerIdErr) return rej('invalid followerId param');
+	// Get 'userId' parameter
+	const [followeeId, followeeIdErr] = $.type(ID).get(params.userId);
+	if (followeeIdErr) return rej('invalid userId param');
 
-	// Fetch follower
-	const follower = await User.findOne({
-		_id: followerId
+	// Fetch followee
+	const followee = await User.findOne({
+		_id: followeeId
 	});
 
-	if (follower === null) {
-		return rej('follower not found');
+	if (followee === null) {
+		return rej('followee not found');
 	}
 
-	await cancelFollowRequest(user, follower);
+	await cancelFollowRequest(followee, user);
 
 	// Send response
-	res();
+	res(await pack(followee._id, user));
 });
diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts
index 4900127a57..1cfb562b55 100644
--- a/src/server/api/endpoints/following/requests/reject.ts
+++ b/src/server/api/endpoints/following/requests/reject.ts
@@ -6,9 +6,9 @@ import User from '../../../../../models/user';
  * Reject a follow request
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
-	// Get 'followerId' parameter
-	const [followerId, followerIdErr] = $.type(ID).get(params.followerId);
-	if (followerIdErr) return rej('invalid followerId param');
+	// Get 'userId' parameter
+	const [followerId, followerIdErr] = $.type(ID).get(params.userId);
+	if (followerIdErr) return rej('invalid userId param');
 
 	// Fetch follower
 	const follower = await User.findOne({
diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts
index 1285c21ea8..b69eb5acb0 100644
--- a/src/services/following/requests/create.ts
+++ b/src/services/following/requests/create.ts
@@ -33,10 +33,10 @@ export default async function(follower: IUser, followee: IUser) {
 
 	// Publish reciveRequest event
 	if (isLocalUser(followee)) {
-		packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)),
+		packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)),
 
 		// 通知を作成
-		notify(followee._id, follower._id, 'reciveRequest');
+		notify(followee._id, follower._id, 'reciveFollowRequest');
 	}
 
 	if (isLocalUser(follower) && isRemoteUser(followee)) {

From 0128831649cb3f434b837c6cf3f19f5cdc65c978 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 13:11:28 +0900
Subject: [PATCH 114/369] wip

---
 .../views/components/follow-button.vue        | 76 +++++++++----------
 .../mobile/views/components/follow-button.vue | 22 ++++--
 2 files changed, 52 insertions(+), 46 deletions(-)

diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue
index dae7604957..c7549c374e 100644
--- a/src/client/app/desktop/views/components/follow-button.vue
+++ b/src/client/app/desktop/views/components/follow-button.vue
@@ -1,19 +1,16 @@
 <template>
 <button class="mk-follow-button"
-	:class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }"
+	:class="{ wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou, big: size == 'big' }"
 	@click="onClick"
 	:disabled="wait"
-	:title="user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%'"
 >
-	<template v-if="!wait && user.isFollowing">
-		<template v-if="size == 'compact'">%fa:minus%</template>
-		<template v-if="size == 'big'">%fa:minus%%i18n:@unfollow%</template>
+	<template v-if="!wait">
+		<template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template>
+		<template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@unfollow%</template></template>
+		<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template>
+		<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template>
 	</template>
-	<template v-if="!wait && !user.isFollowing">
-		<template v-if="size == 'compact'">%fa:plus%</template>
-		<template v-if="size == 'big'">%fa:plus%%i18n:@follow%</template>
-	</template>
-	<template v-if="wait">%fa:spinner .pulse .fw%</template>
+	<template v-else>%fa:spinner .pulse .fw%</template>
 </button>
 </template>
 
@@ -34,6 +31,7 @@ export default Vue.extend({
 
 	data() {
 		return {
+			u: this.user,
 			wait: false,
 			connection: null,
 			connectionId: null
@@ -56,39 +54,44 @@ export default Vue.extend({
 
 	methods: {
 		onFollow(user) {
-			if (user.id == this.user.id) {
+			if (user.id == this.u.id) {
 				this.user.isFollowing = user.isFollowing;
 			}
 		},
 
 		onUnfollow(user) {
-			if (user.id == this.user.id) {
+			if (user.id == this.u.id) {
 				this.user.isFollowing = user.isFollowing;
 			}
 		},
 
-		onClick() {
+		async onClick() {
 			this.wait = true;
-			if (this.user.isFollowing) {
-				(this as any).api('following/delete', {
-					userId: this.user.id
-				}).then(() => {
-					this.user.isFollowing = false;
-				}).catch(err => {
-					console.error(err);
-				}).then(() => {
-					this.wait = false;
-				});
-			} else {
-				(this as any).api('following/create', {
-					userId: this.user.id
-				}).then(() => {
-					this.user.isFollowing = true;
-				}).catch(err => {
-					console.error(err);
-				}).then(() => {
-					this.wait = false;
-				});
+
+			try {
+				if (this.u.isFollowing) {
+					this.u = await (this as any).api('following/delete', {
+						userId: this.u.id
+					});
+				} else {
+					if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
+						this.u = await (this as any).api('following/requests/cancel', {
+							userId: this.u.id
+						});
+					} else if (this.u.isLocked) {
+						this.u = await (this as any).api('following/create', {
+							userId: this.u.id
+						});
+					} else {
+						this.u = await (this as any).api('following/create', {
+							userId: this.user.id
+						});
+					}
+				}
+			} catch (e) {
+				console.error(e);
+			} finally {
+				this.wait = false;
 			}
 		}
 	}
@@ -124,7 +127,7 @@ root(isDark)
 			border 2px solid rgba($theme-color, 0.3)
 			border-radius 8px
 
-	&.follow
+	&:not(.active)
 		color isDark ? #fff : #888
 		background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
 		border solid 1px isDark ? #1c2023 : #e2e2e2
@@ -137,7 +140,7 @@ root(isDark)
 			background isDark ? #22262f : #ececec
 			border-color isDark ? #151a1d : #dcdcdc
 
-	&.unfollow
+	&.active
 		color $theme-color-foreground
 		background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%)
 		border solid 1px lighten($theme-color, 15%)
@@ -162,9 +165,6 @@ root(isDark)
 		height 38px
 		line-height 38px
 
-		i
-			margin-right 8px
-
 .mk-follow-button[data-darkmode]
 	root(true)
 
diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue
index a247db95f6..d8441a20b9 100644
--- a/src/client/app/mobile/views/components/follow-button.vue
+++ b/src/client/app/mobile/views/components/follow-button.vue
@@ -1,6 +1,6 @@
 <template>
 <button class="mk-follow-button"
-	:class="{ wait: wait, following: u.isFollowing }"
+	:class="{ wait: wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou }"
 	@click="onClick"
 	:disabled="wait"
 >
@@ -99,6 +99,7 @@ export default Vue.extend({
 	cursor pointer
 	padding 0 16px
 	margin 0
+	min-width 150px
 	line-height 36px
 	font-size 14px
 	color $theme-color
@@ -107,24 +108,29 @@ export default Vue.extend({
 	border solid 1px $theme-color
 	border-radius 36px
 
-	*
-		pointer-events none
+	&:hover
+		background rgba($theme-color, 0.1)
 
-	&.following
+	&:active
+		background rgba($theme-color, 0.2)
+
+	&.active
 		color $theme-color-foreground
 		background $theme-color
 
 		&:hover
-			background rgba($theme-color, 0.1)
+			background lighten($theme-color, 10%)
+			border-color lighten($theme-color, 10%)
 
 		&:active
-			background rgba($theme-color, 0.2)
+			background darken($theme-color, 10%)
+			border-color darken($theme-color, 10%)
 
 	&.wait
 		cursor wait !important
 		opacity 0.7
 
-	> [data-fa]
-		margin-right 4px
+	*
+		pointer-events none
 
 </style>

From 68404967915deb73b3deca217dba5df420eeaa20 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 13:14:54 +0900
Subject: [PATCH 115/369] wip

---
 locales/ja.yml | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 400b79ab69..fad0c89113 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -331,8 +331,10 @@ desktop/views/components/drive.vue:
     url-upload: "URLからアップロード"
 
 desktop/views/components/follow-button.vue:
-  unfollow: "フォロー解除"
-  follow: "フォローする"
+  unfollow: "フォロー中"
+  follow: "フォロー"
+  request-pending: "フォロー許可待ち"
+  follow-request: "フォロー申請"
 
 desktop/views/components/followers-window.vue:
   followers: "{} のフォロワー"
@@ -771,8 +773,10 @@ mobile/views/components/drive.file-detail.vue:
   exif: "EXIF"
 
 mobile/views/components/follow-button.vue:
+  unfollow: "フォロー中"
   follow: "フォロー"
-  unfollow: "フォロー解除"
+  request-pending: "フォロー許可待ち"
+  follow-request: "フォロー申請"
 
 mobile/views/components/friends-maker.vue:
   title: "気になるユーザーをフォロー"

From 5ca8a0d88642f6d64b2a23891e02e07edabe112e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 13:34:53 +0900
Subject: [PATCH 116/369] wip

---
 locales/ja.yml                                |  7 +++
 .../components/follow-requests-window.vue     | 54 +++++++++++++++++++
 .../views/components/ui.header.account.vue    | 17 ++++++
 .../views/components/user-lists-window.vue    |  2 +-
 src/models/follow-request.ts                  |  4 +-
 5 files changed, 81 insertions(+), 3 deletions(-)
 create mode 100644 src/client/app/desktop/views/components/follow-requests-window.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index fad0c89113..75ff13afef 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -598,6 +598,7 @@ desktop/views/components/ui.header.account.vue:
   drive: "ドライブ"
   favorites: "お気に入り"
   lists: "リスト"
+  follow-requests: "フォロー申請"
   customize: "カスタマイズ"
   settings: "設定"
   signout: "サインアウト"
@@ -617,7 +618,13 @@ desktop/views/components/ui.header.post.vue:
 desktop/views/components/ui.header.search.vue:
   placeholder: "検索"
 
+desktop/views/components/follow-requests-window.vue:
+  title: "フォロー申請"
+  accept: "許可"
+  reject: "拒否"
+
 desktop/views/components/user-lists-window.vue:
+  title: "リスト"
   create-list: "リストを作成"
 
 desktop/views/components/user-preview.vue:
diff --git a/src/client/app/desktop/views/components/follow-requests-window.vue b/src/client/app/desktop/views/components/follow-requests-window.vue
new file mode 100644
index 0000000000..c864f1f9cd
--- /dev/null
+++ b/src/client/app/desktop/views/components/follow-requests-window.vue
@@ -0,0 +1,54 @@
+<template>
+<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
+	<span slot="header">%fa:envelope R% %i18n:@title%</span>
+
+	<div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode">
+		<router-link v-for="req in requests" :key="req.id" :to="req.followee | userPage">{{ req.followee | userName }}</router-link>
+	</div>
+</mk-window>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			requests: []
+		};
+	},
+	mounted() {
+		(this as any).api('following/requests/list').then(requests => {
+			this.fetching = false;
+			this.requests = requests;
+		});
+	},
+	methods: {
+		close() {
+			(this as any).$refs.window.close();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+
+root(isDark)
+	padding 16px
+
+	> button
+		margin-bottom 16px
+
+	> a
+		display block
+		padding 16px
+		border solid 1px isDark ? #1c2023 : #eee
+		border-radius 4px
+
+[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode]
+	root(true)
+
+[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"]:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue
index 8d26691f84..d110d700a0 100644
--- a/src/client/app/desktop/views/components/ui.header.account.vue
+++ b/src/client/app/desktop/views/components/ui.header.account.vue
@@ -19,6 +19,9 @@
 				<li @click="list">
 					<p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p>
 				</li>
+				<li @click="followRequests" v-if="$store.state.i.isLocked">
+					<p>%fa:envelope R%<span>%i18n:@follow-requests%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></span>%fa:angle-right%</p>
+				</li>
 			</ul>
 			<ul>
 				<li>
@@ -46,6 +49,7 @@
 <script lang="ts">
 import Vue from 'vue';
 import MkUserListsWindow from './user-lists-window.vue';
+import MkFollowRequestsWindow from './follow-requests-window.vue';
 import MkSettingsWindow from './settings-window.vue';
 import MkDriveWindow from './drive-window.vue';
 import contains from '../../../common/scripts/contains';
@@ -91,6 +95,10 @@ export default Vue.extend({
 				this.$router.push(`i/lists/${ list.id }`);
 			});
 		},
+		followRequests() {
+			this.close();
+			(this as any).os.new(MkFollowRequestsWindow);
+		},
 		settings() {
 			this.close();
 			(this as any).os.new(MkSettingsWindow);
@@ -225,6 +233,15 @@ root(isDark)
 					> span:first-child
 						padding-left 22px
 
+					> span:nth-child(2)
+						> i
+							margin-left 4px
+							padding 2px 8px
+							font-size 90%
+							background $theme-color
+							color $theme-color-foreground
+							border-radius 8px
+
 					> [data-fa]:first-child
 						margin-right 6px
 						width 16px
diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue
index 454c725d20..109d1695d8 100644
--- a/src/client/app/desktop/views/components/user-lists-window.vue
+++ b/src/client/app/desktop/views/components/user-lists-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
-	<span slot="header">%fa:list% リスト</span>
+	<span slot="header">%fa:list% %i18n:@title%</span>
 
 	<div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode">
 		<button class="ui" @click="add">%i18n:@create-list%</button>
diff --git a/src/models/follow-request.ts b/src/models/follow-request.ts
index 0cdb8b4f47..eea5d1c535 100644
--- a/src/models/follow-request.ts
+++ b/src/models/follow-request.ts
@@ -78,10 +78,10 @@ export const pack = (
 	delete _request._id;
 
 	// Populate follower
-	_request.followerId = await packUser(_request.followerId, me);
+	_request.follower = await packUser(_request.followerId, me);
 
 	// Populate followee
-	_request.followeeId = await packUser(_request.followeeId, me);
+	_request.followee = await packUser(_request.followeeId, me);
 
 	resolve(_request);
 });

From a6a4bb6599b186565afe58a76c78048f658fa358 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 13:36:29 +0900
Subject: [PATCH 117/369] wip

---
 src/models/notification.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/models/notification.ts b/src/models/notification.ts
index c4cf1e4efd..a17a892541 100644
--- a/src/models/notification.ts
+++ b/src/models/notification.ts
@@ -111,6 +111,7 @@ export const pack = (notification: any) => new Promise<any>(async (resolve, reje
 
 	switch (_notification.type) {
 		case 'follow':
+		case 'reciveFollowRequest':
 			// nope
 			break;
 		case 'mention':

From 9e8cfd76c849a236d3e1b5f8ae9b05aa9364ef99 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 13:40:28 +0900
Subject: [PATCH 118/369] wip

---
 src/client/app/common/scripts/streaming/home.ts | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts
index 50bbb56896..c5189ddc7a 100644
--- a/src/client/app/common/scripts/streaming/home.ts
+++ b/src/client/app/common/scripts/streaming/home.ts
@@ -28,6 +28,12 @@ export class HomeStream extends Stream {
 			os.store.dispatch('mergeMe', i);
 		});
 
+		this.on('reciveFollowRequest', () => {
+			os.store.dispatch('mergeMe', {
+				pendingReceivedFollowRequestsCount: (os.store.state.i.pendingReceivedFollowRequestsCount || 0) + 1
+			});
+		});
+
 		this.on('read_all_notifications', () => {
 			os.store.dispatch('mergeMe', {
 				hasUnreadNotification: false

From 8dfd892b71be7e594b6f192d8ceee71ab02d3f3f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 15:51:43 +0900
Subject: [PATCH 119/369] wip

---
 .../components/follow-requests-window.vue     | 24 ++++++++++++++++---
 .../views/components/ui.header.account.vue    |  1 +
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/client/app/desktop/views/components/follow-requests-window.vue b/src/client/app/desktop/views/components/follow-requests-window.vue
index c864f1f9cd..fd37c0a6aa 100644
--- a/src/client/app/desktop/views/components/follow-requests-window.vue
+++ b/src/client/app/desktop/views/components/follow-requests-window.vue
@@ -3,7 +3,12 @@
 	<span slot="header">%fa:envelope R% %i18n:@title%</span>
 
 	<div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode">
-		<router-link v-for="req in requests" :key="req.id" :to="req.followee | userPage">{{ req.followee | userName }}</router-link>
+		<div v-for="req in requests">
+			<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
+			<span>
+				<a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a>
+			</span>
+		</div>
 	</div>
 </mk-window>
 </template>
@@ -24,6 +29,16 @@ export default Vue.extend({
 		});
 	},
 	methods: {
+		accept(user) {
+			(this as any).api('following/requests/accept', { userId: user.id }).then(() => {
+				this.requests = this.requests.filter(r => r.follower.id != user.id);
+			});
+		},
+		reject(user) {
+			(this as any).api('following/requests/reject', { userId: user.id }).then(() => {
+				this.requests = this.requests.filter(r => r.follower.id != user.id);
+			});
+		},
 		close() {
 			(this as any).$refs.window.close();
 		}
@@ -39,12 +54,15 @@ root(isDark)
 	> button
 		margin-bottom 16px
 
-	> a
-		display block
+	> div
+		display flex
 		padding 16px
 		border solid 1px isDark ? #1c2023 : #eee
 		border-radius 4px
 
+		> span
+			margin 0 0 0 auto
+
 [data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode]
 	root(true)
 
diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue
index d110d700a0..8c2da6596a 100644
--- a/src/client/app/desktop/views/components/ui.header.account.vue
+++ b/src/client/app/desktop/views/components/ui.header.account.vue
@@ -238,6 +238,7 @@ root(isDark)
 							margin-left 4px
 							padding 2px 8px
 							font-size 90%
+							font-style normal
 							background $theme-color
 							color $theme-color-foreground
 							border-radius 8px

From 4feff8835cfa80529c14fcbb7a138eeb0a951650 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 16:01:32 +0900
Subject: [PATCH 120/369] wip

---
 src/client/app/common/scripts/streaming/home.ts |  8 +-------
 src/server/api/endpoints/i/update.ts            |  2 +-
 src/server/api/service/twitter.ts               |  4 ++--
 src/services/following/requests/accept.ts       | 14 ++++++++++----
 src/services/following/requests/cancel.ts       |  9 +++++++--
 src/services/following/requests/create.ts       |  8 ++++++--
 6 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts
index c5189ddc7a..f07d0289f6 100644
--- a/src/client/app/common/scripts/streaming/home.ts
+++ b/src/client/app/common/scripts/streaming/home.ts
@@ -20,7 +20,7 @@ export class HomeStream extends Stream {
 		}, 1000 * 60);
 
 		// 自分の情報が更新されたとき
-		this.on('i_updated', i => {
+		this.on('meUpdated', i => {
 			if (os.debug) {
 				console.log('I updated:', i);
 			}
@@ -28,12 +28,6 @@ export class HomeStream extends Stream {
 			os.store.dispatch('mergeMe', i);
 		});
 
-		this.on('reciveFollowRequest', () => {
-			os.store.dispatch('mergeMe', {
-				pendingReceivedFollowRequestsCount: (os.store.state.i.pendingReceivedFollowRequestsCount || 0) + 1
-			});
-		});
-
 		this.on('read_all_notifications', () => {
 			os.store.dispatch('mergeMe', {
 				hasUnreadNotification: false
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 8ee3c84861..5aff6da103 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -99,7 +99,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 	res(iObj);
 
 	// Publish i updated event
-	event(user._id, 'i_updated', iObj);
+	event(user._id, 'meUpdated', iObj);
 
 	// 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認
 	if (user.isLocked && isLocked === false) {
diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts
index 284ae7ee22..8c35509cce 100644
--- a/src/server/api/service/twitter.ts
+++ b/src/server/api/service/twitter.ts
@@ -49,7 +49,7 @@ router.get('/disconnect/twitter', async ctx => {
 	ctx.body = `Twitterの連携を解除しました :v:`;
 
 	// Publish i updated event
-	event(user._id, 'i_updated', await pack(user, user, {
+	event(user._id, 'meUpdated', await pack(user, user, {
 		detail: true,
 		includeSecrets: true
 	}));
@@ -174,7 +174,7 @@ if (config.twitter == null) {
 			ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`;
 
 			// Publish i updated event
-			event(user._id, 'i_updated', await pack(user, user, {
+			event(user._id, 'meUpdated', await pack(user, user, {
 				detail: true,
 				includeSecrets: true
 			}));
diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts
index 2dff9b01fe..1b89cdb981 100644
--- a/src/services/following/requests/accept.ts
+++ b/src/services/following/requests/accept.ts
@@ -1,4 +1,4 @@
-import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user";
+import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user";
 import FollowRequest from "../../../models/follow-request";
 import pack from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
@@ -7,6 +7,7 @@ import { deliver } from '../../../queue';
 import Following from "../../../models/following";
 import FollowingLog from "../../../models/following-log";
 import FollowedLog from "../../../models/followed-log";
+import event from '../../../publishers/stream';
 
 export default async function(followee: IUser, follower: IUser) {
 	const following = await Following.insert({
@@ -30,13 +31,13 @@ export default async function(followee: IUser, follower: IUser) {
 		deliver(followee as ILocalUser, content, follower.inbox);
 	}
 
-	FollowRequest.remove({
+	await FollowRequest.remove({
 		followeeId: followee._id,
 		followerId: follower._id
 	});
 
 	//#region Increment following count
-	User.update({ _id: follower._id }, {
+	await User.update({ _id: follower._id }, {
 		$inc: {
 			followingCount: 1
 		}
@@ -50,15 +51,20 @@ export default async function(followee: IUser, follower: IUser) {
 	//#endregion
 
 	//#region Increment followers count
-	User.update({ _id: followee._id }, {
+	await User.update({ _id: followee._id }, {
 		$inc: {
 			followersCount: 1
 		}
 	});
+
 	FollowedLog.insert({
 		createdAt: following.createdAt,
 		userId: followee._id,
 		count: followee.followersCount + 1
 	});
 	//#endregion
+
+	packUser(followee, followee, {
+		detail: true
+	}).then(packed => event(followee._id, 'meUpdated', packed));
 }
diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts
index 840f70264c..50c95de0eb 100644
--- a/src/services/following/requests/cancel.ts
+++ b/src/services/following/requests/cancel.ts
@@ -1,9 +1,10 @@
-import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user";
+import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user";
 import FollowRequest from "../../../models/follow-request";
 import pack from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderUndo from '../../../remote/activitypub/renderer/undo';
 import { deliver } from '../../../queue';
+import event from '../../../publishers/stream';
 
 export default async function(followee: IUser, follower: IUser) {
 	if (isRemoteUser(followee)) {
@@ -16,9 +17,13 @@ export default async function(followee: IUser, follower: IUser) {
 		followerId: follower._id
 	});
 
-	User.update({ _id: followee._id }, {
+	await User.update({ _id: followee._id }, {
 		$inc: {
 			pendingReceivedFollowRequestsCount: -1
 		}
 	});
+
+	packUser(followee, followee, {
+		detail: true
+	}).then(packed => event(followee._id, 'meUpdated', packed));
 }
diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts
index b69eb5acb0..836d85090d 100644
--- a/src/services/following/requests/create.ts
+++ b/src/services/following/requests/create.ts
@@ -25,7 +25,7 @@ export default async function(follower: IUser, followee: IUser) {
 		}
 	});
 
-	User.update({ _id: followee._id }, {
+	await User.update({ _id: followee._id }, {
 		$inc: {
 			pendingReceivedFollowRequestsCount: 1
 		}
@@ -33,7 +33,11 @@ export default async function(follower: IUser, followee: IUser) {
 
 	// Publish reciveRequest event
 	if (isLocalUser(followee)) {
-		packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)),
+		packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed));
+
+		packUser(followee, followee, {
+			detail: true
+		}).then(packed => event(followee._id, 'meUpdated', packed));
 
 		// 通知を作成
 		notify(followee._id, follower._id, 'reciveFollowRequest');

From 897f7a031d624d8ca37b8efcab573d002c80dbe8 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 16:13:32 +0900
Subject: [PATCH 121/369] wip

---
 locales/ja.yml                                | 10 ++-
 .../views/components/notifications.vue        |  4 +-
 ...ue => received-follow-requests-window.vue} |  0
 .../views/components/ui.header.account.vue    |  2 +-
 src/client/app/mobile/script.ts               |  2 +
 .../views/components/notification-preview.vue |  4 +-
 .../mobile/views/components/notification.vue  |  4 +-
 .../app/mobile/views/components/ui.nav.vue    |  1 +
 .../views/pages/received-follow-requests.vue  | 78 +++++++++++++++++++
 src/models/notification.ts                    |  2 +-
 src/services/following/requests/create.ts     |  6 +-
 11 files changed, 100 insertions(+), 13 deletions(-)
 rename src/client/app/desktop/views/components/{follow-requests-window.vue => received-follow-requests-window.vue} (100%)
 create mode 100644 src/client/app/mobile/views/pages/received-follow-requests.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index 75ff13afef..959865ce0d 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -618,9 +618,9 @@ desktop/views/components/ui.header.post.vue:
 desktop/views/components/ui.header.search.vue:
   placeholder: "検索"
 
-desktop/views/components/follow-requests-window.vue:
+desktop/views/components/received-follow-requests-window.vue:
   title: "フォロー申請"
-  accept: "許可"
+  accept: "承認"
   reject: "拒否"
 
 desktop/views/components/user-lists-window.vue:
@@ -852,6 +852,7 @@ mobile/views/components/ui.nav.vue:
   timeline: "タイムライン"
   notifications: "通知"
   messaging: "メッセージ"
+  follow-requests: "フォロー申請"
   search: "検索"
   drive: "ドライブ"
   favorites: "お気に入り"
@@ -900,6 +901,11 @@ mobile/views/pages/messaging.vue:
 mobile/views/pages/messaging-room.vue:
   messaging: "メッセージ"
 
+mobile/views/pages/received-follow-requests.vue:
+  title: "フォロー申請"
+  accept: "承認"
+  reject: "拒否"
+
 mobile/views/pages/note.vue:
   title: "投稿"
   prev: "前の投稿"
diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue
index 368655095f..f2247a782c 100644
--- a/src/client/app/desktop/views/components/notifications.vue
+++ b/src/client/app/desktop/views/components/notifications.vue
@@ -50,7 +50,7 @@
 						</div>
 					</template>
 
-					<template v-if="notification.type == 'reciveFollowRequest'">
+					<template v-if="notification.type == 'receiveFollowRequest'">
 						<mk-avatar class="avatar" :user="notification.user"/>
 						<div class="text">
 							<p>%fa:user-clock%
@@ -268,7 +268,7 @@ root(isDark)
 					.text p i
 						color #53c7ce
 
-				&.reciveFollowRequest
+				&.receiveFollowRequest
 					.text p i
 						color #888
 
diff --git a/src/client/app/desktop/views/components/follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue
similarity index 100%
rename from src/client/app/desktop/views/components/follow-requests-window.vue
rename to src/client/app/desktop/views/components/received-follow-requests-window.vue
diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue
index 8c2da6596a..4e0fc1cf1a 100644
--- a/src/client/app/desktop/views/components/ui.header.account.vue
+++ b/src/client/app/desktop/views/components/ui.header.account.vue
@@ -49,7 +49,7 @@
 <script lang="ts">
 import Vue from 'vue';
 import MkUserListsWindow from './user-lists-window.vue';
-import MkFollowRequestsWindow from './follow-requests-window.vue';
+import MkFollowRequestsWindow from './received-follow-requests-window.vue';
 import MkSettingsWindow from './settings-window.vue';
 import MkDriveWindow from './drive-window.vue';
 import contains from '../../../common/scripts/contains';
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index 607ff63711..300615ec58 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -32,6 +32,7 @@ import MkNotifications from './views/pages/notifications.vue';
 import MkWidgets from './views/pages/widgets.vue';
 import MkMessaging from './views/pages/messaging.vue';
 import MkMessagingRoom from './views/pages/messaging-room.vue';
+import MkReceivedFollowRequests from './views/pages/received-follow-requests.vue';
 import MkNote from './views/pages/note.vue';
 import MkSearch from './views/pages/search.vue';
 import MkFollowers from './views/pages/followers.vue';
@@ -78,6 +79,7 @@ init((launch) => {
 			{ path: '/i/favorites', name: 'favorites', component: MkFavorites },
 			{ path: '/i/lists', name: 'user-lists', component: MkUserLists },
 			{ path: '/i/lists/:list', name: 'user-list', component: MkUserList },
+			{ path: '/i/received-follow-requests', name: 'received-follow-requests', component: MkReceivedFollowRequests },
 			{ path: '/i/widgets', name: 'widgets', component: MkWidgets },
 			{ path: '/i/messaging', name: 'messaging', component: MkMessaging },
 			{ path: '/i/messaging/:user', component: MkMessagingRoom },
diff --git a/src/client/app/mobile/views/components/notification-preview.vue b/src/client/app/mobile/views/components/notification-preview.vue
index 6046f77242..5e2306932b 100644
--- a/src/client/app/mobile/views/components/notification-preview.vue
+++ b/src/client/app/mobile/views/components/notification-preview.vue
@@ -31,7 +31,7 @@
 		</div>
 	</template>
 
-	<template v-if="notification.type == 'reciveFollowRequest'">
+	<template v-if="notification.type == 'receiveFollowRequest'">
 		<mk-avatar class="avatar" :user="notification.user"/>
 		<div class="text">
 			<p>%fa:user-clock%{{ notification.user | userName }}</p>
@@ -125,7 +125,7 @@ export default Vue.extend({
 		.text p i
 			color #53c7ce
 
-	&.reciveFollowRequest
+	&.receiveFollowRequest
 		.text p i
 			color #888
 
diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue
index 8109bef38e..9228950209 100644
--- a/src/client/app/mobile/views/components/notification.vue
+++ b/src/client/app/mobile/views/components/notification.vue
@@ -40,7 +40,7 @@
 		</div>
 	</div>
 
-	<div class="notification followRequest" v-if="notification.type == 'reciveFollowRequest'">
+	<div class="notification followRequest" v-if="notification.type == 'receiveFollowRequest'">
 		<mk-avatar class="avatar" :user="notification.user"/>
 		<div>
 			<header>
@@ -167,7 +167,7 @@ root(isDark)
 			> div > header i
 				color #53c7ce
 
-		&.reciveFollowRequest
+		&.receiveFollowRequest
 			> div > header i
 				color #888
 
diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index 11a8f7ab97..80f60e4232 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -18,6 +18,7 @@
 					<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@timeline%%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
+					<li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
 				</ul>
 				<ul>
diff --git a/src/client/app/mobile/views/pages/received-follow-requests.vue b/src/client/app/mobile/views/pages/received-follow-requests.vue
new file mode 100644
index 0000000000..bf26a84ff9
--- /dev/null
+++ b/src/client/app/mobile/views/pages/received-follow-requests.vue
@@ -0,0 +1,78 @@
+<template>
+<mk-ui>
+	<span slot="header">%fa:envelope R%%i18n:@title%</span>
+
+	<main>
+		<div v-for="req in requests">
+			<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
+			<span>
+				<a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a>
+			</span>
+		</div>
+	</main>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import Progress from '../../../common/scripts/loading';
+
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			requests: []
+		};
+	},
+	mounted() {
+		document.title = 'Misskey | %i18n:@title%';
+
+		Progress.start();
+
+		(this as any).api('following/requests/list').then(requests => {
+			this.fetching = false;
+			this.requests = requests;
+
+			Progress.done();
+		});
+	},
+	methods: {
+		accept(user) {
+			(this as any).api('following/requests/accept', { userId: user.id }).then(() => {
+				this.requests = this.requests.filter(r => r.follower.id != user.id);
+			});
+		},
+		reject(user) {
+			(this as any).api('following/requests/reject', { userId: user.id }).then(() => {
+				this.requests = this.requests.filter(r => r.follower.id != user.id);
+			});
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+main
+	width 100%
+	max-width 680px
+	margin 0 auto
+	padding 8px
+
+	@media (min-width 500px)
+		padding 16px
+
+	@media (min-width 600px)
+		padding 32px
+
+	> div
+		display flex
+		padding 16px
+		border solid 1px isDark ? #1c2023 : #eee
+		border-radius 4px
+
+		> span
+			margin 0 0 0 auto
+
+</style>
diff --git a/src/models/notification.ts b/src/models/notification.ts
index a17a892541..875c6952b5 100644
--- a/src/models/notification.ts
+++ b/src/models/notification.ts
@@ -111,7 +111,7 @@ export const pack = (notification: any) => new Promise<any>(async (resolve, reje
 
 	switch (_notification.type) {
 		case 'follow':
-		case 'reciveFollowRequest':
+		case 'receiveFollowRequest':
 			// nope
 			break;
 		case 'mention':
diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts
index 836d85090d..fea82b57d8 100644
--- a/src/services/following/requests/create.ts
+++ b/src/services/following/requests/create.ts
@@ -31,16 +31,16 @@ export default async function(follower: IUser, followee: IUser) {
 		}
 	});
 
-	// Publish reciveRequest event
+	// Publish receiveRequest event
 	if (isLocalUser(followee)) {
-		packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed));
+		packUser(follower, followee).then(packed => event(followee._id, 'receiveFollowRequest', packed));
 
 		packUser(followee, followee, {
 			detail: true
 		}).then(packed => event(followee._id, 'meUpdated', packed));
 
 		// 通知を作成
-		notify(followee._id, follower._id, 'reciveFollowRequest');
+		notify(followee._id, follower._id, 'receiveFollowRequest');
 	}
 
 	if (isLocalUser(follower) && isRemoteUser(followee)) {

From 60a7f7f1463135939440dce7f5fd03467d3e2183 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 16:27:24 +0900
Subject: [PATCH 122/369] wip

---
 src/server/api/endpoints/i/update.ts | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 5aff6da103..b94f073d2c 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -28,22 +28,22 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 	// Get 'location' parameter
 	const [location, locationErr] = $.str.optional().nullable().pipe(isValidLocation).get(params.location);
 	if (locationErr) return rej('invalid location param');
-	if (location !== undefined) updates.profile.location = location;
+	if (location !== undefined) updates['profile.location'] = location;
 
 	// Get 'birthday' parameter
 	const [birthday, birthdayErr] = $.str.optional().nullable().pipe(isValidBirthday).get(params.birthday);
 	if (birthdayErr) return rej('invalid birthday param');
-	if (birthday !== undefined) updates.profile.birthday = birthday;
+	if (birthday !== undefined) updates['profile.birthday'] = birthday;
 
 	// Get 'avatarId' parameter
-	const [avatarId, avatarIdErr] = $.type(ID).optional().get(params.avatarId);
+	const [avatarId, avatarIdErr] = $.type(ID).optional().nullable().get(params.avatarId);
 	if (avatarIdErr) return rej('invalid avatarId param');
-	if (avatarId) updates.avatarId = avatarId;
+	if (avatarId !== undefined) updates.avatarId = avatarId;
 
 	// Get 'bannerId' parameter
-	const [bannerId, bannerIdErr] = $.type(ID).optional().get(params.bannerId);
+	const [bannerId, bannerIdErr] = $.type(ID).optional().nullable().get(params.bannerId);
 	if (bannerIdErr) return rej('invalid bannerId param');
-	if (bannerId) updates.bannerId = bannerId;
+	if (bannerId !== undefined) updates.bannerId = bannerId;
 
 	// Get 'isLocked' parameter
 	const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked);
@@ -63,7 +63,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 	// Get 'autoWatch' parameter
 	const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch);
 	if (autoWatchErr) return rej('invalid autoWatch param');
-	if (autoWatch != null) updates.settings.autoWatch = autoWatch;
+	if (autoWatch != null) updates['settings.autoWatch'] = autoWatch;
 
 	if (avatarId) {
 		const avatar = await DriveFile.findOne({
@@ -90,7 +90,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 	});
 
 	// Serialize
-	const iObj = await pack(user, user, {
+	const iObj = await pack(user._id, user, {
 		detail: true,
 		includeSecrets: isSecure
 	});
@@ -98,7 +98,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 	// Send response
 	res(iObj);
 
-	// Publish i updated event
+	// Publish meUpdated event
 	event(user._id, 'meUpdated', iObj);
 
 	// 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認

From 534e43f72d5f261dfd4bb250f671de7651a919c2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 19:19:58 +0900
Subject: [PATCH 123/369] Fix bug

---
 .../mobile/views/components/notification.vue    | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue
index 9228950209..bbcae05f10 100644
--- a/src/client/app/mobile/views/components/notification.vue
+++ b/src/client/app/mobile/views/components/notification.vue
@@ -66,15 +66,15 @@
 	</div>
 
 	<template v-if="notification.type == 'quote'">
-		<mk-note :note="notification.note"/>
+		<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
 	</template>
 
 	<template v-if="notification.type == 'reply'">
-		<mk-note :note="notification.note"/>
+		<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
 	</template>
 
 	<template v-if="notification.type == 'mention'">
-		<mk-note :note="notification.note"/>
+		<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
 	</template>
 </div>
 </template>
@@ -89,6 +89,17 @@ export default Vue.extend({
 		return {
 			getNoteSummary
 		};
+	},
+	methods: {
+		onNoteUpdated(note) {
+			switch (this.notification.type) {
+				case 'quote':
+				case 'reply':
+				case 'mention':
+					Vue.set(this.notification, 'note', note);
+					break;
+			}
+		}
 	}
 });
 </script>

From 0aa9201770351fca74f84b57202cc90cbb95b847 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 2 Jun 2018 19:23:17 +0900
Subject: [PATCH 124/369] 2.25.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index f28a0645af..3dd2648643 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.24.3",
-	"clientVersion": "1.0.6055",
+	"version": "2.25.0",
+	"clientVersion": "1.0.6111",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 255c07d1ab3996a52dab4e32a16861f11f923267 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 3 Jun 2018 04:51:58 +0900
Subject: [PATCH 125/369] 2.25.1

---
 package.json                                           | 4 ++--
 src/client/app/auth/views/index.vue                    | 3 ++-
 src/client/app/desktop/views/components/notes.note.vue | 6 +++---
 src/client/app/mobile/views/components/note.vue        | 4 ++--
 4 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/package.json b/package.json
index 3dd2648643..ad1398525f 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.25.0",
-	"clientVersion": "1.0.6111",
+	"version": "2.25.1",
+	"clientVersion": "1.0.6112",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,
diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue
index 826bcd125d..b9c7cf7c2b 100644
--- a/src/client/app/auth/views/index.vue
+++ b/src/client/app/auth/views/index.vue
@@ -3,6 +3,7 @@
 	<main v-if="$store.getters.isSignedIn">
 		<p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p>
 		<x-form
+			class="form"
 			ref="form"
 			v-if="state == 'waiting'"
 			:session="session"
@@ -102,7 +103,7 @@ export default Vue.extend({
 			padding 32px
 			color #555
 
-		> div
+		> div:not(.form)
 			padding 64px
 
 			> h1
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index 5f4b0532a8..ca67373c23 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -463,7 +463,7 @@ root(isDark)
 					> .app
 						margin-right 8px
 						padding-right 8px
-						border-right solid 1px #eaeaea
+						border-right solid 1px isDark ? #1c2023 : #eaeaea
 
 					> .visibility
 						margin-left 8px
@@ -552,7 +552,7 @@ root(isDark)
 							padding 2px 8px 2px 16px
 							font-size 90%
 							color #8d969e
-							background #edf0f3
+							background isDark ? #313543 : #edf0f3
 							border-radius 4px
 
 							&:before
@@ -565,7 +565,7 @@ root(isDark)
 								width 8px
 								height 8px
 								margin auto 0
-								background #fff
+								background isDark ? #282c37 : #fff
 								border-radius 100%
 
 							&:hover
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 34326e12f3..37d86fe235 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -502,7 +502,7 @@ root(isDark)
 							padding 2px 8px 2px 16px
 							font-size 90%
 							color #8d969e
-							background #edf0f3
+							background isDark ? #313543 : #edf0f3
 							border-radius 4px
 
 							&:before
@@ -515,7 +515,7 @@ root(isDark)
 								width 8px
 								height 8px
 								margin auto 0
-								background #fff
+								background isDark ? #282c37 : #fff
 								border-radius 100%
 
 					> .media

From 70ac07d60e14046c89f7dd7d7d9c80d3b9fddd27 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 3 Jun 2018 07:34:34 +0900
Subject: [PATCH 126/369] :art:

---
 src/client/app/auth/assets/icon.svg | 1 +
 src/client/app/auth/assets/logo.svg | 7 -------
 src/client/app/auth/views/index.vue | 8 ++++----
 3 files changed, 5 insertions(+), 11 deletions(-)
 create mode 100644 src/client/app/auth/assets/icon.svg
 delete mode 100644 src/client/app/auth/assets/logo.svg

diff --git a/src/client/app/auth/assets/icon.svg b/src/client/app/auth/assets/icon.svg
new file mode 100644
index 0000000000..36f5d3e404
--- /dev/null
+++ b/src/client/app/auth/assets/icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 512 512" width="512" height="512"><defs><clipPath id="_clipPath_P6eAE2OaBltOJ3gHGVajfqsOnfv4xIns"><rect width="512" height="512"/></clipPath></defs><g clip-path="url(#_clipPath_P6eAE2OaBltOJ3gHGVajfqsOnfv4xIns)"><clipPath id="_clipPath_P6q7MZAUp3XpQhVgs2GuAbegX9v4gkom"><rect x="0" y="0" width="512" height="512" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_P6q7MZAUp3XpQhVgs2GuAbegX9v4gkom)"><g id="Group"><g id="g4502"><g id="g5125"><g id="text4489"><path d=" M 190.093 359.243 C 167.923 359.32 148.881 345.963 139.9 330.409 C 135.104 323.615 125.617 321.198 125.482 330.409 L 125.482 372.939 C 125.482 390.026 119.253 404.799 106.794 417.258 C 94.69 429.362 79.917 435.413 62.474 435.413 C 45.387 435.413 30.614 429.362 18.155 417.258 C 6.052 404.799 0 390.026 0 372.939 L 0 139.061 C 0 125.89 3.738 113.965 11.213 103.285 C 19.045 92.25 29.012 84.596 41.116 80.325 C 47.879 77.833 54.999 76.587 62.474 76.587 C 81.697 76.587 97.716 84.062 110.531 99.013 C 117.295 106.489 121.211 110.405 122.279 110.761 C 122.279 110.761 173.043 172.145 174.467 173.213 C 175.891 174.281 180.073 182.446 190.093 182.446 C 200.112 182.446 204.829 174.281 206.253 173.213 C 207.676 172.145 258.44 110.761 258.44 110.761 C 258.796 111.117 262.534 107.201 269.654 99.013 C 282.825 84.062 299.022 76.587 318.245 76.587 C 325.364 76.587 332.484 77.833 339.603 80.325 C 351.707 84.596 361.496 92.25 368.972 103.285 C 376.803 113.965 380.719 125.89 380.719 139.061 L 380.719 372.939 C 380.719 390.026 374.489 404.799 362.03 417.258 C 349.927 429.362 335.154 435.413 317.711 435.413 C 300.624 435.413 285.851 429.362 273.391 417.258 C 261.288 404.799 255.237 390.026 255.237 372.939 L 255.237 330.409 C 254.184 318.802 243.925 326.116 240.285 330.409 C 230.674 348.208 212.262 359.167 190.093 359.243 Z  M 457.535 184.448 Q 435.109 184.448 419.09 168.963 Q 403.605 152.944 403.605 130.518 Q 403.605 108.091 419.09 92.606 Q 435.109 76.587 457.535 76.587 Q 479.962 76.587 495.981 92.606 Q 512 108.091 512 130.518 Q 512 152.944 495.981 168.963 Q 479.962 184.448 457.535 184.448 Z  M 458.069 195.128 Q 480.496 195.128 495.981 211.147 Q 512 227.166 512 249.592 L 512 381.482 Q 512 403.909 495.981 419.928 Q 480.496 435.413 458.069 435.413 Q 435.643 435.413 419.624 419.928 Q 403.605 403.909 403.605 381.482 L 403.605 249.592 Q 403.605 227.166 419.624 211.147 Q 435.643 195.128 458.069 195.128 Z " fill-rule="evenodd" fill="rgb(157,157,157)"/></g></g></g></g></g></g></svg>
\ No newline at end of file
diff --git a/src/client/app/auth/assets/logo.svg b/src/client/app/auth/assets/logo.svg
deleted file mode 100644
index 19b8a2737e..0000000000
--- a/src/client/app/auth/assets/logo.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
-	 y="0px" width="1024px" height="512px" viewBox="0 256 1024 512" enable-background="new 0 256 1024 512" xml:space="preserve">
-<polyline opacity="0.5" fill="none" stroke="#000000" stroke-width="34" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
-	896.5,608.5 800.5,416.5 704.5,608.5 608.5,416.5 512.5,608.5 416.5,416.5 320.5,608.5 224.5,416.5 128.5,608.5 "/>
-</svg>
diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue
index b9c7cf7c2b..6d0ba3cda3 100644
--- a/src/client/app/auth/views/index.vue
+++ b/src/client/app/auth/views/index.vue
@@ -27,7 +27,7 @@
 		<h1>サインインしてください</h1>
 		<mk-signin/>
 	</main>
-	<footer><img src="/assets/auth/logo.svg" alt="Misskey"/></footer>
+	<footer><img src="/assets/auth/icon.svg" alt="Misskey"/></footer>
 </div>
 </template>
 
@@ -144,8 +144,8 @@ export default Vue.extend({
 	> footer
 		> img
 			display block
-			width 64px
-			height 64px
-			margin 0 auto
+			width 32px
+			height 32px
+			margin 16px auto
 
 </style>

From 5e967e24ff05ff83075c086a5e25d10ea299a3e0 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 3 Jun 2018 19:39:02 +0900
Subject: [PATCH 127/369] :v:

---
 locales/ja.yml                                            | 4 ++--
 src/client/app/desktop/views/components/follow-button.vue | 2 +-
 src/client/app/mobile/views/components/follow-button.vue  | 3 ++-
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 959865ce0d..a62b341f69 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -331,7 +331,7 @@ desktop/views/components/drive.vue:
     url-upload: "URLからアップロード"
 
 desktop/views/components/follow-button.vue:
-  unfollow: "フォロー中"
+  following: "フォロー中"
   follow: "フォロー"
   request-pending: "フォロー許可待ち"
   follow-request: "フォロー申請"
@@ -780,7 +780,7 @@ mobile/views/components/drive.file-detail.vue:
   exif: "EXIF"
 
 mobile/views/components/follow-button.vue:
-  unfollow: "フォロー中"
+  following: "フォロー中"
   follow: "フォロー"
   request-pending: "フォロー許可待ち"
   follow-request: "フォロー申請"
diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue
index c7549c374e..62742a8f39 100644
--- a/src/client/app/desktop/views/components/follow-button.vue
+++ b/src/client/app/desktop/views/components/follow-button.vue
@@ -6,7 +6,7 @@
 >
 	<template v-if="!wait">
 		<template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template>
-		<template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@unfollow%</template></template>
+		<template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@following%</template></template>
 		<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template>
 		<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template>
 	</template>
diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue
index d8441a20b9..b6a52fe1ed 100644
--- a/src/client/app/mobile/views/components/follow-button.vue
+++ b/src/client/app/mobile/views/components/follow-button.vue
@@ -6,7 +6,7 @@
 >
 	<template v-if="!wait">
 		<template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template>
-		<template v-else-if="u.isFollowing">%fa:minus% %i18n:@unfollow%</template>
+		<template v-else-if="u.isFollowing">%fa:minus% %i18n:@following%</template>
 		<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus% %i18n:@follow-request%</template>
 		<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus% %i18n:@follow%</template>
 	</template>
@@ -102,6 +102,7 @@ export default Vue.extend({
 	min-width 150px
 	line-height 36px
 	font-size 14px
+	font-weight bold
 	color $theme-color
 	background transparent
 	outline none

From 761ae807dbc99ebf7b7bee9bad194217c5986c9b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 3 Jun 2018 19:53:57 +0900
Subject: [PATCH 128/369] Fix bug

---
 src/server/api/endpoints/following/create.ts | 2 +-
 src/server/api/endpoints/following/delete.ts | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts
index 48205232e6..b9610658d1 100644
--- a/src/server/api/endpoints/following/create.ts
+++ b/src/server/api/endpoints/following/create.ts
@@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	create(follower, followee);
 
 	// Send response
-	res(await pack(followee, user));
+	res(await pack(followee._id, user));
 });
diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts
index f4030c247a..4fcdaf5a82 100644
--- a/src/server/api/endpoints/following/delete.ts
+++ b/src/server/api/endpoints/following/delete.ts
@@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	deleteFollowing(follower, followee);
 
 	// Send response
-	res(await pack(followee, user));
+	res(await pack(followee._id, user));
 });

From f87981eeee10c9ec4d31080a0edc620bb30f3ddd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 4 Jun 2018 19:59:07 +0900
Subject: [PATCH 129/369] 2.25.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index ad1398525f..2e59e17f4d 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.25.1",
-	"clientVersion": "1.0.6112",
+	"version": "2.25.2",
+	"clientVersion": "1.0.6116",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From a408b19bbeae2899c878626b5d5ba8393c8258ce Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Tue, 5 Jun 2018 15:09:21 +0900
Subject: [PATCH 130/369] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 842c3e8a34..380795c7d1 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ ultimately sophisticated new type of mini-blog based SNS.
 * User lists
 * Private messages
 * Mute
-* Real time contents
+* Streaming
 * ActivityPub compatible
 
 and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).

From 9ce0f96de3ba32e25893f6d248f35badaa522479 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 5 Jun 2018 21:36:21 +0900
Subject: [PATCH 131/369] wip

---
 locales/ja.yml                                |   1 +
 src/client/app/desktop/script.ts              |   2 +
 .../views/components/ui.header.nav.vue        |   6 +
 .../app/desktop/views/components/ui.vue       |   9 +
 .../desktop/views/pages/deck/deck.column.vue  |  59 ++
 .../views/pages/deck/deck.note.sub.vue        | 153 +++++
 .../desktop/views/pages/deck/deck.note.vue    | 539 ++++++++++++++++++
 .../desktop/views/pages/deck/deck.notes.vue   | 248 ++++++++
 .../app/desktop/views/pages/deck/deck.tl.vue  | 143 +++++
 .../app/desktop/views/pages/deck/deck.vue     |  42 ++
 10 files changed, 1202 insertions(+)
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.column.vue
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.note.sub.vue
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.note.vue
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.notes.vue
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.tl.vue
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index a62b341f69..026c2308c3 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -606,6 +606,7 @@ desktop/views/components/ui.header.account.vue:
 
 desktop/views/components/ui.header.nav.vue:
   home: "ホーム"
+  deck: "デッキ"
   messaging: "メッセージ"
   game: "ゲーム"
 
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index 8fb6096afa..61f1f5b870 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -23,6 +23,7 @@ import updateAvatar from './api/update-avatar';
 import updateBanner from './api/update-banner';
 
 import MkIndex from './views/pages/index.vue';
+import MkDeck from './views/pages/deck/deck.vue';
 import MkUser from './views/pages/user/user.vue';
 import MkFavorites from './views/pages/favorites.vue';
 import MkSelectDrive from './views/pages/selectdrive.vue';
@@ -50,6 +51,7 @@ init(async (launch) => {
 		mode: 'history',
 		routes: [
 			{ path: '/', name: 'index', component: MkIndex },
+			{ path: '/deck', name: 'deck', component: MkDeck },
 			{ path: '/i/customize-home', component: MkHomeCustomize },
 			{ path: '/i/favorites', component: MkFavorites },
 			{ path: '/i/messaging/:user', component: MkMessagingRoom },
diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue
index 4780c57cb4..8e792b3df5 100644
--- a/src/client/app/desktop/views/components/ui.header.nav.vue
+++ b/src/client/app/desktop/views/components/ui.header.nav.vue
@@ -8,6 +8,12 @@
 					<p>%i18n:@home%</p>
 				</router-link>
 			</li>
+			<li class="deck" :class="{ active: $route.name == 'deck' }">
+				<router-link to="/deck">
+					%fa:columns%
+					<p>%i18n:@deck%</p>
+				</router-link>
+			</li>
 			<li class="messaging">
 				<a @click="messaging">
 					%fa:comments%
diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue
index 32cc71e4b0..ad6fc69dfa 100644
--- a/src/client/app/desktop/views/components/ui.vue
+++ b/src/client/app/desktop/views/components/ui.vue
@@ -37,7 +37,16 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 .mk-ui
+	display flex
+	flex-direction column
+	flex 1
+
 	> .header
 		@media (max-width 1000px)
 			display none
+
+	> .content
+		display flex
+		flex-direction column
+		flex 1
 </style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
new file mode 100644
index 0000000000..4e06798293
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -0,0 +1,59 @@
+<template>
+<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs">
+	<header>
+		<slot name="header">Timeline</slot>
+	</header>
+	<div ref="body">
+		<x-tl ref="tl"/>
+	</div>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XTl from './deck.tl.vue';
+
+export default Vue.extend({
+	components: {
+		XTl
+	},
+	mounted() {
+		this.$nextTick(() => {
+			this.$refs.tl.mount(this.$refs.body);
+		});
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	flex 1
+	max-width 330px
+	height 100%
+	margin-right 16px
+	background isDark ? #282C37 : #fff
+	border-radius 6px
+	box-shadow 0 2px 16px rgba(#000, 0.1)
+	overflow hidden
+
+	> header
+		z-index 1
+		line-height 48px
+		padding 0 16px
+		color isDark ? #e3e5e8 : #888
+		background isDark ? #313543 : #fff
+		box-shadow 0 1px rgba(#000, 0.15)
+
+	> div
+		height calc(100% - 48px)
+		overflow auto
+
+.dnpfarvgbnfmyzbdquhhzyxcmstpdqzs[data-darkmode]
+	root(true)
+
+.dnpfarvgbnfmyzbdquhhzyxcmstpdqzs:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
new file mode 100644
index 0000000000..b458b74186
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
@@ -0,0 +1,153 @@
+<template>
+<div class="fnlfosztlhtptnongximhlbykxblytcq">
+	<mk-avatar class="avatar" :user="note.user"/>
+	<div class="main">
+		<header>
+			<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
+			<span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span>
+			<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
+			<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
+			<span class="username"><mk-acct :user="note.user"/></span>
+			<div class="info">
+				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
+				<router-link class="created-at" :to="note | notePage">
+					<mk-time :time="note.createdAt"/>
+				</router-link>
+				<span class="visibility" v-if="note.visibility != 'public'">
+					<template v-if="note.visibility == 'home'">%fa:home%</template>
+					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
+					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
+					<template v-if="note.visibility == 'private'">%fa:lock%</template>
+				</span>
+			</div>
+		</header>
+		<div class="body">
+			<mk-sub-note-content class="text" :note="note"/>
+		</div>
+	</div>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+
+export default Vue.extend({
+	props: {
+		note: {
+			type: Object,
+			required: true
+		},
+		// TODO
+		truncate: {
+			type: Boolean,
+			default: true
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+root(isDark)
+	display flex
+	padding 16px
+	font-size 10px
+	background isDark ? #21242d : #fcfcfc
+
+	&.smart
+		> .main
+			width 100%
+
+			> header
+				align-items center
+
+	> .avatar
+		flex-shrink 0
+		display block
+		margin 0 8px 0 0
+		width 38px
+		height 38px
+		border-radius 8px
+
+	> .main
+		flex 1
+		min-width 0
+
+		> header
+			display flex
+			align-items baseline
+			margin-bottom 2px
+			white-space nowrap
+
+			> .avatar
+				flex-shrink 0
+				margin-right 8px
+				width 18px
+				height 18px
+				border-radius 100%
+
+			> .name
+				display block
+				margin 0 0.5em 0 0
+				padding 0
+				overflow hidden
+				color isDark ? #fff : #607073
+				font-size 1em
+				font-weight 700
+				text-align left
+				text-decoration none
+				text-overflow ellipsis
+
+				&:hover
+					text-decoration underline
+
+			> .is-admin
+			> .is-bot
+			> .is-cat
+				align-self center
+				margin 0 0.5em 0 0
+				padding 1px 5px
+				font-size 0.8em
+				color isDark ? #758188 : #aaa
+				border solid 1px isDark ? #57616f : #ddd
+				border-radius 3px
+
+				&.is-admin
+					border-color isDark ? #d42c41 : #f56a7b
+					color isDark ? #d42c41 : #f56a7b
+
+			> .username
+				text-align left
+				margin 0
+				color isDark ? #606984 : #d1d8da
+
+			> .info
+				margin-left auto
+				font-size 0.9em
+
+				> *
+					color isDark ? #606984 : #b2b8bb
+
+				> .mobile
+					margin-right 6px
+
+				> .visibility
+					margin-left 6px
+
+		> .body
+
+			> .text
+				margin 0
+				padding 0
+				color isDark ? #959ba7 : #717171
+
+				pre
+					max-height 120px
+					font-size 80%
+
+.fnlfosztlhtptnongximhlbykxblytcq[data-darkmode]
+	root(true)
+
+.fnlfosztlhtptnongximhlbykxblytcq:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
new file mode 100644
index 0000000000..8582a37b91
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -0,0 +1,539 @@
+<template>
+<div class="zyjjkidcqjnlegkqebitfviomuqmseqk" :class="{ renote: isRenote }">
+	<div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
+		<x-sub :note="p.reply"/>
+	</div>
+	<div class="renote" v-if="isRenote">
+		<mk-avatar class="avatar" :user="note.user"/>
+		%fa:retweet%
+		<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
+		<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
+		<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
+		<mk-time :time="note.createdAt"/>
+	</div>
+	<article>
+		<mk-avatar class="avatar" :user="p.user"/>
+		<div class="main">
+			<header>
+				<router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link>
+				<span class="is-admin" v-if="p.user.isAdmin">admin</span>
+				<span class="is-bot" v-if="p.user.isBot">bot</span>
+				<span class="is-cat" v-if="p.user.isCat">cat</span>
+				<span class="username"><mk-acct :user="p.user"/></span>
+				<div class="info">
+					<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
+					<router-link class="created-at" :to="p | notePage">
+						<mk-time :time="p.createdAt"/>
+					</router-link>
+					<span class="visibility" v-if="p.visibility != 'public'">
+						<template v-if="p.visibility == 'home'">%fa:home%</template>
+						<template v-if="p.visibility == 'followers'">%fa:unlock%</template>
+						<template v-if="p.visibility == 'specified'">%fa:envelope%</template>
+						<template v-if="p.visibility == 'private'">%fa:lock%</template>
+					</span>
+				</div>
+			</header>
+			<div class="body">
+				<p v-if="p.cw != null" class="cw">
+					<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
+					<span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@less%' : '%i18n:@more%' }}</span>
+				</p>
+				<div class="content" v-show="p.cw == null || showContent">
+					<div class="text">
+						<span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span>
+						<span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span>
+						<a class="reply" v-if="p.reply">%fa:reply%</a>
+						<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i"/>
+						<a class="rp" v-if="p.renote != null">RP:</a>
+					</div>
+					<div class="media" v-if="p.media.length > 0">
+						<mk-media-list :media-list="p.media"/>
+					</div>
+					<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
+					<div class="tags" v-if="p.tags && p.tags.length > 0">
+						<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
+					</div>
+					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
+					<div class="renote" v-if="p.renote">
+						<mk-note-preview :note="p.renote"/>
+					</div>
+				</div>
+				<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>
+			</div>
+			<footer>
+				<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
+				<button @click="reply">
+					<template v-if="p.reply">%fa:reply-all%</template>
+					<template v-else>%fa:reply%</template>
+				</button>
+				<button @click="renote" title="Renote">%fa:retweet%</button>
+				<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton">%fa:plus%</button>
+				<button class="menu" @click="menu" ref="menuButton">%fa:ellipsis-h%</button>
+			</footer>
+		</div>
+	</article>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import parse from '../../../../../../text/parse';
+import canHideText from '../../../../common/scripts/can-hide-text';
+
+import MkNoteMenu from '../../../../common/views/components/note-menu.vue';
+import MkReactionPicker from '../../../../common/views/components/reaction-picker.vue';
+import XSub from './deck.note.sub.vue';
+
+export default Vue.extend({
+	components: {
+		XSub
+	},
+
+	props: ['note'],
+
+	data() {
+		return {
+			showContent: false,
+			connection: null,
+			connectionId: null
+		};
+	},
+
+	computed: {
+		isRenote(): boolean {
+			return (this.note.renote &&
+				this.note.text == null &&
+				this.note.mediaIds.length == 0 &&
+				this.note.poll == null);
+		},
+
+		p(): any {
+			return this.isRenote ? this.note.renote : this.note;
+		},
+
+		reactionsCount(): number {
+			return this.p.reactionCounts
+				? Object.keys(this.p.reactionCounts)
+					.map(key => this.p.reactionCounts[key])
+					.reduce((a, b) => a + b)
+				: 0;
+		},
+
+		urls(): string[] {
+			if (this.p.text) {
+				const ast = parse(this.p.text);
+				return ast
+					.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
+					.map(t => t.url);
+			} else {
+				return null;
+			}
+		}
+	},
+
+	created() {
+		if (this.$store.getters.isSignedIn) {
+			this.connection = (this as any).os.stream.getConnection();
+			this.connectionId = (this as any).os.stream.use();
+		}
+	},
+
+	mounted() {
+		this.capture(true);
+
+		if (this.$store.getters.isSignedIn) {
+			this.connection.on('_connected_', this.onStreamConnected);
+		}
+
+		// Draw map
+		if (this.p.geo) {
+			const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
+			if (shouldShowMap) {
+				(this as any).os.getGoogleMaps().then(maps => {
+					const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
+					const map = new maps.Map(this.$refs.map, {
+						center: uluru,
+						zoom: 15
+					});
+					new maps.Marker({
+						position: uluru,
+						map: map
+					});
+				});
+			}
+		}
+	},
+
+	beforeDestroy() {
+		this.decapture(true);
+
+		if (this.$store.getters.isSignedIn) {
+			this.connection.off('_connected_', this.onStreamConnected);
+			(this as any).os.stream.dispose(this.connectionId);
+		}
+	},
+
+	methods: {
+		canHideText,
+
+		capture(withHandler = false) {
+			if (this.$store.getters.isSignedIn) {
+				this.connection.send({
+					type: 'capture',
+					id: this.p.id
+				});
+				if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
+			}
+		},
+
+		decapture(withHandler = false) {
+			if (this.$store.getters.isSignedIn) {
+				this.connection.send({
+					type: 'decapture',
+					id: this.p.id
+				});
+				if (withHandler) this.connection.off('note-updated', this.onStreamNoteUpdated);
+			}
+		},
+
+		onStreamConnected() {
+			this.capture();
+		},
+
+		onStreamNoteUpdated(data) {
+			const note = data.note;
+			if (note.id == this.note.id) {
+				this.$emit('update:note', note);
+			} else if (note.id == this.note.renoteId) {
+				this.note.renote = note;
+			}
+		},
+
+		reply() {
+			(this as any).apis.post({
+				reply: this.p
+			});
+		},
+
+		renote() {
+			(this as any).apis.post({
+				renote: this.p
+			});
+		},
+
+		react() {
+			(this as any).os.new(MkReactionPicker, {
+				source: this.$refs.reactButton,
+				note: this.p,
+				compact: true
+			});
+		},
+
+		menu() {
+			(this as any).os.new(MkNoteMenu, {
+				source: this.$refs.menuButton,
+				note: this.p,
+				compact: true
+			});
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	font-size 12px
+	border-bottom solid 1px isDark ? #1c2023 : #eaeaea
+
+	&:last-of-type
+		border-bottom none
+
+	&.smart
+		> article
+			> .main
+				> header
+					align-items center
+					margin-bottom 4px
+
+	> .renote
+		display flex
+		align-items center
+		padding 8px 16px
+		line-height 28px
+		white-space pre
+		color #9dbb00
+		background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%)
+
+		.avatar
+			flex-shrink 0
+			display inline-block
+			width 20px
+			height 20px
+			margin 0 8px 0 0
+			border-radius 6px
+
+		[data-fa]
+			margin-right 4px
+
+		> span
+			flex-shrink 0
+
+			&:last-of-type
+				margin-right 8px
+
+		.name
+			overflow hidden
+			flex-shrink 1
+			text-overflow ellipsis
+			white-space nowrap
+			font-weight bold
+
+		> .mk-time
+			display block
+			margin-left auto
+			flex-shrink 0
+			font-size 0.9em
+
+		& + article
+			padding-top 8px
+
+	> article
+		display flex
+		padding 16px 16px 9px
+
+		> .avatar
+			flex-shrink 0
+			display block
+			margin 0 10px 8px 0
+			width 42px
+			height 42px
+			border-radius 6px
+			//position -webkit-sticky
+			//position sticky
+			//top 62px
+
+		> .main
+			flex 1
+			min-width 0
+
+			> header
+				display flex
+				align-items baseline
+				white-space nowrap
+
+				> .avatar
+					flex-shrink 0
+					margin-right 8px
+					width 20px
+					height 20px
+					border-radius 100%
+
+				> .name
+					display block
+					margin 0 0.5em 0 0
+					padding 0
+					overflow hidden
+					color isDark ? #fff : #627079
+					font-weight bold
+					text-decoration none
+					text-overflow ellipsis
+
+				> .is-admin
+				> .is-bot
+				> .is-cat
+					align-self center
+					margin 0 0.5em 0 0
+					padding 1px 6px
+					font-size 0.8em
+					color isDark ? #758188 : #aaa
+					border solid 1px isDark ? #57616f : #ddd
+					border-radius 3px
+
+					&.is-admin
+						border-color isDark ? #d42c41 : #f56a7b
+						color isDark ? #d42c41 : #f56a7b
+
+				> .username
+					margin 0 0.5em 0 0
+					overflow hidden
+					text-overflow ellipsis
+					color isDark ? #606984 : #ccc
+
+				> .info
+					margin-left auto
+					font-size 0.9em
+
+					> *
+						color isDark ? #606984 : #c0c0c0
+
+					> .mobile
+						margin-right 6px
+
+					> .visibility
+						margin-left 6px
+
+			> .body
+
+				> .cw
+					cursor default
+					display block
+					margin 0
+					padding 0
+					overflow-wrap break-word
+					color isDark ? #fff : #717171
+
+					> .text
+						margin-right 8px
+
+					> .toggle
+						display inline-block
+						padding 4px 8px
+						font-size 0.7em
+						color isDark ? #393f4f : #fff
+						background isDark ? #687390 : #b1b9c1
+						border-radius 2px
+						cursor pointer
+						user-select none
+
+						&:hover
+							background isDark ? #707b97 : #bbc4ce
+
+				> .content
+
+					> .text
+						display block
+						margin 0
+						padding 0
+						overflow-wrap break-word
+						color isDark ? #fff : #717171
+
+						>>> .title
+							display block
+							margin-bottom 4px
+							padding 4px
+							font-size 90%
+							text-align center
+							background isDark ? #2f3944 : #eef1f3
+							border-radius 4px
+
+						>>> .code
+							margin 8px 0
+
+						>>> .quote
+							margin 8px
+							padding 6px 12px
+							color isDark ? #6f808e : #aaa
+							border-left solid 3px isDark ? #637182 : #eee
+
+						> .reply
+							margin-right 8px
+							color isDark ? #99abbf : #717171
+
+						> .rp
+							margin-left 4px
+							font-style oblique
+							color #a0bf46
+
+						[data-is-me]:after
+							content "you"
+							padding 0 4px
+							margin-left 4px
+							font-size 80%
+							color $theme-color-foreground
+							background $theme-color
+							border-radius 4px
+
+					.mk-url-preview
+						margin-top 8px
+
+					> .tags
+						margin 4px 0 0 0
+
+						> *
+							display inline-block
+							margin 0 8px 0 0
+							padding 2px 8px 2px 16px
+							font-size 90%
+							color #8d969e
+							background isDark ? #313543 : #edf0f3
+							border-radius 4px
+
+							&:before
+								content ""
+								display block
+								position absolute
+								top 0
+								bottom 0
+								left 4px
+								width 8px
+								height 8px
+								margin auto 0
+								background isDark ? #282c37 : #fff
+								border-radius 100%
+
+					> .media
+						> img
+							display block
+							max-width 100%
+
+					> .location
+						margin 4px 0
+						font-size 12px
+						color #ccc
+
+					> .map
+						width 100%
+						height 200px
+
+						&:empty
+							display none
+
+					> .mk-poll
+						font-size 80%
+
+					> .renote
+						margin 8px 0
+
+						> .mk-note-preview
+							padding 16px
+							border dashed 1px isDark ? #4e945e : #c0dac6
+							border-radius 8px
+
+				> .app
+					font-size 12px
+					color #ccc
+
+			> footer
+				> button
+					margin 0
+					padding 8px
+					background transparent
+					border none
+					box-shadow none
+					font-size 1em
+					color isDark ? #606984 : #ddd
+					cursor pointer
+
+					&:not(:last-child)
+						margin-right 28px
+
+					&:hover
+						color isDark ? #9198af : #666
+
+					> .count
+						display inline
+						margin 0 0 0 8px
+						color #999
+
+					&.reacted
+						color $theme-color
+
+.zyjjkidcqjnlegkqebitfviomuqmseqk[data-darkmode]
+	root(true)
+
+.zyjjkidcqjnlegkqebitfviomuqmseqk:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue
new file mode 100644
index 0000000000..ff871b049d
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue
@@ -0,0 +1,248 @@
+<template>
+<div class="eamppglmnmimdhrlzhplwpvyeaqmmhxu">
+	<div class="newer-indicator" v-show="queue.length > 0"></div>
+
+	<slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot>
+
+	<div v-if="!fetching && requestInitPromise != null">
+		<p>%i18n:@error%</p>
+		<button @click="resolveInitPromise">%i18n:@retry%</button>
+	</div>
+
+	<transition-group name="mk-notes" class="transition">
+		<template v-for="(note, i) in _notes">
+			<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
+			<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
+				<span>%fa:angle-up%{{ note._datetext }}</span>
+				<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
+			</p>
+		</template>
+	</transition-group>
+
+	<footer v-if="more">
+		<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
+			<template v-if="!moreFetching">%i18n:@load-more%</template>
+			<template v-if="moreFetching">%fa:spinner .pulse .fw%</template>
+		</button>
+	</footer>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import { url } from '../../../config';
+import getNoteSummary from '../../../../../renderers/get-note-summary';
+
+import XNote from './deck.note.vue';
+
+const displayLimit = 30;
+
+export default Vue.extend({
+	components: {
+		XNote
+	},
+
+	props: {
+		more: {
+			type: Function,
+			required: false
+		}
+	},
+
+	data() {
+		return {
+			rootEl: null,
+			requestInitPromise: null as () => Promise<any[]>,
+			notes: [],
+			queue: [],
+			unreadCount: 0,
+			fetching: true,
+			moreFetching: false
+		};
+	},
+
+	computed: {
+		_notes(): any[] {
+			return (this.notes as any).map(note => {
+				const date = new Date(note.createdAt).getDate();
+				const month = new Date(note.createdAt).getMonth() + 1;
+				note._date = date;
+				note._datetext = `${month}月 ${date}日`;
+				return note;
+			});
+		}
+	},
+
+	beforeDestroy() {
+		this.root.removeEventListener('scroll', this.onScroll);
+	},
+
+	methods: {
+		mount(root) {
+			this.rootEl = root;
+			this.rootEl.addEventListener('scroll', this.onScroll);
+		},
+
+		isScrollTop() {
+			if (this.rootEl == null) return true;
+			return this.rootEl.scrollTop <= 8;
+		},
+
+		focus() {
+			(this.$el as any).children[0].focus();
+		},
+
+		onNoteUpdated(i, note) {
+			Vue.set((this as any).notes, i, note);
+		},
+
+		init(promiseGenerator: () => Promise<any[]>) {
+			this.requestInitPromise = promiseGenerator;
+			this.resolveInitPromise();
+		},
+
+		resolveInitPromise() {
+			this.queue = [];
+			this.notes = [];
+			this.fetching = true;
+
+			const promise = this.requestInitPromise();
+
+			promise.then(notes => {
+				this.notes = notes;
+				this.requestInitPromise = null;
+				this.fetching = false;
+			}, e => {
+				this.fetching = false;
+			});
+		},
+
+		prepend(note, silent = false) {
+			//#region 弾く
+			const isMyNote = note.userId == this.$store.state.i.id;
+			const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null;
+
+			if (this.$store.state.settings.showMyRenotes === false) {
+				if (isMyNote && isPureRenote) {
+					return;
+				}
+			}
+
+			if (this.$store.state.settings.showRenotedMyNotes === false) {
+				if (isPureRenote && (note.renote.userId == this.$store.state.i.id)) {
+					return;
+				}
+			}
+			//#endregion
+
+			if (this.isScrollTop()) {
+				// Prepend the note
+				this.notes.unshift(note);
+
+				// オーバーフローしたら古い投稿は捨てる
+				if (this.notes.length >= displayLimit) {
+					this.notes = this.notes.slice(0, displayLimit);
+				}
+			} else {
+				this.queue.push(note);
+			}
+		},
+
+		append(note) {
+			this.notes.push(note);
+		},
+
+		tail() {
+			return this.notes[this.notes.length - 1];
+		},
+
+		releaseQueue() {
+			this.queue.forEach(n => this.prepend(n, true));
+			this.queue = [];
+		},
+
+		async loadMore() {
+			if (this.more == null) return;
+			if (this.moreFetching) return;
+
+			this.moreFetching = true;
+			await this.more();
+			this.moreFetching = false;
+		},
+
+		onScroll() {
+			if (this.isScrollTop()) {
+				this.releaseQueue();
+			}
+
+			if (this.rootEl && this.$store.state.settings.fetchOnScroll !== false) {
+				const current = this.rootEl.scrollTop + this.rootEl.clientHeight;
+				if (current > this.rootEl.scrollHeight - 8) this.loadMore();
+			}
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	.transition
+		.mk-notes-enter
+		.mk-notes-leave-to
+			opacity 0
+			transform translateY(-30px)
+
+		> *
+			transition transform .3s ease, opacity .3s ease
+
+		> .date
+			display block
+			margin 0
+			line-height 32px
+			font-size 14px
+			text-align center
+			color isDark ? #666b79 : #aaa
+			background isDark ? #242731 : #fdfdfd
+			border-bottom solid 1px isDark ? #1c2023 : #eaeaea
+
+			span
+				margin 0 16px
+
+			[data-fa]
+				margin-right 8px
+
+	> .newer-indicator
+		position -webkit-sticky
+		position sticky
+		z-index 100
+		height 3px
+		background $theme-color
+
+	> footer
+		> button
+			display block
+			margin 0
+			padding 16px
+			width 100%
+			text-align center
+			color #ccc
+			background isDark ? #282C37 : #fff
+			border-top solid 1px isDark ? #1c2023 : #eaeaea
+			border-bottom-left-radius 6px
+			border-bottom-right-radius 6px
+
+			&:hover
+				background isDark ? #2e3440 : #f5f5f5
+
+			&:active
+				background isDark ? #21242b : #eee
+
+.eamppglmnmimdhrlzhplwpvyeaqmmhxu[data-darkmode]
+	root(true)
+
+.eamppglmnmimdhrlzhplwpvyeaqmmhxu:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue
new file mode 100644
index 0000000000..ce9a77703f
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue
@@ -0,0 +1,143 @@
+<template>
+	<x-notes ref="timeline" :more="existMore ? more : null"/>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XNotes from './deck.notes.vue';
+
+const fetchLimit = 10;
+
+export default Vue.extend({
+	components: {
+		XNotes
+	},
+
+	props: {
+		root: {
+			type: Object,
+			required: false
+		},
+		src: {
+			type: String,
+			required: false,
+			default: 'home'
+		}
+	},
+
+	data() {
+		return {
+			fetching: true,
+			moreFetching: false,
+			existMore: false,
+			connection: null,
+			connectionId: null,
+			unreadCount: 0,
+			date: null
+		};
+	},
+
+	computed: {
+		stream(): any {
+			return this.src == 'home'
+				? (this as any).os.stream
+				: this.src == 'local'
+					? (this as any).os.streams.localTimelineStream
+					: (this as any).os.streams.globalTimelineStream;
+		},
+
+		endpoint(): string {
+			return this.src == 'home'
+				? 'notes/timeline'
+				: this.src == 'local'
+					? 'notes/local-timeline'
+					: 'notes/global-timeline';
+		}
+	},
+
+	mounted() {
+		this.connection = this.stream.getConnection();
+		this.connectionId = this.stream.use();
+
+		this.connection.on('note', this.onNote);
+		if (this.src == 'home') {
+			this.connection.on('follow', this.onChangeFollowing);
+			this.connection.on('unfollow', this.onChangeFollowing);
+		}
+
+		this.fetch();
+	},
+
+	beforeDestroy() {
+		this.connection.off('note', this.onNote);
+		if (this.src == 'home') {
+			this.connection.off('follow', this.onChangeFollowing);
+			this.connection.off('unfollow', this.onChangeFollowing);
+		}
+		this.stream.dispose(this.connectionId);
+	},
+
+	methods: {
+		mount(root) {
+			this.$refs.timeline.mount(root);
+		},
+
+		fetch() {
+			this.fetching = true;
+
+			(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
+				(this as any).api(this.endpoint, {
+					limit: fetchLimit + 1,
+					untilDate: this.date ? this.date.getTime() : undefined,
+					includeMyRenotes: this.$store.state.settings.showMyRenotes,
+					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
+				}).then(notes => {
+					if (notes.length == fetchLimit + 1) {
+						notes.pop();
+						this.existMore = true;
+					}
+					res(notes);
+					this.fetching = false;
+					this.$emit('loaded');
+				}, rej);
+			}));
+		},
+
+		more() {
+			this.moreFetching = true;
+
+			const promise = (this as any).api(this.endpoint, {
+				limit: fetchLimit + 1,
+				untilId: (this.$refs.timeline as any).tail().id,
+				includeMyRenotes: this.$store.state.settings.showMyRenotes,
+				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
+			});
+
+			promise.then(notes => {
+				if (notes.length == fetchLimit + 1) {
+					notes.pop();
+				} else {
+					this.existMore = false;
+				}
+				notes.forEach(n => (this.$refs.timeline as any).append(n));
+				this.moreFetching = false;
+			});
+
+			return promise;
+		},
+
+		onNote(note) {
+			// Prepend a note
+			(this.$refs.timeline as any).prepend(note);
+		},
+
+		onChangeFollowing() {
+			this.fetch();
+		},
+
+		focus() {
+			(this.$refs.timeline as any).focus();
+		}
+	}
+});
+</script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
new file mode 100644
index 0000000000..afb65d2335
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -0,0 +1,42 @@
+<template>
+<mk-ui :class="$style.root">
+	<div class="qlvquzbjribqcaozciifydkngcwtyzje">
+		<x-column src="home"/>
+		<x-column src="home"/>
+		<x-column src="home"/>
+		<x-column src="home"/>
+	</div>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XColumn from './deck.column.vue';
+
+export default Vue.extend({
+	components: {
+		XColumn
+	}
+});
+</script>
+
+<style lang="stylus" module>
+.root
+	height 100vh
+</style>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	display flex
+	flex 1
+	padding 16px
+
+.qlvquzbjribqcaozciifydkngcwtyzje[data-darkmode]
+	root(true)
+
+.qlvquzbjribqcaozciifydkngcwtyzje:not([data-darkmode])
+	root(false)
+
+</style>

From e28d1c756971cdfda5364c80f6af7a69dbf5ffc1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 5 Jun 2018 21:44:02 +0900
Subject: [PATCH 132/369] wip

---
 src/client/app/desktop/views/pages/deck/deck.column.vue | 3 ++-
 src/client/app/desktop/views/pages/deck/deck.vue        | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 4e06798293..e0fc394f33 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -30,7 +30,7 @@ export default Vue.extend({
 
 root(isDark)
 	flex 1
-	max-width 330px
+	min-width 330px
 	height 100%
 	margin-right 16px
 	background isDark ? #282C37 : #fff
@@ -49,6 +49,7 @@ root(isDark)
 	> div
 		height calc(100% - 48px)
 		overflow auto
+		overflow-x hidden
 
 .dnpfarvgbnfmyzbdquhhzyxcmstpdqzs[data-darkmode]
 	root(true)
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index afb65d2335..0c32b7d665 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -31,7 +31,8 @@ export default Vue.extend({
 root(isDark)
 	display flex
 	flex 1
-	padding 16px
+	padding 16px 0 16px 16px
+	overflow auto
 
 .qlvquzbjribqcaozciifydkngcwtyzje[data-darkmode]
 	root(true)

From dfa2c951d67a64f4e72a0ebca7ff81e40fc25976 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 5 Jun 2018 22:54:03 +0900
Subject: [PATCH 133/369] wip

---
 .../views/components/ui.header.nav.vue        |  2 +-
 .../desktop/views/pages/deck/deck.column.vue  | 25 +++++++++++---
 .../desktop/views/pages/deck/deck.notes.vue   | 16 +++++----
 .../views/pages/deck/deck.tl-column.vue       | 33 +++++++++++++++++++
 .../app/desktop/views/pages/deck/deck.tl.vue  |  4 ---
 .../app/desktop/views/pages/deck/deck.vue     | 11 +++----
 src/services/note/create.ts                   |  4 ++-
 7 files changed, 72 insertions(+), 23 deletions(-)
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.tl-column.vue

diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue
index 8e792b3df5..fe2637cec3 100644
--- a/src/client/app/desktop/views/components/ui.header.nav.vue
+++ b/src/client/app/desktop/views/components/ui.header.nav.vue
@@ -11,7 +11,7 @@
 			<li class="deck" :class="{ active: $route.name == 'deck' }">
 				<router-link to="/deck">
 					%fa:columns%
-					<p>%i18n:@deck%</p>
+					<p>%i18n:@deck% <small>(beta)</small></p>
 				</router-link>
 			</li>
 			<li class="messaging">
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index e0fc394f33..8d0b3c0fdb 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,10 +1,10 @@
 <template>
 <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs">
 	<header>
-		<slot name="header">Timeline</slot>
+		<slot name="header"></slot>
 	</header>
 	<div ref="body">
-		<x-tl ref="tl"/>
+		<slot></slot>
 	</div>
 </div>
 </template>
@@ -17,9 +17,23 @@ export default Vue.extend({
 	components: {
 		XTl
 	},
+	provide() {
+		return {
+			getColumn() {
+				return this;
+			},
+			getScrollContainer() {
+				return this.$refs.body;
+			}
+		};
+	},
 	mounted() {
 		this.$nextTick(() => {
-			this.$refs.tl.mount(this.$refs.body);
+			this.$emit('mounted');
+
+			setInterval(() => {
+				this.$emit('mounted');
+			}, 100);
 		});
 	}
 });
@@ -31,6 +45,7 @@ export default Vue.extend({
 root(isDark)
 	flex 1
 	min-width 330px
+	max-width 330px
 	height 100%
 	margin-right 16px
 	background isDark ? #282C37 : #fff
@@ -40,14 +55,14 @@ root(isDark)
 
 	> header
 		z-index 1
-		line-height 48px
+		line-height 42px
 		padding 0 16px
 		color isDark ? #e3e5e8 : #888
 		background isDark ? #313543 : #fff
 		box-shadow 0 1px rgba(#000, 0.15)
 
 	> div
-		height calc(100% - 48px)
+		height calc(100% - 42px)
 		overflow auto
 		overflow-x hidden
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue
index ff871b049d..48be4e585c 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notes.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue
@@ -73,16 +73,20 @@ export default Vue.extend({
 		}
 	},
 
+	inject: ['getColumn', 'getScrollContainer'],
+
+	created() {
+		this.getColumn().$once('mounted', () => {
+			this.rootEl = this.getScrollContainer();
+			this.rootEl.addEventListener('scroll', this.onScroll);
+		})
+	},
+
 	beforeDestroy() {
-		this.root.removeEventListener('scroll', this.onScroll);
+		this.rootEl.removeEventListener('scroll', this.onScroll);
 	},
 
 	methods: {
-		mount(root) {
-			this.rootEl = root;
-			this.rootEl.addEventListener('scroll', this.onScroll);
-		},
-
 		isScrollTop() {
 			if (this.rootEl == null) return true;
 			return this.rootEl.scrollTop <= 8;
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
new file mode 100644
index 0000000000..674f04077f
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -0,0 +1,33 @@
+<template>
+<div>
+	<x-column>
+		<span slot="header">
+			<template v-if="src == 'home'">%fa:home% %i18n:@home%</template>
+			<template v-if="src == 'local'">%fa:R comments% %i18n:@local%</template>
+			<template v-if="src == 'global'">%fa:globe% %i18n:@global%</template>
+			<template v-if="src == 'list'">%fa:list% {{ list.title }}</template>
+		</span>
+		<x-tl :src="src"/>
+	</x-column>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XColumn from './deck.column.vue';
+import XTl from './deck.tl.vue';
+
+export default Vue.extend({
+	components: {
+		XColumn,
+		XTl
+	},
+
+	props: {
+		src: {
+			type: String,
+			required: false
+		}
+	},
+});
+</script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue
index ce9a77703f..0a788b32ed 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue
@@ -14,10 +14,6 @@ export default Vue.extend({
 	},
 
 	props: {
-		root: {
-			type: Object,
-			required: false
-		},
 		src: {
 			type: String,
 			required: false,
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index 0c32b7d665..dfd480029c 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -1,21 +1,20 @@
 <template>
 <mk-ui :class="$style.root">
 	<div class="qlvquzbjribqcaozciifydkngcwtyzje">
-		<x-column src="home"/>
-		<x-column src="home"/>
-		<x-column src="home"/>
-		<x-column src="home"/>
+		<x-tl-column src="home"/>
+		<x-tl-column src="local"/>
+		<x-tl-column src="global"/>
 	</div>
 </mk-ui>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
-import XColumn from './deck.column.vue';
+import XTlColumn from './deck.tl-column.vue';
 
 export default Vue.extend({
 	components: {
-		XColumn
+		XTlColumn
 	}
 });
 </script>
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 37d21fecad..f820182a42 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -221,7 +221,9 @@ export default async (user: IUser, data: {
 		}
 
 		// Publish note to global timeline stream
-		publishGlobalTimelineStream(noteObj);
+		if (note.visibility == 'public' && note.replyId == null) {
+			publishGlobalTimelineStream(noteObj);
+		}
 
 		if (note.visibility == 'specified') {
 			data.visibleUsers.forEach(async u => {

From 334dabc1de705d35cb65fb9c8d5b17cd697d502e Mon Sep 17 00:00:00 2001
From: momf <m0fqn090310@gmail.com>
Date: Tue, 5 Jun 2018 23:00:03 +0900
Subject: [PATCH 134/369] fix: validate post's text on mobile client.

---
 src/client/app/mobile/views/components/post-form.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index beacb1721b..2c7feb3f8e 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -5,7 +5,7 @@
 		<div>
 			<span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span>
 			<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
-			<button class="submit" :disabled="posting" @click="post">{{ submitText }}</button>
+			<button class="submit" :disabled="!canPost" @click="post">{{ submitText }}</button>
 		</div>
 	</header>
 	<div class="form">

From 2e919b788f449b34872bd3e530b2f4f637365c00 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 5 Jun 2018 23:19:04 +0900
Subject: [PATCH 135/369] wip

---
 .../pages/deck/deck.notifications-column.vue  |  22 ++
 .../views/pages/deck/deck.notifications.vue   | 335 ++++++++++++++++++
 .../app/desktop/views/pages/deck/deck.vue     |   5 +-
 3 files changed, 361 insertions(+), 1 deletion(-)
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.notifications.vue

diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
new file mode 100644
index 0000000000..0566989642
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -0,0 +1,22 @@
+<template>
+<div>
+	<x-column>
+		<span slot="header">%fa:bell R% %i18n:@notifications%</span>
+
+		<x-notifications/>
+	</x-column>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XColumn from './deck.column.vue';
+import XNotifications from './deck.notifications.vue';
+
+export default Vue.extend({
+	components: {
+		XColumn,
+		XNotifications
+	}
+});
+</script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
new file mode 100644
index 0000000000..7a9646b587
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
@@ -0,0 +1,335 @@
+<template>
+<div class="oxynyeqmfvracxnglgulyqfgqxnxmehl">
+	<div class="notifications" v-if="notifications.length != 0">
+		<transition-group name="mk-notifications" class="transition">
+			<template v-for="(notification, i) in _notifications">
+				<div class="notification" :class="notification.type" :key="notification.id">
+					<mk-time :time="notification.createdAt"/>
+
+					<template v-if="notification.type == 'reaction'">
+						<mk-avatar class="avatar" :user="notification.user"/>
+						<div class="text">
+							<p>
+								<mk-reaction-icon :reaction="notification.reaction"/>
+								<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
+							</p>
+							<router-link class="note-ref" :to="notification.note | notePage">
+								%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
+							</router-link>
+						</div>
+					</template>
+
+					<template v-if="notification.type == 'renote'">
+						<mk-avatar class="avatar" :user="notification.note.user"/>
+						<div class="text">
+							<p>%fa:retweet%
+								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
+							</p>
+							<router-link class="note-ref" :to="notification.note | notePage">
+								%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%
+							</router-link>
+						</div>
+					</template>
+
+					<template v-if="notification.type == 'quote'">
+						<mk-avatar class="avatar" :user="notification.note.user"/>
+						<div class="text">
+							<p>%fa:quote-left%
+								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
+							</p>
+							<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
+						</div>
+					</template>
+
+					<template v-if="notification.type == 'follow'">
+						<mk-avatar class="avatar" :user="notification.user"/>
+						<div class="text">
+							<p>%fa:user-plus%
+								<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
+							</p>
+						</div>
+					</template>
+
+					<template v-if="notification.type == 'receiveFollowRequest'">
+						<mk-avatar class="avatar" :user="notification.user"/>
+						<div class="text">
+							<p>%fa:user-clock%
+								<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
+							</p>
+						</div>
+					</template>
+
+					<template v-if="notification.type == 'reply'">
+						<mk-avatar class="avatar" :user="notification.note.user"/>
+						<div class="text">
+							<p>%fa:reply%
+								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
+							</p>
+							<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
+						</div>
+					</template>
+
+					<template v-if="notification.type == 'mention'">
+						<mk-avatar class="avatar" :user="notification.note.user"/>
+						<div class="text">
+							<p>%fa:at%
+								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
+							</p>
+							<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
+						</div>
+					</template>
+
+					<template v-if="notification.type == 'poll_vote'">
+						<mk-avatar class="avatar" :user="notification.user"/>
+						<div class="text">
+							<p>%fa:chart-pie%<a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p>
+							<router-link class="note-ref" :to="notification.note | notePage">
+								%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
+							</router-link>
+						</div>
+					</template>
+				</div>
+
+				<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
+					<span>%fa:angle-up%{{ notification._datetext }}</span>
+					<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
+				</p>
+			</template>
+		</transition-group>
+	</div>
+	<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
+		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
+	</button>
+	<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>
+	<p class="loading" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import getNoteSummary from '../../../../../../renderers/get-note-summary';
+
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			fetchingMoreNotifications: false,
+			notifications: [],
+			moreNotifications: false,
+			connection: null,
+			connectionId: null,
+			getNoteSummary
+		};
+	},
+	computed: {
+		_notifications(): any[] {
+			return (this.notifications as any).map(notification => {
+				const date = new Date(notification.createdAt).getDate();
+				const month = new Date(notification.createdAt).getMonth() + 1;
+				notification._date = date;
+				notification._datetext = `${month}月 ${date}日`;
+				return notification;
+			});
+		}
+	},
+	mounted() {
+		this.connection = (this as any).os.stream.getConnection();
+		this.connectionId = (this as any).os.stream.use();
+
+		this.connection.on('notification', this.onNotification);
+
+		const max = 10;
+
+		(this as any).api('i/notifications', {
+			limit: max + 1
+		}).then(notifications => {
+			if (notifications.length == max + 1) {
+				this.moreNotifications = true;
+				notifications.pop();
+			}
+
+			this.notifications = notifications;
+			this.fetching = false;
+		});
+	},
+	beforeDestroy() {
+		this.connection.off('notification', this.onNotification);
+		(this as any).os.stream.dispose(this.connectionId);
+	},
+	methods: {
+		fetchMoreNotifications() {
+			this.fetchingMoreNotifications = true;
+
+			const max = 30;
+
+			(this as any).api('i/notifications', {
+				limit: max + 1,
+				untilId: this.notifications[this.notifications.length - 1].id
+			}).then(notifications => {
+				if (notifications.length == max + 1) {
+					this.moreNotifications = true;
+					notifications.pop();
+				} else {
+					this.moreNotifications = false;
+				}
+				this.notifications = this.notifications.concat(notifications);
+				this.fetchingMoreNotifications = false;
+			});
+		},
+		onNotification(notification) {
+			// TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない
+			this.connection.send({
+				type: 'read_notification',
+				id: notification.id
+			});
+
+			this.notifications.unshift(notification);
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+root(isDark)
+	.transition
+		.mk-notifications-enter
+		.mk-notifications-leave-to
+			opacity 0
+			transform translateY(-30px)
+
+		> *
+			transition transform .3s ease, opacity .3s ease
+
+	> .notifications
+		> *
+			> .notification
+				margin 0
+				padding 16px
+				overflow-wrap break-word
+				font-size 0.9em
+				border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
+
+				&:last-child
+					border-bottom none
+
+				> .mk-time
+					display inline
+					position absolute
+					top 16px
+					right 12px
+					vertical-align top
+					color isDark ? #606984 : rgba(#000, 0.6)
+					font-size small
+
+				&:after
+					content ""
+					display block
+					clear both
+
+				> .avatar
+					display block
+					float left
+					position -webkit-sticky
+					position sticky
+					top 16px
+					width 36px
+					height 36px
+					border-radius 6px
+
+				> .text
+					float right
+					width calc(100% - 36px)
+					padding-left 8px
+
+					p
+						margin 0
+
+						i, .mk-reaction-icon
+							margin-right 4px
+
+				.note-preview
+					color isDark ? #c2cad4 : rgba(#000, 0.7)
+
+				.note-ref
+					color isDark ? #c2cad4 : rgba(#000, 0.7)
+
+					[data-fa]
+						font-size 1em
+						font-weight normal
+						font-style normal
+						display inline-block
+						margin-right 3px
+
+				&.renote, &.quote
+					.text p i
+						color #77B255
+
+				&.follow
+					.text p i
+						color #53c7ce
+
+				&.receiveFollowRequest
+					.text p i
+						color #888
+
+				&.reply, &.mention
+					.text p i
+						color #555
+
+			> .date
+				display block
+				margin 0
+				line-height 32px
+				text-align center
+				font-size 0.8em
+				color isDark ? #666b79 : #aaa
+				background isDark ? #242731 : #fdfdfd
+				border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
+
+				span
+					margin 0 16px
+
+				[data-fa]
+					margin-right 8px
+
+	> .more
+		display block
+		width 100%
+		padding 16px
+		color #555
+		border-top solid 1px rgba(#000, 0.05)
+
+		&:hover
+			background rgba(#000, 0.025)
+
+		&:active
+			background rgba(#000, 0.05)
+
+		&.fetching
+			cursor wait
+
+		> [data-fa]
+			margin-right 4px
+
+	> .empty
+		margin 0
+		padding 16px
+		text-align center
+		color #aaa
+
+	> .loading
+		margin 0
+		padding 16px
+		text-align center
+		color #aaa
+
+		> [data-fa]
+			margin-right 4px
+
+.oxynyeqmfvracxnglgulyqfgqxnxmehl[data-darkmode]
+	root(true)
+
+.oxynyeqmfvracxnglgulyqfgqxnxmehl:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index dfd480029c..fb5e55086c 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -2,6 +2,7 @@
 <mk-ui :class="$style.root">
 	<div class="qlvquzbjribqcaozciifydkngcwtyzje">
 		<x-tl-column src="home"/>
+		<x-notifications-column/>
 		<x-tl-column src="local"/>
 		<x-tl-column src="global"/>
 	</div>
@@ -11,10 +12,12 @@
 <script lang="ts">
 import Vue from 'vue';
 import XTlColumn from './deck.tl-column.vue';
+import XNotificationsColumn from './deck.notifications-column.vue';
 
 export default Vue.extend({
 	components: {
-		XTlColumn
+		XTlColumn,
+		XNotificationsColumn
 	}
 });
 </script>

From 64519a9fd4546d1b2c98b68917fbe5ed00a8d8c9 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 5 Jun 2018 23:22:37 +0900
Subject: [PATCH 136/369] 2.26.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 2e59e17f4d..474b942135 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.25.2",
-	"clientVersion": "1.0.6116",
+	"version": "2.26.0",
+	"clientVersion": "1.0.6140",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 062fbd7d271c0ee787a355c9d1a4d7ffc038759a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 01:54:24 +0900
Subject: [PATCH 137/369] wip

---
 .../desktop/views/pages/deck/deck.column.vue  | 55 ++++++++++++-------
 .../desktop/views/pages/deck/deck.notes.vue   | 35 +++++-------
 2 files changed, 49 insertions(+), 41 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 8d0b3c0fdb..eb1c47c46c 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs">
-	<header>
+	<header :class="{ indicate }">
 		<slot name="header"></slot>
 	</header>
 	<div ref="body">
@@ -11,30 +11,44 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import XTl from './deck.tl.vue';
 
 export default Vue.extend({
-	components: {
-		XTl
-	},
-	provide() {
+	data() {
 		return {
-			getColumn() {
-				return this;
-			},
-			getScrollContainer() {
-				return this.$refs.body;
-			}
+			indicate: false
 		};
 	},
-	mounted() {
-		this.$nextTick(() => {
-			this.$emit('mounted');
 
-			setInterval(() => {
-				this.$emit('mounted');
-			}, 100);
-		});
+	provide() {
+		return {
+			column: this,
+			isScrollTop: this.isScrollTop,
+			indicate: v => this.indicate = v
+		};
+	},
+
+	mounted() {
+		this.$refs.body.addEventListener('scroll', this.onScroll);
+	},
+	beforeDestroy() {
+		this.$refs.body.removeEventListener('scroll', this.onScroll);
+	},
+
+	methods: {
+		isScrollTop() {
+			return this.$refs.body.scrollTop == 0;
+		},
+
+		onScroll() {
+			if (this.isScrollTop()) {
+				this.$emit('top');
+			}
+
+			if (this.$store.state.settings.fetchOnScroll !== false) {
+				const current = this.$refs.body.scrollTop + this.$refs.body.clientHeight;
+				if (current > this.$refs.body.scrollHeight - 1) this.$emit('bottom');
+			}
+		}
 	}
 });
 </script>
@@ -61,6 +75,9 @@ root(isDark)
 		background isDark ? #313543 : #fff
 		box-shadow 0 1px rgba(#000, 0.15)
 
+		&.indicate
+			box-shadow 0 3px 0 0 $theme-color
+
 	> div
 		height calc(100% - 42px)
 		overflow auto
diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue
index 48be4e585c..e05b31c32e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notes.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue
@@ -1,7 +1,5 @@
 <template>
 <div class="eamppglmnmimdhrlzhplwpvyeaqmmhxu">
-	<div class="newer-indicator" v-show="queue.length > 0"></div>
-
 	<slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot>
 
 	<div v-if="!fetching && requestInitPromise != null">
@@ -42,6 +40,8 @@ export default Vue.extend({
 		XNote
 	},
 
+	inject: ['column', 'isScrollTop', 'indicate'],
+
 	props: {
 		more: {
 			type: Function,
@@ -73,25 +73,17 @@ export default Vue.extend({
 		}
 	},
 
-	inject: ['getColumn', 'getScrollContainer'],
-
 	created() {
-		this.getColumn().$once('mounted', () => {
-			this.rootEl = this.getScrollContainer();
-			this.rootEl.addEventListener('scroll', this.onScroll);
-		})
+		this.column.$on('top', this.onTop);
+		this.column.$on('bottom', this.onBottom);
 	},
 
 	beforeDestroy() {
-		this.rootEl.removeEventListener('scroll', this.onScroll);
+		this.column.$off('top', this.onTop);
+		this.column.$off('bottom', this.onBottom);
 	},
 
 	methods: {
-		isScrollTop() {
-			if (this.rootEl == null) return true;
-			return this.rootEl.scrollTop <= 8;
-		},
-
 		focus() {
 			(this.$el as any).children[0].focus();
 		},
@@ -149,6 +141,7 @@ export default Vue.extend({
 				}
 			} else {
 				this.queue.push(note);
+				this.indicate(true);
 			}
 		},
 
@@ -163,6 +156,7 @@ export default Vue.extend({
 		releaseQueue() {
 			this.queue.forEach(n => this.prepend(n, true));
 			this.queue = [];
+			this.indicate(false);
 		},
 
 		async loadMore() {
@@ -174,15 +168,12 @@ export default Vue.extend({
 			this.moreFetching = false;
 		},
 
-		onScroll() {
-			if (this.isScrollTop()) {
-				this.releaseQueue();
-			}
+		onTop() {
+			this.releaseQueue();
+		},
 
-			if (this.rootEl && this.$store.state.settings.fetchOnScroll !== false) {
-				const current = this.rootEl.scrollTop + this.rootEl.clientHeight;
-				if (current > this.rootEl.scrollHeight - 8) this.loadMore();
-			}
+		onBottom() {
+			this.loadMore();
 		}
 	}
 });

From f88fb9bc1dc4aeb7d50729124db5814064fda607 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 01:54:36 +0900
Subject: [PATCH 138/369] wip

---
 src/client/app/desktop/views/pages/deck/deck.notes.vue | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue
index e05b31c32e..e37505b551 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notes.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue
@@ -208,13 +208,6 @@ root(isDark)
 			[data-fa]
 				margin-right 8px
 
-	> .newer-indicator
-		position -webkit-sticky
-		position sticky
-		z-index 100
-		height 3px
-		background $theme-color
-
 	> footer
 		> button
 			display block

From f9180811680aa66706d722384cba4d82d7a2e52c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 02:48:26 +0900
Subject: [PATCH 139/369] wip

---
 .../app/desktop/views/components/home.vue     | 52 +++++++++++++++++++
 src/client/app/store.ts                       | 15 ++++++
 src/server/api/private/signup.ts              | 48 -----------------
 3 files changed, 67 insertions(+), 48 deletions(-)

diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index 636ed871c7..d3ba84a4b3 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -76,6 +76,50 @@ import Vue from 'vue';
 import * as XDraggable from 'vuedraggable';
 import * as uuid from 'uuid';
 
+const defaultDesktopHomeWidgets = {
+	left: [
+		'profile',
+		'calendar',
+		'activity',
+		'rss',
+		'trends',
+		'photo-stream',
+		'version'
+	],
+	right: [
+		'broadcast',
+		'notifications',
+		'users',
+		'polls',
+		'server',
+		'donation',
+		'nav',
+		'tips'
+	]
+};
+
+//#region Construct home data
+const _defaultDesktopHomeWidgets = [];
+
+defaultDesktopHomeWidgets.left.forEach(widget => {
+	_defaultDesktopHomeWidgets.push({
+		name: widget,
+		id: uuid(),
+		place: 'left',
+		data: {}
+	});
+});
+
+defaultDesktopHomeWidgets.right.forEach(widget => {
+	_defaultDesktopHomeWidgets.push({
+		name: widget,
+		id: uuid(),
+		place: 'right',
+		data: {}
+	});
+});
+//#endregion
+
 export default Vue.extend({
 	components: {
 		XDraggable
@@ -119,6 +163,14 @@ export default Vue.extend({
 		}
 	},
 
+	created() {
+		if (this.$store.state.i.clientSettings == null || this.$store.state.i.clientSettings.home == null) {
+			this.api('i/update_home', {
+				home: _defaultDesktopHomeWidgets
+			});
+		}
+	},
+
 	mounted() {
 		this.connection = (this as any).os.stream.getConnection();
 		this.connectionId = (this as any).os.stream.use();
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index 905ec0501c..00cae3b857 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -7,6 +7,20 @@ import { hostname } from './config';
 const defaultSettings = {
 	home: [],
 	mobileHome: [],
+	deck: {
+		columns: [/*{
+			type: 'widgets',
+			widgets: []
+		}, */{
+			type: 'home'
+		}, {
+			type: 'notifications'
+		}, {
+			type: 'local'
+		}, {
+			type: 'global'
+		}]
+	},
 	fetchOnScroll: true,
 	showMaps: true,
 	showPostFormOnTopOfTl: false,
@@ -156,6 +170,7 @@ export default (os: MiOS) => new Vuex.Store({
 
 			actions: {
 				merge(ctx, settings) {
+					if (settings == null) return;
 					Object.entries(settings).forEach(([key, value]) => {
 						ctx.commit('set', { key, value });
 					});
diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts
index cf51dec4d2..14d4b8a3fc 100644
--- a/src/server/api/private/signup.ts
+++ b/src/server/api/private/signup.ts
@@ -1,4 +1,3 @@
-import * as uuid from 'uuid';
 import * as Koa from 'koa';
 import * as bcrypt from 'bcryptjs';
 import { generate as generateKeypair } from '../../../crypto_key';
@@ -11,28 +10,6 @@ recaptcha.init({
 	secret_key: config.recaptcha.secret_key
 });
 
-const home = {
-	left: [
-		'profile',
-		'calendar',
-		'activity',
-		'rss',
-		'trends',
-		'photo-stream',
-		'version'
-	],
-	right: [
-		'broadcast',
-		'notifications',
-		'users',
-		'polls',
-		'server',
-		'donation',
-		'nav',
-		'tips'
-	]
-};
-
 export default async (ctx: Koa.Context) => {
 	// Verify recaptcha
 	// ただしテスト時はこの機構は障害となるため無効にする
@@ -82,28 +59,6 @@ export default async (ctx: Koa.Context) => {
 	// Generate secret
 	const secret = generateUserToken();
 
-	//#region Construct home data
-	const homeData = [];
-
-	home.left.forEach(widget => {
-		homeData.push({
-			name: widget,
-			id: uuid(),
-			place: 'left',
-			data: {}
-		});
-	});
-
-	home.right.forEach(widget => {
-		homeData.push({
-			name: widget,
-			id: uuid(),
-			place: 'right',
-			data: {}
-		});
-	});
-	//#endregion
-
 	// Create account
 	const account: IUser = await User.insert({
 		avatarId: null,
@@ -135,9 +90,6 @@ export default async (ctx: Koa.Context) => {
 		},
 		settings: {
 			autoWatch: true
-		},
-		clientSettings: {
-			home: homeData
 		}
 	});
 

From d8cd24fab0bd454bd543200e71a17601afbb9f87 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 03:03:56 +0900
Subject: [PATCH 140/369] wip

---
 src/client/app/common/scripts/streaming/home.ts  | 2 --
 src/client/app/desktop/views/components/home.vue | 6 ++++--
 src/client/app/store.ts                          | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts
index f07d0289f6..a27c55a60d 100644
--- a/src/client/app/common/scripts/streaming/home.ts
+++ b/src/client/app/common/scripts/streaming/home.ts
@@ -1,5 +1,3 @@
-import * as merge from 'object-assign-deep';
-
 import Stream from './stream';
 import StreamManager from './stream-manager';
 import MiOS from '../../../mios';
diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index d3ba84a4b3..c30ca68210 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -147,7 +147,7 @@ export default Vue.extend({
 
 	computed: {
 		home(): any[] {
-			return this.$store.state.settings.home;
+			return this.$store.state.settings.home || [];
 		},
 		left(): any[] {
 			return this.home.filter(w => w.place == 'left');
@@ -164,9 +164,11 @@ export default Vue.extend({
 	},
 
 	created() {
-		if (this.$store.state.i.clientSettings == null || this.$store.state.i.clientSettings.home == null) {
+		if (this.$store.state.settings.home == null) {
 			this.api('i/update_home', {
 				home: _defaultDesktopHomeWidgets
+			}).then(() => {
+				this.$store.commit('settings/setHome', _defaultDesktopHomeWidgets);
 			});
 		}
 	},
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index 00cae3b857..135fbe51f5 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -5,7 +5,7 @@ import MiOS from './mios';
 import { hostname } from './config';
 
 const defaultSettings = {
-	home: [],
+	home: null,
 	mobileHome: [],
 	deck: {
 		columns: [/*{

From 8ca58de2ba1e6867e1ca83062269ed8fbd350c25 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 03:12:06 +0900
Subject: [PATCH 141/369] wip

---
 .../app/desktop/views/pages/deck/deck.vue     | 44 +++++++++++++++++--
 src/client/app/store.ts                       | 15 +------
 2 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index fb5e55086c..079260972f 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -1,10 +1,12 @@
 <template>
 <mk-ui :class="$style.root">
 	<div class="qlvquzbjribqcaozciifydkngcwtyzje">
-		<x-tl-column src="home"/>
-		<x-notifications-column/>
-		<x-tl-column src="local"/>
-		<x-tl-column src="global"/>
+		<template v-for="column in columns">
+			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id"/>
+			<x-tl-column v-if="column.type == 'home'" :key="column.id" src="home"/>
+			<x-tl-column v-if="column.type == 'local'" :key="column.id" src="local"/>
+			<x-tl-column v-if="column.type == 'global'" :key="column.id" src="global"/>
+		</template>
 	</div>
 </mk-ui>
 </template>
@@ -13,11 +15,45 @@
 import Vue from 'vue';
 import XTlColumn from './deck.tl-column.vue';
 import XNotificationsColumn from './deck.notifications-column.vue';
+import * as uuid from 'uuid';
 
 export default Vue.extend({
 	components: {
 		XTlColumn,
 		XNotificationsColumn
+	},
+	computed: {
+		columns() {
+			if (this.$store.state.settings.deck == null) return [];
+			return this.$store.state.settings.deck.columns;
+		}
+	},
+	created() {
+		if (this.$store.state.settings.deck == null) {
+			const deck = {
+				columns: [/*{
+					type: 'widgets',
+					widgets: []
+				}, */{
+					id: uuid(),
+					type: 'home'
+				}, {
+					id: uuid(),
+					type: 'notifications'
+				}, {
+					id: uuid(),
+					type: 'local'
+				}, {
+					id: uuid(),
+					type: 'global'
+				}]
+			};
+
+			this.$store.dispatch('settings/set', {
+				key: 'deck',
+				value: deck
+			});
+		}
 	}
 });
 </script>
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index 135fbe51f5..7795c9477a 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -7,20 +7,7 @@ import { hostname } from './config';
 const defaultSettings = {
 	home: null,
 	mobileHome: [],
-	deck: {
-		columns: [/*{
-			type: 'widgets',
-			widgets: []
-		}, */{
-			type: 'home'
-		}, {
-			type: 'notifications'
-		}, {
-			type: 'local'
-		}, {
-			type: 'global'
-		}]
-	},
+	deck: null,
 	fetchOnScroll: true,
 	showMaps: true,
 	showPostFormOnTopOfTl: false,

From 0d8c83f27cc03efe2f332f84928f14309e646632 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 04:00:48 +0900
Subject: [PATCH 142/369] wip

---
 src/client/app/desktop/api/post.ts            |  2 +-
 .../received-follow-requests-window.vue       |  6 ++---
 .../views/components/user-lists-window.vue    |  6 ++---
 .../desktop/views/pages/deck/deck.column.vue  |  1 -
 .../desktop/views/pages/deck/deck.note.vue    | 26 -------------------
 .../app/desktop/views/pages/deck/deck.vue     | 19 +++++++++++++-
 6 files changed, 25 insertions(+), 35 deletions(-)

diff --git a/src/client/app/desktop/api/post.ts b/src/client/app/desktop/api/post.ts
index af71829c7b..cfc78e50fa 100644
--- a/src/client/app/desktop/api/post.ts
+++ b/src/client/app/desktop/api/post.ts
@@ -6,7 +6,7 @@ export default (os: OS) => opts => {
 	const o = opts || {};
 	if (o.renote) {
 		const vm = os.new(RenoteFormWindow, {
-			renote: o.renote
+			note: o.renote
 		});
 		document.body.appendChild(vm.$el);
 	} else {
diff --git a/src/client/app/desktop/views/components/received-follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue
index fd37c0a6aa..26b7ec2590 100644
--- a/src/client/app/desktop/views/components/received-follow-requests-window.vue
+++ b/src/client/app/desktop/views/components/received-follow-requests-window.vue
@@ -2,7 +2,7 @@
 <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
 	<span slot="header">%fa:envelope R% %i18n:@title%</span>
 
-	<div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode">
+	<div class="slpqaxdoxhvglersgjukmvizkqbmbokc" :data-darkmode="$store.state.device.darkmode">
 		<div v-for="req in requests">
 			<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
 			<span>
@@ -63,10 +63,10 @@ root(isDark)
 		> span
 			margin 0 0 0 auto
 
-[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode]
+.slpqaxdoxhvglersgjukmvizkqbmbokc[data-darkmode]
 	root(true)
 
-[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"]:not([data-darkmode])
+.slpqaxdoxhvglersgjukmvizkqbmbokc:not([data-darkmode])
 	root(false)
 
 </style>
diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue
index 109d1695d8..47648c287d 100644
--- a/src/client/app/desktop/views/components/user-lists-window.vue
+++ b/src/client/app/desktop/views/components/user-lists-window.vue
@@ -2,7 +2,7 @@
 <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
 	<span slot="header">%fa:list% %i18n:@title%</span>
 
-	<div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode">
+	<div class="xkxvokkjlptzyewouewmceqcxhpgzprp" :data-darkmode="$store.state.device.darkmode">
 		<button class="ui" @click="add">%i18n:@create-list%</button>
 		<a v-for="list in lists" :key="list.id" @click="choice(list)">{{ list.title }}</a>
 	</div>
@@ -60,10 +60,10 @@ root(isDark)
 		border solid 1px isDark ? #1c2023 : #eee
 		border-radius 4px
 
-[data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82"][data-darkmode]
+.xkxvokkjlptzyewouewmceqcxhpgzprp[data-darkmode]
 	root(true)
 
-[data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82"]:not([data-darkmode])
+.xkxvokkjlptzyewouewmceqcxhpgzprp:not([data-darkmode])
 	root(false)
 
 </style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index eb1c47c46c..bae28f3a64 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -61,7 +61,6 @@ root(isDark)
 	min-width 330px
 	max-width 330px
 	height 100%
-	margin-right 16px
 	background isDark ? #282C37 : #fff
 	border-radius 6px
 	box-shadow 0 2px 16px rgba(#000, 0.1)
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index 8582a37b91..27d1cb8d47 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -111,14 +111,6 @@ export default Vue.extend({
 			return this.isRenote ? this.note.renote : this.note;
 		},
 
-		reactionsCount(): number {
-			return this.p.reactionCounts
-				? Object.keys(this.p.reactionCounts)
-					.map(key => this.p.reactionCounts[key])
-					.reduce((a, b) => a + b)
-				: 0;
-		},
-
 		urls(): string[] {
 			if (this.p.text) {
 				const ast = parse(this.p.text);
@@ -144,24 +136,6 @@ export default Vue.extend({
 		if (this.$store.getters.isSignedIn) {
 			this.connection.on('_connected_', this.onStreamConnected);
 		}
-
-		// Draw map
-		if (this.p.geo) {
-			const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
-			if (shouldShowMap) {
-				(this as any).os.getGoogleMaps().then(maps => {
-					const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
-					const map = new maps.Map(this.$refs.map, {
-						center: uluru,
-						zoom: 15
-					});
-					new maps.Marker({
-						position: uluru,
-						map: map
-					});
-				});
-			}
-		}
 	},
 
 	beforeDestroy() {
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index 079260972f..a31eb44dd0 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -1,12 +1,13 @@
 <template>
 <mk-ui :class="$style.root">
-	<div class="qlvquzbjribqcaozciifydkngcwtyzje">
+	<div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode">
 		<template v-for="column in columns">
 			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id"/>
 			<x-tl-column v-if="column.type == 'home'" :key="column.id" src="home"/>
 			<x-tl-column v-if="column.type == 'local'" :key="column.id" src="local"/>
 			<x-tl-column v-if="column.type == 'global'" :key="column.id" src="global"/>
 		</template>
+		<button>%fa:plus%</button>
 	</div>
 </mk-ui>
 </template>
@@ -72,6 +73,22 @@ root(isDark)
 	padding 16px 0 16px 16px
 	overflow auto
 
+	> div
+		margin-right 16px
+
+		&:last-of-type
+			margin-right 0
+
+	> button
+		padding 0 16px
+		color isDark ? #93a0a5 : #888
+
+		&:hover
+			color isDark ? #b8c5ca : #777
+
+		&:active
+			color isDark ? #fff : #555
+
 .qlvquzbjribqcaozciifydkngcwtyzje[data-darkmode]
 	root(true)
 

From 69b5de3346377ef2b7e5786e078d870717277084 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 05:18:08 +0900
Subject: [PATCH 143/369] wip

---
 .../app/common/views/components/index.ts      |   2 +
 .../app/common/views/components/menu.vue      | 153 +++++++++++++++++
 .../app/common/views/components/note-menu.vue | 162 ++++--------------
 .../desktop/views/pages/deck/deck.column.vue  |  56 +++++-
 .../desktop/views/pages/deck/deck.list-tl.vue | 103 +++++++++++
 .../pages/deck/deck.notifications-column.vue  |   9 +-
 .../views/pages/deck/deck.tl-column.vue       |  26 +--
 .../app/desktop/views/pages/deck/deck.tl.vue  |   9 +-
 .../app/desktop/views/pages/deck/deck.vue     |  68 +++++++-
 src/client/app/mios.ts                        |   6 +-
 src/client/app/store.ts                       |  74 ++++++++
 11 files changed, 505 insertions(+), 163 deletions(-)
 create mode 100644 src/client/app/common/views/components/menu.vue
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.list-tl.vue

diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index df74f5ddfb..f30e3f953b 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -1,6 +1,7 @@
 import Vue from 'vue';
 
 import analogClock from './analog-clock.vue';
+import menu from './menu.vue';
 import signin from './signin.vue';
 import signup from './signup.vue';
 import forkit from './forkit.vue';
@@ -29,6 +30,7 @@ import Othello from './othello.vue';
 import welcomeTimeline from './welcome-timeline.vue';
 
 Vue.component('mk-analog-clock', analogClock);
+Vue.component('mk-menu', menu);
 Vue.component('mk-signin', signin);
 Vue.component('mk-signup', signup);
 Vue.component('mk-forkit', forkit);
diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue
new file mode 100644
index 0000000000..e5df8345b9
--- /dev/null
+++ b/src/client/app/common/views/components/menu.vue
@@ -0,0 +1,153 @@
+<template>
+<div class="mk-menu">
+	<div class="backdrop" ref="backdrop" @click="close"></div>
+	<div class="popover" :class="{ compact }" ref="popover">
+		<button v-for="item in items" @click="clicked(item.onClick)" v-html="item.content"></button>
+	</div>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import * as anime from 'animejs';
+
+export default Vue.extend({
+	props: ['source', 'compact', 'items'],
+	mounted() {
+		this.$nextTick(() => {
+			const popover = this.$refs.popover as any;
+
+			const rect = this.source.getBoundingClientRect();
+			const width = popover.offsetWidth;
+			const height = popover.offsetHeight;
+
+			if (this.compact) {
+				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
+				const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2);
+				popover.style.left = (x - (width / 2)) + 'px';
+				popover.style.top = (y - (height / 2)) + 'px';
+			} else {
+				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
+				const y = rect.top + window.pageYOffset + this.source.offsetHeight;
+				popover.style.left = (x - (width / 2)) + 'px';
+				popover.style.top = y + 'px';
+			}
+
+			anime({
+				targets: this.$refs.backdrop,
+				opacity: 1,
+				duration: 100,
+				easing: 'linear'
+			});
+
+			anime({
+				targets: this.$refs.popover,
+				opacity: 1,
+				scale: [0.5, 1],
+				duration: 500
+			});
+		});
+	},
+	methods: {
+		clicked(fn) {
+			fn();
+			this.close();
+		},
+		close() {
+			(this.$refs.backdrop as any).style.pointerEvents = 'none';
+			anime({
+				targets: this.$refs.backdrop,
+				opacity: 0,
+				duration: 200,
+				easing: 'linear'
+			});
+
+			(this.$refs.popover as any).style.pointerEvents = 'none';
+			anime({
+				targets: this.$refs.popover,
+				opacity: 0,
+				scale: 0.5,
+				duration: 200,
+				easing: 'easeInBack',
+				complete: () => {
+					this.$emit('closed');
+					this.$destroy();
+				}
+			});
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+$border-color = rgba(27, 31, 35, 0.15)
+
+.mk-menu
+	position initial
+
+	> .backdrop
+		position fixed
+		top 0
+		left 0
+		z-index 10000
+		width 100%
+		height 100%
+		background rgba(#000, 0.1)
+		opacity 0
+
+	> .popover
+		position absolute
+		z-index 10001
+		padding 8px 0
+		background #fff
+		border 1px solid $border-color
+		border-radius 4px
+		box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
+		transform scale(0.5)
+		opacity 0
+
+		$balloon-size = 16px
+
+		&:not(.compact)
+			margin-top $balloon-size
+			transform-origin center -($balloon-size)
+
+			&:before
+				content ""
+				display block
+				position absolute
+				top -($balloon-size * 2)
+				left s('calc(50% - %s)', $balloon-size)
+				border-top solid $balloon-size transparent
+				border-left solid $balloon-size transparent
+				border-right solid $balloon-size transparent
+				border-bottom solid $balloon-size $border-color
+
+			&:after
+				content ""
+				display block
+				position absolute
+				top -($balloon-size * 2) + 1.5px
+				left s('calc(50% - %s)', $balloon-size)
+				border-top solid $balloon-size transparent
+				border-left solid $balloon-size transparent
+				border-right solid $balloon-size transparent
+				border-bottom solid $balloon-size #fff
+
+		> button
+			display block
+			padding 8px 16px
+			width 100%
+
+			&:hover
+				color $theme-color-foreground
+				background $theme-color
+				text-decoration none
+
+			&:active
+				color $theme-color-foreground
+				background darken($theme-color, 10%)
+
+</style>
diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue
index a400610a2b..951a9ed1d9 100644
--- a/src/client/app/common/views/components/note-menu.vue
+++ b/src/client/app/common/views/components/note-menu.vue
@@ -1,55 +1,41 @@
 <template>
-<div class="mk-note-menu">
-	<div class="backdrop" ref="backdrop" @click="close"></div>
-	<div class="popover" :class="{ compact }" ref="popover">
-		<button @click="favorite">%i18n:@favorite%</button>
-		<button v-if="note.userId == $store.state.i.id" @click="pin">%i18n:@pin%</button>
-		<button v-if="note.userId == $store.state.i.id" @click="del">%i18n:@delete%</button>
-		<a v-if="note.uri" :href="note.uri" target="_blank">%i18n:@remote%</a>
-	</div>
+<div class="mk-note-menu" style="position:initial">
+	<mk-menu ref="menu" :source="source" :compact="compact" :items="items" @closed="$destroy"/>
 </div>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
-import * as anime from 'animejs';
 
 export default Vue.extend({
 	props: ['note', 'source', 'compact'],
-	mounted() {
-		this.$nextTick(() => {
-			const popover = this.$refs.popover as any;
-
-			const rect = this.source.getBoundingClientRect();
-			const width = popover.offsetWidth;
-			const height = popover.offsetHeight;
-
-			if (this.compact) {
-				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
-				const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2);
-				popover.style.left = (x - (width / 2)) + 'px';
-				popover.style.top = (y - (height / 2)) + 'px';
-			} else {
-				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
-				const y = rect.top + window.pageYOffset + this.source.offsetHeight;
-				popover.style.left = (x - (width / 2)) + 'px';
-				popover.style.top = y + 'px';
+	computed: {
+		items() {
+			const items = [];
+			items.push({
+				content: '%i18n:@favorite%',
+				onClick: this.favorite
+			});
+			if (this.note.userId == this.$store.state.i.id) {
+				items.push({
+					content: '%i18n:@pin%',
+					onClick: this.pin
+				});
+				items.push({
+					content: '%i18n:@delete%',
+					onClick: this.del
+				});
 			}
-
-			anime({
-				targets: this.$refs.backdrop,
-				opacity: 1,
-				duration: 100,
-				easing: 'linear'
-			});
-
-			anime({
-				targets: this.$refs.popover,
-				opacity: 1,
-				scale: [0.5, 1],
-				duration: 500
-			});
-		});
+			if (this.note.uri) {
+				items.push({
+					content: '%i18n:@remote%',
+					onClick: () => {
+						window.open(this.note.uri, '_blank');
+					}
+				});
+			}
+			return items;
+		}
 	},
 	methods: {
 		pin() {
@@ -78,98 +64,8 @@ export default Vue.extend({
 		},
 
 		close() {
-			(this.$refs.backdrop as any).style.pointerEvents = 'none';
-			anime({
-				targets: this.$refs.backdrop,
-				opacity: 0,
-				duration: 200,
-				easing: 'linear'
-			});
-
-			(this.$refs.popover as any).style.pointerEvents = 'none';
-			anime({
-				targets: this.$refs.popover,
-				opacity: 0,
-				scale: 0.5,
-				duration: 200,
-				easing: 'easeInBack',
-				complete: () => this.$destroy()
-			});
+			this.$refs.menu.close();
 		}
 	}
 });
 </script>
-
-<style lang="stylus" scoped>
-@import '~const.styl'
-
-$border-color = rgba(27, 31, 35, 0.15)
-
-.mk-note-menu
-	position initial
-
-	> .backdrop
-		position fixed
-		top 0
-		left 0
-		z-index 10000
-		width 100%
-		height 100%
-		background rgba(#000, 0.1)
-		opacity 0
-
-	> .popover
-		position absolute
-		z-index 10001
-		padding 8px 0
-		background #fff
-		border 1px solid $border-color
-		border-radius 4px
-		box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
-		transform scale(0.5)
-		opacity 0
-
-		$balloon-size = 16px
-
-		&:not(.compact)
-			margin-top $balloon-size
-			transform-origin center -($balloon-size)
-
-			&:before
-				content ""
-				display block
-				position absolute
-				top -($balloon-size * 2)
-				left s('calc(50% - %s)', $balloon-size)
-				border-top solid $balloon-size transparent
-				border-left solid $balloon-size transparent
-				border-right solid $balloon-size transparent
-				border-bottom solid $balloon-size $border-color
-
-			&:after
-				content ""
-				display block
-				position absolute
-				top -($balloon-size * 2) + 1.5px
-				left s('calc(50% - %s)', $balloon-size)
-				border-top solid $balloon-size transparent
-				border-left solid $balloon-size transparent
-				border-right solid $balloon-size transparent
-				border-bottom solid $balloon-size #fff
-
-		> button
-		> a
-			display block
-			padding 8px 16px
-			width 100%
-
-			&:hover
-				color $theme-color-foreground
-				background $theme-color
-				text-decoration none
-
-			&:active
-				color $theme-color-foreground
-				background darken($theme-color, 10%)
-
-</style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index bae28f3a64..2e95086f4e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -2,6 +2,7 @@
 <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs">
 	<header :class="{ indicate }">
 		<slot name="header"></slot>
+		<button ref="menu" @click="menu">%fa:caret-down%</button>
 	</header>
 	<div ref="body">
 		<slot></slot>
@@ -11,8 +12,16 @@
 
 <script lang="ts">
 import Vue from 'vue';
+import Menu from '../../../../common/views/components/menu.vue';
 
 export default Vue.extend({
+	props: {
+		id: {
+			type: String,
+			required: false
+		}
+	},
+
 	data() {
 		return {
 			indicate: false
@@ -48,6 +57,29 @@ export default Vue.extend({
 				const current = this.$refs.body.scrollTop + this.$refs.body.clientHeight;
 				if (current > this.$refs.body.scrollHeight - 1) this.$emit('bottom');
 			}
+		},
+
+		menu() {
+			this.os.new(Menu, {
+				source: this.$refs.menu,
+				compact: false,
+				items: [{
+					content: '%fa:arrow-left% %i18n:@swap-left%',
+					onClick: () => {
+						this.$store.dispatch('settings/swapLeftDeckColumn', this.id);
+					}
+				}, {
+					content: '%fa:arrow-right% %i18n:@swap-right%',
+					onClick: () => {
+						this.$store.dispatch('settings/swapRightDeckColumn', this.id);
+					}
+				}, {
+					content: '%fa:trash-alt R% %i18n:@remove%',
+					onClick: () => {
+						this.$store.dispatch('settings/removeDeckColumn', this.id);
+					}
+				}]
+			});
 		}
 	}
 });
@@ -57,6 +89,8 @@ export default Vue.extend({
 @import '~const.styl'
 
 root(isDark)
+	$header-height = 42px
+
 	flex 1
 	min-width 330px
 	max-width 330px
@@ -68,7 +102,7 @@ root(isDark)
 
 	> header
 		z-index 1
-		line-height 42px
+		line-height $header-height
 		padding 0 16px
 		color isDark ? #e3e5e8 : #888
 		background isDark ? #313543 : #fff
@@ -77,8 +111,26 @@ root(isDark)
 		&.indicate
 			box-shadow 0 3px 0 0 $theme-color
 
+		> span
+			[data-fa]
+				margin-right 8px
+
+		> button
+			position absolute
+			top 0
+			right 0
+			width $header-height
+			line-height $header-height
+			color isDark ? #9baec8 : #ccc
+
+			&:hover
+				color isDark ? #b2c1d5 : #aaa
+
+			&:active
+				color isDark ? #b2c1d5 : #999
+
 	> div
-		height calc(100% - 42px)
+		height calc(100% - $header-height)
 		overflow auto
 		overflow-x hidden
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
new file mode 100644
index 0000000000..7b5e76ffec
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
@@ -0,0 +1,103 @@
+<template>
+	<x-notes ref="timeline" :more="existMore ? more : null"/>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XNotes from './deck.notes.vue';
+import { UserListStream } from '../../../../common/scripts/streaming/user-list';
+
+const fetchLimit = 10;
+
+export default Vue.extend({
+	components: {
+		XNotes
+	},
+
+	props: {
+		list: {
+			type: Object,
+			required: true
+		}
+	},
+
+	data() {
+		return {
+			fetching: true,
+			moreFetching: false,
+			existMore: false,
+			connection: null
+		};
+	},
+
+	mounted() {
+		if (this.connection) this.connection.close();
+		this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id);
+		this.connection.on('note', this.onNote);
+		this.connection.on('userAdded', this.onUserAdded);
+		this.connection.on('userRemoved', this.onUserRemoved);
+
+		this.fetch();
+	},
+
+	beforeDestroy() {
+		this.connection.close();
+	},
+
+	methods: {
+		fetch() {
+			this.fetching = true;
+
+			(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
+				(this as any).api('notes/user-list-timeline', {
+					listId: this.list.id,
+					limit: fetchLimit + 1,
+					includeMyRenotes: this.$store.state.settings.showMyRenotes,
+					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
+				}).then(notes => {
+					if (notes.length == fetchLimit + 1) {
+						notes.pop();
+						this.existMore = true;
+					}
+					res(notes);
+					this.fetching = false;
+					this.$emit('loaded');
+				}, rej);
+			}));
+		},
+		more() {
+			this.moreFetching = true;
+
+			const promise = (this as any).api('notes/user-list-timeline', {
+				listId: this.list.id,
+				limit: fetchLimit + 1,
+				untilId: (this.$refs.timeline as any).tail().id,
+				includeMyRenotes: this.$store.state.settings.showMyRenotes,
+				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
+			});
+
+			promise.then(notes => {
+				if (notes.length == fetchLimit + 1) {
+					notes.pop();
+				} else {
+					this.existMore = false;
+				}
+				notes.forEach(n => (this.$refs.timeline as any).append(n));
+				this.moreFetching = false;
+			});
+
+			return promise;
+		},
+		onNote(note) {
+			// Prepend a note
+			(this.$refs.timeline as any).prepend(note);
+		},
+		onUserAdded() {
+			this.fetch();
+		},
+		onUserRemoved() {
+			this.fetch();
+		}
+	}
+});
+</script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
index 0566989642..bfc2af1935 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -1,6 +1,6 @@
 <template>
 <div>
-	<x-column>
+	<x-column :id="id">
 		<span slot="header">%fa:bell R% %i18n:@notifications%</span>
 
 		<x-notifications/>
@@ -17,6 +17,13 @@ export default Vue.extend({
 	components: {
 		XColumn,
 		XNotifications
+	},
+
+	props: {
+		id: {
+			type: String,
+			required: true
+		}
 	}
 });
 </script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index 674f04077f..2781377762 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -1,13 +1,15 @@
 <template>
 <div>
-	<x-column>
+	<x-column :id="column.id">
 		<span slot="header">
-			<template v-if="src == 'home'">%fa:home% %i18n:@home%</template>
-			<template v-if="src == 'local'">%fa:R comments% %i18n:@local%</template>
-			<template v-if="src == 'global'">%fa:globe% %i18n:@global%</template>
-			<template v-if="src == 'list'">%fa:list% {{ list.title }}</template>
+			<template v-if="column.type == 'home'">%fa:home%%i18n:@home%</template>
+			<template v-if="column.type == 'local'">%fa:R comments%%i18n:@local%</template>
+			<template v-if="column.type == 'global'">%fa:globe%%i18n:@global%</template>
+			<template v-if="column.type == 'list'">%fa:list%{{ column.list.title }}</template>
 		</span>
-		<x-tl :src="src"/>
+
+		<x-list-tl v-if="column.type == 'list'" :list="column.list"/>
+		<x-tl v-else :src="column.type"/>
 	</x-column>
 </div>
 </template>
@@ -16,18 +18,20 @@
 import Vue from 'vue';
 import XColumn from './deck.column.vue';
 import XTl from './deck.tl.vue';
+import XListTl from './deck.list-tl.vue';
 
 export default Vue.extend({
 	components: {
 		XColumn,
-		XTl
+		XTl,
+		XListTl
 	},
 
 	props: {
-		src: {
-			type: String,
-			required: false
+		column: {
+			type: Object,
+			required: true
 		}
-	},
+	}
 });
 </script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue
index 0a788b32ed..8e9d783875 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue
@@ -27,9 +27,7 @@ export default Vue.extend({
 			moreFetching: false,
 			existMore: false,
 			connection: null,
-			connectionId: null,
-			unreadCount: 0,
-			date: null
+			connectionId: null
 		};
 	},
 
@@ -74,17 +72,12 @@ export default Vue.extend({
 	},
 
 	methods: {
-		mount(root) {
-			this.$refs.timeline.mount(root);
-		},
-
 		fetch() {
 			this.fetching = true;
 
 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
 				(this as any).api(this.endpoint, {
 					limit: fetchLimit + 1,
-					untilDate: this.date ? this.date.getTime() : undefined,
 					includeMyRenotes: this.$store.state.settings.showMyRenotes,
 					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 				}).then(notes => {
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index a31eb44dd0..ebec4f096c 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -2,12 +2,13 @@
 <mk-ui :class="$style.root">
 	<div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode">
 		<template v-for="column in columns">
-			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id"/>
-			<x-tl-column v-if="column.type == 'home'" :key="column.id" src="home"/>
-			<x-tl-column v-if="column.type == 'local'" :key="column.id" src="local"/>
-			<x-tl-column v-if="column.type == 'global'" :key="column.id" src="global"/>
+			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :id="column.id"/>
+			<x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/>
+			<x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/>
+			<x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/>
+			<x-tl-column v-if="column.type == 'list'" :key="column.id" :column="column"/>
 		</template>
-		<button>%fa:plus%</button>
+		<button ref="add" @click="add">%fa:plus%</button>
 	</div>
 </mk-ui>
 </template>
@@ -16,6 +17,8 @@
 import Vue from 'vue';
 import XTlColumn from './deck.tl-column.vue';
 import XNotificationsColumn from './deck.notifications-column.vue';
+import Menu from '../../../../common/views/components/menu.vue';
+import MkUserListsWindow from '../../components/user-lists-window.vue';
 import * as uuid from 'uuid';
 
 export default Vue.extend({
@@ -55,6 +58,61 @@ export default Vue.extend({
 				value: deck
 			});
 		}
+	},
+
+	methods: {
+		add() {
+			this.os.new(Menu, {
+				source: this.$refs.add,
+				compact: true,
+				items: [{
+					content: '%i18n:@home%',
+					onClick: () => {
+						this.$store.dispatch('settings/addDeckColumn', {
+							id: uuid(),
+							type: 'home'
+						});
+					}
+				}, {
+					content: '%i18n:@local%',
+					onClick: () => {
+						this.$store.dispatch('settings/addDeckColumn', {
+							id: uuid(),
+							type: 'local'
+						});
+					}
+				}, {
+					content: '%i18n:@global%',
+					onClick: () => {
+						this.$store.dispatch('settings/addDeckColumn', {
+							id: uuid(),
+							type: 'global'
+						});
+					}
+				}, {
+					content: '%i18n:@list%',
+					onClick: () => {
+						const w = (this as any).os.new(MkUserListsWindow);
+						w.$once('choosen', list => {
+							this.$store.dispatch('settings/addDeckColumn', {
+								id: uuid(),
+								type: 'list',
+								list: list
+							});
+							w.close();
+						});
+					}
+				}, {
+					content: '%i18n:@notifications%',
+					onClick: () => {
+						this.$store.dispatch('settings/addDeckColumn', {
+							id: uuid(),
+							type: 'notifications'
+						});
+					}
+				}]
+			});
+		}
 	}
 });
 </script>
diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts
index a8da5ddb55..c644e22087 100644
--- a/src/client/app/mios.ts
+++ b/src/client/app/mios.ts
@@ -73,12 +73,12 @@ export default class MiOS extends EventEmitter {
 	public app: Vue;
 
 	public new(vm, props) {
-		const w = new vm({
+		const x = new vm({
 			parent: this.app,
 			propsData: props
 		}).$mount();
-		document.body.appendChild(w.$el);
-		return w;
+		document.body.appendChild(x.$el);
+		return x;
 	}
 
 	/**
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index 7795c9477a..17faeb97e5 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -152,6 +152,44 @@ export default (os: MiOS) => new Vuex.Store({
 
 				removeMobileHomeWidget(state, widget) {
 					state.mobileHome = state.mobileHome.filter(w => w.id != widget.id);
+				},
+
+				addDeckColumn(state, column) {
+					if (state.deck.columns == null) state.deck.columns = [];
+					state.deck.columns.push(column);
+				},
+
+				removeDeckColumn(state, id) {
+					if (state.deck.columns == null) return;
+					state.deck.columns = state.deck.columns.filter(c => c.id != id);
+				},
+
+				swapLeftDeckColumn(state, id) {
+					if (state.deck.columns == null) return;
+					state.deck.columns.some((c, i) => {
+						if (c.id == id) {
+							const left = state.deck.columns[i - 1];
+							if (left) {
+								state.deck.columns[i - 1] = state.deck.columns[i];
+								state.deck.columns[i] = left;
+							}
+							return true;
+						}
+					});
+				},
+
+				swapRightDeckColumn(state, id) {
+					if (state.deck.columns == null) return;
+					state.deck.columns.some((c, i) => {
+						if (c.id == id) {
+							const right = state.deck.columns[i + 1];
+							if (right) {
+								state.deck.columns[i + 1] = state.deck.columns[i];
+								state.deck.columns[i] = right;
+							}
+							return true;
+						}
+					});
 				}
 			},
 
@@ -174,6 +212,42 @@ export default (os: MiOS) => new Vuex.Store({
 					}
 				},
 
+				addDeckColumn(ctx, column) {
+					ctx.commit('addDeckColumn', column);
+
+					os.api('i/update_client_setting', {
+						name: 'deck',
+						value: ctx.state.deck
+					});
+				},
+
+				removeDeckColumn(ctx, id) {
+					ctx.commit('removeDeckColumn', id);
+
+					os.api('i/update_client_setting', {
+						name: 'deck',
+						value: ctx.state.deck
+					});
+				},
+
+				swapLeftDeckColumn(ctx, id) {
+					ctx.commit('swapLeftDeckColumn', id);
+
+					os.api('i/update_client_setting', {
+						name: 'deck',
+						value: ctx.state.deck
+					});
+				},
+
+				swapRightDeckColumn(ctx, id) {
+					ctx.commit('swapRightDeckColumn', id);
+
+					os.api('i/update_client_setting', {
+						name: 'deck',
+						value: ctx.state.deck
+					});
+				},
+
 				addHomeWidget(ctx, widget) {
 					ctx.commit('addHomeWidget', widget);
 

From 781fffee4273370f316520385c24e112858de9a6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 05:18:46 +0900
Subject: [PATCH 144/369] 2.26.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 474b942135..983c2c8304 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.26.0",
-	"clientVersion": "1.0.6140",
+	"version": "2.26.1",
+	"clientVersion": "1.0.6148",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 380a369ecaa1501bc73c4cf46c8ae1435714021a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 05:29:31 +0900
Subject: [PATCH 145/369] oops

---
 src/client/app/desktop/views/pages/deck/deck.column.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 2e95086f4e..3dc2da1c77 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -130,7 +130,7 @@ root(isDark)
 				color isDark ? #b2c1d5 : #999
 
 	> div
-		height calc(100% - $header-height)
+		height "calc(100% - %s)" % $header-height
 		overflow auto
 		overflow-x hidden
 

From e8edda01a98c57bbb4a7fb71a5a2ece9f9e970ac Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 05:29:45 +0900
Subject: [PATCH 146/369] 2.26.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 983c2c8304..9c2bfb16e6 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.26.1",
-	"clientVersion": "1.0.6148",
+	"version": "2.26.2",
+	"clientVersion": "1.0.6150",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From ed8fa59639da195804ccfad129225c3d82fbf10f Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 05:39:05 +0900
Subject: [PATCH 147/369] Update README.md

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 380795c7d1..a6eade4bc2 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@ ultimately sophisticated new type of mini-blog based SNS.
 ----------------------------------------------------------------
 * Reactions
 * User lists
+* Cusromizable column view (known as MisskeyDeck)
 * Private messages
 * Mute
 * Streaming

From fac686830584b572710f39f6b29cef71dc015e29 Mon Sep 17 00:00:00 2001
From: momf <m0fqn090310@gmail.com>
Date: Wed, 6 Jun 2018 09:46:33 +0900
Subject: [PATCH 148/369] fix: validate post's text with Ctrl+Enter on PC.

---
 src/client/app/desktop/views/components/post-form.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index 7b2adfe707..ac9b7bcede 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -209,7 +209,7 @@ export default Vue.extend({
 		},
 
 		onKeydown(e) {
-			if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post();
+			if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && canPost) this.post();
 		},
 
 		onPaste(e) {

From b0f989dbacbdbdd091b0d220496d22f47c795576 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 19:22:45 +0900
Subject: [PATCH 149/369] =?UTF-8?q?Deck=E3=81=AB=E3=82=A6=E3=82=A3?=
 =?UTF-8?q?=E3=82=B8=E3=82=A7=E3=83=83=E3=83=88=E3=82=92=E7=BD=AE=E3=81=91?=
 =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/client/app/common/define-widget.ts        |  21 +--
 .../app/common/scripts/streaming/home.ts      |  25 ++-
 .../app/common/views/components/menu.vue      |  10 +-
 .../app/common/views/widgets/broadcast.vue    |   2 +-
 .../app/common/views/widgets/calendar.vue     |   4 +-
 .../app/common/views/widgets/donation.vue     |   2 +-
 src/client/app/common/views/widgets/rss.vue   |   2 +-
 .../app/common/views/widgets/slideshow.vue    |   2 +-
 .../app/desktop/views/components/home.vue     |   4 +-
 .../views/components/widget-container.vue     |   2 +-
 .../desktop/views/pages/deck/deck.column.vue  |  74 ++++++---
 .../pages/deck/deck.notifications-column.vue  |   2 +-
 .../app/desktop/views/pages/deck/deck.vue     |  14 +-
 .../views/pages/deck/deck.widgets-column.vue  | 152 ++++++++++++++++++
 src/client/app/mobile/views/pages/widgets.vue |   4 +-
 src/client/app/store.ts                       |  89 ++++++----
 src/server/api/endpoints.ts                   |   5 +
 src/server/api/endpoints/i/update_home.ts     |  51 +-----
 .../api/endpoints/i/update_mobile_home.ts     |  52 +-----
 src/server/api/endpoints/i/update_widget.ts   |  79 +++++++++
 20 files changed, 417 insertions(+), 179 deletions(-)
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
 create mode 100644 src/server/api/endpoints/i/update_widget.ts

diff --git a/src/client/app/common/define-widget.ts b/src/client/app/common/define-widget.ts
index 0b2bc36566..2fae28be72 100644
--- a/src/client/app/common/define-widget.ts
+++ b/src/client/app/common/define-widget.ts
@@ -9,9 +9,9 @@ export default function<T extends object>(data: {
 			widget: {
 				type: Object
 			},
-			isMobile: {
-				type: Boolean,
-				default: false
+			platform: {
+				type: String,
+				required: true
 			},
 			isCustomizeMode: {
 				type: Boolean,
@@ -66,17 +66,10 @@ export default function<T extends object>(data: {
 
 				this.bakeProps();
 
-				if (this.isMobile) {
-					(this as any).api('i/update_mobile_home', {
-						id: this.id,
-						data: this.props
-					});
-				} else {
-					(this as any).api('i/update_home', {
-						id: this.id,
-						data: this.props
-					});
-				}
+				(this as any).api('i/update_widget', {
+					id: this.id,
+					data: this.props
+				});
 			}
 		}
 	});
diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts
index a27c55a60d..dd18c70d70 100644
--- a/src/client/app/common/scripts/streaming/home.ts
+++ b/src/client/app/common/scripts/streaming/home.ts
@@ -58,25 +58,18 @@ export class HomeStream extends Stream {
 		});
 
 		this.on('home_updated', x => {
-			if (x.home) {
-				os.store.commit('settings/setHome', x.home);
-			} else {
-				os.store.commit('settings/setHomeWidget', {
-					id: x.id,
-					data: x.data
-				});
-			}
+			os.store.commit('settings/setHome', x);
 		});
 
 		this.on('mobile_home_updated', x => {
-			if (x.home) {
-				os.store.commit('settings/setMobileHome', x.home);
-			} else {
-				os.store.commit('settings/setMobileHomeWidget', {
-					id: x.id,
-					data: x.data
-				});
-			}
+			os.store.commit('settings/setMobileHome', x);
+		});
+
+		this.on('widgetUpdated', x => {
+			os.store.commit('settings/setWidget', {
+				id: x.id,
+				data: x.data
+			});
 		});
 
 		// トークンが再生成されたとき
diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue
index e5df8345b9..73c8403ad3 100644
--- a/src/client/app/common/views/components/menu.vue
+++ b/src/client/app/common/views/components/menu.vue
@@ -2,7 +2,10 @@
 <div class="mk-menu">
 	<div class="backdrop" ref="backdrop" @click="close"></div>
 	<div class="popover" :class="{ compact }" ref="popover">
-		<button v-for="item in items" @click="clicked(item.onClick)" v-html="item.content"></button>
+		<template v-for="item in items">
+			<div v-if="item == null"></div>
+			<button v-else @click="clicked(item.onClick)" v-html="item.content"></button>
+		</template>
 	</div>
 </div>
 </template>
@@ -150,4 +153,9 @@ $border-color = rgba(27, 31, 35, 0.15)
 				color $theme-color-foreground
 				background darken($theme-color, 10%)
 
+		> div
+			margin 8px 0
+			height 1px
+			background #eee
+
 </style>
diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue
index f337cec853..69b2a54fe9 100644
--- a/src/client/app/common/views/widgets/broadcast.vue
+++ b/src/client/app/common/views/widgets/broadcast.vue
@@ -2,7 +2,7 @@
 <div class="mkw-broadcast"
 	:data-found="broadcasts.length != 0"
 	:data-melt="props.design == 1"
-	:data-mobile="isMobile"
+	:data-mobile="platform == 'mobile'"
 >
 	<div class="icon">
 		<svg height="32" version="1.1" viewBox="0 0 32 32" width="32">
diff --git a/src/client/app/common/views/widgets/calendar.vue b/src/client/app/common/views/widgets/calendar.vue
index 0e9714960a..333b56f629 100644
--- a/src/client/app/common/views/widgets/calendar.vue
+++ b/src/client/app/common/views/widgets/calendar.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="mkw-calendar" :data-special="special" :data-mobile="isMobile">
+<div class="mkw-calendar" :data-special="special" :data-mobile="platform == 'mobile'">
 	<mk-widget-container :naked="props.design == 1" :show-header="false">
 		<div class="mkw-calendar--body">
 			<div class="calendar" :data-is-holiday="isHoliday">
@@ -67,7 +67,7 @@ export default define({
 	},
 	methods: {
 		func() {
-			if (this.isMobile) return;
+			if (this.platform == 'mobile') return;
 			if (this.props.design == 2) {
 				this.props.design = 0;
 			} else {
diff --git a/src/client/app/common/views/widgets/donation.vue b/src/client/app/common/views/widgets/donation.vue
index 75f5db808a..470576d5e6 100644
--- a/src/client/app/common/views/widgets/donation.vue
+++ b/src/client/app/common/views/widgets/donation.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="mkw-donation" :data-mobile="isMobile">
+<div class="mkw-donation" :data-mobile="platform == 'mobile'">
 	<article>
 		<h1>%fa:heart%%i18n:@title%</h1>
 		<p>
diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue
index 7ac453e450..a777388cdb 100644
--- a/src/client/app/common/views/widgets/rss.vue
+++ b/src/client/app/common/views/widgets/rss.vue
@@ -4,7 +4,7 @@
 		<template slot="header">%fa:rss-square%RSS</template>
 		<button slot="func" title="設定" @click="setting">%fa:cog%</button>
 
-		<div class="mkw-rss--body" :data-mobile="isMobile">
+		<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
 			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
 			<div class="feed" v-else>
 				<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
diff --git a/src/client/app/common/views/widgets/slideshow.vue b/src/client/app/common/views/widgets/slideshow.vue
index 459b24a32f..e1c28f5115 100644
--- a/src/client/app/common/views/widgets/slideshow.vue
+++ b/src/client/app/common/views/widgets/slideshow.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="mkw-slideshow" :data-mobile="isMobile">
+<div class="mkw-slideshow" :data-mobile="platform == 'mobile'">
 	<div @click="choose">
 		<p v-if="props.folder === undefined">
 			<template v-if="isCustomizeMode">フォルダを指定するには、カスタマイズモードを終了してください</template>
diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index c30ca68210..826753c169 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -47,7 +47,7 @@
 				:key="place"
 			>
 				<div v-for="widget in widgets[place]" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="onWidgetContextmenu(widget.id)">
-					<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true"/>
+					<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="desktop"/>
 				</div>
 			</x-draggable>
 			<div class="main">
@@ -60,7 +60,7 @@
 		</template>
 		<template v-else>
 			<div v-for="place in ['left', 'right']" :class="place">
-				<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
+				<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp" platform="desktop"/>
 			</div>
 			<div class="main">
 				<mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/>
diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue
index 488e9cb249..7cfcd68eba 100644
--- a/src/client/app/desktop/views/components/widget-container.vue
+++ b/src/client/app/desktop/views/components/widget-container.vue
@@ -36,7 +36,7 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 root(isDark)
 	background isDark ? #282C37 : #fff
-	border solid 1px rgba(#000, 0.075)
+	border solid 1px rgba(#000, isDark ? 0.2 : 0.075)
 	border-radius 6px
 	overflow hidden
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 3dc2da1c77..e9f013734a 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,8 +1,8 @@
 <template>
-<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs">
+<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow }">
 	<header :class="{ indicate }">
 		<slot name="header"></slot>
-		<button ref="menu" @click="menu">%fa:caret-down%</button>
+		<button ref="menu" @click="showMenu">%fa:caret-down%</button>
 	</header>
 	<div ref="body">
 		<slot></slot>
@@ -19,6 +19,20 @@ export default Vue.extend({
 		id: {
 			type: String,
 			required: false
+		},
+		menu: {
+			type: Array,
+			required: false
+		},
+		naked: {
+			type: Boolean,
+			required: false,
+			default: false
+		},
+		narrow: {
+			type: Boolean,
+			required: false,
+			default: false
 		}
 	},
 
@@ -59,26 +73,33 @@ export default Vue.extend({
 			}
 		},
 
-		menu() {
+		showMenu() {
+			const items = [{
+				content: '%fa:arrow-left% %i18n:@swap-left%',
+				onClick: () => {
+					this.$store.dispatch('settings/swapLeftDeckColumn', this.id);
+				}
+			}, {
+				content: '%fa:arrow-right% %i18n:@swap-right%',
+				onClick: () => {
+					this.$store.dispatch('settings/swapRightDeckColumn', this.id);
+				}
+			}, {
+				content: '%fa:trash-alt R% %i18n:@remove%',
+				onClick: () => {
+					this.$store.dispatch('settings/removeDeckColumn', this.id);
+				}
+			}];
+
+			if (this.menu) {
+				items.unshift(null);
+				this.menu.reverse().forEach(i => items.unshift(i));
+			}
+
 			this.os.new(Menu, {
 				source: this.$refs.menu,
 				compact: false,
-				items: [{
-					content: '%fa:arrow-left% %i18n:@swap-left%',
-					onClick: () => {
-						this.$store.dispatch('settings/swapLeftDeckColumn', this.id);
-					}
-				}, {
-					content: '%fa:arrow-right% %i18n:@swap-right%',
-					onClick: () => {
-						this.$store.dispatch('settings/swapRightDeckColumn', this.id);
-					}
-				}, {
-					content: '%fa:trash-alt R% %i18n:@remove%',
-					onClick: () => {
-						this.$store.dispatch('settings/removeDeckColumn', this.id);
-					}
-				}]
+				items
 			});
 		}
 	}
@@ -100,6 +121,21 @@ root(isDark)
 	box-shadow 0 2px 16px rgba(#000, 0.1)
 	overflow hidden
 
+	&.narrow
+		min-width 285px
+		max-width 285px
+
+	&.naked
+		background rgba(#000, isDark ? 0.25 : 0.1)
+
+		> header
+			background transparent
+			box-shadow none
+
+			if !isDark
+				> button
+					color #bbb
+
 	> header
 		z-index 1
 		line-height $header-height
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
index bfc2af1935..b92614314c 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<x-column :id="id">
-		<span slot="header">%fa:bell R% %i18n:@notifications%</span>
+		<span slot="header">%fa:bell R%%i18n:@notifications%</span>
 
 		<x-notifications/>
 	</x-column>
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index ebec4f096c..4935d9a5bd 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -2,6 +2,7 @@
 <mk-ui :class="$style.root">
 	<div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode">
 		<template v-for="column in columns">
+			<x-widgets-column v-if="column.type == 'widgets'" :key="column.id" :column="column"/>
 			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :id="column.id"/>
 			<x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/>
 			<x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/>
@@ -17,6 +18,7 @@
 import Vue from 'vue';
 import XTlColumn from './deck.tl-column.vue';
 import XNotificationsColumn from './deck.notifications-column.vue';
+import XWidgetsColumn from './deck.widgets-column.vue';
 import Menu from '../../../../common/views/components/menu.vue';
 import MkUserListsWindow from '../../components/user-lists-window.vue';
 import * as uuid from 'uuid';
@@ -24,7 +26,8 @@ import * as uuid from 'uuid';
 export default Vue.extend({
 	components: {
 		XTlColumn,
-		XNotificationsColumn
+		XNotificationsColumn,
+		XWidgetsColumn
 	},
 	computed: {
 		columns() {
@@ -110,6 +113,15 @@ export default Vue.extend({
 							type: 'notifications'
 						});
 					}
+				}, {
+					content: '%i18n:@widgets%',
+					onClick: () => {
+						this.$store.dispatch('settings/addDeckColumn', {
+							id: uuid(),
+							type: 'widgets',
+							widgets: []
+						});
+					}
 				}]
 			});
 		}
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
new file mode 100644
index 0000000000..0b2cc305f4
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -0,0 +1,152 @@
+<template>
+<div class="wtdtxvecapixsepjtcupubtsmometobz">
+	<x-column :id="column.id" :menu="menu" :naked="true" :narrow="true">
+		<span slot="header">%fa:calculator%%i18n:@widgets%</span>
+
+		<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
+			<template v-if="edit">
+				<header>
+					<select v-model="widgetAdderSelected">
+						<option value="profile">%i18n:common.widgets.profile%</option>
+						<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
+						<option value="calendar">%i18n:common.widgets.calendar%</option>
+						<option value="timemachine">%i18n:common.widgets.timemachine%</option>
+						<option value="activity">%i18n:common.widgets.activity%</option>
+						<option value="rss">%i18n:common.widgets.rss%</option>
+						<option value="trends">%i18n:common.widgets.trends%</option>
+						<option value="photo-stream">%i18n:common.widgets.photo-stream%</option>
+						<option value="slideshow">%i18n:common.widgets.slideshow%</option>
+						<option value="version">%i18n:common.widgets.version%</option>
+						<option value="broadcast">%i18n:common.widgets.broadcast%</option>
+						<option value="notifications">%i18n:common.widgets.notifications%</option>
+						<option value="users">%i18n:common.widgets.users%</option>
+						<option value="polls">%i18n:common.widgets.polls%</option>
+						<option value="post-form">%i18n:common.widgets.post-form%</option>
+						<option value="messaging">%i18n:common.widgets.messaging%</option>
+						<option value="memo">%i18n:common.widgets.memo%</option>
+						<option value="server">%i18n:common.widgets.server%</option>
+						<option value="donation">%i18n:common.widgets.donation%</option>
+						<option value="nav">%i18n:common.widgets.nav%</option>
+						<option value="tips">%i18n:common.widgets.tips%</option>
+					</select>
+					<button @click="addWidget">追加</button>
+				</header>
+				<x-draggable
+					:list="column.widgets"
+					:options="{ handle: '.handle', animation: 150 }"
+					@sort="onWidgetSort"
+				>
+					<div v-for="widget in column.widgets" class="customize-container" :key="widget.id">
+						<header>
+							<span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button>
+						</header>
+						<div @click="widgetFunc(widget.id)">
+							<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/>
+						</div>
+					</div>
+				</x-draggable>
+			</template>
+			<template v-else>
+				<component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck"/>
+			</template>
+		</div>
+	</x-column>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XColumn from './deck.column.vue';
+import * as XDraggable from 'vuedraggable';
+import * as uuid from 'uuid';
+
+export default Vue.extend({
+	components: {
+		XColumn,
+		XDraggable
+	},
+
+	props: {
+		column: {
+			type: Object,
+			required: true
+		}
+	},
+
+	data() {
+		return {
+			edit: false,
+			menu: null,
+			widgetAdderSelected: null
+		}
+	},
+
+	created() {
+		this.menu = [{
+			content: '%fa:cog% %i18n:@edit%',
+			onClick: () => {
+				this.edit = !this.edit;
+			}
+		}];
+	},
+
+	methods: {
+		widgetFunc(id) {
+			const w = this.$refs[id][0];
+			if (w.func) w.func();
+		},
+
+		onWidgetSort() {
+			this.saveWidgets();
+		},
+
+		addWidget() {
+			this.$store.dispatch('settings/addDeckWidget', {
+				id: this.column.id,
+				widget: {
+					name: this.widgetAdderSelected,
+					id: uuid(),
+					data: {}
+				}
+			});
+		},
+
+		removeWidget(widget) {
+			this.$store.dispatch('settings/removeDeckWidget', {
+				id: this.column.id,
+				widget
+			});
+		},
+
+		saveWidgets() {
+			this.$store.dispatch('settings/saveDeck');
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	.gqpwvtwtprsbmnssnbicggtwqhmylhnq
+		.widget, .customize-container
+			margin 8px
+
+			&:first-of-type
+				margin-top 0
+
+		.customize-container
+			background #fff
+
+		> header
+			color isDark ? #fff : #000
+
+.wtdtxvecapixsepjtcupubtsmometobz[data-darkmode]
+	root(true)
+
+.wtdtxvecapixsepjtcupubtsmometobz:not([data-darkmode])
+	root(false)
+
+</style>
+
diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue
index a0893770e8..eab0ca6a38 100644
--- a/src/client/app/mobile/views/pages/widgets.vue
+++ b/src/client/app/mobile/views/pages/widgets.vue
@@ -35,13 +35,13 @@
 						<span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button>
 					</header>
 					<div @click="widgetFunc(widget.id)">
-						<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" :is-mobile="true"/>
+						<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="mobile"/>
 					</div>
 				</div>
 			</x-draggable>
 		</template>
 		<template v-else>
-			<component class="widget" v-for="widget in widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" :is-mobile="true"/>
+			<component class="widget" v-for="widget in widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="mobile"/>
 		</template>
 	</main>
 </mk-ui>
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index 17faeb97e5..5582ff6c57 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -124,13 +124,6 @@ export default (os: MiOS) => new Vuex.Store({
 					state.home = data;
 				},
 
-				setHomeWidget(state, x) {
-					const w = state.home.find(w => w.id == x.id);
-					if (w) {
-						w.data = x.data;
-					}
-				},
-
 				addHomeWidget(state, widget) {
 					state.home.unshift(widget);
 				},
@@ -139,11 +132,36 @@ export default (os: MiOS) => new Vuex.Store({
 					state.mobileHome = data;
 				},
 
-				setMobileHomeWidget(state, x) {
-					const w = state.mobileHome.find(w => w.id == x.id);
-					if (w) {
-						w.data = x.data;
+				setWidget(state, x) {
+					let w;
+
+					//#region Decktop home
+					if (state.home) {
+						w = state.home.find(w => w.id == x.id);
+						if (w) {
+							w.data = x.data;
+						}
 					}
+					//#endregion
+
+					//#region Mobile home
+					if (state.mobileHome) {
+						w = state.mobileHome.find(w => w.id == x.id);
+						if (w) {
+							w.data = x.data;
+						}
+					}
+					//#endregion
+
+					//#region Deck
+					if (state.deck && state.deck.columns) {
+						state.deck.columns.filter(c => c.type == 'widgets').forEach(c => {
+							c.widgets.forEach(w => {
+								if (w.id == x.id) w.data = x.data;
+							});
+						});
+					}
+					//#endregion
 				},
 
 				addMobileHomeWidget(state, widget) {
@@ -190,6 +208,20 @@ export default (os: MiOS) => new Vuex.Store({
 							return true;
 						}
 					});
+				},
+
+				addDeckWidget(state, x) {
+					if (state.deck.columns == null) return;
+					const column = state.deck.columns.find(c => c.id == x.id);
+					if (column == null) return;
+					column.widgets.unshift(x.widget);
+				},
+
+				removeDeckWidget(state, x) {
+					if (state.deck.columns == null) return;
+					const column = state.deck.columns.find(c => c.id == x.id);
+					if (column == null) return;
+					column.widgets = column.widgets.filter(w => w.id != x.widget.id);
 				}
 			},
 
@@ -212,40 +244,41 @@ export default (os: MiOS) => new Vuex.Store({
 					}
 				},
 
-				addDeckColumn(ctx, column) {
-					ctx.commit('addDeckColumn', column);
-
+				saveDeck(ctx) {
 					os.api('i/update_client_setting', {
 						name: 'deck',
 						value: ctx.state.deck
 					});
 				},
 
+				addDeckColumn(ctx, column) {
+					ctx.commit('addDeckColumn', column);
+					ctx.dispatch('saveDeck');
+				},
+
 				removeDeckColumn(ctx, id) {
 					ctx.commit('removeDeckColumn', id);
-
-					os.api('i/update_client_setting', {
-						name: 'deck',
-						value: ctx.state.deck
-					});
+					ctx.dispatch('saveDeck');
 				},
 
 				swapLeftDeckColumn(ctx, id) {
 					ctx.commit('swapLeftDeckColumn', id);
-
-					os.api('i/update_client_setting', {
-						name: 'deck',
-						value: ctx.state.deck
-					});
+					ctx.dispatch('saveDeck');
 				},
 
 				swapRightDeckColumn(ctx, id) {
 					ctx.commit('swapRightDeckColumn', id);
+					ctx.dispatch('saveDeck');
+				},
 
-					os.api('i/update_client_setting', {
-						name: 'deck',
-						value: ctx.state.deck
-					});
+				addDeckWidget(ctx, x) {
+					ctx.commit('addDeckWidget', x);
+					ctx.dispatch('saveDeck');
+				},
+
+				removeDeckWidget(ctx, x) {
+					ctx.commit('removeDeckWidget', x);
+					ctx.dispatch('saveDeck');
 				},
 
 				addHomeWidget(ctx, widget) {
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index e9392d236b..94e649d29b 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -189,6 +189,11 @@ const endpoints: Endpoint[] = [
 		withCredential: true,
 		secure: true
 	},
+	{
+		name: 'i/update_widget',
+		withCredential: true,
+		secure: true
+	},
 	{
 		name: 'i/change_password',
 		withCredential: true,
diff --git a/src/server/api/endpoints/i/update_home.ts b/src/server/api/endpoints/i/update_home.ts
index 8ce551957e..48f6dbbb7a 100644
--- a/src/server/api/endpoints/i/update_home.ts
+++ b/src/server/api/endpoints/i/update_home.ts
@@ -1,6 +1,3 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import User from '../../../../models/user';
 import event from '../../../../publishers/stream';
@@ -13,50 +10,16 @@ module.exports = async (params, user) => new Promise(async (res, rej) => {
 			.have('id', $.str)
 			.have('place', $.str)
 			.have('data', $.obj))
-		.optional()
 		.get(params.home);
 	if (homeErr) return rej('invalid home param');
 
-	// Get 'id' parameter
-	const [id, idErr] = $.str.optional().get(params.id);
-	if (idErr) return rej('invalid id param');
+	await User.update(user._id, {
+		$set: {
+			'clientSettings.home': home
+		}
+	});
 
-	// Get 'data' parameter
-	const [data, dataErr] = $.obj.optional().get(params.data);
-	if (dataErr) return rej('invalid data param');
+	res();
 
-	if (home) {
-		await User.update(user._id, {
-			$set: {
-				'clientSettings.home': home
-			}
-		});
-
-		res();
-
-		event(user._id, 'home_updated', {
-			home
-		});
-	} else {
-		if (id == null && data == null) return rej('you need to set id and data params if home param unset');
-
-		const _home = user.clientSettings.home;
-		const widget = _home.find(w => w.id == id);
-
-		if (widget == null) return rej('widget not found');
-
-		widget.data = data;
-
-		await User.update(user._id, {
-			$set: {
-				'clientSettings.home': _home
-			}
-		});
-
-		res();
-
-		event(user._id, 'home_updated', {
-			id, data
-		});
-	}
+	event(user._id, 'home_updated', home);
 });
diff --git a/src/server/api/endpoints/i/update_mobile_home.ts b/src/server/api/endpoints/i/update_mobile_home.ts
index d79a77072b..d285a0a72d 100644
--- a/src/server/api/endpoints/i/update_mobile_home.ts
+++ b/src/server/api/endpoints/i/update_mobile_home.ts
@@ -1,6 +1,3 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import User from '../../../../models/user';
 import event from '../../../../publishers/stream';
@@ -12,49 +9,16 @@ module.exports = async (params, user) => new Promise(async (res, rej) => {
 			.have('name', $.str)
 			.have('id', $.str)
 			.have('data', $.obj))
-		.optional().get(params.home);
+		.get(params.home);
 	if (homeErr) return rej('invalid home param');
 
-	// Get 'id' parameter
-	const [id, idErr] = $.str.optional().get(params.id);
-	if (idErr) return rej('invalid id param');
+	await User.update(user._id, {
+		$set: {
+			'clientSettings.mobileHome': home
+		}
+	});
 
-	// Get 'data' parameter
-	const [data, dataErr] = $.obj.optional().get(params.data);
-	if (dataErr) return rej('invalid data param');
+	res();
 
-	if (home) {
-		await User.update(user._id, {
-			$set: {
-				'clientSettings.mobileHome': home
-			}
-		});
-
-		res();
-
-		event(user._id, 'mobile_home_updated', {
-			home
-		});
-	} else {
-		if (id == null && data == null) return rej('you need to set id and data params if home param unset');
-
-		const _home = user.clientSettings.mobileHome || [];
-		const widget = _home.find(w => w.id == id);
-
-		if (widget == null) return rej('widget not found');
-
-		widget.data = data;
-
-		await User.update(user._id, {
-			$set: {
-				'clientSettings.mobileHome': _home
-			}
-		});
-
-		res();
-
-		event(user._id, 'mobile_home_updated', {
-			id, data
-		});
-	}
+	event(user._id, 'mobile_home_updated', home);
 });
diff --git a/src/server/api/endpoints/i/update_widget.ts b/src/server/api/endpoints/i/update_widget.ts
new file mode 100644
index 0000000000..b37761bde1
--- /dev/null
+++ b/src/server/api/endpoints/i/update_widget.ts
@@ -0,0 +1,79 @@
+import $ from 'cafy';
+import User from '../../../../models/user';
+import event from '../../../../publishers/stream';
+
+module.exports = async (params, user) => new Promise(async (res, rej) => {
+	// Get 'id' parameter
+	const [id, idErr] = $.str.get(params.id);
+	if (idErr) return rej('invalid id param');
+
+	// Get 'data' parameter
+	const [data, dataErr] = $.obj.get(params.data);
+	if (dataErr) return rej('invalid data param');
+
+	if (id == null && data == null) return rej('you need to set id and data params if home param unset');
+
+	let widget;
+
+	//#region Desktop home
+	if (widget == null && user.clientSettings.home) {
+		const desktopHome = user.clientSettings.home;
+		widget = desktopHome.find(w => w.id == id);
+		if (widget) {
+				widget.data = data;
+
+			await User.update(user._id, {
+				$set: {
+					'clientSettings.home': desktopHome
+				}
+			});
+		}
+	}
+	//#endregion
+
+	//#region Mobile home
+	if (widget == null && user.clientSettings.mobileHome) {
+		const mobileHome = user.clientSettings.mobileHome;
+		widget = mobileHome.find(w => w.id == id);
+		if (widget) {
+				widget.data = data;
+
+			await User.update(user._id, {
+				$set: {
+					'clientSettings.mobileHome': mobileHome
+				}
+			});
+		}
+	}
+	//#endregion
+
+	//#region Deck
+	if (widget == null && user.clientSettings.deck && user.clientSettings.deck.columns) {
+		const deck = user.clientSettings.deck;
+		deck.columns.filter(c => c.type == 'widgets').forEach(c => {
+			c.widgets.forEach(w => {
+				if (w.id == id) widget = w;
+			});
+		});
+		if (widget) {
+				widget.data = data;
+
+			await User.update(user._id, {
+				$set: {
+					'clientSettings.deck': deck
+				}
+			});
+		}
+	}
+	//#endregion
+
+	if (widget) {
+		event(user._id, 'widgetUpdated', {
+			id, data
+		});
+
+		res();
+	} else {
+		rej('widget not found');
+	}
+});

From dc58c9bd2f3d91252719a931efadaa043878d349 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 19:24:34 +0900
Subject: [PATCH 150/369] 2.27.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 9c2bfb16e6..7a063e1ea4 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.26.2",
-	"clientVersion": "1.0.6150",
+	"version": "2.27.0",
+	"clientVersion": "1.0.6156",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 1201794befc3aa52091f9a388a581219333d317d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 19:34:25 +0900
Subject: [PATCH 151/369] Revert "fix: validate post's text with Ctrl+Enter on
 PC."

This reverts commit fac686830584b572710f39f6b29cef71dc015e29.
---
 src/client/app/desktop/views/components/post-form.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index ac9b7bcede..7b2adfe707 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -209,7 +209,7 @@ export default Vue.extend({
 		},
 
 		onKeydown(e) {
-			if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && canPost) this.post();
+			if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post();
 		},
 
 		onPaste(e) {

From c1b320710bc543e6aabf3c67545554a8ae5b5d73 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 6 Jun 2018 19:37:15 +0900
Subject: [PATCH 152/369] 2.27.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 7a063e1ea4..25aa109552 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.27.0",
-	"clientVersion": "1.0.6156",
+	"version": "2.27.1",
+	"clientVersion": "1.0.6158",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From ebb98d975b23523313af3765115f2f6775474096 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 00:53:31 +0900
Subject: [PATCH 153/369] :v:

---
 src/client/app/desktop/style.styl                | 5 -----
 src/client/app/desktop/views/pages/deck/deck.vue | 1 +
 src/client/app/desktop/views/pages/welcome.vue   | 4 +---
 3 files changed, 2 insertions(+), 8 deletions(-)

diff --git a/src/client/app/desktop/style.styl b/src/client/app/desktop/style.styl
index f2a60955fd..3cd36482e4 100644
--- a/src/client/app/desktop/style.styl
+++ b/src/client/app/desktop/style.styl
@@ -42,8 +42,3 @@ html
 
 				&:active
 					background-color $theme-color
-
-body
-	display flex
-	flex-direction column
-	min-height 100%
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index 4935d9a5bd..ef54dd7fbd 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -140,6 +140,7 @@ export default Vue.extend({
 root(isDark)
 	display flex
 	flex 1
+	justify-content center
 	padding 16px 0 16px 16px
 	overflow auto
 
diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index cecd7e3a90..688d3e21cb 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -83,9 +83,7 @@ export default Vue.extend({
 @import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css);
 
 root(isDark)
-	display flex
-	flex-direction column
-	flex 1
+	min-height 100vh
 	background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg')
 	background-size cover
 	background-position center

From b85597b15d49c45a9ba26a64d758a765dd6c2709 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 01:00:38 +0900
Subject: [PATCH 154/369] Fix glitch

---
 src/client/app/desktop/views/pages/deck/deck.vue | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index ef54dd7fbd..b876dec103 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -29,12 +29,14 @@ export default Vue.extend({
 		XNotificationsColumn,
 		XWidgetsColumn
 	},
+
 	computed: {
 		columns() {
 			if (this.$store.state.settings.deck == null) return [];
 			return this.$store.state.settings.deck.columns;
 		}
 	},
+
 	created() {
 		if (this.$store.state.settings.deck == null) {
 			const deck = {
@@ -63,6 +65,14 @@ export default Vue.extend({
 		}
 	},
 
+	mounted() {
+		document.documentElement.style.overflow = 'hidden';
+	},
+
+	beforeDestroy() {
+		document.documentElement.style.overflow = 'auto';
+	},
+
 	methods: {
 		add() {
 			this.os.new(Menu, {

From 9ad7a804960e09f16bb5e00c491f14c61ef7e22a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 01:17:29 +0900
Subject: [PATCH 155/369] i18n

---
 locales/ja.yml                                   | 12 ++++++++++++
 .../app/desktop/views/pages/deck/deck.column.vue |  6 +++---
 .../pages/deck/deck.notifications-column.vue     |  2 +-
 .../desktop/views/pages/deck/deck.tl-column.vue  |  6 +++---
 src/client/app/desktop/views/pages/deck/deck.vue | 16 ++++++++--------
 .../views/pages/deck/deck.widgets-column.vue     |  4 ++--
 6 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 026c2308c3..8e04d0988f 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -76,6 +76,18 @@ common:
     nav: "ナビゲーション"
     tips: "ヒント"
 
+  deck:
+    widgets: "ウィジェット"
+    home: "ホーム"
+    local: "ローカル"
+    global: "グローバル"
+    notifications: "通知"
+    list: "リスト"
+    swap-left: "左に移動"
+    swap-right: "右に移動"
+    remove: "カラムを削除"
+    add-column: "カラムを追加"
+
 common/views/components/connect-failed.vue:
   title: "サーバーに接続できません"
   description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index e9f013734a..4dee0db91c 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -75,17 +75,17 @@ export default Vue.extend({
 
 		showMenu() {
 			const items = [{
-				content: '%fa:arrow-left% %i18n:@swap-left%',
+				content: '%fa:arrow-left% %i18n:common.deck.swap-left%',
 				onClick: () => {
 					this.$store.dispatch('settings/swapLeftDeckColumn', this.id);
 				}
 			}, {
-				content: '%fa:arrow-right% %i18n:@swap-right%',
+				content: '%fa:arrow-right% %i18n:common.deck.swap-right%',
 				onClick: () => {
 					this.$store.dispatch('settings/swapRightDeckColumn', this.id);
 				}
 			}, {
-				content: '%fa:trash-alt R% %i18n:@remove%',
+				content: '%fa:trash-alt R% %i18n:common.deck.remove%',
 				onClick: () => {
 					this.$store.dispatch('settings/removeDeckColumn', this.id);
 				}
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
index b92614314c..f57c52d2e1 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<x-column :id="id">
-		<span slot="header">%fa:bell R%%i18n:@notifications%</span>
+		<span slot="header">%fa:bell R%%i18n:common.deck.notifications%</span>
 
 		<x-notifications/>
 	</x-column>
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index 2781377762..54bc6bfc22 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -2,9 +2,9 @@
 <div>
 	<x-column :id="column.id">
 		<span slot="header">
-			<template v-if="column.type == 'home'">%fa:home%%i18n:@home%</template>
-			<template v-if="column.type == 'local'">%fa:R comments%%i18n:@local%</template>
-			<template v-if="column.type == 'global'">%fa:globe%%i18n:@global%</template>
+			<template v-if="column.type == 'home'">%fa:home%%i18n:common.deck.home%</template>
+			<template v-if="column.type == 'local'">%fa:R comments%%i18n:common.deck.local%</template>
+			<template v-if="column.type == 'global'">%fa:globe%%i18n:common.deck.global%</template>
 			<template v-if="column.type == 'list'">%fa:list%{{ column.list.title }}</template>
 		</span>
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index b876dec103..d6cbf7396d 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -9,7 +9,7 @@
 			<x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/>
 			<x-tl-column v-if="column.type == 'list'" :key="column.id" :column="column"/>
 		</template>
-		<button ref="add" @click="add">%fa:plus%</button>
+		<button ref="add" @click="add" title="%i18n:common.deck.add-column%">%fa:plus%</button>
 	</div>
 </mk-ui>
 </template>
@@ -79,7 +79,7 @@ export default Vue.extend({
 				source: this.$refs.add,
 				compact: true,
 				items: [{
-					content: '%i18n:@home%',
+					content: '%i18n:common.deck.home%',
 					onClick: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
@@ -87,7 +87,7 @@ export default Vue.extend({
 						});
 					}
 				}, {
-					content: '%i18n:@local%',
+					content: '%i18n:common.deck.local%',
 					onClick: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
@@ -95,7 +95,7 @@ export default Vue.extend({
 						});
 					}
 				}, {
-					content: '%i18n:@global%',
+					content: '%i18n:common.deck.global%',
 					onClick: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
@@ -103,7 +103,7 @@ export default Vue.extend({
 						});
 					}
 				}, {
-					content: '%i18n:@list%',
+					content: '%i18n:common.deck.list%',
 					onClick: () => {
 						const w = (this as any).os.new(MkUserListsWindow);
 						w.$once('choosen', list => {
@@ -116,7 +116,7 @@ export default Vue.extend({
 						});
 					}
 				}, {
-					content: '%i18n:@notifications%',
+					content: '%i18n:common.deck.notifications%',
 					onClick: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
@@ -124,7 +124,7 @@ export default Vue.extend({
 						});
 					}
 				}, {
-					content: '%i18n:@widgets%',
+					content: '%i18n:common.deck.widgets%',
 					onClick: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
@@ -155,7 +155,7 @@ root(isDark)
 	overflow auto
 
 	> div
-		margin-right 16px
+		margin-right 8px
 
 		&:last-of-type
 			margin-right 0
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 0b2cc305f4..34073160c1 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="wtdtxvecapixsepjtcupubtsmometobz">
 	<x-column :id="column.id" :menu="menu" :naked="true" :narrow="true">
-		<span slot="header">%fa:calculator%%i18n:@widgets%</span>
+		<span slot="header">%fa:calculator%%i18n:common.deck.widgets%</span>
 
 		<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
 			<template v-if="edit">
@@ -29,7 +29,7 @@
 						<option value="nav">%i18n:common.widgets.nav%</option>
 						<option value="tips">%i18n:common.widgets.tips%</option>
 					</select>
-					<button @click="addWidget">追加</button>
+					<button @click="addWidget">%i18n:@add%</button>
 				</header>
 				<x-draggable
 					:list="column.widgets"

From 388cb7db3a7ce8d6489b3d59875c41b2b140e32c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 01:41:05 +0900
Subject: [PATCH 156/369] :v:

---
 .../views/components/notifications.vue        |   2 +-
 .../views/pages/deck/deck.notification.vue    | 179 +++++++++++++++
 .../views/pages/deck/deck.notifications.vue   | 216 +++---------------
 3 files changed, 210 insertions(+), 187 deletions(-)
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.notification.vue

diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue
index f2247a782c..ada97d5c86 100644
--- a/src/client/app/desktop/views/components/notifications.vue
+++ b/src/client/app/desktop/views/components/notifications.vue
@@ -206,7 +206,7 @@ root(isDark)
 				margin 0
 				padding 16px
 				overflow-wrap break-word
-				font-size 0.9em
+				font-size 12px
 				border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
 
 				&:last-child
diff --git a/src/client/app/desktop/views/pages/deck/deck.notification.vue b/src/client/app/desktop/views/pages/deck/deck.notification.vue
new file mode 100644
index 0000000000..a145a94f8a
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.notification.vue
@@ -0,0 +1,179 @@
+<template>
+<div class="dsfykdcjpuwfvpefwufddclpjhzktmpw">
+	<div class="notification reaction" v-if="notification.type == 'reaction'">
+		<mk-avatar class="avatar" :user="notification.user"/>
+		<div>
+			<header>
+				<mk-reaction-icon :reaction="notification.reaction"/>
+				<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
+				<mk-time :time="notification.createdAt"/>
+			</header>
+			<router-link class="note-ref" :to="notification.note | notePage">
+				%fa:quote-left%{{ getNoteSummary(notification.note) }}
+				%fa:quote-right%
+			</router-link>
+		</div>
+	</div>
+
+	<div class="notification renote" v-if="notification.type == 'renote'">
+		<mk-avatar class="avatar" :user="notification.user"/>
+		<div>
+			<header>
+				%fa:retweet%
+				<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
+				<mk-time :time="notification.createdAt"/>
+			</header>
+			<router-link class="note-ref" :to="notification.note | notePage">
+				%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%
+			</router-link>
+		</div>
+	</div>
+
+	<div class="notification follow" v-if="notification.type == 'follow'">
+		<mk-avatar class="avatar" :user="notification.user"/>
+		<div>
+			<header>
+				%fa:user-plus%
+				<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
+				<mk-time :time="notification.createdAt"/>
+			</header>
+		</div>
+	</div>
+
+	<div class="notification followRequest" v-if="notification.type == 'receiveFollowRequest'">
+		<mk-avatar class="avatar" :user="notification.user"/>
+		<div>
+			<header>
+				%fa:user-clock%
+				<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
+				<mk-time :time="notification.createdAt"/>
+			</header>
+		</div>
+	</div>
+
+	<div class="notification poll_vote" v-if="notification.type == 'poll_vote'">
+		<mk-avatar class="avatar" :user="notification.user"/>
+		<div>
+			<header>
+				%fa:chart-pie%
+				<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
+				<mk-time :time="notification.createdAt"/>
+			</header>
+			<router-link class="note-ref" :to="notification.note | notePage">
+				%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
+			</router-link>
+		</div>
+	</div>
+
+	<template v-if="notification.type == 'quote'">
+		<x-note :note="notification.note" @update:note="onNoteUpdated"/>
+	</template>
+
+	<template v-if="notification.type == 'reply'">
+		<x-note :note="notification.note" @update:note="onNoteUpdated"/>
+	</template>
+
+	<template v-if="notification.type == 'mention'">
+		<x-note :note="notification.note" @update:note="onNoteUpdated"/>
+	</template>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import getNoteSummary from '../../../../../../renderers/get-note-summary';
+import XNote from './deck.note.vue';
+
+export default Vue.extend({
+	components: {
+		XNote
+	},
+	props: ['notification'],
+	data() {
+		return {
+			getNoteSummary
+		};
+	},
+	methods: {
+		onNoteUpdated(note) {
+			switch (this.notification.type) {
+				case 'quote':
+				case 'reply':
+				case 'mention':
+					Vue.set(this.notification, 'note', note);
+					break;
+			}
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+root(isDark)
+	> .notification
+		padding 16px
+		font-size 12px
+		overflow-wrap break-word
+
+		&:after
+			content ""
+			display block
+			clear both
+
+		> .avatar
+			display block
+			float left
+			width 36px
+			height 36px
+			border-radius 6px
+
+		> div
+			float right
+			width calc(100% - 36px)
+			padding-left 8px
+
+			> header
+				display flex
+				align-items baseline
+				white-space nowrap
+
+				i, .mk-reaction-icon
+					margin-right 4px
+
+				> .mk-time
+					margin-left auto
+					color isDark ? #606984 : #c0c0c0
+					font-size 0.9em
+
+			> .note-preview
+				color isDark ? #fff : #717171
+
+			> .note-ref
+				color isDark ? #fff : #717171
+
+				[data-fa]
+					font-size 1em
+					font-weight normal
+					font-style normal
+					display inline-block
+					margin-right 3px
+
+		&.renote
+			> div > header i
+				color #77B255
+
+		&.follow
+			> div > header i
+				color #53c7ce
+
+		&.receiveFollowRequest
+			> div > header i
+				color #888
+
+.dsfykdcjpuwfvpefwufddclpjhzktmpw[data-darkmode]
+	root(true)
+
+.dsfykdcjpuwfvpefwufddclpjhzktmpw:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
index 7a9646b587..31a3673dd3 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
@@ -1,102 +1,14 @@
 <template>
 <div class="oxynyeqmfvracxnglgulyqfgqxnxmehl">
-	<div class="notifications" v-if="notifications.length != 0">
-		<transition-group name="mk-notifications" class="transition">
-			<template v-for="(notification, i) in _notifications">
-				<div class="notification" :class="notification.type" :key="notification.id">
-					<mk-time :time="notification.createdAt"/>
-
-					<template v-if="notification.type == 'reaction'">
-						<mk-avatar class="avatar" :user="notification.user"/>
-						<div class="text">
-							<p>
-								<mk-reaction-icon :reaction="notification.reaction"/>
-								<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
-							</p>
-							<router-link class="note-ref" :to="notification.note | notePage">
-								%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
-							</router-link>
-						</div>
-					</template>
-
-					<template v-if="notification.type == 'renote'">
-						<mk-avatar class="avatar" :user="notification.note.user"/>
-						<div class="text">
-							<p>%fa:retweet%
-								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
-							</p>
-							<router-link class="note-ref" :to="notification.note | notePage">
-								%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%
-							</router-link>
-						</div>
-					</template>
-
-					<template v-if="notification.type == 'quote'">
-						<mk-avatar class="avatar" :user="notification.note.user"/>
-						<div class="text">
-							<p>%fa:quote-left%
-								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
-							</p>
-							<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
-						</div>
-					</template>
-
-					<template v-if="notification.type == 'follow'">
-						<mk-avatar class="avatar" :user="notification.user"/>
-						<div class="text">
-							<p>%fa:user-plus%
-								<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
-							</p>
-						</div>
-					</template>
-
-					<template v-if="notification.type == 'receiveFollowRequest'">
-						<mk-avatar class="avatar" :user="notification.user"/>
-						<div class="text">
-							<p>%fa:user-clock%
-								<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
-							</p>
-						</div>
-					</template>
-
-					<template v-if="notification.type == 'reply'">
-						<mk-avatar class="avatar" :user="notification.note.user"/>
-						<div class="text">
-							<p>%fa:reply%
-								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
-							</p>
-							<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
-						</div>
-					</template>
-
-					<template v-if="notification.type == 'mention'">
-						<mk-avatar class="avatar" :user="notification.note.user"/>
-						<div class="text">
-							<p>%fa:at%
-								<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
-							</p>
-							<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
-						</div>
-					</template>
-
-					<template v-if="notification.type == 'poll_vote'">
-						<mk-avatar class="avatar" :user="notification.user"/>
-						<div class="text">
-							<p>%fa:chart-pie%<a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p>
-							<router-link class="note-ref" :to="notification.note | notePage">
-								%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
-							</router-link>
-						</div>
-					</template>
-				</div>
-
-				<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
-					<span>%fa:angle-up%{{ notification._datetext }}</span>
-					<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
-				</p>
-			</template>
-		</transition-group>
-	</div>
+	<transition-group name="mk-notifications" class="transition notifications">
+		<template v-for="(notification, i) in _notifications">
+			<x-notification class="notification" :notification="notification" :key="notification.id"/>
+			<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
+				<span>%fa:angle-up%{{ notification._datetext }}</span>
+				<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
+			</p>
+		</template>
+	</transition-group>
 	<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
 		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
 	</button>
@@ -107,9 +19,12 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import getNoteSummary from '../../../../../../renderers/get-note-summary';
+import XNotification from './deck.notification.vue';
 
 export default Vue.extend({
+	components: {
+		XNotification
+	},
 	data() {
 		return {
 			fetching: true,
@@ -117,8 +32,7 @@ export default Vue.extend({
 			notifications: [],
 			moreNotifications: false,
 			connection: null,
-			connectionId: null,
-			getNoteSummary
+			connectionId: null
 		};
 	},
 	computed: {
@@ -191,6 +105,7 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 root(isDark)
+
 	.transition
 		.mk-notifications-enter
 		.mk-notifications-leave-to
@@ -201,96 +116,25 @@ root(isDark)
 			transition transform .3s ease, opacity .3s ease
 
 	> .notifications
-		> *
-			> .notification
-				margin 0
-				padding 16px
-				overflow-wrap break-word
-				font-size 0.9em
-				border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
 
-				&:last-child
-					border-bottom none
+		> .notification:not(:last-child)
+			border-bottom solid 1px isDark ? #1c2023 : #eaeaea
 
-				> .mk-time
-					display inline
-					position absolute
-					top 16px
-					right 12px
-					vertical-align top
-					color isDark ? #606984 : rgba(#000, 0.6)
-					font-size small
+		> .date
+			display block
+			margin 0
+			line-height 32px
+			text-align center
+			font-size 0.8em
+			color isDark ? #666b79 : #aaa
+			background isDark ? #242731 : #fdfdfd
+			border-bottom solid 1px isDark ? #1c2023 : #eaeaea
 
-				&:after
-					content ""
-					display block
-					clear both
+			span
+				margin 0 16px
 
-				> .avatar
-					display block
-					float left
-					position -webkit-sticky
-					position sticky
-					top 16px
-					width 36px
-					height 36px
-					border-radius 6px
-
-				> .text
-					float right
-					width calc(100% - 36px)
-					padding-left 8px
-
-					p
-						margin 0
-
-						i, .mk-reaction-icon
-							margin-right 4px
-
-				.note-preview
-					color isDark ? #c2cad4 : rgba(#000, 0.7)
-
-				.note-ref
-					color isDark ? #c2cad4 : rgba(#000, 0.7)
-
-					[data-fa]
-						font-size 1em
-						font-weight normal
-						font-style normal
-						display inline-block
-						margin-right 3px
-
-				&.renote, &.quote
-					.text p i
-						color #77B255
-
-				&.follow
-					.text p i
-						color #53c7ce
-
-				&.receiveFollowRequest
-					.text p i
-						color #888
-
-				&.reply, &.mention
-					.text p i
-						color #555
-
-			> .date
-				display block
-				margin 0
-				line-height 32px
-				text-align center
-				font-size 0.8em
-				color isDark ? #666b79 : #aaa
-				background isDark ? #242731 : #fdfdfd
-				border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
-
-				span
-					margin 0 16px
-
-				[data-fa]
-					margin-right 8px
+			i
+				margin-right 8px
 
 	> .more
 		display block

From 8678e30cc8da8a91c3dcdad11a3696defa77f13f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 01:45:04 +0900
Subject: [PATCH 157/369] 2.27.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 25aa109552..63c9f5e24c 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.27.1",
-	"clientVersion": "1.0.6158",
+	"version": "2.27.2",
+	"clientVersion": "1.0.6185",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 999ce8e36640b6ee2f2b483915c2ae4a13816f8a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 01:52:03 +0900
Subject: [PATCH 158/369] Improve scroll performance

---
 src/client/app/desktop/views/components/notes.vue       | 2 +-
 src/client/app/desktop/views/pages/deck/deck.column.vue | 2 +-
 src/client/app/desktop/views/pages/search.vue           | 2 +-
 src/client/app/desktop/views/pages/user/user.header.vue | 2 +-
 src/client/app/mobile/views/components/notes.vue        | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue
index 5a147f31e2..69f3739f79 100644
--- a/src/client/app/desktop/views/components/notes.vue
+++ b/src/client/app/desktop/views/components/notes.vue
@@ -74,7 +74,7 @@ export default Vue.extend({
 
 	mounted() {
 		document.addEventListener('visibilitychange', this.onVisibilitychange, false);
-		window.addEventListener('scroll', this.onScroll);
+		window.addEventListener('scroll', this.onScroll, { passive: true });
 	},
 
 	beforeDestroy() {
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 4dee0db91c..458732fa73 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -51,7 +51,7 @@ export default Vue.extend({
 	},
 
 	mounted() {
-		this.$refs.body.addEventListener('scroll', this.onScroll);
+		this.$refs.body.addEventListener('scroll', this.onScroll, { passive: true });
 	},
 	beforeDestroy() {
 		this.$refs.body.removeEventListener('scroll', this.onScroll);
diff --git a/src/client/app/desktop/views/pages/search.vue b/src/client/app/desktop/views/pages/search.vue
index 67e1e3bfe0..e79ac1c739 100644
--- a/src/client/app/desktop/views/pages/search.vue
+++ b/src/client/app/desktop/views/pages/search.vue
@@ -46,7 +46,7 @@ export default Vue.extend({
 	},
 	mounted() {
 		document.addEventListener('keydown', this.onDocumentKeydown);
-		window.addEventListener('scroll', this.onScroll);
+		window.addEventListener('scroll', this.onScroll, { passive: true });
 
 		this.fetch();
 	},
diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue
index 44910bc7f0..d52c6b762c 100644
--- a/src/client/app/desktop/views/pages/user/user.header.vue
+++ b/src/client/app/desktop/views/pages/user/user.header.vue
@@ -37,7 +37,7 @@ export default Vue.extend({
 	mounted() {
 		if (this.user.bannerUrl) {
 			window.addEventListener('load', this.onScroll);
-			window.addEventListener('scroll', this.onScroll);
+			window.addEventListener('scroll', this.onScroll, { passive: true });
 			window.addEventListener('resize', this.onScroll);
 		}
 	},
diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue
index 09cee966a3..7aaf0424c7 100644
--- a/src/client/app/mobile/views/components/notes.vue
+++ b/src/client/app/mobile/views/components/notes.vue
@@ -81,7 +81,7 @@ export default Vue.extend({
 
 	mounted() {
 		document.addEventListener('visibilitychange', this.onVisibilitychange, false);
-		window.addEventListener('scroll', this.onScroll);
+		window.addEventListener('scroll', this.onScroll, { passive: true });
 	},
 
 	beforeDestroy() {

From 39099909bf54f03a3c98bf26036557cc05f033e2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 02:06:32 +0900
Subject: [PATCH 159/369] Fix firefox

---
 src/client/app/desktop/views/components/ui.vue | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue
index ad6fc69dfa..34769b52bb 100644
--- a/src/client/app/desktop/views/components/ui.vue
+++ b/src/client/app/desktop/views/components/ui.vue
@@ -49,4 +49,5 @@ export default Vue.extend({
 		display flex
 		flex-direction column
 		flex 1
+		overflow hidden
 </style>

From 0ac5fdab49df5430df52404b7035f4f2e00a1a11 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 02:07:00 +0900
Subject: [PATCH 160/369] 2.27.3

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 63c9f5e24c..6d4c9f750e 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.27.2",
-	"clientVersion": "1.0.6185",
+	"version": "2.27.3",
+	"clientVersion": "1.0.6188",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 0534a0a41e32dd53d476efd597e9a134a3352b5e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 04:31:49 +0900
Subject: [PATCH 161/369] :v:

---
 cli/suspend.js | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/cli/suspend.js b/cli/suspend.js
index 0f22bba477..077685d507 100644
--- a/cli/suspend.js
+++ b/cli/suspend.js
@@ -3,16 +3,21 @@ const User = require('../built/models/user').default;
 
 const args = process.argv.slice(2);
 
-const userId = new mongo.ObjectID(args[0]);
+const user = args[0];
 
-console.log(`Suspending ${userId}...`);
+const q = user.startsWith('@') ? {
+	username: user.split('@')[1],
+	host: user.split('@')[2]
+} : { _id: new mongo.ObjectID(user) };
 
-User.update({ _id: userId }, {
+console.log(`Suspending ${user}...`);
+
+User.update(q, {
 	$set: {
 		isSuspended: true
 	}
 }).then(() => {
-	console.log(`Suspended ${userId}`);
+	console.log(`Suspended ${user}`);
 }, e => {
 	console.error(e);
 });

From 2053a041e5167480dfa7c688632bf4b88339f66a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 04:33:39 +0900
Subject: [PATCH 162/369] Fix

---
 cli/suspend.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cli/suspend.js b/cli/suspend.js
index 077685d507..877b37dbca 100644
--- a/cli/suspend.js
+++ b/cli/suspend.js
@@ -7,7 +7,7 @@ const user = args[0];
 
 const q = user.startsWith('@') ? {
 	username: user.split('@')[1],
-	host: user.split('@')[2]
+	host: user.split('@')[2] || null
 } : { _id: new mongo.ObjectID(user) };
 
 console.log(`Suspending ${user}...`);

From 14d12c21f2ee7f7162b3583e94c13b8a6e7f1e43 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 05:14:37 +0900
Subject: [PATCH 163/369] nanka iroiro

---
 .../app/desktop/views/components/settings.vue     | 10 ++++++++++
 src/client/app/desktop/views/components/ui.vue    | 14 +++++++++++++-
 .../app/desktop/views/pages/deck/deck.column.vue  |  1 +
 src/client/app/desktop/views/pages/deck/deck.vue  |  8 +++++++-
 src/models/user.ts                                |  5 +++++
 src/server/api/endpoints/i/update.ts              | 15 +++++++++++++++
 6 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue
index 1bfff8cc83..e0d578c33b 100644
--- a/src/client/app/desktop/views/components/settings.vue
+++ b/src/client/app/desktop/views/components/settings.vue
@@ -40,6 +40,7 @@
 				<button class="ui button" @click="customizeHome" style="margin-bottom: 16px">%i18n:@customize%</button>
 			</div>
 			<div class="div">
+				<button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button>
 				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
 				<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
 				<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
@@ -293,6 +294,15 @@ export default Vue.extend({
 			this.$router.push('/i/customize-home');
 			this.$emit('done');
 		},
+		updateWallpaper() {
+			(this as any).apis.chooseDriveFile({
+				multiple: false
+			}).then(file => {
+				(this as any).api('i/update', {
+					wallpaperId: file.id
+				});
+			});
+		},
 		onChangeFetchOnScroll(v) {
 			this.$store.dispatch('settings/set', {
 				key: 'fetchOnScroll',
diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue
index 34769b52bb..351deafded 100644
--- a/src/client/app/desktop/views/components/ui.vue
+++ b/src/client/app/desktop/views/components/ui.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="mk-ui">
+<div class="mk-ui" :style="style">
 	<x-header class="header"/>
 	<div class="content">
 		<slot></slot>
@@ -16,6 +16,15 @@ export default Vue.extend({
 	components: {
 		XHeader
 	},
+	computed: {
+		style(): any {
+			if (!this.$store.getters.isSignedIn || this.$store.state.i.wallpaperUrl == null) return {};
+			return {
+				backgroundColor: this.$store.state.i.wallpaperColor && this.$store.state.i.wallpaperColor.length == 3 ? `rgb(${ this.$store.state.i.wallpaperColor.join(',') })` : null,
+				backgroundImage: `url(${ this.$store.state.i.wallpaperUrl })`
+			};
+		}
+	},
 	mounted() {
 		document.addEventListener('keydown', this.onKeydown);
 	},
@@ -40,6 +49,9 @@ export default Vue.extend({
 	display flex
 	flex-direction column
 	flex 1
+	background-size cover
+	background-position center
+	background-attachment fixed
 
 	> .header
 		@media (max-width 1000px)
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 458732fa73..f71503d5c1 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -140,6 +140,7 @@ root(isDark)
 		z-index 1
 		line-height $header-height
 		padding 0 16px
+		font-size 14px
 		color isDark ? #e3e5e8 : #888
 		background isDark ? #313543 : #fff
 		box-shadow 0 1px rgba(#000, 0.15)
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index d6cbf7396d..369874ec67 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -150,7 +150,6 @@ export default Vue.extend({
 root(isDark)
 	display flex
 	flex 1
-	justify-content center
 	padding 16px 0 16px 16px
 	overflow auto
 
@@ -160,6 +159,13 @@ root(isDark)
 		&:last-of-type
 			margin-right 0
 
+	> *
+		&:first-child
+			margin-left auto
+
+		&:last-child
+			margin-right auto
+
 	> button
 		padding 0 16px
 		color isDark ? #93a0a5 : #888
diff --git a/src/models/user.ts b/src/models/user.ts
index 0e06512dae..2d4d7dc184 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -48,6 +48,7 @@ type IUserBase = {
 	usernameLower: string;
 	avatarId: mongo.ObjectID;
 	bannerId: mongo.ObjectID;
+	wallpaperId: mongo.ObjectID;
 	data: any;
 	description: string;
 	pinnedNoteId: mongo.ObjectID;
@@ -412,6 +413,10 @@ export const pack = (
 		? `${config.drive_url}/${_user.bannerId}`
 		: null;
 
+	_user.wallpaperUrl = _user.wallpaperId != null
+		? `${config.drive_url}/${_user.wallpaperId}`
+		: null;
+
 	if (!meId || !meId.equals(_user.id) || !opts.detail) {
 		delete _user.avatarId;
 		delete _user.bannerId;
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index b94f073d2c..1a1da997c9 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -45,6 +45,11 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 	if (bannerIdErr) return rej('invalid bannerId param');
 	if (bannerId !== undefined) updates.bannerId = bannerId;
 
+	// Get 'wallpaperId' parameter
+	const [wallpaperId, wallpaperIdErr] = $.type(ID).optional().nullable().get(params.wallpaperId);
+	if (wallpaperIdErr) return rej('invalid wallpaperId param');
+	if (wallpaperId !== undefined) updates.wallpaperId = wallpaperId;
+
 	// Get 'isLocked' parameter
 	const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked);
 	if (isLockedErr) return rej('invalid isLocked param');
@@ -85,6 +90,16 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
 		}
 	}
 
+	if (wallpaperId) {
+		const wallpaper = await DriveFile.findOne({
+			_id: wallpaperId
+		});
+
+		if (wallpaper != null && wallpaper.metadata.properties.avgColor) {
+			updates.wallpaperColor = wallpaper.metadata.properties.avgColor;
+		}
+	}
+
 	await User.update(user._id, {
 		$set: updates
 	});

From 818bc96aabbee330ed27fc0fe180cbd43d8c8af8 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 05:15:05 +0900
Subject: [PATCH 164/369] 2.28.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 6d4c9f750e..6cf0fc42bf 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.27.3",
-	"clientVersion": "1.0.6188",
+	"version": "2.28.0",
+	"clientVersion": "1.0.6192",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From be9f836b21c3d7dc1b315fa305caf17f04c139c4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 06:13:57 +0900
Subject: [PATCH 165/369] =?UTF-8?q?=E3=82=84=E3=81=A3=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 locales/ja.yml                                |  1 +
 .../desktop/views/pages/deck/deck.column.vue  | 17 ++++++-
 .../desktop/views/pages/deck/deck.list-tl.vue | 15 ++++++
 .../pages/deck/deck.notifications-column.vue  | 17 +++++--
 .../views/pages/deck/deck.tl-column.vue       | 50 ++++++++++++++++---
 .../app/desktop/views/pages/deck/deck.tl.vue  | 15 ++++++
 .../app/desktop/views/pages/deck/deck.vue     |  2 +-
 .../views/pages/deck/deck.widgets-column.vue  | 11 +++-
 src/client/app/store.ts                       | 11 ++++
 .../api/endpoints/notes/global-timeline.ts    |  8 +++
 .../api/endpoints/notes/local-timeline.ts     |  8 +++
 src/server/api/endpoints/notes/timeline.ts    | 10 ++++
 .../api/endpoints/notes/user-list-timeline.ts | 10 ++++
 13 files changed, 159 insertions(+), 16 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 8e04d0988f..320da8e777 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -87,6 +87,7 @@ common:
     swap-right: "右に移動"
     remove: "カラムを削除"
     add-column: "カラムを追加"
+    rename: "名前を変更"
 
 common/views/components/connect-failed.vue:
   title: "サーバーに接続できません"
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index f71503d5c1..10005fa9b0 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -20,6 +20,10 @@ export default Vue.extend({
 			type: String,
 			required: false
 		},
+		name: {
+			type: String,
+			required: false
+		},
 		menu: {
 			type: Array,
 			required: false
@@ -75,6 +79,17 @@ export default Vue.extend({
 
 		showMenu() {
 			const items = [{
+				content: '%fa:pencil-alt% %i18n:common.deck.rename%',
+				onClick: () => {
+					(this as any).apis.input({
+						title: '%i18n:common.deck.rename%',
+						default: this.name,
+						allowEmpty: false
+					}).then(name => {
+						this.$store.dispatch('settings/renameDeckColumn', { id: this.id, name });
+					});
+				}
+			}, null, {
 				content: '%fa:arrow-left% %i18n:common.deck.swap-left%',
 				onClick: () => {
 					this.$store.dispatch('settings/swapLeftDeckColumn', this.id);
@@ -84,7 +99,7 @@ export default Vue.extend({
 				onClick: () => {
 					this.$store.dispatch('settings/swapRightDeckColumn', this.id);
 				}
-			}, {
+			}, null, {
 				content: '%fa:trash-alt R% %i18n:common.deck.remove%',
 				onClick: () => {
 					this.$store.dispatch('settings/removeDeckColumn', this.id);
diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
index 7b5e76ffec..ee4e89747b 100644
--- a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
@@ -18,6 +18,11 @@ export default Vue.extend({
 		list: {
 			type: Object,
 			required: true
+		},
+		mediaOnly: {
+			type: Boolean,
+			required: false,
+			default: false
 		}
 	},
 
@@ -30,6 +35,12 @@ export default Vue.extend({
 		};
 	},
 
+	watch: {
+		mediaOnly() {
+			this.fetch();
+		}
+	},
+
 	mounted() {
 		if (this.connection) this.connection.close();
 		this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id);
@@ -52,6 +63,7 @@ export default Vue.extend({
 				(this as any).api('notes/user-list-timeline', {
 					listId: this.list.id,
 					limit: fetchLimit + 1,
+					mediaOnly: this.mediaOnly,
 					includeMyRenotes: this.$store.state.settings.showMyRenotes,
 					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 				}).then(notes => {
@@ -72,6 +84,7 @@ export default Vue.extend({
 				listId: this.list.id,
 				limit: fetchLimit + 1,
 				untilId: (this.$refs.timeline as any).tail().id,
+				mediaOnly: this.mediaOnly,
 				includeMyRenotes: this.$store.state.settings.showMyRenotes,
 				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 			});
@@ -89,6 +102,8 @@ export default Vue.extend({
 			return promise;
 		},
 		onNote(note) {
+			if (this.mediaOnly && note.media.length == 0) return;
+
 			// Prepend a note
 			(this.$refs.timeline as any).prepend(note);
 		},
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
index f57c52d2e1..e01f91c24d 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
-	<x-column :id="id">
-		<span slot="header">%fa:bell R%%i18n:common.deck.notifications%</span>
+	<x-column :id="column.id" :name="name">
+		<span slot="header">%fa:bell R%{{ name }}</span>
 
 		<x-notifications/>
 	</x-column>
@@ -20,10 +20,17 @@ export default Vue.extend({
 	},
 
 	props: {
-		id: {
-			type: String,
+		column: {
+			type: Object,
 			required: true
 		}
-	}
+	},
+
+	computed: {
+		name(): string {
+			if (this.column.name) return this.column.name;
+			return '%i18n:common.deck.notifications%';
+		}
+	},
 });
 </script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index 54bc6bfc22..1a5075396b 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -1,15 +1,20 @@
 <template>
 <div>
-	<x-column :id="column.id">
+	<x-column :id="column.id" :menu="menu" :name="name">
 		<span slot="header">
-			<template v-if="column.type == 'home'">%fa:home%%i18n:common.deck.home%</template>
-			<template v-if="column.type == 'local'">%fa:R comments%%i18n:common.deck.local%</template>
-			<template v-if="column.type == 'global'">%fa:globe%%i18n:common.deck.global%</template>
-			<template v-if="column.type == 'list'">%fa:list%{{ column.list.title }}</template>
+			<template v-if="column.type == 'home'">%fa:home%</template>
+			<template v-if="column.type == 'local'">%fa:R comments%</template>
+			<template v-if="column.type == 'global'">%fa:globe%</template>
+			<template v-if="column.type == 'list'">%fa:list%</template>
+			<span>{{ name }}</span>
 		</span>
 
-		<x-list-tl v-if="column.type == 'list'" :list="column.list"/>
-		<x-tl v-else :src="column.type"/>
+		<div class="editor" v-if="edit">
+			<mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/>
+			<mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/>
+		</div>
+		<x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/>
+		<x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/>
 	</x-column>
 </div>
 </template>
@@ -32,6 +37,37 @@ export default Vue.extend({
 			type: Object,
 			required: true
 		}
+	},
+
+	data() {
+		return {
+			edit: false,
+			menu: [{
+				content: '%fa:cog% %i18n:@edit%',
+				onClick: () => {
+					this.edit = !this.edit;
+				}
+			}]
+		}
+	},
+
+	computed: {
+		name(): string {
+			if (this.column.name) return this.column.name;
+
+			switch (this.column.type) {
+				case 'home': return '%i18n:common.deck.home%';
+				case 'local': return '%i18n:common.deck.local%';
+				case 'global': return '%i18n:common.deck.global%';
+				case 'list': return this.column.list.title;
+			}
+		}
+	},
+
+	methods: {
+		onChangeSettings(v) {
+			this.$store.dispatch('settings/saveDeck');
+		}
 	}
 });
 </script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue
index 8e9d783875..47aa8c6413 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue
@@ -18,6 +18,11 @@ export default Vue.extend({
 			type: String,
 			required: false,
 			default: 'home'
+		},
+		mediaOnly: {
+			type: Boolean,
+			required: false,
+			default: false
 		}
 	},
 
@@ -31,6 +36,12 @@ export default Vue.extend({
 		};
 	},
 
+	watch: {
+		mediaOnly() {
+			this.fetch();
+		}
+	},
+
 	computed: {
 		stream(): any {
 			return this.src == 'home'
@@ -78,6 +89,7 @@ export default Vue.extend({
 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
 				(this as any).api(this.endpoint, {
 					limit: fetchLimit + 1,
+					mediaOnly: this.mediaOnly,
 					includeMyRenotes: this.$store.state.settings.showMyRenotes,
 					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
 				}).then(notes => {
@@ -97,6 +109,7 @@ export default Vue.extend({
 
 			const promise = (this as any).api(this.endpoint, {
 				limit: fetchLimit + 1,
+				mediaOnly: this.mediaOnly,
 				untilId: (this.$refs.timeline as any).tail().id,
 				includeMyRenotes: this.$store.state.settings.showMyRenotes,
 				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
@@ -116,6 +129,8 @@ export default Vue.extend({
 		},
 
 		onNote(note) {
+			if (this.mediaOnly && note.media.length == 0) return;
+
 			// Prepend a note
 			(this.$refs.timeline as any).prepend(note);
 		},
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index 369874ec67..57ec214c3a 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -3,7 +3,7 @@
 	<div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode">
 		<template v-for="column in columns">
 			<x-widgets-column v-if="column.type == 'widgets'" :key="column.id" :column="column"/>
-			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :id="column.id"/>
+			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :column="column"/>
 			<x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/>
 			<x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/>
 			<x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/>
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 34073160c1..6bcebd07cc 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="wtdtxvecapixsepjtcupubtsmometobz">
-	<x-column :id="column.id" :menu="menu" :naked="true" :narrow="true">
-		<span slot="header">%fa:calculator%%i18n:common.deck.widgets%</span>
+	<x-column :id="column.id" :menu="menu" :naked="true" :narrow="true" :name="name">
+		<span slot="header">%fa:calculator%{{ name }}</span>
 
 		<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
 			<template v-if="edit">
@@ -81,6 +81,13 @@ export default Vue.extend({
 		}
 	},
 
+	computed: {
+		name(): string {
+			if (this.column.name) return this.column.name;
+			return '%i18n:common.deck.widgets%';
+		}
+	},
+
 	created() {
 		this.menu = [{
 			content: '%fa:cog% %i18n:@edit%',
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index 5582ff6c57..d51a3abad1 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -222,6 +222,12 @@ export default (os: MiOS) => new Vuex.Store({
 					const column = state.deck.columns.find(c => c.id == x.id);
 					if (column == null) return;
 					column.widgets = column.widgets.filter(w => w.id != x.widget.id);
+				},
+
+				renameDeckColumn(state, x) {
+					const column = state.deck.columns.find(c => c.id == x.id);
+					if (column == null) return;
+					column.name = x.name;
 				}
 			},
 
@@ -281,6 +287,11 @@ export default (os: MiOS) => new Vuex.Store({
 					ctx.dispatch('saveDeck');
 				},
 
+				renameDeckColumn(ctx, x) {
+					ctx.commit('renameDeckColumn', x);
+					ctx.dispatch('saveDeck');
+				},
+
 				addHomeWidget(ctx, widget) {
 					ctx.commit('addHomeWidget', widget);
 
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index 7cf06c3af1..2d4f2b6368 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -35,6 +35,10 @@ module.exports = async (params, user) => {
 		throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified';
 	}
 
+	// Get 'mediaOnly' parameter
+	const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly);
+	if (mediaOnlyErr) throw 'invalid mediaOnly param';
+
 	// ミュートしているユーザーを取得
 	const mutedUserIds = user ? (await Mute.find({
 		muterId: user._id
@@ -64,6 +68,10 @@ module.exports = async (params, user) => {
 		};
 	}
 
+	if (mediaOnly) {
+		query.mediaIds = { $exists: true, $ne: [] };
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index 7d01de3d43..734cc9af0a 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -35,6 +35,10 @@ module.exports = async (params, user) => {
 		throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified';
 	}
 
+	// Get 'mediaOnly' parameter
+	const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly);
+	if (mediaOnlyErr) throw 'invalid mediaOnly param';
+
 	// ミュートしているユーザーを取得
 	const mutedUserIds = user ? (await Mute.find({
 		muterId: user._id
@@ -67,6 +71,10 @@ module.exports = async (params, user) => {
 		};
 	}
 
+	if (mediaOnly) {
+		query.mediaIds = { $exists: true, $ne: [] };
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {
diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts
index 9f32555649..f1d741d5ee 100644
--- a/src/server/api/endpoints/notes/timeline.ts
+++ b/src/server/api/endpoints/notes/timeline.ts
@@ -44,6 +44,10 @@ module.exports = async (params, user, app) => {
 	const [includeRenotedMyNotes = true, includeRenotedMyNotesErr] = $.bool.optional().get(params.includeRenotedMyNotes);
 	if (includeRenotedMyNotesErr) throw 'invalid includeRenotedMyNotes param';
 
+	// Get 'mediaOnly' parameter
+	const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly);
+	if (mediaOnlyErr) throw 'invalid mediaOnly param';
+
 	const [followings, mutedUserIds] = await Promise.all([
 		// フォローを取得
 		// Fetch following
@@ -137,6 +141,12 @@ module.exports = async (params, user, app) => {
 		});
 	}
 
+	if (mediaOnly) {
+		query.$and.push({
+			mediaIds: { $exists: true, $ne: [] }
+		});
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {
diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts
index 9f8397d679..a74a5141f9 100644
--- a/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -44,6 +44,10 @@ module.exports = async (params, user, app) => {
 	const [includeRenotedMyNotes = true, includeRenotedMyNotesErr] = $.bool.optional().get(params.includeRenotedMyNotes);
 	if (includeRenotedMyNotesErr) throw 'invalid includeRenotedMyNotes param';
 
+	// Get 'mediaOnly' parameter
+	const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly);
+	if (mediaOnlyErr) throw 'invalid mediaOnly param';
+
 	// Get 'listId' parameter
 	const [listId, listIdErr] = $.type(ID).get(params.listId);
 	if (listIdErr) throw 'invalid listId param';
@@ -146,6 +150,12 @@ module.exports = async (params, user, app) => {
 		});
 	}
 
+	if (mediaOnly) {
+		query.$and.push({
+			mediaIds: { $exists: true, $ne: [] }
+		});
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {

From ab04f2fce06494af8c5ebc062139556b04b11f2c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 06:15:57 +0900
Subject: [PATCH 166/369] :v:

---
 src/client/app/desktop/views/components/settings.vue | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue
index e0d578c33b..c660c2869a 100644
--- a/src/client/app/desktop/views/components/settings.vue
+++ b/src/client/app/desktop/views/components/settings.vue
@@ -41,6 +41,7 @@
 			</div>
 			<div class="div">
 				<button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button>
+				<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button>
 				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
 				<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
 				<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
@@ -303,6 +304,11 @@ export default Vue.extend({
 				});
 			});
 		},
+		deleteWallpaper() {
+			(this as any).api('i/update', {
+				wallpaperId: null
+			});
+		},
 		onChangeFetchOnScroll(v) {
 			this.$store.dispatch('settings/set', {
 				key: 'fetchOnScroll',

From 86b0dfdd3392cefed4a395603fc937efc18ed6ff Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 06:16:11 +0900
Subject: [PATCH 167/369] 2.29.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 6cf0fc42bf..90bb274b22 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.28.0",
-	"clientVersion": "1.0.6192",
+	"version": "2.29.0",
+	"clientVersion": "1.0.6195",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From d3b51bf94a7fa132c966d30ff902be2829c2b933 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 08:29:46 +0900
Subject: [PATCH 168/369] :v:

---
 src/client/app/common/views/components/time.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/common/views/components/time.vue b/src/client/app/common/views/components/time.vue
index 6e0d2b0dcb..58ed115620 100644
--- a/src/client/app/common/views/components/time.vue
+++ b/src/client/app/common/views/components/time.vue
@@ -59,7 +59,7 @@ export default Vue.extend({
 	created() {
 		if (this.mode == 'relative' || this.mode == 'detail') {
 			this.tick();
-			this.tickId = setInterval(this.tick, 1000);
+			this.tickId = setInterval(this.tick, 5000);
 		}
 	},
 	destroyed() {

From 0e8a592b26b74e921e1ac708572571c842746aaa Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 08:41:58 +0900
Subject: [PATCH 169/369] :v:

---
 src/client/app/desktop/views/pages/deck/deck.column.vue | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 10005fa9b0..4e37c3cbdb 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -127,9 +127,7 @@ export default Vue.extend({
 root(isDark)
 	$header-height = 42px
 
-	flex 1
-	min-width 330px
-	max-width 330px
+	width 330px
 	height 100%
 	background isDark ? #282C37 : #fff
 	border-radius 6px
@@ -137,8 +135,7 @@ root(isDark)
 	overflow hidden
 
 	&.narrow
-		min-width 285px
-		max-width 285px
+		width 285px
 
 	&.naked
 		background rgba(#000, isDark ? 0.25 : 0.1)

From 44ef60c8a29f05147a64b3325217606828707098 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 7 Jun 2018 08:48:22 +0900
Subject: [PATCH 170/369] 2.29.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 90bb274b22..d7986e059a 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.29.0",
-	"clientVersion": "1.0.6195",
+	"version": "2.29.1",
+	"clientVersion": "1.0.6218",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 79d592b4318d0a9d69a3469db8a0ef8b35c3af90 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 04:21:06 +0900
Subject: [PATCH 171/369] =?UTF-8?q?MisskeyDeck:=20=E3=82=AB=E3=83=A9?=
 =?UTF-8?q?=E3=83=A0=E3=82=92=E3=82=B9=E3=82=BF=E3=83=83=E3=82=AF=E3=81=A7?=
 =?UTF-8?q?=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 locales/ja.yml                                |   2 +
 .../app/common/views/components/menu.vue      |  33 +++++-
 .../views/pages/deck/deck.column-core.vue     |  48 ++++++++
 .../desktop/views/pages/deck/deck.column.vue  |  61 +++++++---
 .../pages/deck/deck.notifications-column.vue  |  17 +--
 .../views/pages/deck/deck.tl-column.vue       |  39 +++----
 .../app/desktop/views/pages/deck/deck.vue     |  58 +++++++---
 .../views/pages/deck/deck.widgets-column.vue  | 107 ++++++++----------
 src/client/app/store.ts                       |  53 ++++++---
 9 files changed, 275 insertions(+), 143 deletions(-)
 create mode 100644 src/client/app/desktop/views/pages/deck/deck.column-core.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index 320da8e777..3161040ec8 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -88,6 +88,8 @@ common:
     remove: "カラムを削除"
     add-column: "カラムを追加"
     rename: "名前を変更"
+    stack-left: "左に重ねる"
+    pop-right: "右に出す"
 
 common/views/components/connect-failed.vue:
   title: "サーバーに接続できません"
diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue
index 73c8403ad3..8874e4c49b 100644
--- a/src/client/app/common/views/components/menu.vue
+++ b/src/client/app/common/views/components/menu.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mk-menu">
 	<div class="backdrop" ref="backdrop" @click="close"></div>
-	<div class="popover" :class="{ compact }" ref="popover">
+	<div class="popover" :class="{ hukidasi }" ref="popover">
 		<template v-for="item in items">
 			<div v-if="item == null"></div>
 			<button v-else @click="clicked(item.onClick)" v-html="item.content"></button>
@@ -16,6 +16,11 @@ import * as anime from 'animejs';
 
 export default Vue.extend({
 	props: ['source', 'compact', 'items'],
+	data() {
+		return {
+			hukidasi: !this.compact
+		};
+	},
 	mounted() {
 		this.$nextTick(() => {
 			const popover = this.$refs.popover as any;
@@ -24,18 +29,34 @@ export default Vue.extend({
 			const width = popover.offsetWidth;
 			const height = popover.offsetHeight;
 
+			let left;
+			let top;
+
 			if (this.compact) {
 				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
 				const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2);
-				popover.style.left = (x - (width / 2)) + 'px';
-				popover.style.top = (y - (height / 2)) + 'px';
+				left = (x - (width / 2));
+				top = (y - (height / 2));
 			} else {
 				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
 				const y = rect.top + window.pageYOffset + this.source.offsetHeight;
-				popover.style.left = (x - (width / 2)) + 'px';
-				popover.style.top = y + 'px';
+				left = (x - (width / 2));
+				top = y;
 			}
 
+			if (left + width > window.innerWidth) {
+				left = window.innerWidth - width;
+				this.hukidasi = false;
+			}
+
+			if (top + height > window.innerHeight) {
+				top = window.innerHeight - height;
+				this.hukidasi = false;
+			}
+
+			popover.style.left = left + 'px';
+			popover.style.top = top + 'px';
+
 			anime({
 				targets: this.$refs.backdrop,
 				opacity: 1,
@@ -113,7 +134,7 @@ $border-color = rgba(27, 31, 35, 0.15)
 
 		$balloon-size = 16px
 
-		&:not(.compact)
+		&.hukidasi
 			margin-top $balloon-size
 			transform-origin center -($balloon-size)
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue
new file mode 100644
index 0000000000..836ce3ac9e
--- /dev/null
+++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue
@@ -0,0 +1,48 @@
+<template>
+<x-widgets-column v-if="column.type == 'widgets'"/>
+<x-notifications-column v-else-if="column.type == 'notifications'"/>
+<x-tl-column v-else-if="column.type == 'home'"/>
+<x-tl-column v-else-if="column.type == 'local'"/>
+<x-tl-column v-else-if="column.type == 'global'"/>
+<x-tl-column v-else-if="column.type == 'list'"/>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XTlColumn from './deck.tl-column.vue';
+import XNotificationsColumn from './deck.notifications-column.vue';
+import XWidgetsColumn from './deck.widgets-column.vue';
+
+export default Vue.extend({
+	components: {
+		XTlColumn,
+		XNotificationsColumn,
+		XWidgetsColumn
+	},
+
+	props: {
+		column: {
+			type: Object,
+			required: true
+		},
+		isStacked: {
+			type: Boolean,
+			required: false,
+			default: false
+		},
+		isActive: {
+			type: Boolean,
+			required: false,
+			default: true
+		}
+	},
+
+	provide() {
+		return {
+			column: this.column,
+			isStacked: this.isStacked,
+			isActive: this.isActive
+		};
+	}
+});
+</script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 4e37c3cbdb..172880df6e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,10 +1,10 @@
 <template>
-<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow }">
-	<header :class="{ indicate }">
+<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, isActive, isStacked }">
+	<header :class="{ indicate }" @click="toggleActive">
 		<slot name="header"></slot>
-		<button ref="menu" @click="showMenu">%fa:caret-down%</button>
+		<button ref="menu" @click.stop="showMenu">%fa:caret-down%</button>
 	</header>
-	<div ref="body">
+	<div ref="body" v-show="isActive">
 		<slot></slot>
 	</div>
 </div>
@@ -16,17 +16,14 @@ import Menu from '../../../../common/views/components/menu.vue';
 
 export default Vue.extend({
 	props: {
-		id: {
-			type: String,
-			required: false
-		},
 		name: {
 			type: String,
 			required: false
 		},
 		menu: {
 			type: Array,
-			required: false
+			required: false,
+			default: null
 		},
 		naked: {
 			type: Boolean,
@@ -40,9 +37,17 @@ export default Vue.extend({
 		}
 	},
 
+	inject: {
+		column: { from: 'column' },
+		_isActive: { from: 'isActive' },
+		isStacked: { from: 'isStacked' },
+		getColumnVm: { from: 'getColumnVm' }
+	},
+
 	data() {
 		return {
-			indicate: false
+			indicate: false,
+			isActive: this._isActive
 		};
 	},
 
@@ -62,6 +67,13 @@ export default Vue.extend({
 	},
 
 	methods: {
+		toggleActive() {
+			if (!this.isStacked) return;
+			const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id));
+			if (this.isActive && vms.filter(vm => vm.$el.classList.contains('isActive')).length == 1) return;
+			this.isActive = !this.isActive;
+		},
+
 		isScrollTop() {
 			return this.$refs.body.scrollTop == 0;
 		},
@@ -86,23 +98,33 @@ export default Vue.extend({
 						default: this.name,
 						allowEmpty: false
 					}).then(name => {
-						this.$store.dispatch('settings/renameDeckColumn', { id: this.id, name });
+						this.$store.dispatch('settings/renameDeckColumn', { id: this.column.id, name });
 					});
 				}
 			}, null, {
 				content: '%fa:arrow-left% %i18n:common.deck.swap-left%',
 				onClick: () => {
-					this.$store.dispatch('settings/swapLeftDeckColumn', this.id);
+					this.$store.dispatch('settings/swapLeftDeckColumn', this.column.id);
 				}
 			}, {
 				content: '%fa:arrow-right% %i18n:common.deck.swap-right%',
 				onClick: () => {
-					this.$store.dispatch('settings/swapRightDeckColumn', this.id);
+					this.$store.dispatch('settings/swapRightDeckColumn', this.column.id);
+				}
+			}, null, {
+				content: '%fa:window-restore R% %i18n:common.deck.stack-left%',
+				onClick: () => {
+					this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id);
+				}
+			}, {
+				content: '%fa:window-restore R% %i18n:common.deck.pop-right%',
+				onClick: () => {
+					this.$store.dispatch('settings/popRightDeckColumn', this.column.id);
 				}
 			}, null, {
 				content: '%fa:trash-alt R% %i18n:common.deck.remove%',
 				onClick: () => {
-					this.$store.dispatch('settings/removeDeckColumn', this.id);
+					this.$store.dispatch('settings/removeDeckColumn', this.column.id);
 				}
 			}];
 
@@ -128,14 +150,20 @@ root(isDark)
 	$header-height = 42px
 
 	width 330px
+	min-width 330px
 	height 100%
 	background isDark ? #282C37 : #fff
 	border-radius 6px
 	box-shadow 0 2px 16px rgba(#000, 0.1)
 	overflow hidden
 
-	&.narrow
+	&:not(.isActive)
+		flex-basis $header-height
+		min-height $header-height
+
+	&:not(.isStacked).narrow
 		width 285px
+		min-width 285px
 
 	&.naked
 		background rgba(#000, isDark ? 0.25 : 0.1)
@@ -157,6 +185,9 @@ root(isDark)
 		background isDark ? #313543 : #fff
 		box-shadow 0 1px rgba(#000, 0.15)
 
+		&, *
+			user-select none
+
 		&.indicate
 			box-shadow 0 3px 0 0 $theme-color
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
index e01f91c24d..87f16211fc 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -1,11 +1,9 @@
 <template>
-<div>
-	<x-column :id="column.id" :name="name">
-		<span slot="header">%fa:bell R%{{ name }}</span>
+<x-column :name="name">
+	<span slot="header">%fa:bell R%{{ name }}</span>
 
-		<x-notifications/>
-	</x-column>
-</div>
+	<x-notifications/>
+</x-column>
 </template>
 
 <script lang="ts">
@@ -19,12 +17,7 @@ export default Vue.extend({
 		XNotifications
 	},
 
-	props: {
-		column: {
-			type: Object,
-			required: true
-		}
-	},
+	inject: ['column'],
 
 	computed: {
 		name(): string {
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index 1a5075396b..46d56bb055 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -1,22 +1,20 @@
 <template>
-<div>
-	<x-column :id="column.id" :menu="menu" :name="name">
-		<span slot="header">
-			<template v-if="column.type == 'home'">%fa:home%</template>
-			<template v-if="column.type == 'local'">%fa:R comments%</template>
-			<template v-if="column.type == 'global'">%fa:globe%</template>
-			<template v-if="column.type == 'list'">%fa:list%</template>
-			<span>{{ name }}</span>
-		</span>
+<x-column :menu="menu" :name="name">
+	<span slot="header">
+		<template v-if="column.type == 'home'">%fa:home%</template>
+		<template v-if="column.type == 'local'">%fa:R comments%</template>
+		<template v-if="column.type == 'global'">%fa:globe%</template>
+		<template v-if="column.type == 'list'">%fa:list%</template>
+		<span>{{ name }}</span>
+	</span>
 
-		<div class="editor" v-if="edit">
-			<mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/>
-			<mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/>
-		</div>
-		<x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/>
-		<x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/>
-	</x-column>
-</div>
+	<div class="editor" v-if="edit">
+		<mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/>
+		<mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/>
+	</div>
+	<x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/>
+	<x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/>
+</x-column>
 </template>
 
 <script lang="ts">
@@ -32,12 +30,7 @@ export default Vue.extend({
 		XListTl
 	},
 
-	props: {
-		column: {
-			type: Object,
-			required: true
-		}
-	},
+	inject: ['column'],
 
 	data() {
 		return {
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index 57ec214c3a..fa2d90ed0e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -1,13 +1,13 @@
 <template>
 <mk-ui :class="$style.root">
 	<div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode">
-		<template v-for="column in columns">
-			<x-widgets-column v-if="column.type == 'widgets'" :key="column.id" :column="column"/>
-			<x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :column="column"/>
-			<x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/>
-			<x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/>
-			<x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/>
-			<x-tl-column v-if="column.type == 'list'" :key="column.id" :column="column"/>
+		<template v-for="ids in layout">
+			<div v-if="ids.length > 1" class="folder">
+				<template v-for="id, i in ids">
+					<x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true" :is-active="i == 0"/>
+				</template>
+			</div>
+			<x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])"/>
 		</template>
 		<button ref="add" @click="add" title="%i18n:common.deck.add-column%">%fa:plus%</button>
 	</div>
@@ -16,27 +16,34 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import XTlColumn from './deck.tl-column.vue';
-import XNotificationsColumn from './deck.notifications-column.vue';
-import XWidgetsColumn from './deck.widgets-column.vue';
+import XColumnCore from './deck.column-core.vue';
 import Menu from '../../../../common/views/components/menu.vue';
 import MkUserListsWindow from '../../components/user-lists-window.vue';
 import * as uuid from 'uuid';
 
 export default Vue.extend({
 	components: {
-		XTlColumn,
-		XNotificationsColumn,
-		XWidgetsColumn
+		XColumnCore
 	},
 
 	computed: {
-		columns() {
+		columns(): any[] {
 			if (this.$store.state.settings.deck == null) return [];
 			return this.$store.state.settings.deck.columns;
+		},
+		layout(): any[] {
+			if (this.$store.state.settings.deck == null) return [];
+			if (this.$store.state.settings.deck.layout == null) return this.$store.state.settings.deck.columns.map(c => [c.id]);
+			return this.$store.state.settings.deck.layout;
 		}
 	},
 
+	provide() {
+		return {
+			getColumnVm: this.getColumnVm
+		};
+	},
+
 	created() {
 		if (this.$store.state.settings.deck == null) {
 			const deck = {
@@ -58,11 +65,23 @@ export default Vue.extend({
 				}]
 			};
 
+			deck.layout = deck.columns.map(c => [c.id]);
+
 			this.$store.dispatch('settings/set', {
 				key: 'deck',
 				value: deck
 			});
 		}
+
+		// 互換性のため
+		if (this.$store.state.settings.deck != null && this.$store.state.settings.deck.layout == null) {
+			this.$store.dispatch('settings/set', {
+				key: 'deck',
+				value: Object.assign({}, this.$store.state.settings.deck, {
+					layout: this.$store.state.settings.deck.columns.map(c => [c.id])
+				})
+			});
+		}
 	},
 
 	mounted() {
@@ -74,6 +93,10 @@ export default Vue.extend({
 	},
 
 	methods: {
+		getColumnVm(id) {
+			return this.$refs[id][0];
+		},
+
 		add() {
 			this.os.new(Menu, {
 				source: this.$refs.add,
@@ -159,6 +182,13 @@ root(isDark)
 		&:last-of-type
 			margin-right 0
 
+		&.folder
+			display flex
+			flex-direction column
+
+			> *:not(:last-child)
+				margin-bottom 8px
+
 	> *
 		&:first-child
 			margin-left auto
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 6bcebd07cc..1f8fd8a9bf 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -1,57 +1,55 @@
 <template>
-<div class="wtdtxvecapixsepjtcupubtsmometobz">
-	<x-column :id="column.id" :menu="menu" :naked="true" :narrow="true" :name="name">
-		<span slot="header">%fa:calculator%{{ name }}</span>
+<x-column :menu="menu" :naked="true" :narrow="true" :name="name" class="wtdtxvecapixsepjtcupubtsmometobz">
+	<span slot="header">%fa:calculator%{{ name }}</span>
 
-		<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
-			<template v-if="edit">
-				<header>
-					<select v-model="widgetAdderSelected">
-						<option value="profile">%i18n:common.widgets.profile%</option>
-						<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
-						<option value="calendar">%i18n:common.widgets.calendar%</option>
-						<option value="timemachine">%i18n:common.widgets.timemachine%</option>
-						<option value="activity">%i18n:common.widgets.activity%</option>
-						<option value="rss">%i18n:common.widgets.rss%</option>
-						<option value="trends">%i18n:common.widgets.trends%</option>
-						<option value="photo-stream">%i18n:common.widgets.photo-stream%</option>
-						<option value="slideshow">%i18n:common.widgets.slideshow%</option>
-						<option value="version">%i18n:common.widgets.version%</option>
-						<option value="broadcast">%i18n:common.widgets.broadcast%</option>
-						<option value="notifications">%i18n:common.widgets.notifications%</option>
-						<option value="users">%i18n:common.widgets.users%</option>
-						<option value="polls">%i18n:common.widgets.polls%</option>
-						<option value="post-form">%i18n:common.widgets.post-form%</option>
-						<option value="messaging">%i18n:common.widgets.messaging%</option>
-						<option value="memo">%i18n:common.widgets.memo%</option>
-						<option value="server">%i18n:common.widgets.server%</option>
-						<option value="donation">%i18n:common.widgets.donation%</option>
-						<option value="nav">%i18n:common.widgets.nav%</option>
-						<option value="tips">%i18n:common.widgets.tips%</option>
-					</select>
-					<button @click="addWidget">%i18n:@add%</button>
-				</header>
-				<x-draggable
-					:list="column.widgets"
-					:options="{ handle: '.handle', animation: 150 }"
-					@sort="onWidgetSort"
-				>
-					<div v-for="widget in column.widgets" class="customize-container" :key="widget.id">
-						<header>
-							<span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button>
-						</header>
-						<div @click="widgetFunc(widget.id)">
-							<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/>
-						</div>
+	<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
+		<template v-if="edit">
+			<header>
+				<select v-model="widgetAdderSelected">
+					<option value="profile">%i18n:common.widgets.profile%</option>
+					<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
+					<option value="calendar">%i18n:common.widgets.calendar%</option>
+					<option value="timemachine">%i18n:common.widgets.timemachine%</option>
+					<option value="activity">%i18n:common.widgets.activity%</option>
+					<option value="rss">%i18n:common.widgets.rss%</option>
+					<option value="trends">%i18n:common.widgets.trends%</option>
+					<option value="photo-stream">%i18n:common.widgets.photo-stream%</option>
+					<option value="slideshow">%i18n:common.widgets.slideshow%</option>
+					<option value="version">%i18n:common.widgets.version%</option>
+					<option value="broadcast">%i18n:common.widgets.broadcast%</option>
+					<option value="notifications">%i18n:common.widgets.notifications%</option>
+					<option value="users">%i18n:common.widgets.users%</option>
+					<option value="polls">%i18n:common.widgets.polls%</option>
+					<option value="post-form">%i18n:common.widgets.post-form%</option>
+					<option value="messaging">%i18n:common.widgets.messaging%</option>
+					<option value="memo">%i18n:common.widgets.memo%</option>
+					<option value="server">%i18n:common.widgets.server%</option>
+					<option value="donation">%i18n:common.widgets.donation%</option>
+					<option value="nav">%i18n:common.widgets.nav%</option>
+					<option value="tips">%i18n:common.widgets.tips%</option>
+				</select>
+				<button @click="addWidget">%i18n:@add%</button>
+			</header>
+			<x-draggable
+				:list="column.widgets"
+				:options="{ handle: '.handle', animation: 150 }"
+				@sort="onWidgetSort"
+			>
+				<div v-for="widget in column.widgets" class="customize-container" :key="widget.id">
+					<header>
+						<span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button>
+					</header>
+					<div @click="widgetFunc(widget.id)">
+						<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/>
 					</div>
-				</x-draggable>
-			</template>
-			<template v-else>
-				<component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck"/>
-			</template>
-		</div>
-	</x-column>
-</div>
+				</div>
+			</x-draggable>
+		</template>
+		<template v-else>
+			<component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck"/>
+		</template>
+	</div>
+</x-column>
 </template>
 
 <script lang="ts">
@@ -66,12 +64,7 @@ export default Vue.extend({
 		XDraggable
 	},
 
-	props: {
-		column: {
-			type: Object,
-			required: true
-		}
-	},
+	inject: ['column'],
 
 	data() {
 		return {
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index d51a3abad1..e78d941d8c 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -173,23 +173,22 @@ export default (os: MiOS) => new Vuex.Store({
 				},
 
 				addDeckColumn(state, column) {
-					if (state.deck.columns == null) state.deck.columns = [];
 					state.deck.columns.push(column);
+					state.deck.layout.push([column.id]);
 				},
 
 				removeDeckColumn(state, id) {
-					if (state.deck.columns == null) return;
 					state.deck.columns = state.deck.columns.filter(c => c.id != id);
+					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
 				},
 
 				swapLeftDeckColumn(state, id) {
-					if (state.deck.columns == null) return;
-					state.deck.columns.some((c, i) => {
-						if (c.id == id) {
-							const left = state.deck.columns[i - 1];
+					state.deck.layout.some((ids, i) => {
+						if (ids.indexOf(id) != -1) {
+							const left = state.deck.layout[i - 1];
 							if (left) {
-								state.deck.columns[i - 1] = state.deck.columns[i];
-								state.deck.columns[i] = left;
+								state.deck.layout[i - 1] = state.deck.layout[i];
+								state.deck.layout[i] = left;
 							}
 							return true;
 						}
@@ -197,28 +196,40 @@ export default (os: MiOS) => new Vuex.Store({
 				},
 
 				swapRightDeckColumn(state, id) {
-					if (state.deck.columns == null) return;
-					state.deck.columns.some((c, i) => {
-						if (c.id == id) {
-							const right = state.deck.columns[i + 1];
+					state.deck.layout.some((ids, i) => {
+						if (ids.indexOf(id) != -1) {
+							const right = state.deck.layout[i + 1];
 							if (right) {
-								state.deck.columns[i + 1] = state.deck.columns[i];
-								state.deck.columns[i] = right;
+								state.deck.layout[i + 1] = state.deck.layout[i];
+								state.deck.layout[i] = right;
 							}
 							return true;
 						}
 					});
 				},
 
+				stackLeftDeckColumn(state, id) {
+					const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
+					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
+					const left = state.deck.layout[i - 1];
+					if (left) state.deck.layout[i - 1].push(id);
+					state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
+				},
+
+				popRightDeckColumn(state, id) {
+					const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
+					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
+					state.deck.layout.splice(i + 1, 0, [id]);
+					state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
+				},
+
 				addDeckWidget(state, x) {
-					if (state.deck.columns == null) return;
 					const column = state.deck.columns.find(c => c.id == x.id);
 					if (column == null) return;
 					column.widgets.unshift(x.widget);
 				},
 
 				removeDeckWidget(state, x) {
-					if (state.deck.columns == null) return;
 					const column = state.deck.columns.find(c => c.id == x.id);
 					if (column == null) return;
 					column.widgets = column.widgets.filter(w => w.id != x.widget.id);
@@ -277,6 +288,16 @@ export default (os: MiOS) => new Vuex.Store({
 					ctx.dispatch('saveDeck');
 				},
 
+				stackLeftDeckColumn(ctx, id) {
+					ctx.commit('stackLeftDeckColumn', id);
+					ctx.dispatch('saveDeck');
+				},
+
+				popRightDeckColumn(ctx, id) {
+					ctx.commit('popRightDeckColumn', id);
+					ctx.dispatch('saveDeck');
+				},
+
 				addDeckWidget(ctx, x) {
 					ctx.commit('addDeckWidget', x);
 					ctx.dispatch('saveDeck');

From caabdc68f313fb775167b62c941b81463a7a541f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 04:34:15 +0900
Subject: [PATCH 172/369] =?UTF-8?q?MisskeyDeck:=20=E3=82=B9=E3=82=BF?=
 =?UTF-8?q?=E3=83=83=E3=82=AF=E3=81=97=E3=81=9F=E3=82=AB=E3=83=A9=E3=83=A0?=
 =?UTF-8?q?=E3=82=92=E4=B8=8A=E4=B8=8B=E7=A7=BB=E5=8B=95=E3=81=A7=E3=81=8D?=
 =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 locales/ja.yml                                |  2 +
 .../app/common/views/components/menu.vue      |  4 +-
 .../desktop/views/pages/deck/deck.column.vue  | 16 ++++++--
 src/client/app/store.ts                       | 38 +++++++++++++++++++
 4 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 3161040ec8..120ccc7998 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -85,6 +85,8 @@ common:
     list: "リスト"
     swap-left: "左に移動"
     swap-right: "右に移動"
+    swap-up: "上に移動"
+    swap-down: "下に移動"
     remove: "カラムを削除"
     add-column: "カラムを追加"
     rename: "名前を変更"
diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue
index 8874e4c49b..f1e23df007 100644
--- a/src/client/app/common/views/components/menu.vue
+++ b/src/client/app/common/views/components/menu.vue
@@ -3,8 +3,8 @@
 	<div class="backdrop" ref="backdrop" @click="close"></div>
 	<div class="popover" :class="{ hukidasi }" ref="popover">
 		<template v-for="item in items">
-			<div v-if="item == null"></div>
-			<button v-else @click="clicked(item.onClick)" v-html="item.content"></button>
+			<div v-if="item === null"></div>
+			<button v-if="item" @click="clicked(item.onClick)" v-html="item.content"></button>
 		</template>
 	</div>
 </div>
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 172880df6e..897181dd37 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -111,17 +111,27 @@ export default Vue.extend({
 				onClick: () => {
 					this.$store.dispatch('settings/swapRightDeckColumn', this.column.id);
 				}
-			}, null, {
+			}, this.isStacked ? {
+				content: '%fa:arrow-up% %i18n:common.deck.swap-up%',
+				onClick: () => {
+					this.$store.dispatch('settings/swapUpDeckColumn', this.column.id);
+				}
+			} : undefined, this.isStacked ? {
+				content: '%fa:arrow-down% %i18n:common.deck.swap-down%',
+				onClick: () => {
+					this.$store.dispatch('settings/swapDownDeckColumn', this.column.id);
+				}
+			} : undefined, null, {
 				content: '%fa:window-restore R% %i18n:common.deck.stack-left%',
 				onClick: () => {
 					this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id);
 				}
-			}, {
+			}, this.isStacked ? {
 				content: '%fa:window-restore R% %i18n:common.deck.pop-right%',
 				onClick: () => {
 					this.$store.dispatch('settings/popRightDeckColumn', this.column.id);
 				}
-			}, null, {
+			} : undefined, null, {
 				content: '%fa:trash-alt R% %i18n:common.deck.remove%',
 				onClick: () => {
 					this.$store.dispatch('settings/removeDeckColumn', this.column.id);
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index e78d941d8c..e6c3863d7f 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -208,6 +208,34 @@ export default (os: MiOS) => new Vuex.Store({
 					});
 				},
 
+				swapUpDeckColumn(state, id) {
+					const ids = state.deck.layout.find(ids => ids.indexOf(id) != -1);
+					ids.some((x, i) => {
+						if (x == id) {
+							const up = ids[i - 1];
+							if (up) {
+								ids[i - 1] = id;
+								ids[i] = up;
+							}
+							return true;
+						}
+					});
+				},
+
+				swapDownDeckColumn(state, id) {
+					const ids = state.deck.layout.find(ids => ids.indexOf(id) != -1);
+					ids.some((x, i) => {
+						if (x == id) {
+							const down = ids[i + 1];
+							if (down) {
+								ids[i + 1] = id;
+								ids[i] = down;
+							}
+							return true;
+						}
+					});
+				},
+
 				stackLeftDeckColumn(state, id) {
 					const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
 					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
@@ -288,6 +316,16 @@ export default (os: MiOS) => new Vuex.Store({
 					ctx.dispatch('saveDeck');
 				},
 
+				swapUpDeckColumn(ctx, id) {
+					ctx.commit('swapUpDeckColumn', id);
+					ctx.dispatch('saveDeck');
+				},
+
+				swapDownDeckColumn(ctx, id) {
+					ctx.commit('swapDownDeckColumn', id);
+					ctx.dispatch('saveDeck');
+				},
+
 				stackLeftDeckColumn(ctx, id) {
 					ctx.commit('stackLeftDeckColumn', id);
 					ctx.dispatch('saveDeck');

From 07bbd9506a838cf101047b65ab6d0dce5742f9c6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 04:46:31 +0900
Subject: [PATCH 173/369] :art:

---
 src/client/app/desktop/views/pages/deck/deck.column.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 897181dd37..b7e46a29e1 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -127,7 +127,7 @@ export default Vue.extend({
 					this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id);
 				}
 			}, this.isStacked ? {
-				content: '%fa:window-restore R% %i18n:common.deck.pop-right%',
+				content: '%fa:window-maximize R% %i18n:common.deck.pop-right%',
 				onClick: () => {
 					this.$store.dispatch('settings/popRightDeckColumn', this.column.id);
 				}

From b0a8d7abe9478bd514cd642027fabe01ed63f301 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 05:04:21 +0900
Subject: [PATCH 174/369] :v:

---
 .../desktop/views/pages/deck/deck.column.vue  | 21 +++++++++++++++----
 .../desktop/views/pages/deck/deck.notes.vue   | 13 ++++++------
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index b7e46a29e1..8996228a8a 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,7 +1,8 @@
 <template>
 <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, isActive, isStacked }">
-	<header :class="{ indicate }" @click="toggleActive">
+	<header :class="{ indicate: count > 0 }" @click="toggleActive">
 		<slot name="header"></slot>
+		<span class="count" v-if="count > 0">({{ count }})</span>
 		<button ref="menu" @click.stop="showMenu">%fa:caret-down%</button>
 	</header>
 	<div ref="body" v-show="isActive">
@@ -46,16 +47,24 @@ export default Vue.extend({
 
 	data() {
 		return {
-			indicate: false,
+			count: 0,
 			isActive: this._isActive
 		};
 	},
 
+	watch: {
+		isActive(v) {
+			if (v && this.isScrollTop()) {
+				this.$emit('top');
+			}
+		}
+	},
+
 	provide() {
 		return {
 			column: this,
 			isScrollTop: this.isScrollTop,
-			indicate: v => this.indicate = v
+			count: v => this.count = v
 		};
 	},
 
@@ -75,7 +84,7 @@ export default Vue.extend({
 		},
 
 		isScrollTop() {
-			return this.$refs.body.scrollTop == 0;
+			return this.isActive && this.$refs.body.scrollTop == 0;
 		},
 
 		onScroll() {
@@ -205,6 +214,10 @@ root(isDark)
 			[data-fa]
 				margin-right 8px
 
+		> .count
+			margin-left 4px
+			opacity 0.5
+
 		> button
 			position absolute
 			top 0
diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue
index e37505b551..1ccacea908 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notes.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue
@@ -28,8 +28,6 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import { url } from '../../../config';
-import getNoteSummary from '../../../../../renderers/get-note-summary';
 
 import XNote from './deck.note.vue';
 
@@ -40,7 +38,7 @@ export default Vue.extend({
 		XNote
 	},
 
-	inject: ['column', 'isScrollTop', 'indicate'],
+	inject: ['column', 'isScrollTop', 'count'],
 
 	props: {
 		more: {
@@ -55,7 +53,6 @@ export default Vue.extend({
 			requestInitPromise: null as () => Promise<any[]>,
 			notes: [],
 			queue: [],
-			unreadCount: 0,
 			fetching: true,
 			moreFetching: false
 		};
@@ -73,6 +70,12 @@ export default Vue.extend({
 		}
 	},
 
+	watch: {
+		queue(q) {
+			this.count(q.length);
+		}
+	},
+
 	created() {
 		this.column.$on('top', this.onTop);
 		this.column.$on('bottom', this.onBottom);
@@ -141,7 +144,6 @@ export default Vue.extend({
 				}
 			} else {
 				this.queue.push(note);
-				this.indicate(true);
 			}
 		},
 
@@ -156,7 +158,6 @@ export default Vue.extend({
 		releaseQueue() {
 			this.queue.forEach(n => this.prepend(n, true));
 			this.queue = [];
-			this.indicate(false);
 		},
 
 		async loadMore() {

From 602284d38c264a2260196be6567ab86fea090a31 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 05:04:56 +0900
Subject: [PATCH 175/369] 2.30.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index d7986e059a..3b49b395ad 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.29.1",
-	"clientVersion": "1.0.6218",
+	"version": "2.30.0",
+	"clientVersion": "1.0.6253",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From af9c5c6ab7e272427346474a401f426a9c209a31 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 05:07:19 +0900
Subject: [PATCH 176/369] typo

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index a6eade4bc2..e52c9f1df0 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ ultimately sophisticated new type of mini-blog based SNS.
 ----------------------------------------------------------------
 * Reactions
 * User lists
-* Cusromizable column view (known as MisskeyDeck)
+* Customizable column view (known as MisskeyDeck)
 * Private messages
 * Mute
 * Streaming

From af501f5eeb91027f1ae60f55498673f462585b74 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 05:48:27 +0900
Subject: [PATCH 177/369] Fix bug

---
 .../views/pages/deck/deck.column-core.vue     | 20 ++++--------
 .../desktop/views/pages/deck/deck.column.vue  | 31 ++++++++++++-------
 .../pages/deck/deck.notifications-column.vue  | 17 ++++++++--
 .../views/pages/deck/deck.tl-column.vue       | 17 ++++++++--
 .../views/pages/deck/deck.widgets-column.vue  | 17 ++++++++--
 5 files changed, 71 insertions(+), 31 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue
index 836ce3ac9e..8046480ec6 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column-core.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue
@@ -1,10 +1,10 @@
 <template>
-<x-widgets-column v-if="column.type == 'widgets'"/>
-<x-notifications-column v-else-if="column.type == 'notifications'"/>
-<x-tl-column v-else-if="column.type == 'home'"/>
-<x-tl-column v-else-if="column.type == 'local'"/>
-<x-tl-column v-else-if="column.type == 'global'"/>
-<x-tl-column v-else-if="column.type == 'list'"/>
+<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
+<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
+<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
+<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
+<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
+<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
 </template>
 
 <script lang="ts">
@@ -35,14 +35,6 @@ export default Vue.extend({
 			required: false,
 			default: true
 		}
-	},
-
-	provide() {
-		return {
-			column: this.column,
-			isStacked: this.isStacked,
-			isActive: this.isActive
-		};
 	}
 });
 </script>
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 8996228a8a..976a424a62 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,11 +1,11 @@
 <template>
-<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, isActive, isStacked }">
+<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked }">
 	<header :class="{ indicate: count > 0 }" @click="toggleActive">
 		<slot name="header"></slot>
 		<span class="count" v-if="count > 0">({{ count }})</span>
 		<button ref="menu" @click.stop="showMenu">%fa:caret-down%</button>
 	</header>
-	<div ref="body" v-show="isActive">
+	<div ref="body" v-show="active">
 		<slot></slot>
 	</div>
 </div>
@@ -17,6 +17,18 @@ import Menu from '../../../../common/views/components/menu.vue';
 
 export default Vue.extend({
 	props: {
+		column: {
+			type: Object,
+			required: true
+		},
+		isStacked: {
+			type: Boolean,
+			required: true
+		},
+		isActive: {
+			type: Boolean,
+			required: true
+		},
 		name: {
 			type: String,
 			required: false
@@ -39,21 +51,18 @@ export default Vue.extend({
 	},
 
 	inject: {
-		column: { from: 'column' },
-		_isActive: { from: 'isActive' },
-		isStacked: { from: 'isStacked' },
 		getColumnVm: { from: 'getColumnVm' }
 	},
 
 	data() {
 		return {
 			count: 0,
-			isActive: this._isActive
+			active: this.isActive
 		};
 	},
 
 	watch: {
-		isActive(v) {
+		active(v) {
 			if (v && this.isScrollTop()) {
 				this.$emit('top');
 			}
@@ -79,12 +88,12 @@ export default Vue.extend({
 		toggleActive() {
 			if (!this.isStacked) return;
 			const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id));
-			if (this.isActive && vms.filter(vm => vm.$el.classList.contains('isActive')).length == 1) return;
-			this.isActive = !this.isActive;
+			if (this.active && vms.filter(vm => vm.$el.classList.contains('active')).length == 1) return;
+			this.active = !this.active;
 		},
 
 		isScrollTop() {
-			return this.isActive && this.$refs.body.scrollTop == 0;
+			return this.active && this.$refs.body.scrollTop == 0;
 		},
 
 		onScroll() {
@@ -176,7 +185,7 @@ root(isDark)
 	box-shadow 0 2px 16px rgba(#000, 0.1)
 	overflow hidden
 
-	&:not(.isActive)
+	&:not(.active)
 		flex-basis $header-height
 		min-height $header-height
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
index 87f16211fc..1e3500e48e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -1,5 +1,5 @@
 <template>
-<x-column :name="name">
+<x-column :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive">
 	<span slot="header">%fa:bell R%{{ name }}</span>
 
 	<x-notifications/>
@@ -17,7 +17,20 @@ export default Vue.extend({
 		XNotifications
 	},
 
-	inject: ['column'],
+	props: {
+		column: {
+			type: Object,
+			required: true
+		},
+		isStacked: {
+			type: Boolean,
+			required: true
+		},
+		isActive: {
+			type: Boolean,
+			required: true
+		}
+	},
 
 	computed: {
 		name(): string {
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index 46d56bb055..333e776b70 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -1,5 +1,5 @@
 <template>
-<x-column :menu="menu" :name="name">
+<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive">
 	<span slot="header">
 		<template v-if="column.type == 'home'">%fa:home%</template>
 		<template v-if="column.type == 'local'">%fa:R comments%</template>
@@ -30,7 +30,20 @@ export default Vue.extend({
 		XListTl
 	},
 
-	inject: ['column'],
+	props: {
+		column: {
+			type: Object,
+			required: true
+		},
+		isStacked: {
+			type: Boolean,
+			required: true
+		},
+		isActive: {
+			type: Boolean,
+			required: true
+		}
+	},
 
 	data() {
 		return {
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 1f8fd8a9bf..68724677b4 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -1,5 +1,5 @@
 <template>
-<x-column :menu="menu" :naked="true" :narrow="true" :name="name" class="wtdtxvecapixsepjtcupubtsmometobz">
+<x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive" class="wtdtxvecapixsepjtcupubtsmometobz">
 	<span slot="header">%fa:calculator%{{ name }}</span>
 
 	<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
@@ -64,7 +64,20 @@ export default Vue.extend({
 		XDraggable
 	},
 
-	inject: ['column'],
+	props: {
+		column: {
+			type: Object,
+			required: true
+		},
+		isStacked: {
+			type: Boolean,
+			required: true
+		},
+		isActive: {
+			type: Boolean,
+			required: true
+		}
+	},
 
 	data() {
 		return {

From 0967f23b6e69302697aac406472e2e15276b5dc3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 05:49:19 +0900
Subject: [PATCH 178/369] 2.30.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 3b49b395ad..553ba4bb26 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.30.0",
-	"clientVersion": "1.0.6253",
+	"version": "2.30.1",
+	"clientVersion": "1.0.6259",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 1366c785f9a22c7e9a322e4dc40eff8cd49dea2b Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 05:54:42 +0900
Subject: [PATCH 179/369] Update README.md

---
 README.md | 34 +++++-----------------------------
 1 file changed, 5 insertions(+), 29 deletions(-)

diff --git a/README.md b/README.md
index e52c9f1df0..8fe1246e50 100644
--- a/README.md
+++ b/README.md
@@ -46,18 +46,9 @@ If you want to...
 [![Backers][backers-image]][support-url]
 [![Sponsors][sponsors-image]][support-url]
 
-:mortar_board: Notable contributors
-----------------------------------------------------------------
-| ![syuilo][syuilo-icon] | ![Morisawa Aya][ayamorisawa-icon] | ![otofune][otofune-icon] | ![akihikodaki][akihikodaki-icon] | ![tamaina][tamaina-icon] | ![rinsuki][rinsuki-icon] |
-|:-:|:-:|:-:|:-:|:-:|:-:|
-| [syuilo][syuilo-link]<br>Owner | [Aya Morisawa][ayamorisawa-link]<br>Collaborator | [otofune][otofune-link]<br>Collaborator | [akihikodaki][akihikodaki-link] | [tamaina][tamaina-link] | [rinsuki][rinsuki-link] |
-
-[List of all contributors](https://github.com/syuilo/misskey/graphs/contributors)
-
-### :earth_americas: Translators
-| ![][mirro-san-icon] | ![][Conan-kun-icon] | ![][m4sk1n-icon] |
-|:-:|:-:|:-:|
-| [Mirro][mirro-san-link]<br>English, French | [Asriel][Conan-kun-link]<br>English, French | [Marcin Mikołajczak][m4sk1n-link]<br>Polish |
+| ![][ooo-icon] |
+|:-:|
+| [ooo][ooo-link] |
 
 :four_leaf_clover: Copyright
 ----------------------------------------------------------------
@@ -85,23 +76,8 @@ Misskey is an open-source software licensed under [GNU AGPLv3](LICENSE).
 [sponsors-image]: https://opencollective.com/misskey/sponsors.svg
 [support-url]: https://opencollective.com/misskey#support
 
-<!-- Contributors Info -->
 [syuilo-link]:      https://syuilo.com
 [syuilo-icon]:      https://avatars2.githubusercontent.com/u/4439005?v=3&s=70
-[ayamorisawa-link]: https://github.com/ayamorisawa
-[ayamorisawa-icon]: https://avatars0.githubusercontent.com/u/10798641?v=3&s=70
-[otofune-link]:     https://github.com/otofune
-[otofune-icon]:     https://avatars0.githubusercontent.com/u/15062473?v=3&s=70
-[akihikodaki-link]: https://github.com/akihikodaki
-[akihikodaki-icon]: https://avatars2.githubusercontent.com/u/17036990?s=70&v=4
-[rinsuki-link]:     https://github.com/rinsuki
-[rinsuki-icon]:     https://avatars0.githubusercontent.com/u/6533808?s=70&v=4
-[tamaina-link]:     https://github.com/tamaina
-[tamaina-icon]:     https://avatars1.githubusercontent.com/u/7973572?s=70&v=4
 
-[mirro-san-link]:   https://github.com/mirro-san
-[mirro-san-icon]:   https://avatars1.githubusercontent.com/u/17948612?s=70&v=4
-[Conan-kun-link]:   https://github.com/Conan-kun
-[Conan-kun-icon]:   https://avatars3.githubusercontent.com/u/30003708?s=70&v=4
-[m4sk1n-link]:      https://github.com/m4sk1n
-[m4sk1n-icon]:      https://avatars3.githubusercontent.com/u/21127288?s=70&v=4
+[ooo-link]:   https://www.patreon.com/user/creators?u=11601413
+[ooo-icon]:   https://c10.patreonusercontent.com/3/eyJ2IjoiMSIsInciOjIwMH0%3D/patreon-media/user/11601413/20cb15f209924302b399b99d3c98b850?token-time=2145916800&token-hash=IO31nK6VZCMWBWU2VAk2c824BX2QZ4DNPKyHHZXS0iw%3D

From 3d40a7df003fa0922d1362a0e2d601846a9b850d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 07:43:12 +0900
Subject: [PATCH 180/369] :v:

---
 .../views/pages/deck/deck.column-core.vue       | 17 ++++++-----------
 .../desktop/views/pages/deck/deck.column.vue    |  6 +-----
 .../pages/deck/deck.notifications-column.vue    |  6 +-----
 .../desktop/views/pages/deck/deck.tl-column.vue |  6 +-----
 .../app/desktop/views/pages/deck/deck.vue       |  2 +-
 .../views/pages/deck/deck.widgets-column.vue    |  6 +-----
 6 files changed, 11 insertions(+), 32 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue
index 8046480ec6..28e7f13650 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column-core.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue
@@ -1,10 +1,10 @@
 <template>
-<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
-<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
-<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
-<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
-<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
-<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked" :is-active="isActive"/>
+<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked"/>
+<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked"/>
+<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked"/>
+<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked"/>
+<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/>
+<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/>
 </template>
 
 <script lang="ts">
@@ -29,11 +29,6 @@ export default Vue.extend({
 			type: Boolean,
 			required: false,
 			default: false
-		},
-		isActive: {
-			type: Boolean,
-			required: false,
-			default: true
 		}
 	}
 });
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 976a424a62..bfd7924b03 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -25,10 +25,6 @@ export default Vue.extend({
 			type: Boolean,
 			required: true
 		},
-		isActive: {
-			type: Boolean,
-			required: true
-		},
 		name: {
 			type: String,
 			required: false
@@ -57,7 +53,7 @@ export default Vue.extend({
 	data() {
 		return {
 			count: 0,
-			active: this.isActive
+			active: true
 		};
 	},
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
index 1e3500e48e..220e938a46 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue
@@ -1,5 +1,5 @@
 <template>
-<x-column :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive">
+<x-column :name="name" :column="column" :is-stacked="isStacked">
 	<span slot="header">%fa:bell R%{{ name }}</span>
 
 	<x-notifications/>
@@ -25,10 +25,6 @@ export default Vue.extend({
 		isStacked: {
 			type: Boolean,
 			required: true
-		},
-		isActive: {
-			type: Boolean,
-			required: true
 		}
 	},
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index 333e776b70..30add843eb 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -1,5 +1,5 @@
 <template>
-<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive">
+<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked">
 	<span slot="header">
 		<template v-if="column.type == 'home'">%fa:home%</template>
 		<template v-if="column.type == 'local'">%fa:R comments%</template>
@@ -38,10 +38,6 @@ export default Vue.extend({
 		isStacked: {
 			type: Boolean,
 			required: true
-		},
-		isActive: {
-			type: Boolean,
-			required: true
 		}
 	},
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index fa2d90ed0e..460a99036d 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -4,7 +4,7 @@
 		<template v-for="ids in layout">
 			<div v-if="ids.length > 1" class="folder">
 				<template v-for="id, i in ids">
-					<x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true" :is-active="i == 0"/>
+					<x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true"/>
 				</template>
 			</div>
 			<x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])"/>
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 68724677b4..2b35e5b25e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -1,5 +1,5 @@
 <template>
-<x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive" class="wtdtxvecapixsepjtcupubtsmometobz">
+<x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" class="wtdtxvecapixsepjtcupubtsmometobz">
 	<span slot="header">%fa:calculator%{{ name }}</span>
 
 	<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
@@ -72,10 +72,6 @@ export default Vue.extend({
 		isStacked: {
 			type: Boolean,
 			required: true
-		},
-		isActive: {
-			type: Boolean,
-			required: true
 		}
 	},
 

From f2ccb684ebd574dfc04bf3d7b0fbccf698e9de4a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 08:05:25 +0900
Subject: [PATCH 181/369] :art:

---
 src/client/app/desktop/views/pages/deck/deck.column.vue | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index bfd7924b03..3e26d8630f 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -208,6 +208,7 @@ root(isDark)
 		color isDark ? #e3e5e8 : #888
 		background isDark ? #313543 : #fff
 		box-shadow 0 1px rgba(#000, 0.15)
+		cursor pointer
 
 		&, *
 			user-select none
@@ -229,6 +230,7 @@ root(isDark)
 			right 0
 			width $header-height
 			line-height $header-height
+			font-size 16px
 			color isDark ? #9baec8 : #ccc
 
 			&:hover

From fa171f237d5fcdcdc4296b99dde37486b47efa00 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 08:06:19 +0900
Subject: [PATCH 182/369] 2.30.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 553ba4bb26..b693617d94 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.30.1",
-	"clientVersion": "1.0.6259",
+	"version": "2.30.2",
+	"clientVersion": "1.0.6274",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From b05feb5bf76922d1777ec2f6c97159069d2e3df1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 08:38:32 +0900
Subject: [PATCH 183/369] =?UTF-8?q?MisskeyDeck:=20=E3=83=89=E3=83=A9?=
 =?UTF-8?q?=E3=83=83=E3=82=B0=E3=81=A7=E3=82=AB=E3=83=A9=E3=83=A0=E3=82=92?=
 =?UTF-8?q?=E5=85=A5=E3=82=8C=E6=9B=BF=E3=81=88=E3=82=89=E3=82=8C=E3=82=8B?=
 =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../desktop/views/pages/deck/deck.column.vue  | 67 ++++++++++++++++++-
 src/client/app/store.ts                       | 16 +++++
 2 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 3e26d8630f..7c97e45062 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,6 +1,15 @@
 <template>
-<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked }">
-	<header :class="{ indicate: count > 0 }" @click="toggleActive">
+<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging }">
+	<header :class="{ indicate: count > 0 }"
+			draggable="true"
+			@click="toggleActive"
+			@dragstart="onDragstart"
+			@dragend="onDragend"
+			@dragover.prevent.stop="onDragover"
+			@dragenter.prevent="onDragenter"
+			@dragleave="onDragleave"
+			@drop.prevent.stop="onDrop"
+		>
 		<slot name="header"></slot>
 		<span class="count" v-if="count > 0">({{ count }})</span>
 		<button ref="menu" @click.stop="showMenu">%fa:caret-down%</button>
@@ -53,7 +62,9 @@ export default Vue.extend({
 	data() {
 		return {
 			count: 0,
-			active: true
+			active: true,
+			dragging: false,
+			draghover: false
 		};
 	},
 
@@ -162,6 +173,49 @@ export default Vue.extend({
 				compact: false,
 				items
 			});
+		},
+
+		onDragstart(e) {
+			e.dataTransfer.effectAllowed = 'move';
+			e.dataTransfer.setData('mk-deck-column', this.column.id);
+			this.dragging = true;
+		},
+
+		onDragend(e) {
+			this.dragging = false;
+		},
+
+		onDragover(e) {
+			// 自分自身がドラッグされている場合
+			if (this.dragging) {
+				// 自分自身にはドロップさせない
+				e.dataTransfer.dropEffect = 'none';
+				return;
+			}
+
+			const isDeckColumn = e.dataTransfer.types[0] == 'mk-deck-column';
+
+			e.dataTransfer.dropEffect = isDeckColumn ? 'move' : 'none';
+		},
+
+		onDragenter() {
+			if (!this.dragging) this.draghover = true;
+		},
+
+		onDragleave() {
+			this.draghover = false;
+		},
+
+		onDrop(e) {
+			this.draghover = false;
+
+			const id = e.dataTransfer.getData('mk-deck-column');
+			if (id != null && id != '') {
+				this.$store.dispatch('settings/swapDeckColumn', {
+					a: this.column.id,
+					b: id
+				});
+			}
 		}
 	}
 });
@@ -181,6 +235,10 @@ root(isDark)
 	box-shadow 0 2px 16px rgba(#000, 0.1)
 	overflow hidden
 
+	&.draghover
+	&.dragging
+		box-shadow 0 0 0 2px rgba($theme-color, 0.7)
+
 	&:not(.active)
 		flex-basis $header-height
 		min-height $header-height
@@ -213,6 +271,9 @@ root(isDark)
 		&, *
 			user-select none
 
+		*:not(button)
+			pointer-events none
+
 		&.indicate
 			box-shadow 0 3px 0 0 $theme-color
 
diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index e6c3863d7f..0dbdf9bd5e 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -182,6 +182,17 @@ export default (os: MiOS) => new Vuex.Store({
 					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
 				},
 
+				swapDeckColumn(state, x) {
+					const a = x.a;
+					const b = x.b;
+					const aX = state.deck.layout.findIndex(ids => ids.indexOf(a) != -1);
+					const aY = state.deck.layout[aX].findIndex(id => id == a);
+					const bX = state.deck.layout.findIndex(ids => ids.indexOf(b) != -1);
+					const bY = state.deck.layout[bX].findIndex(id => id == b);
+					state.deck.layout[aX][aY] = b;
+					state.deck.layout[bX][bY] = a;
+				},
+
 				swapLeftDeckColumn(state, id) {
 					state.deck.layout.some((ids, i) => {
 						if (ids.indexOf(id) != -1) {
@@ -306,6 +317,11 @@ export default (os: MiOS) => new Vuex.Store({
 					ctx.dispatch('saveDeck');
 				},
 
+				swapDeckColumn(ctx, id) {
+					ctx.commit('swapDeckColumn', id);
+					ctx.dispatch('saveDeck');
+				},
+
 				swapLeftDeckColumn(ctx, id) {
 					ctx.commit('swapLeftDeckColumn', id);
 					ctx.dispatch('saveDeck');

From 3ffd6ff5a2e764d930a465d65838ebe46519ce62 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 08:39:04 +0900
Subject: [PATCH 184/369] 2.31.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index b693617d94..342b9d0479 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.30.2",
-	"clientVersion": "1.0.6274",
+	"version": "2.31.0",
+	"clientVersion": "1.0.6276",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From bb4fe5174f6ea6acf50c7411aac840f64de6e31d Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 09:08:09 +0900
Subject: [PATCH 185/369] Update README.md

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 8fe1246e50..5749cb365b 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,8 @@ ultimately sophisticated new type of mini-blog based SNS.
 
 <a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
 
+![](https://c10.patreonusercontent.com/3/e30%3D/patreon-posts/RsKWEDEKf8D_wYDQWAbex9CSb-1DnXW1nfqfLvuys5ROj2k0VF6_luuzHMTyf95n.png?token-time=1529539200&token-hash=RmcSP0947mw5o2-B6g1L6aU_OoDXANe198kLU6HMO30%3D)
+
 :sparkles: Features
 ----------------------------------------------------------------
 * Reactions

From 00e0d6ce2c71e92540180368176dbb909d30986f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 11:17:22 +0900
Subject: [PATCH 186/369] Improve usability

---
 .../desktop/views/pages/deck/deck.column.vue  | 39 +++++++++++++++----
 1 file changed, 32 insertions(+), 7 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index 7c97e45062..dd207360a2 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -1,14 +1,15 @@
 <template>
-<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging }">
+<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging, dropready }"
+		@dragover.prevent.stop="onDragover"
+		@dragenter.prevent="onDragenter"
+		@dragleave="onDragleave"
+		@drop.prevent.stop="onDrop"
+>
 	<header :class="{ indicate: count > 0 }"
 			draggable="true"
 			@click="toggleActive"
 			@dragstart="onDragstart"
 			@dragend="onDragend"
-			@dragover.prevent.stop="onDragover"
-			@dragenter.prevent="onDragenter"
-			@dragleave="onDragleave"
-			@drop.prevent.stop="onDrop"
 		>
 		<slot name="header"></slot>
 		<span class="count" v-if="count > 0">({{ count }})</span>
@@ -64,7 +65,8 @@ export default Vue.extend({
 			count: 0,
 			active: true,
 			dragging: false,
-			draghover: false
+			draghover: false,
+			dropready: false
 		};
 	},
 
@@ -73,6 +75,9 @@ export default Vue.extend({
 			if (v && this.isScrollTop()) {
 				this.$emit('top');
 			}
+		},
+		dragging(v) {
+			this.$root.$emit(v ? 'deck.column.dragStart' : 'deck.column.dragEnd');
 		}
 	},
 
@@ -86,12 +91,25 @@ export default Vue.extend({
 
 	mounted() {
 		this.$refs.body.addEventListener('scroll', this.onScroll, { passive: true });
+		this.$root.$on('deck.column.dragStart', this.onOtherDragStart);
+		this.$root.$on('deck.column.dragEnd', this.onOtherDragEnd);
 	},
+
 	beforeDestroy() {
 		this.$refs.body.removeEventListener('scroll', this.onScroll);
+		this.$root.$off('deck.column.dragStart', this.onOtherDragStart);
+		this.$root.$off('deck.column.dragEnd', this.onOtherDragEnd);
 	},
 
 	methods: {
+		onOtherDragStart() {
+			this.dropready = true;
+		},
+
+		onOtherDragEnd() {
+			this.dropready = false;
+		},
+
 		toggleActive() {
 			if (!this.isStacked) return;
 			const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id));
@@ -208,6 +226,7 @@ export default Vue.extend({
 
 		onDrop(e) {
 			this.draghover = false;
+			this.$root.$emit('deck.column.dragEnd');
 
 			const id = e.dataTransfer.getData('mk-deck-column');
 			if (id != null && id != '') {
@@ -236,8 +255,14 @@ root(isDark)
 	overflow hidden
 
 	&.draghover
+		box-shadow 0 0 0 2px rgba($theme-color, 0.8)
+
 	&.dragging
-		box-shadow 0 0 0 2px rgba($theme-color, 0.7)
+		box-shadow 0 0 0 2px rgba($theme-color, 0.4)
+
+	&.dropready
+		*
+			pointer-events none
 
 	&:not(.active)
 		flex-basis $header-height

From ebeb7f85782fb35be210cf48497d5d7ee991e368 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 11:46:45 +0900
Subject: [PATCH 187/369] :v:

---
 .../app/common/views/components/menu.vue      |  2 +-
 .../app/common/views/components/note-menu.vue | 16 +++---
 .../views/components/context-menu.menu.vue    | 22 ++++----
 .../desktop/views/components/context-menu.vue | 22 ++++++--
 .../desktop/views/components/drive.file.vue   | 20 +++----
 .../desktop/views/components/drive.folder.vue | 16 +++---
 .../app/desktop/views/components/drive.vue    |  6 +--
 .../desktop/views/pages/deck/deck.column.vue  | 54 ++++++++++++-------
 .../views/pages/deck/deck.tl-column.vue       |  5 +-
 .../app/desktop/views/pages/deck/deck.vue     | 30 ++++++-----
 .../views/pages/deck/deck.widgets-column.vue  |  5 +-
 11 files changed, 117 insertions(+), 81 deletions(-)

diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue
index f1e23df007..cf3a09e672 100644
--- a/src/client/app/common/views/components/menu.vue
+++ b/src/client/app/common/views/components/menu.vue
@@ -4,7 +4,7 @@
 	<div class="popover" :class="{ hukidasi }" ref="popover">
 		<template v-for="item in items">
 			<div v-if="item === null"></div>
-			<button v-if="item" @click="clicked(item.onClick)" v-html="item.content"></button>
+			<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text"></button>
 		</template>
 	</div>
 </div>
diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue
index 951a9ed1d9..4a8aae9e49 100644
--- a/src/client/app/common/views/components/note-menu.vue
+++ b/src/client/app/common/views/components/note-menu.vue
@@ -13,23 +13,23 @@ export default Vue.extend({
 		items() {
 			const items = [];
 			items.push({
-				content: '%i18n:@favorite%',
-				onClick: this.favorite
+				text: '%i18n:@favorite%',
+				action: this.favorite
 			});
 			if (this.note.userId == this.$store.state.i.id) {
 				items.push({
-					content: '%i18n:@pin%',
-					onClick: this.pin
+					text: '%i18n:@pin%',
+					action: this.pin
 				});
 				items.push({
-					content: '%i18n:@delete%',
-					onClick: this.del
+					text: '%i18n:@delete%',
+					action: this.del
 				});
 			}
 			if (this.note.uri) {
 				items.push({
-					content: '%i18n:@remote%',
-					onClick: () => {
+					text: '%i18n:@remote%',
+					action: () => {
 						window.open(this.note.uri, '_blank');
 					}
 				});
diff --git a/src/client/app/desktop/views/components/context-menu.menu.vue b/src/client/app/desktop/views/components/context-menu.menu.vue
index 843604a059..e7deec675e 100644
--- a/src/client/app/desktop/views/components/context-menu.menu.vue
+++ b/src/client/app/desktop/views/components/context-menu.menu.vue
@@ -1,15 +1,17 @@
 <template>
 <ul class="menu">
-	<li v-for="(item, i) in menu" :class="item.type">
-		<template v-if="item.type == 'item'">
-			<p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p>
-		</template>
-		<template v-if="item.type == 'link'">
-			<a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a>
-		</template>
-		<template v-else-if="item.type == 'nest'">
-			<p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p>
-			<me-nu :menu="item.menu" @x="click"/>
+	<li v-for="(item, i) in menu" :class="item ? item.type : item === null ? 'divider' : null">
+		<template v-if="item">
+			<template v-if="item.type == null || item.type == 'item'">
+				<p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p>
+			</template>
+			<template v-else-if="item.type == 'link'">
+				<a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a>
+			</template>
+			<template v-else-if="item.type == 'nest'">
+				<p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p>
+				<me-nu :menu="item.menu" @x="click"/>
+			</template>
 		</template>
 	</li>
 </ul>
diff --git a/src/client/app/desktop/views/components/context-menu.vue b/src/client/app/desktop/views/components/context-menu.vue
index 60a33f9c93..a9a083ec0a 100644
--- a/src/client/app/desktop/views/components/context-menu.vue
+++ b/src/client/app/desktop/views/components/context-menu.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="context-menu" :style="{ left: `${x}px`, top: `${y}px` }" @contextmenu.prevent="() => {}">
+<div class="context-menu" @contextmenu.prevent="() => {}">
 	<x-menu :menu="menu" @x="click"/>
 </div>
 </template>
@@ -17,6 +17,23 @@ export default Vue.extend({
 	props: ['x', 'y', 'menu'],
 	mounted() {
 		this.$nextTick(() => {
+			const width = this.$el.offsetWidth;
+			const height = this.$el.offsetHeight;
+
+			let x = this.x;
+			let y = this.y;
+
+			if (x + width > window.innerWidth) {
+				x = window.innerWidth - width;
+			}
+
+			if (y + height > window.innerHeight) {
+				y = window.innerHeight - height;
+			}
+
+			this.$el.style.left = x + 'px';
+			this.$el.style.top = y + 'px';
+
 			Array.from(document.querySelectorAll('body *')).forEach(el => {
 				el.addEventListener('mousedown', this.onMousedown);
 			});
@@ -38,7 +55,7 @@ export default Vue.extend({
 			return false;
 		},
 		click(item) {
-			if (item.onClick) item.onClick();
+			if (item.action) item.action();
 			this.close();
 		},
 		close() {
@@ -59,7 +76,6 @@ root(isDark)
 	$item-height = 38px
 	$padding = 10px
 
-	display none
 	position fixed
 	top 0
 	left 0
diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue
index 62a189d849..a4531e221f 100644
--- a/src/client/app/desktop/views/components/drive.file.vue
+++ b/src/client/app/desktop/views/components/drive.file.vue
@@ -66,37 +66,33 @@ export default Vue.extend({
 				type: 'item',
 				text: '%i18n:@contextmenu.rename%',
 				icon: '%fa:i-cursor%',
-				onClick: this.rename
+				action: this.rename
 			}, {
 				type: 'item',
 				text: '%i18n:@contextmenu.copy-url%',
 				icon: '%fa:link%',
-				onClick: this.copyUrl
+				action: this.copyUrl
 			}, {
 				type: 'link',
 				href: `${this.file.url}?download`,
 				text: '%i18n:@contextmenu.download%',
 				icon: '%fa:download%',
-			}, {
-				type: 'divider',
-			}, {
+			}, null, {
 				type: 'item',
 				text: '%i18n:common.delete%',
 				icon: '%fa:R trash-alt%',
-				onClick: this.deleteFile
-			}, {
-				type: 'divider',
-			}, {
+				action: this.deleteFile
+			}, null, {
 				type: 'nest',
 				text: '%i18n:@contextmenu.else-files%',
 				menu: [{
 					type: 'item',
 					text: '%i18n:@contextmenu.set-as-avatar%',
-					onClick: this.setAsAvatar
+					action: this.setAsAvatar
 				}, {
 					type: 'item',
 					text: '%i18n:@contextmenu.set-as-banner%',
-					onClick: this.setAsBanner
+					action: this.setAsBanner
 				}]
 			}, {
 				type: 'nest',
@@ -104,7 +100,7 @@ export default Vue.extend({
 				menu: [{
 					type: 'item',
 					text: '%i18n:@contextmenu.add-app%...',
-					onClick: this.addApp
+					action: this.addApp
 				}]
 			}], {
 				closed: () => {
diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue
index 06f2b3f80c..fc0f353f47 100644
--- a/src/client/app/desktop/views/components/drive.folder.vue
+++ b/src/client/app/desktop/views/components/drive.folder.vue
@@ -56,26 +56,22 @@ export default Vue.extend({
 				type: 'item',
 				text: '%i18n:@contextmenu.move-to-this-folder%',
 				icon: '%fa:arrow-right%',
-				onClick: this.go
+				action: this.go
 			}, {
 				type: 'item',
 				text: '%i18n:@contextmenu.show-in-new-window%',
 				icon: '%fa:R window-restore%',
-				onClick: this.newWindow
-			}, {
-				type: 'divider',
-			}, {
+				action: this.newWindow
+			}, null, {
 				type: 'item',
 				text: '%i18n:@contextmenu.rename%',
 				icon: '%fa:i-cursor%',
-				onClick: this.rename
-			}, {
-				type: 'divider',
-			}, {
+				action: this.rename
+			}, null, {
 				type: 'item',
 				text: '%i18n:common.delete%',
 				icon: '%fa:R trash-alt%',
-				onClick: this.deleteFolder
+				action: this.deleteFolder
 			}], {
 				closed: () => {
 					this.isContextmenuShowing = false;
diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue
index 9a738070f1..b69c884089 100644
--- a/src/client/app/desktop/views/components/drive.vue
+++ b/src/client/app/desktop/views/components/drive.vue
@@ -140,17 +140,17 @@ export default Vue.extend({
 				type: 'item',
 				text: '%i18n:@contextmenu.create-folder%',
 				icon: '%fa:R folder%',
-				onClick: this.createFolder
+				action: this.createFolder
 			}, {
 				type: 'item',
 				text: '%i18n:@contextmenu.upload%',
 				icon: '%fa:upload%',
-				onClick: this.selectLocalFile
+				action: this.selectLocalFile
 			}, {
 				type: 'item',
 				text: '%i18n:@contextmenu.url-upload%',
 				icon: '%fa:cloud-upload-alt%',
-				onClick: this.urlUpload
+				action: this.urlUpload
 			}]);
 		},
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue
index dd207360a2..d59d430da6 100644
--- a/src/client/app/desktop/views/pages/deck/deck.column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.column.vue
@@ -10,6 +10,7 @@
 			@click="toggleActive"
 			@dragstart="onDragstart"
 			@dragend="onDragend"
+			@contextmenu.prevent.stop="onContextmenu"
 		>
 		<slot name="header"></slot>
 		<span class="count" v-if="count > 0">({{ count }})</span>
@@ -24,6 +25,7 @@
 <script lang="ts">
 import Vue from 'vue';
 import Menu from '../../../../common/views/components/menu.vue';
+import contextmenu from '../../../api/contextmenu';
 
 export default Vue.extend({
 	props: {
@@ -132,10 +134,11 @@ export default Vue.extend({
 			}
 		},
 
-		showMenu() {
+		getMenu() {
 			const items = [{
-				content: '%fa:pencil-alt% %i18n:common.deck.rename%',
-				onClick: () => {
+				icon: '%fa:pencil-alt%',
+				text: '%i18n:common.deck.rename%',
+				action: () => {
 					(this as any).apis.input({
 						title: '%i18n:common.deck.rename%',
 						default: this.name,
@@ -145,38 +148,45 @@ export default Vue.extend({
 					});
 				}
 			}, null, {
-				content: '%fa:arrow-left% %i18n:common.deck.swap-left%',
-				onClick: () => {
+				icon: '%fa:arrow-left%',
+				text: '%i18n:common.deck.swap-left%',
+				action: () => {
 					this.$store.dispatch('settings/swapLeftDeckColumn', this.column.id);
 				}
 			}, {
-				content: '%fa:arrow-right% %i18n:common.deck.swap-right%',
-				onClick: () => {
+				icon: '%fa:arrow-right%',
+				text: '%i18n:common.deck.swap-right%',
+				action: () => {
 					this.$store.dispatch('settings/swapRightDeckColumn', this.column.id);
 				}
 			}, this.isStacked ? {
-				content: '%fa:arrow-up% %i18n:common.deck.swap-up%',
-				onClick: () => {
+				icon: '%fa:arrow-up%',
+				text: '%i18n:common.deck.swap-up%',
+				action: () => {
 					this.$store.dispatch('settings/swapUpDeckColumn', this.column.id);
 				}
 			} : undefined, this.isStacked ? {
-				content: '%fa:arrow-down% %i18n:common.deck.swap-down%',
-				onClick: () => {
+				icon: '%fa:arrow-down%',
+				text: '%i18n:common.deck.swap-down%',
+				action: () => {
 					this.$store.dispatch('settings/swapDownDeckColumn', this.column.id);
 				}
 			} : undefined, null, {
-				content: '%fa:window-restore R% %i18n:common.deck.stack-left%',
-				onClick: () => {
+				icon: '%fa:window-restore R%',
+				text: '%i18n:common.deck.stack-left%',
+				action: () => {
 					this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id);
 				}
 			}, this.isStacked ? {
-				content: '%fa:window-maximize R% %i18n:common.deck.pop-right%',
-				onClick: () => {
+				icon: '%fa:window-maximize R%',
+				text: '%i18n:common.deck.pop-right%',
+				action: () => {
 					this.$store.dispatch('settings/popRightDeckColumn', this.column.id);
 				}
 			} : undefined, null, {
-				content: '%fa:trash-alt R% %i18n:common.deck.remove%',
-				onClick: () => {
+				icon: '%fa:trash-alt R%',
+				text: '%i18n:common.deck.remove%',
+				action: () => {
 					this.$store.dispatch('settings/removeDeckColumn', this.column.id);
 				}
 			}];
@@ -186,10 +196,18 @@ export default Vue.extend({
 				this.menu.reverse().forEach(i => items.unshift(i));
 			}
 
+			return items;
+		},
+
+		onContextmenu(e) {
+			contextmenu((this as any).os)(e, this.getMenu());
+		},
+
+		showMenu() {
 			this.os.new(Menu, {
 				source: this.$refs.menu,
 				compact: false,
-				items
+				items: this.getMenu()
 			});
 		},
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index 30add843eb..a8e0177baa 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -45,8 +45,9 @@ export default Vue.extend({
 		return {
 			edit: false,
 			menu: [{
-				content: '%fa:cog% %i18n:@edit%',
-				onClick: () => {
+				icon: '%fa:cog%',
+				text: '%i18n:@edit%',
+				action: () => {
 					this.edit = !this.edit;
 				}
 			}]
diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue
index 460a99036d..da4acb8cca 100644
--- a/src/client/app/desktop/views/pages/deck/deck.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.vue
@@ -102,32 +102,36 @@ export default Vue.extend({
 				source: this.$refs.add,
 				compact: true,
 				items: [{
-					content: '%i18n:common.deck.home%',
-					onClick: () => {
+					icon: '%fa:home%',
+					text: '%i18n:common.deck.home%',
+					action: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
 							type: 'home'
 						});
 					}
 				}, {
-					content: '%i18n:common.deck.local%',
-					onClick: () => {
+					icon: '%fa:comments R%',
+					text: '%i18n:common.deck.local%',
+					action: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
 							type: 'local'
 						});
 					}
 				}, {
-					content: '%i18n:common.deck.global%',
-					onClick: () => {
+					icon: '%fa:globe%',
+					text: '%i18n:common.deck.global%',
+					action: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
 							type: 'global'
 						});
 					}
 				}, {
-					content: '%i18n:common.deck.list%',
-					onClick: () => {
+					icon: '%fa:list%',
+					text: '%i18n:common.deck.list%',
+					action: () => {
 						const w = (this as any).os.new(MkUserListsWindow);
 						w.$once('choosen', list => {
 							this.$store.dispatch('settings/addDeckColumn', {
@@ -139,16 +143,18 @@ export default Vue.extend({
 						});
 					}
 				}, {
-					content: '%i18n:common.deck.notifications%',
-					onClick: () => {
+					icon: '%fa:bell R%',
+					text: '%i18n:common.deck.notifications%',
+					action: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
 							type: 'notifications'
 						});
 					}
 				}, {
-					content: '%i18n:common.deck.widgets%',
-					onClick: () => {
+					icon: '%fa:calculator%',
+					text: '%i18n:common.deck.widgets%',
+					action: () => {
 						this.$store.dispatch('settings/addDeckColumn', {
 							id: uuid(),
 							type: 'widgets',
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 2b35e5b25e..098a580405 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -92,8 +92,9 @@ export default Vue.extend({
 
 	created() {
 		this.menu = [{
-			content: '%fa:cog% %i18n:@edit%',
-			onClick: () => {
+			icon: '%fa:cog%',
+			text: '%i18n:@edit%',
+			action: () => {
 				this.edit = !this.edit;
 			}
 		}];

From 16e446c121f3186cf583ff21567d67f4cb104b99 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 11:47:33 +0900
Subject: [PATCH 188/369] 2.32.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 342b9d0479..d9dfc3a552 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.31.0",
-	"clientVersion": "1.0.6276",
+	"version": "2.32.0",
+	"clientVersion": "1.0.6285",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 34f44de59c9ba74ed88be440d099435403fe5c4f Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 13:14:30 +0900
Subject: [PATCH 189/369] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 5749cb365b..580c639726 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
 > Lead Maintainer: [syuilo][syuilo-link]
 
 **[Misskey](https://misskey.xyz)** is a completely open source,
-ultimately sophisticated new type of mini-blog based SNS.
+ultimately sophisticated professional microblogging software.
 
 <a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
 

From 9a6246fd4e7f4f5a3c6f9453162c858e3bc25031 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 20:34:44 +0900
Subject: [PATCH 190/369] New: Zen mode

---
 src/client/app/desktop/views/components/ui.vue | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue
index 351deafded..d410c3d980 100644
--- a/src/client/app/desktop/views/components/ui.vue
+++ b/src/client/app/desktop/views/components/ui.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="mk-ui" :style="style">
-	<x-header class="header"/>
+	<x-header class="header" v-show="!zenMode"/>
 	<div class="content">
 		<slot></slot>
 	</div>
@@ -16,6 +16,11 @@ export default Vue.extend({
 	components: {
 		XHeader
 	},
+	data() {
+		return {
+			zenMode: false
+		};
+	},
 	computed: {
 		style(): any {
 			if (!this.$store.getters.isSignedIn || this.$store.state.i.wallpaperUrl == null) return {};
@@ -39,6 +44,11 @@ export default Vue.extend({
 				e.preventDefault();
 				(this as any).apis.post();
 			}
+
+			if (e.which == 90) { // z
+				e.preventDefault();
+				this.zenMode = !this.zenMode;
+			}
 		}
 	}
 });

From 724e812972cdaf55b0c2e8d3ebbb31637c405f57 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 20:57:02 +0900
Subject: [PATCH 191/369] Refactor

---
 .../app/common/views/components/index.ts      |   2 +
 .../common/views/components/note-header.vue   | 112 ++++++++++++++++++
 .../desktop/views/components/note-preview.vue |  54 +--------
 .../views/components/notes.note.sub.vue       |  71 +----------
 .../desktop/views/components/notes.note.vue   |  79 +-----------
 .../views/pages/deck/deck.note.sub.vue        |  80 +------------
 .../desktop/views/pages/deck/deck.note.vue    |  76 +-----------
 .../mobile/views/components/note-preview.vue  |  79 +-----------
 .../app/mobile/views/components/note.sub.vue  |  81 +------------
 .../app/mobile/views/components/note.vue      |  78 +-----------
 10 files changed, 128 insertions(+), 584 deletions(-)
 create mode 100644 src/client/app/common/views/components/note-header.vue

diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index f30e3f953b..803854468e 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -2,6 +2,7 @@ import Vue from 'vue';
 
 import analogClock from './analog-clock.vue';
 import menu from './menu.vue';
+import noteHeader from './note-header.vue';
 import signin from './signin.vue';
 import signup from './signup.vue';
 import forkit from './forkit.vue';
@@ -31,6 +32,7 @@ import welcomeTimeline from './welcome-timeline.vue';
 
 Vue.component('mk-analog-clock', analogClock);
 Vue.component('mk-menu', menu);
+Vue.component('mk-note-header', noteHeader);
 Vue.component('mk-signin', signin);
 Vue.component('mk-signup', signup);
 Vue.component('mk-forkit', forkit);
diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue
new file mode 100644
index 0000000000..611a14f73d
--- /dev/null
+++ b/src/client/app/common/views/components/note-header.vue
@@ -0,0 +1,112 @@
+<template>
+<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
+	<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
+	<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
+	<span class="is-admin" v-if="note.user.isAdmin">admin</span>
+	<span class="is-bot" v-if="note.user.isBot">bot</span>
+	<span class="is-cat" v-if="note.user.isCat">cat</span>
+	<span class="username"><mk-acct :user="note.user"/></span>
+	<div class="info">
+		<span class="app" v-if="note.app">via <b>{{ note.app.name }}</b></span>
+		<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
+		<router-link class="created-at" :to="note | notePage">
+			<mk-time :time="note.createdAt"/>
+		</router-link>
+		<span class="visibility" v-if="note.visibility != 'public'">
+			<template v-if="note.visibility == 'home'">%fa:home%</template>
+			<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
+			<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
+			<template v-if="note.visibility == 'private'">%fa:lock%</template>
+		</span>
+	</div>
+</header>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+
+export default Vue.extend({
+	props: {
+		note: {
+			type: Object,
+			required: true
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	display flex
+	align-items baseline
+	white-space nowrap
+
+	> .avatar
+		flex-shrink 0
+		margin-right 8px
+		width 20px
+		height 20px
+		border-radius 100%
+
+	> .name
+		display block
+		margin 0 .5em 0 0
+		padding 0
+		overflow hidden
+		color isDark ? #fff : #627079
+		font-size 1em
+		font-weight bold
+		text-decoration none
+		text-overflow ellipsis
+
+		&:hover
+			text-decoration underline
+
+	> .is-admin
+	> .is-bot
+	> .is-cat
+		align-self center
+		margin 0 .5em 0 0
+		padding 1px 6px
+		font-size 12px
+		color isDark ? #758188 : #aaa
+		border solid 1px isDark ? #57616f : #ddd
+		border-radius 3px
+
+		&.is-admin
+			border-color isDark ? #d42c41 : #f56a7b
+			color isDark ? #d42c41 : #f56a7b
+
+	> .username
+		margin 0 .5em 0 0
+		overflow hidden
+		text-overflow ellipsis
+		color isDark ? #606984 : #ccc
+
+	> .info
+		margin-left auto
+		font-size 0.9em
+
+		> *
+			color isDark ? #606984 : #c0c0c0
+
+		> .mobile
+			margin-right 8px
+
+		> .app
+			margin-right 8px
+			padding-right 8px
+			border-right solid 1px isDark ? #1c2023 : #eaeaea
+
+		> .visibility
+			margin-left 8px
+
+.bvonvjxbwzaiskogyhbwgyxvcgserpmu[data-darkmode]
+	root(true)
+
+.bvonvjxbwzaiskogyhbwgyxvcgserpmu:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue
index 1d9ee2cd0a..fed3b37f40 100644
--- a/src/client/app/desktop/views/components/note-preview.vue
+++ b/src/client/app/desktop/views/components/note-preview.vue
@@ -2,22 +2,7 @@
 <div class="mk-note-preview" :title="title">
 	<mk-avatar class="avatar" :user="note.user"/>
 	<div class="main">
-		<header>
-			<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
-			<span class="username"><mk-acct :user="note.user"/></span>
-			<div class="info">
-				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
-				<router-link class="created-at" :to="note | notePage">
-					<mk-time :time="note.createdAt"/>
-				</router-link>
-				<span class="visibility" v-if="note.visibility != 'public'">
-					<template v-if="note.visibility == 'home'">%fa:home%</template>
-					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
-					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
-					<template v-if="note.visibility == 'private'">%fa:lock%</template>
-				</span>
-			</div>
-		</header>
+		<mk-note-header class="header" :note="note"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
@@ -56,43 +41,6 @@ root(isDark)
 		flex 1
 		min-width 0
 
-		> header
-			display flex
-			align-items baseline
-			white-space nowrap
-
-			> .name
-				margin 0 .5em 0 0
-				padding 0
-				overflow hidden
-				color isDark ? #fff : #607073
-				font-size 1em
-				font-weight bold
-				text-decoration none
-				text-overflow ellipsis
-
-				&:hover
-					text-decoration underline
-
-			> .username
-				margin 0 .5em 0 0
-				overflow hidden
-				text-overflow ellipsis
-				color isDark ? #606984 : #d1d8da
-
-			> .info
-				margin-left auto
-				font-size 0.9em
-
-				> *
-					color isDark ? #606984 : #b2b8bb
-
-				> .mobile
-					margin-right 6px
-
-				> .visibility
-					margin-left 6px
-
 		> .body
 
 			> .text
diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue
index 827112ecd8..a8186fb7e4 100644
--- a/src/client/app/desktop/views/components/notes.note.sub.vue
+++ b/src/client/app/desktop/views/components/notes.note.sub.vue
@@ -2,25 +2,7 @@
 <div class="sub" :title="title">
 	<mk-avatar class="avatar" :user="note.user"/>
 	<div class="main">
-		<header>
-			<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
-			<span class="is-admin" v-if="note.user.isAdmin">admin</span>
-			<span class="is-bot" v-if="note.user.isBot">bot</span>
-			<span class="is-cat" v-if="note.user.isCat">cat</span>
-			<span class="username"><mk-acct :user="note.user"/></span>
-			<div class="info">
-				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
-				<router-link class="created-at" :to="note | notePage">
-					<mk-time :time="note.createdAt"/>
-				</router-link>
-				<span class="visibility" v-if="note.visibility != 'public'">
-					<template v-if="note.visibility == 'home'">%fa:home%</template>
-					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
-					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
-					<template v-if="note.visibility == 'private'">%fa:lock%</template>
-				</span>
-			</div>
-		</header>
+		<mk-note-header class="header" :note="note"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
@@ -62,57 +44,8 @@ root(isDark)
 		flex 1
 		min-width 0
 
-		> header
-			display flex
-			align-items baseline
+		> .header
 			margin-bottom 2px
-			white-space nowrap
-
-			> .name
-				display block
-				margin 0 .5em 0 0
-				padding 0
-				overflow hidden
-				color isDark ? #fff : #607073
-				font-size 1em
-				font-weight bold
-				text-decoration none
-				text-overflow ellipsis
-
-				&:hover
-					text-decoration underline
-
-			> .is-admin
-			> .is-bot
-			> .is-cat
-				align-self center
-				margin 0 0.5em 0 0
-				padding 1px 5px
-				font-size 10px
-				color isDark ? #758188 : #aaa
-				border solid 1px isDark ? #57616f : #ddd
-				border-radius 3px
-
-				&.is-admin
-					border-color isDark ? #d42c41 : #f56a7b
-					color isDark ? #d42c41 : #f56a7b
-
-			> .username
-				margin 0 .5em 0 0
-				color isDark ? #606984 : #d1d8da
-
-			> .info
-				margin-left auto
-				font-size 0.9em
-
-				> *
-					color isDark ? #606984 : #b2b8bb
-
-				> .mobile
-					margin-right 6px
-
-				> .visibility
-					margin-left 6px
 
 		> .body
 
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index ca67373c23..2f185e335a 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -14,26 +14,7 @@
 	<article>
 		<mk-avatar class="avatar" :user="p.user"/>
 		<div class="main">
-			<header>
-				<router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link>
-				<span class="is-admin" v-if="p.user.isAdmin">admin</span>
-				<span class="is-bot" v-if="p.user.isBot">bot</span>
-				<span class="is-cat" v-if="p.user.isCat">cat</span>
-				<span class="username"><mk-acct :user="p.user"/></span>
-				<div class="info">
-					<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>
-					<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
-					<router-link class="created-at" :to="p | notePage">
-						<mk-time :time="p.createdAt"/>
-					</router-link>
-					<span class="visibility" v-if="p.visibility != 'public'">
-						<template v-if="p.visibility == 'home'">%fa:home%</template>
-						<template v-if="p.visibility == 'followers'">%fa:unlock%</template>
-						<template v-if="p.visibility == 'specified'">%fa:envelope%</template>
-						<template v-if="p.visibility == 'private'">%fa:lock%</template>
-					</span>
-				</div>
-			</header>
+			<mk-note-header class="header" :note="p"/>
 			<div class="body">
 				<p v-if="p.cw != null" class="cw">
 					<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
@@ -409,64 +390,8 @@ root(isDark)
 			flex 1
 			min-width 0
 
-			> header
-				display flex
-				align-items baseline
+			> .header
 				margin-bottom 4px
-				white-space nowrap
-
-				> .name
-					display block
-					margin 0 .5em 0 0
-					padding 0
-					overflow hidden
-					color isDark ? #fff : #627079
-					font-size 1em
-					font-weight bold
-					text-decoration none
-					text-overflow ellipsis
-
-					&:hover
-						text-decoration underline
-
-				> .is-admin
-				> .is-bot
-				> .is-cat
-					align-self center
-					margin 0 .5em 0 0
-					padding 1px 6px
-					font-size 12px
-					color isDark ? #758188 : #aaa
-					border solid 1px isDark ? #57616f : #ddd
-					border-radius 3px
-
-					&.is-admin
-						border-color isDark ? #d42c41 : #f56a7b
-						color isDark ? #d42c41 : #f56a7b
-
-				> .username
-					margin 0 .5em 0 0
-					overflow hidden
-					text-overflow ellipsis
-					color isDark ? #606984 : #ccc
-
-				> .info
-					margin-left auto
-					font-size 0.9em
-
-					> *
-						color isDark ? #606984 : #c0c0c0
-
-					> .mobile
-						margin-right 8px
-
-					> .app
-						margin-right 8px
-						padding-right 8px
-						border-right solid 1px isDark ? #1c2023 : #eaeaea
-
-					> .visibility
-						margin-left 8px
 
 			> .body
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
index b458b74186..6fc70b6af5 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
@@ -2,25 +2,7 @@
 <div class="fnlfosztlhtptnongximhlbykxblytcq">
 	<mk-avatar class="avatar" :user="note.user"/>
 	<div class="main">
-		<header>
-			<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
-			<span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span>
-			<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
-			<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
-			<span class="username"><mk-acct :user="note.user"/></span>
-			<div class="info">
-				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
-				<router-link class="created-at" :to="note | notePage">
-					<mk-time :time="note.createdAt"/>
-				</router-link>
-				<span class="visibility" v-if="note.visibility != 'public'">
-					<template v-if="note.visibility == 'home'">%fa:home%</template>
-					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
-					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
-					<template v-if="note.visibility == 'private'">%fa:lock%</template>
-				</span>
-			</div>
-		</header>
+		<mk-note-header class="header" :note="note"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
@@ -72,66 +54,8 @@ root(isDark)
 		flex 1
 		min-width 0
 
-		> header
-			display flex
-			align-items baseline
+		> .header
 			margin-bottom 2px
-			white-space nowrap
-
-			> .avatar
-				flex-shrink 0
-				margin-right 8px
-				width 18px
-				height 18px
-				border-radius 100%
-
-			> .name
-				display block
-				margin 0 0.5em 0 0
-				padding 0
-				overflow hidden
-				color isDark ? #fff : #607073
-				font-size 1em
-				font-weight 700
-				text-align left
-				text-decoration none
-				text-overflow ellipsis
-
-				&:hover
-					text-decoration underline
-
-			> .is-admin
-			> .is-bot
-			> .is-cat
-				align-self center
-				margin 0 0.5em 0 0
-				padding 1px 5px
-				font-size 0.8em
-				color isDark ? #758188 : #aaa
-				border solid 1px isDark ? #57616f : #ddd
-				border-radius 3px
-
-				&.is-admin
-					border-color isDark ? #d42c41 : #f56a7b
-					color isDark ? #d42c41 : #f56a7b
-
-			> .username
-				text-align left
-				margin 0
-				color isDark ? #606984 : #d1d8da
-
-			> .info
-				margin-left auto
-				font-size 0.9em
-
-				> *
-					color isDark ? #606984 : #b2b8bb
-
-				> .mobile
-					margin-right 6px
-
-				> .visibility
-					margin-left 6px
 
 		> .body
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index 27d1cb8d47..2dab8289ed 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -14,25 +14,7 @@
 	<article>
 		<mk-avatar class="avatar" :user="p.user"/>
 		<div class="main">
-			<header>
-				<router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link>
-				<span class="is-admin" v-if="p.user.isAdmin">admin</span>
-				<span class="is-bot" v-if="p.user.isBot">bot</span>
-				<span class="is-cat" v-if="p.user.isCat">cat</span>
-				<span class="username"><mk-acct :user="p.user"/></span>
-				<div class="info">
-					<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
-					<router-link class="created-at" :to="p | notePage">
-						<mk-time :time="p.createdAt"/>
-					</router-link>
-					<span class="visibility" v-if="p.visibility != 'public'">
-						<template v-if="p.visibility == 'home'">%fa:home%</template>
-						<template v-if="p.visibility == 'followers'">%fa:unlock%</template>
-						<template v-if="p.visibility == 'specified'">%fa:envelope%</template>
-						<template v-if="p.visibility == 'private'">%fa:lock%</template>
-					</span>
-				</div>
-			</header>
+			<mk-note-header class="header" :note="p"/>
 			<div class="body">
 				<p v-if="p.cw != null" class="cw">
 					<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
@@ -292,62 +274,6 @@ root(isDark)
 			flex 1
 			min-width 0
 
-			> header
-				display flex
-				align-items baseline
-				white-space nowrap
-
-				> .avatar
-					flex-shrink 0
-					margin-right 8px
-					width 20px
-					height 20px
-					border-radius 100%
-
-				> .name
-					display block
-					margin 0 0.5em 0 0
-					padding 0
-					overflow hidden
-					color isDark ? #fff : #627079
-					font-weight bold
-					text-decoration none
-					text-overflow ellipsis
-
-				> .is-admin
-				> .is-bot
-				> .is-cat
-					align-self center
-					margin 0 0.5em 0 0
-					padding 1px 6px
-					font-size 0.8em
-					color isDark ? #758188 : #aaa
-					border solid 1px isDark ? #57616f : #ddd
-					border-radius 3px
-
-					&.is-admin
-						border-color isDark ? #d42c41 : #f56a7b
-						color isDark ? #d42c41 : #f56a7b
-
-				> .username
-					margin 0 0.5em 0 0
-					overflow hidden
-					text-overflow ellipsis
-					color isDark ? #606984 : #ccc
-
-				> .info
-					margin-left auto
-					font-size 0.9em
-
-					> *
-						color isDark ? #606984 : #c0c0c0
-
-					> .mobile
-						margin-right 6px
-
-					> .visibility
-						margin-left 6px
-
 			> .body
 
 				> .cw
diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index 77ca99e978..388ac5c090 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -2,26 +2,7 @@
 <div class="mk-note-preview" :class="{ smart: $store.state.device.postStyle == 'smart' }">
 	<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
 	<div class="main">
-		<header>
-			<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
-			<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
-			<span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span>
-			<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
-			<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
-			<span class="username"><mk-acct :user="note.user"/></span>
-			<div class="info">
-				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
-				<router-link class="created-at" :to="note | notePage">
-					<mk-time :time="note.createdAt"/>
-				</router-link>
-				<span class="visibility" v-if="note.visibility != 'public'">
-					<template v-if="note.visibility == 'home'">%fa:home%</template>
-					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
-					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
-					<template v-if="note.visibility == 'private'">%fa:lock%</template>
-				</span>
-			</div>
-		</header>
+		<mk-note-header class="header" :note="note"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
@@ -79,64 +60,8 @@ root(isDark)
 		flex 1
 		min-width 0
 
-		> header
-			display flex
-			align-items baseline
+		> .header
 			margin-bottom 2px
-			white-space nowrap
-
-			> .avatar
-				flex-shrink 0
-				margin-right 8px
-				width 18px
-				height 18px
-				border-radius 100%
-
-			> .name
-				display block
-				margin 0 .5em 0 0
-				padding 0
-				overflow hidden
-				color isDark ? #fff : #607073
-				font-size 1em
-				font-weight 700
-				text-align left
-				text-decoration none
-				text-overflow ellipsis
-
-			> .is-admin
-			> .is-bot
-			> .is-cat
-				align-self center
-				margin 0 0.5em 0 0
-				padding 1px 6px
-				font-size 0.8em
-				color isDark ? #758188 : #aaa
-				border solid 1px isDark ? #57616f : #ddd
-				border-radius 3px
-
-				&.is-admin
-					border-color isDark ? #d42c41 : #f56a7b
-					color isDark ? #d42c41 : #f56a7b
-
-			> .username
-				margin 0 .5em 0 0
-				overflow hidden
-				text-overflow ellipsis
-				color isDark ? #606984 : #d1d8da
-
-			> .info
-				margin-left auto
-				font-size 0.9em
-
-				> *
-					color isDark ? #606984 : #b2b8bb
-
-				> .mobile
-					margin-right 6px
-
-				> .visibility
-					margin-left 6px
 
 		> .body
 
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index f487b7647e..f757b2e522 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -2,26 +2,7 @@
 <div class="sub" :class="{ smart: $store.state.device.postStyle == 'smart' }">
 	<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
 	<div class="main">
-		<header>
-			<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
-			<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
-			<span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span>
-			<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
-			<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
-			<span class="username"><mk-acct :user="note.user"/></span>
-			<div class="info">
-				<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
-				<router-link class="created-at" :to="note | notePage">
-					<mk-time :time="note.createdAt"/>
-				</router-link>
-				<span class="visibility" v-if="note.visibility != 'public'">
-					<template v-if="note.visibility == 'home'">%fa:home%</template>
-					<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
-					<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
-					<template v-if="note.visibility == 'private'">%fa:lock%</template>
-				</span>
-			</div>
-		</header>
+		<mk-note-header class="header" :note="note"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
@@ -92,66 +73,8 @@ root(isDark)
 		flex 1
 		min-width 0
 
-		> header
-			display flex
-			align-items baseline
+		> .header
 			margin-bottom 2px
-			white-space nowrap
-
-			> .avatar
-				flex-shrink 0
-				margin-right 8px
-				width 18px
-				height 18px
-				border-radius 100%
-
-			> .name
-				display block
-				margin 0 0.5em 0 0
-				padding 0
-				overflow hidden
-				color isDark ? #fff : #607073
-				font-size 1em
-				font-weight 700
-				text-align left
-				text-decoration none
-				text-overflow ellipsis
-
-				&:hover
-					text-decoration underline
-
-			> .is-admin
-			> .is-bot
-			> .is-cat
-				align-self center
-				margin 0 0.5em 0 0
-				padding 1px 5px
-				font-size 0.8em
-				color isDark ? #758188 : #aaa
-				border solid 1px isDark ? #57616f : #ddd
-				border-radius 3px
-
-				&.is-admin
-					border-color isDark ? #d42c41 : #f56a7b
-					color isDark ? #d42c41 : #f56a7b
-
-			> .username
-				text-align left
-				margin 0
-				color isDark ? #606984 : #d1d8da
-
-			> .info
-				margin-left auto
-				font-size 0.9em
-
-				> *
-					color isDark ? #606984 : #b2b8bb
-
-				> .mobile
-					margin-right 6px
-
-				> .visibility
-					margin-left 6px
 
 		> .body
 
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 37d86fe235..127f62868e 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -14,26 +14,7 @@
 	<article>
 		<mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle != 'smart'"/>
 		<div class="main">
-			<header>
-				<mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle == 'smart'"/>
-				<router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link>
-				<span class="is-admin" v-if="p.user.isAdmin">admin</span>
-				<span class="is-bot" v-if="p.user.isBot">bot</span>
-				<span class="is-cat" v-if="p.user.isCat">cat</span>
-				<span class="username"><mk-acct :user="p.user"/></span>
-				<div class="info">
-					<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
-					<router-link class="created-at" :to="p | notePage">
-						<mk-time :time="p.createdAt"/>
-					</router-link>
-					<span class="visibility" v-if="p.visibility != 'public'">
-						<template v-if="p.visibility == 'home'">%fa:home%</template>
-						<template v-if="p.visibility == 'followers'">%fa:unlock%</template>
-						<template v-if="p.visibility == 'specified'">%fa:envelope%</template>
-						<template v-if="p.visibility == 'private'">%fa:lock%</template>
-					</span>
-				</div>
-			</header>
+			<mk-note-header class="header" :note="p"/>
 			<div class="body">
 				<p v-if="p.cw != null" class="cw">
 					<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
@@ -358,65 +339,10 @@ root(isDark)
 			flex 1
 			min-width 0
 
-			> header
-				display flex
-				align-items baseline
-				white-space nowrap
-
+			> .header
 				@media (min-width 500px)
 					margin-bottom 2px
 
-				> .avatar
-					flex-shrink 0
-					margin-right 8px
-					width 20px
-					height 20px
-					border-radius 100%
-
-				> .name
-					display block
-					margin 0 0.5em 0 0
-					padding 0
-					overflow hidden
-					color isDark ? #fff : #627079
-					font-weight bold
-					text-decoration none
-					text-overflow ellipsis
-
-				> .is-admin
-				> .is-bot
-				> .is-cat
-					align-self center
-					margin 0 0.5em 0 0
-					padding 1px 6px
-					font-size 0.8em
-					color isDark ? #758188 : #aaa
-					border solid 1px isDark ? #57616f : #ddd
-					border-radius 3px
-
-					&.is-admin
-						border-color isDark ? #d42c41 : #f56a7b
-						color isDark ? #d42c41 : #f56a7b
-
-				> .username
-					margin 0 0.5em 0 0
-					overflow hidden
-					text-overflow ellipsis
-					color isDark ? #606984 : #ccc
-
-				> .info
-					margin-left auto
-					font-size 0.9em
-
-					> *
-						color isDark ? #606984 : #c0c0c0
-
-					> .mobile
-						margin-right 6px
-
-					> .visibility
-						margin-left 6px
-
 			> .body
 				@media (min-width 700px)
 					font-size 1.1em

From 2f3d744e19950b987305c57662f8f77f2a12f5f6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 21:17:48 +0900
Subject: [PATCH 192/369] :art:

---
 src/client/app/common/views/components/note-header.vue    | 7 ++++++-
 src/client/app/desktop/views/components/note-preview.vue  | 2 +-
 src/client/app/desktop/views/pages/deck/deck.note.sub.vue | 2 +-
 src/client/app/desktop/views/pages/deck/deck.note.vue     | 2 +-
 src/client/app/mobile/views/components/note-preview.vue   | 2 +-
 src/client/app/mobile/views/components/note.sub.vue       | 2 +-
 src/client/app/mobile/views/components/note.vue           | 2 +-
 7 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue
index 611a14f73d..1f92a1d375 100644
--- a/src/client/app/common/views/components/note-header.vue
+++ b/src/client/app/common/views/components/note-header.vue
@@ -7,7 +7,7 @@
 	<span class="is-cat" v-if="note.user.isCat">cat</span>
 	<span class="username"><mk-acct :user="note.user"/></span>
 	<div class="info">
-		<span class="app" v-if="note.app">via <b>{{ note.app.name }}</b></span>
+		<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
 		<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
 		<router-link class="created-at" :to="note | notePage">
 			<mk-time :time="note.createdAt"/>
@@ -30,6 +30,11 @@ export default Vue.extend({
 		note: {
 			type: Object,
 			required: true
+		},
+		mini: {
+			type: Boolean,
+			required: false,
+			default: false
 		}
 	}
 });
diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue
index fed3b37f40..2599439f09 100644
--- a/src/client/app/desktop/views/components/note-preview.vue
+++ b/src/client/app/desktop/views/components/note-preview.vue
@@ -2,7 +2,7 @@
 <div class="mk-note-preview" :title="title">
 	<mk-avatar class="avatar" :user="note.user"/>
 	<div class="main">
-		<mk-note-header class="header" :note="note"/>
+		<mk-note-header class="header" :note="note" :mini="true"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
index 6fc70b6af5..3ba9ae914e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue
@@ -2,7 +2,7 @@
 <div class="fnlfosztlhtptnongximhlbykxblytcq">
 	<mk-avatar class="avatar" :user="note.user"/>
 	<div class="main">
-		<mk-note-header class="header" :note="note"/>
+		<mk-note-header class="header" :note="note" :mini="true"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index 2dab8289ed..8c0c679c72 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -14,7 +14,7 @@
 	<article>
 		<mk-avatar class="avatar" :user="p.user"/>
 		<div class="main">
-			<mk-note-header class="header" :note="p"/>
+			<mk-note-header class="header" :note="p" :mini="true"/>
 			<div class="body">
 				<p v-if="p.cw != null" class="cw">
 					<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue
index 388ac5c090..5d56d2d326 100644
--- a/src/client/app/mobile/views/components/note-preview.vue
+++ b/src/client/app/mobile/views/components/note-preview.vue
@@ -2,7 +2,7 @@
 <div class="mk-note-preview" :class="{ smart: $store.state.device.postStyle == 'smart' }">
 	<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
 	<div class="main">
-		<mk-note-header class="header" :note="note"/>
+		<mk-note-header class="header" :note="note" :mini="true"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue
index f757b2e522..a68aec40a1 100644
--- a/src/client/app/mobile/views/components/note.sub.vue
+++ b/src/client/app/mobile/views/components/note.sub.vue
@@ -2,7 +2,7 @@
 <div class="sub" :class="{ smart: $store.state.device.postStyle == 'smart' }">
 	<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
 	<div class="main">
-		<mk-note-header class="header" :note="note"/>
+		<mk-note-header class="header" :note="note" :mini="true"/>
 		<div class="body">
 			<mk-sub-note-content class="text" :note="note"/>
 		</div>
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 127f62868e..62cee0abfc 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -14,7 +14,7 @@
 	<article>
 		<mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle != 'smart'"/>
 		<div class="main">
-			<mk-note-header class="header" :note="p"/>
+			<mk-note-header class="header" :note="p" :mini="true"/>
 			<div class="body">
 				<p v-if="p.cw != null" class="cw">
 					<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>

From 19300ca65cb4cc827a9a9b0f341c601a2780c5e9 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 21:22:13 +0900
Subject: [PATCH 193/369] Add new cli tool

---
 cli/update-remote-user.js | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 cli/update-remote-user.js

diff --git a/cli/update-remote-user.js b/cli/update-remote-user.js
new file mode 100644
index 0000000000..b50cddddbe
--- /dev/null
+++ b/cli/update-remote-user.js
@@ -0,0 +1,12 @@
+const updatePerson = require('../built/remote/activitypub/models/person').updatePerson;
+
+const args = process.argv.slice(2);
+const user = args[0];
+
+console.log(`Updating ${user}...`);
+
+updatePerson(user).then(() => {
+	console.log(`Updated ${user}`);
+}, e => {
+	console.error(e);
+});

From 6152fd20bf01ec97758a807f747ebf5939903f47 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 21:37:20 +0900
Subject: [PATCH 194/369] Improve deck

---
 .../desktop/views/pages/deck/deck.notes.vue   |  2 +-
 .../views/pages/deck/deck.notifications.vue   | 52 ++++++++++++++++++-
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue
index 1ccacea908..1f1ca6ad5e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notes.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue
@@ -31,7 +31,7 @@ import Vue from 'vue';
 
 import XNote from './deck.note.vue';
 
-const displayLimit = 30;
+const displayLimit = 20;
 
 export default Vue.extend({
 	components: {
diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
index 31a3673dd3..afe2cd1cbd 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
@@ -21,20 +21,27 @@
 import Vue from 'vue';
 import XNotification from './deck.notification.vue';
 
+const displayLimit = 20;
+
 export default Vue.extend({
 	components: {
 		XNotification
 	},
+
+	inject: ['column', 'isScrollTop', 'count'],
+
 	data() {
 		return {
 			fetching: true,
 			fetchingMoreNotifications: false,
 			notifications: [],
+			queue: [],
 			moreNotifications: false,
 			connection: null,
 			connectionId: null
 		};
 	},
+
 	computed: {
 		_notifications(): any[] {
 			return (this.notifications as any).map(notification => {
@@ -46,12 +53,22 @@ export default Vue.extend({
 			});
 		}
 	},
+
+	watch: {
+		queue(q) {
+			this.count(q.length);
+		}
+	},
+
 	mounted() {
 		this.connection = (this as any).os.stream.getConnection();
 		this.connectionId = (this as any).os.stream.use();
 
 		this.connection.on('notification', this.onNotification);
 
+		this.column.$on('top', this.onTop);
+		this.column.$on('bottom', this.onBottom);
+
 		const max = 10;
 
 		(this as any).api('i/notifications', {
@@ -66,10 +83,15 @@ export default Vue.extend({
 			this.fetching = false;
 		});
 	},
+
 	beforeDestroy() {
 		this.connection.off('notification', this.onNotification);
 		(this as any).os.stream.dispose(this.connectionId);
+
+		this.column.$off('top', this.onTop);
+		this.column.$off('bottom', this.onBottom);
 	},
+
 	methods: {
 		fetchMoreNotifications() {
 			this.fetchingMoreNotifications = true;
@@ -90,6 +112,7 @@ export default Vue.extend({
 				this.fetchingMoreNotifications = false;
 			});
 		},
+
 		onNotification(notification) {
 			// TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない
 			this.connection.send({
@@ -97,7 +120,34 @@ export default Vue.extend({
 				id: notification.id
 			});
 
-			this.notifications.unshift(notification);
+			this.prepend(notification);
+		},
+
+		prepend(notification) {
+			if (this.isScrollTop()) {
+				// Prepend the notification
+				this.notifications.unshift(notification);
+
+				// オーバーフローしたら古い通知は捨てる
+				if (this.notifications.length >= displayLimit) {
+					this.notifications = this.notifications.slice(0, displayLimit);
+				}
+			} else {
+				this.queue.push(notification);
+			}
+		},
+
+		releaseQueue() {
+			this.queue.forEach(n => this.prepend(n));
+			this.queue = [];
+		},
+
+		onTop() {
+			this.releaseQueue();
+		},
+
+		onBottom() {
+			this.fetchMoreNotifications();
 		}
 	}
 });

From 581d1617d8cc36c0b58cc2bbc1ab1fd4c20cec10 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 21:39:24 +0900
Subject: [PATCH 195/369] 2.33.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index d9dfc3a552..b311beb62d 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.32.0",
-	"clientVersion": "1.0.6285",
+	"version": "2.33.0",
+	"clientVersion": "1.0.6292",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 5747732156f6619afa8400924b8438d08bc5c82c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 21:50:31 +0900
Subject: [PATCH 196/369] Fix

---
 src/client/app/common/views/components/note-header.vue | 2 +-
 src/client/app/desktop/views/pages/deck/deck.note.vue  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue
index 1f92a1d375..6e64a6a6d3 100644
--- a/src/client/app/common/views/components/note-header.vue
+++ b/src/client/app/common/views/components/note-header.vue
@@ -75,7 +75,7 @@ root(isDark)
 		align-self center
 		margin 0 .5em 0 0
 		padding 1px 6px
-		font-size 12px
+		font-size 80%
 		color isDark ? #758188 : #aaa
 		border solid 1px isDark ? #57616f : #ddd
 		border-radius 3px
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index 8c0c679c72..795bd10fcc 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -216,7 +216,7 @@ root(isDark)
 	> .renote
 		display flex
 		align-items center
-		padding 8px 16px
+		padding 8px 16px 0 16px
 		line-height 28px
 		white-space pre
 		color #9dbb00

From cc6fa135ac6dc3b885c1d60f0a35afca02f1d31e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 21:50:41 +0900
Subject: [PATCH 197/369] 2.33.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index b311beb62d..36fab4684a 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.33.0",
-	"clientVersion": "1.0.6292",
+	"version": "2.33.1",
+	"clientVersion": "1.0.6294",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 02e6b732e9ccf7c40c43d68b7bb514692ceafb4f Mon Sep 17 00:00:00 2001
From: momf <m0fqn090310@gmail.com>
Date: Fri, 8 Jun 2018 22:00:18 +0900
Subject: [PATCH 198/369] fix: when text is null, bug can pass validation.

fixed. (maybe?)
---
 src/server/api/endpoints/notes/create.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts
index 182359f637..89e72a184e 100644
--- a/src/server/api/endpoints/notes/create.ts
+++ b/src/server/api/endpoints/notes/create.ts
@@ -140,7 +140,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res
 	}
 
 	// テキストが無いかつ添付ファイルが無いかつRenoteも無いかつ投票も無かったらエラー
-	if (text === undefined && files === null && renote === null && poll === undefined) {
+	if ((text === undefined or text === null) && files === null && renote === null && poll === undefined) {
 		return rej('text, mediaIds, renoteId or poll is required');
 	}
 

From 22a1dc0566abe0c8589f41a55b0740fb81a37aa0 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 22:03:14 +0900
Subject: [PATCH 199/369] Better log

---
 src/services/drive/add-file.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index 35a7a42d80..ace1a6d623 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -164,8 +164,8 @@ export default async function(
 			'metadata.deletedAt': { $exists: false }
 		});
 
-		if (much !== null) {
-			log('file with same hash is found');
+		if (much) {
+			log(`file with same hash is found: ${much._id}`);
 			return much;
 		}
 	}

From fe159a13a96fb1b22fb270cfd84d93337dd39ee7 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 8 Jun 2018 22:03:24 +0900
Subject: [PATCH 200/369] 2.33.2

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 36fab4684a..36c9d8e5f3 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.33.1",
+	"version": "2.33.2",
 	"clientVersion": "1.0.6294",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From 33495b5cb327df1d02b728854bf93b3dc3188b9c Mon Sep 17 00:00:00 2001
From: momf <m0fqn090310@gmail.com>
Date: Fri, 8 Jun 2018 22:04:07 +0900
Subject: [PATCH 201/369] fix: "or" operator.

---
 src/server/api/endpoints/notes/create.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts
index 89e72a184e..446764e1d6 100644
--- a/src/server/api/endpoints/notes/create.ts
+++ b/src/server/api/endpoints/notes/create.ts
@@ -140,7 +140,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res
 	}
 
 	// テキストが無いかつ添付ファイルが無いかつRenoteも無いかつ投票も無かったらエラー
-	if ((text === undefined or text === null) && files === null && renote === null && poll === undefined) {
+	if ((text === undefined || text === null) && files === null && renote === null && poll === undefined) {
 		return rej('text, mediaIds, renoteId or poll is required');
 	}
 

From 6eff8fde74e01fa3527585ec1fbd3629d51bc97a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 01:45:25 +0900
Subject: [PATCH 202/369] =?UTF-8?q?=E3=82=B5=E3=83=BC=E3=83=90=E3=83=BC?=
 =?UTF-8?q?=E3=81=AE=E7=B5=B1=E8=A8=88=E6=83=85=E5=A0=B1=E3=82=92=E3=83=A1?=
 =?UTF-8?q?=E3=83=A2=E3=83=AA=E3=81=AB=E8=A8=98=E6=86=B6=E3=81=99=E3=82=8B?=
 =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B=E3=81=AA=E3=81=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 package.json                                  |  2 +-
 .../views/widgets/server.cpu-memory.vue       |  9 +++++++++
 src/index.ts                                  |  4 ++--
 src/{utils/stats.ts => server-stats.ts}       | 13 ++++++++++--
 src/server/api/stream/server.ts               | 20 +++++++++++++++++--
 5 files changed, 41 insertions(+), 7 deletions(-)
 rename src/{utils/stats.ts => server-stats.ts} (70%)

diff --git a/package.json b/package.json
index 36c9d8e5f3..b0ad03aa6e 100644
--- a/package.json
+++ b/package.json
@@ -218,6 +218,6 @@
 		"webpack-cli": "2.1.4",
 		"websocket": "1.0.26",
 		"ws": "5.2.0",
-		"xev": "2.0.0"
+		"xev": "2.0.1"
 	}
 }
diff --git a/src/client/app/common/views/widgets/server.cpu-memory.vue b/src/client/app/common/views/widgets/server.cpu-memory.vue
index fbd36b255a..6bf998c249 100644
--- a/src/client/app/common/views/widgets/server.cpu-memory.vue
+++ b/src/client/app/common/views/widgets/server.cpu-memory.vue
@@ -76,9 +76,15 @@ export default Vue.extend({
 	},
 	mounted() {
 		this.connection.on('stats', this.onStats);
+		this.connection.on('statsLog', this.onStatsLog);
+		this.connection.send({
+			type: 'requestLog',
+			id: Math.random().toString()
+		});
 	},
 	beforeDestroy() {
 		this.connection.off('stats', this.onStats);
+		this.connection.off('statsLog', this.onStatsLog);
 	},
 	methods: {
 		onStats(stats) {
@@ -94,6 +100,9 @@ export default Vue.extend({
 
 			this.cpuP = (stats.cpu_usage * 100).toFixed(0);
 			this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
+		},
+		onStatsLog(statsLog) {
+			statsLog.forEach(stats => this.onStats(stats));
 		}
 	}
 });
diff --git a/src/index.ts b/src/index.ts
index bcd6561691..42a4f484e6 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -17,7 +17,7 @@ import ProgressBar from './utils/cli/progressbar';
 import EnvironmentInfo from './utils/environmentInfo';
 import MachineInfo from './utils/machineInfo';
 import DependencyInfo from './utils/dependencyInfo';
-import stats from './utils/stats';
+import serverStats from './server-stats';
 
 import loadConfig from './config/load';
 import { Config } from './config/types';
@@ -49,7 +49,7 @@ function main() {
 		masterMain(opt);
 
 		ev.mount();
-		stats();
+		serverStats();
 	} else {
 		workerMain(opt);
 	}
diff --git a/src/utils/stats.ts b/src/server-stats.ts
similarity index 70%
rename from src/utils/stats.ts
rename to src/server-stats.ts
index cfb710f5e1..85aa85b682 100644
--- a/src/utils/stats.ts
+++ b/src/server-stats.ts
@@ -9,10 +9,16 @@ const ev = new Xev();
  * Report stats regularly
  */
 export default function() {
+	const log = [];
+
+	ev.on('requestServerStatsLog', id => {
+		ev.emit('serverStatsLog:' + id, log);
+	});
+
 	setInterval(() => {
 		osUtils.cpuUsage(cpuUsage => {
 			const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/');
-			ev.emit('stats', {
+			const stats = {
 				cpu_usage: cpuUsage,
 				mem: {
 					total: os.totalmem(),
@@ -21,7 +27,10 @@ export default function() {
 				disk,
 				os_uptime: os.uptime(),
 				process_uptime: process.uptime()
-			});
+			};
+			ev.emit('serverStats', stats);
+			log.push(stats);
+			if (log.length > 50) log.shift();
 		});
 	}, 1000);
 }
diff --git a/src/server/api/stream/server.ts b/src/server/api/stream/server.ts
index 4ca2ad1b10..342170a21e 100644
--- a/src/server/api/stream/server.ts
+++ b/src/server/api/stream/server.ts
@@ -11,9 +11,25 @@ export default function(request: websocket.request, connection: websocket.connec
 		}));
 	};
 
-	ev.addListener('stats', onStats);
+	connection.on('message', async data => {
+		const msg = JSON.parse(data.utf8Data);
+
+		switch (msg.type) {
+			case 'requestLog':
+				ev.once('serverStatsLog:' + msg.id, statsLog => {
+					connection.send(JSON.stringify({
+						type: 'statsLog',
+						body: statsLog
+					}));
+				});
+				ev.emit('requestServerStatsLog', msg.id);
+				break;
+		}
+	});
+
+	ev.addListener('serverStats', onStats);
 
 	connection.on('close', () => {
-		ev.removeListener('stats', onStats);
+		ev.removeListener('serverStats', onStats);
 	});
 }

From c78945436e39121f46e083eac7a6572ca2efe2d2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 04:14:26 +0900
Subject: [PATCH 203/369] #1686

---
 locales/ja.yml                                |   5 +
 package.json                                  |   2 +-
 .../streaming/{server.ts => notes-stats.ts}   |  10 +-
 .../common/scripts/streaming/server-stats.ts  |  30 +++
 src/client/app/common/views/widgets/index.ts  |   2 +
 .../common/views/widgets/posts-monitor.vue    | 182 ++++++++++++++++++
 .../app/common/views/widgets/server.vue       |   6 +-
 .../app/desktop/views/components/home.vue     |   1 +
 .../views/pages/deck/deck.widgets-column.vue  |   1 +
 src/client/app/mios.ts                        |  12 +-
 src/client/app/mobile/views/pages/widgets.vue |   1 +
 src/db/mongodb.ts                             |   5 +-
 src/index.ts                                  |   2 +
 src/models/note.ts                            |   3 +
 src/notes-stats-child.ts                      |  20 ++
 src/notes-stats.ts                            |  20 ++
 src/server-stats.ts                           |   2 +-
 src/server/api/stream/notes-stats.ts          |  35 ++++
 .../api/stream/{server.ts => server-stats.ts} |   0
 src/server/api/streaming.ts                   |  12 +-
 20 files changed, 333 insertions(+), 18 deletions(-)
 rename src/client/app/common/scripts/streaming/{server.ts => notes-stats.ts} (57%)
 create mode 100644 src/client/app/common/scripts/streaming/server-stats.ts
 create mode 100644 src/client/app/common/views/widgets/posts-monitor.vue
 create mode 100644 src/notes-stats-child.ts
 create mode 100644 src/notes-stats.ts
 create mode 100644 src/server/api/stream/notes-stats.ts
 rename src/server/api/stream/{server.ts => server-stats.ts} (100%)

diff --git a/locales/ja.yml b/locales/ja.yml
index 120ccc7998..212ba90b69 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -63,6 +63,7 @@ common:
     memo: "メモ"
     trends: "トレンド"
     photo-stream: "フォトストリーム"
+    posts-monitor: "投稿チャート"
     slideshow: "スライドショー"
     version: "バージョン"
     broadcast: "ブロードキャスト"
@@ -249,6 +250,10 @@ common/views/widgets/photo-stream.vue:
   title: "フォトストリーム"
   no-photos: "写真はありません"
 
+common/views/widgets/posts-monitor.vue:
+  title: "投稿チャート"
+  toggle: "表示を切り替え"
+
 common/views/widgets/server.vue:
   title: "サーバー情報"
   toggle: "表示を切り替え"
diff --git a/package.json b/package.json
index b0ad03aa6e..a18f37e0a2 100644
--- a/package.json
+++ b/package.json
@@ -152,7 +152,7 @@
 		"mkdirp": "0.5.1",
 		"mocha": "5.2.0",
 		"moji": "0.5.1",
-		"mongodb": "3.0.8",
+		"mongodb": "3.0.10",
 		"monk": "6.0.6",
 		"ms": "2.1.1",
 		"nan": "2.10.0",
diff --git a/src/client/app/common/scripts/streaming/server.ts b/src/client/app/common/scripts/streaming/notes-stats.ts
similarity index 57%
rename from src/client/app/common/scripts/streaming/server.ts
rename to src/client/app/common/scripts/streaming/notes-stats.ts
index 2ea4239288..9e3e78a709 100644
--- a/src/client/app/common/scripts/streaming/server.ts
+++ b/src/client/app/common/scripts/streaming/notes-stats.ts
@@ -3,15 +3,15 @@ import StreamManager from './stream-manager';
 import MiOS from '../../../mios';
 
 /**
- * Server stream connection
+ * Notes stats stream connection
  */
-export class ServerStream extends Stream {
+export class NotesStatsStream extends Stream {
 	constructor(os: MiOS) {
-		super(os, 'server');
+		super(os, 'notes-stats');
 	}
 }
 
-export class ServerStreamManager extends StreamManager<ServerStream> {
+export class NotesStatsStreamManager extends StreamManager<NotesStatsStream> {
 	private os: MiOS;
 
 	constructor(os: MiOS) {
@@ -22,7 +22,7 @@ export class ServerStreamManager extends StreamManager<ServerStream> {
 
 	public getConnection() {
 		if (this.connection == null) {
-			this.connection = new ServerStream(this.os);
+			this.connection = new NotesStatsStream(this.os);
 		}
 
 		return this.connection;
diff --git a/src/client/app/common/scripts/streaming/server-stats.ts b/src/client/app/common/scripts/streaming/server-stats.ts
new file mode 100644
index 0000000000..9983dfcaf0
--- /dev/null
+++ b/src/client/app/common/scripts/streaming/server-stats.ts
@@ -0,0 +1,30 @@
+import Stream from './stream';
+import StreamManager from './stream-manager';
+import MiOS from '../../../mios';
+
+/**
+ * Server stats stream connection
+ */
+export class ServerStatsStream extends Stream {
+	constructor(os: MiOS) {
+		super(os, 'server-stats');
+	}
+}
+
+export class ServerStatsStreamManager extends StreamManager<ServerStatsStream> {
+	private os: MiOS;
+
+	constructor(os: MiOS) {
+		super();
+
+		this.os = os;
+	}
+
+	public getConnection() {
+		if (this.connection == null) {
+			this.connection = new ServerStatsStream(this.os);
+		}
+
+		return this.connection;
+	}
+}
diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts
index a4cabc43ba..0190393ba7 100644
--- a/src/client/app/common/views/widgets/index.ts
+++ b/src/client/app/common/views/widgets/index.ts
@@ -4,6 +4,7 @@ import wAnalogClock from './analog-clock.vue';
 import wVersion from './version.vue';
 import wRss from './rss.vue';
 import wServer from './server.vue';
+import wPostsMonitor from './posts-monitor.vue';
 import wMemo from './memo.vue';
 import wBroadcast from './broadcast.vue';
 import wCalendar from './calendar.vue';
@@ -22,6 +23,7 @@ Vue.component('mkw-tips', wTips);
 Vue.component('mkw-donation', wDonation);
 Vue.component('mkw-broadcast', wBroadcast);
 Vue.component('mkw-server', wServer);
+Vue.component('mkw-posts-monitor', wPostsMonitor);
 Vue.component('mkw-memo', wMemo);
 Vue.component('mkw-rss', wRss);
 Vue.component('mkw-version', wVersion);
diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue
new file mode 100644
index 0000000000..bdf811bad0
--- /dev/null
+++ b/src/client/app/common/views/widgets/posts-monitor.vue
@@ -0,0 +1,182 @@
+<template>
+<div class="mkw-posts-monitor">
+	<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
+		<template slot="header">%fa:chart-line%%i18n:@title%</template>
+		<button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button>
+
+		<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode">
+			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 2">
+				<defs>
+					<linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0">
+						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
+						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
+					</linearGradient>
+					<mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
+						<polyline
+							:points="fediPolylinePoints"
+							fill="none"
+							stroke="#fff"
+							stroke-width="1"/>
+					</mask>
+				</defs>
+				<rect
+					x="-1" y="-1"
+					:width="viewBoxX + 2" :height="viewBoxY + 2"
+					:style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/>
+				<text x="1" y="5">Fedi</text>
+			</svg>
+			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1">
+				<defs>
+					<linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0">
+						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
+						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
+					</linearGradient>
+					<mask :id="localMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
+						<polyline
+							:points="localPolylinePoints"
+							fill="none"
+							stroke="#fff"
+							stroke-width="1"/>
+					</mask>
+				</defs>
+				<rect
+					x="-1" y="-1"
+					:width="viewBoxX + 2" :height="viewBoxY + 2"
+					:style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/>
+				<text x="1" y="5">Local</text>
+			</svg>
+		</div>
+	</mk-widget-container>
+</div>
+</template>
+
+<script lang="ts">
+import define from '../../../common/define-widget';
+import * as uuid from 'uuid';
+
+export default define({
+	name: 'server',
+	props: () => ({
+		design: 0,
+		view: 0
+	})
+}).extend({
+	data() {
+		return {
+			connection: null,
+			connectionId: null,
+			viewBoxY: 30,
+			stats: [],
+			fediGradientId: uuid(),
+			fediMaskId: uuid(),
+			localGradientId: uuid(),
+			localMaskId: uuid(),
+			fediPolylinePoints: '',
+			localPolylinePoints: '',
+			fediPolygonPoints: '',
+			localPolygonPoints: ''
+		};
+	},
+	computed: {
+		viewBoxX(): number {
+			return this.props.view == 0 ? 50 : 100;
+		}
+	},
+	watch: {
+		viewBoxX() {
+			this.draw();
+		}
+	},
+	mounted() {
+		this.connection = (this as any).os.streams.notesStatsStream.getConnection();
+		this.connectionId = (this as any).os.streams.notesStatsStream.use();
+
+		this.connection.on('stats', this.onStats);
+		this.connection.on('statsLog', this.onStatsLog);
+		this.connection.send({
+			type: 'requestLog',
+			id: Math.random().toString()
+		});
+	},
+	beforeDestroy() {
+		this.connection.off('stats', this.onStats);
+		this.connection.off('statsLog', this.onStatsLog);
+		(this as any).os.streams.notesStatsStream.dispose(this.connectionId);
+	},
+	methods: {
+		toggle() {
+			if (this.props.view == 2) {
+				this.props.view = 0;
+			} else {
+				this.props.view++;
+			}
+			this.save();
+		},
+		func() {
+			if (this.props.design == 2) {
+				this.props.design = 0;
+			} else {
+				this.props.design++;
+			}
+			this.save();
+		},
+		draw() {
+			const stats = this.props.view == 0 ? this.stats.slice(0, 50) : this.stats;
+			const fediPeak = Math.max.apply(null, this.stats.map(x => x.all)) || 1;
+			const localPeak = Math.max.apply(null, this.stats.map(x => x.local)) || 1;
+
+			this.fediPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' ');
+			this.localPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' ');
+
+			this.fediPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
+			this.localPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
+		},
+		onStats(stats) {
+			this.stats.push(stats);
+			if (this.stats.length > 100) this.stats.shift();
+			this.draw();
+		},
+		onStatsLog(statsLog) {
+			statsLog.forEach(stats => this.onStats(stats));
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+root(isDark)
+	&.dual
+		> svg
+			width 50%
+			float left
+
+			&:first-child
+				padding-right 5px
+
+			&:last-child
+				padding-left 5px
+
+	> svg
+		display block
+		padding 10px
+		width 100%
+
+		> text
+			font-size 5px
+			fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55)
+
+			> tspan
+				opacity 0.5
+
+	&:after
+		content ""
+		display block
+		clear both
+
+.qpdmibaztplkylerhdbllwcokyrfxeyj[data-darkmode]
+	root(true)
+
+.qpdmibaztplkylerhdbllwcokyrfxeyj:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/common/views/widgets/server.vue b/src/client/app/common/views/widgets/server.vue
index 2fdd60499b..d796a3ae05 100644
--- a/src/client/app/common/views/widgets/server.vue
+++ b/src/client/app/common/views/widgets/server.vue
@@ -55,11 +55,11 @@ export default define({
 			this.fetching = false;
 		});
 
-		this.connection = (this as any).os.streams.serverStream.getConnection();
-		this.connectionId = (this as any).os.streams.serverStream.use();
+		this.connection = (this as any).os.streams.serverStatsStream.getConnection();
+		this.connectionId = (this as any).os.streams.serverStatsStream.use();
 	},
 	beforeDestroy() {
-		(this as any).os.streams.serverStream.dispose(this.connectionId);
+		(this as any).os.streams.serverStatsStream.dispose(this.connectionId);
 	},
 	methods: {
 		toggle() {
diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index 826753c169..cac1fd935b 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -23,6 +23,7 @@
 					<option value="post-form">%i18n:common.widgets.post-form%</option>
 					<option value="messaging">%i18n:common.widgets.messaging%</option>
 					<option value="memo">%i18n:common.widgets.memo%</option>
+					<option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option>
 					<option value="server">%i18n:common.widgets.server%</option>
 					<option value="donation">%i18n:common.widgets.donation%</option>
 					<option value="nav">%i18n:common.widgets.nav%</option>
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 098a580405..2a3a2472dc 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -23,6 +23,7 @@
 					<option value="post-form">%i18n:common.widgets.post-form%</option>
 					<option value="messaging">%i18n:common.widgets.messaging%</option>
 					<option value="memo">%i18n:common.widgets.memo%</option>
+					<option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option>
 					<option value="server">%i18n:common.widgets.server%</option>
 					<option value="donation">%i18n:common.widgets.donation%</option>
 					<option value="nav">%i18n:common.widgets.nav%</option>
diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts
index c644e22087..ba3f967a23 100644
--- a/src/client/app/mios.ts
+++ b/src/client/app/mios.ts
@@ -8,7 +8,8 @@ import Progress from './common/scripts/loading';
 import Connection from './common/scripts/streaming/stream';
 import { HomeStreamManager } from './common/scripts/streaming/home';
 import { DriveStreamManager } from './common/scripts/streaming/drive';
-import { ServerStreamManager } from './common/scripts/streaming/server';
+import { ServerStatsStreamManager } from './common/scripts/streaming/server-stats';
+import { NotesStatsStreamManager } from './common/scripts/streaming/notes-stats';
 import { MessagingIndexStreamManager } from './common/scripts/streaming/messaging-index';
 import { OthelloStreamManager } from './common/scripts/streaming/othello';
 
@@ -104,14 +105,16 @@ export default class MiOS extends EventEmitter {
 		localTimelineStream: LocalTimelineStreamManager;
 		globalTimelineStream: GlobalTimelineStreamManager;
 		driveStream: DriveStreamManager;
-		serverStream: ServerStreamManager;
+		serverStatsStream: ServerStatsStreamManager;
+		notesStatsStream: NotesStatsStreamManager;
 		messagingIndexStream: MessagingIndexStreamManager;
 		othelloStream: OthelloStreamManager;
 	} = {
 		localTimelineStream: null,
 		globalTimelineStream: null,
 		driveStream: null,
-		serverStream: null,
+		serverStatsStream: null,
+		notesStatsStream: null,
 		messagingIndexStream: null,
 		othelloStream: null
 	};
@@ -218,7 +221,8 @@ export default class MiOS extends EventEmitter {
 		this.store = initStore(this);
 
 		//#region Init stream managers
-		this.streams.serverStream = new ServerStreamManager(this);
+		this.streams.serverStatsStream = new ServerStatsStreamManager(this);
+		this.streams.notesStatsStream = new NotesStatsStreamManager(this);
 
 		this.once('signedin', () => {
 			// Init home stream manager
diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue
index eab0ca6a38..ea8580b4d0 100644
--- a/src/client/app/mobile/views/pages/widgets.vue
+++ b/src/client/app/mobile/views/pages/widgets.vue
@@ -15,6 +15,7 @@
 					<option value="rss">%i18n:common.widgets.rss%</option>
 					<option value="photo-stream">%i18n:common.widgets.photo-stream%</option>
 					<option value="slideshow">%i18n:common.widgets.slideshow%</option>
+					<option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option>
 					<option value="version">%i18n:common.widgets.version%</option>
 					<option value="server">%i18n:common.widgets.server%</option>
 					<option value="memo">%i18n:common.widgets.memo%</option>
diff --git a/src/db/mongodb.ts b/src/db/mongodb.ts
index 05bb72bfde..0f6d27ca15 100644
--- a/src/db/mongodb.ts
+++ b/src/db/mongodb.ts
@@ -12,7 +12,10 @@ const uri = u && p
  */
 import mongo from 'monk';
 
-const db = mongo(uri);
+const db = mongo(uri, {
+	poolSize: 16,
+	keepAlive: 1
+});
 
 export default db;
 
diff --git a/src/index.ts b/src/index.ts
index 42a4f484e6..4a98b7564c 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -18,6 +18,7 @@ import EnvironmentInfo from './utils/environmentInfo';
 import MachineInfo from './utils/machineInfo';
 import DependencyInfo from './utils/dependencyInfo';
 import serverStats from './server-stats';
+import notesStats from './notes-stats';
 
 import loadConfig from './config/load';
 import { Config } from './config/types';
@@ -50,6 +51,7 @@ function main() {
 
 		ev.mount();
 		serverStats();
+		notesStats();
 	} else {
 		workerMain(opt);
 	}
diff --git a/src/models/note.ts b/src/models/note.ts
index ad8c1565f0..d4681b7b70 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -16,6 +16,9 @@ import Following from './following';
 const Note = db.get<INote>('notes');
 Note.createIndex('uri', { sparse: true, unique: true });
 Note.createIndex('userId');
+Note.createIndex({
+	createdAt: -1
+});
 export default Note;
 
 export function isValidText(text: string): boolean {
diff --git a/src/notes-stats-child.ts b/src/notes-stats-child.ts
new file mode 100644
index 0000000000..0e0f14eaf1
--- /dev/null
+++ b/src/notes-stats-child.ts
@@ -0,0 +1,20 @@
+import Note from './models/note';
+
+setInterval(async () => {
+	const [all, local] = await Promise.all([Note.count({
+		createdAt: {
+			$gte: new Date(Date.now() - 3000)
+		}
+	}), Note.count({
+		createdAt: {
+			$gte: new Date(Date.now() - 3000)
+		},
+		'_user.host': null
+	})]);
+
+	const stats = {
+		all, local
+	};
+
+	process.send(stats);
+}, 3000);
diff --git a/src/notes-stats.ts b/src/notes-stats.ts
new file mode 100644
index 0000000000..3094c34af0
--- /dev/null
+++ b/src/notes-stats.ts
@@ -0,0 +1,20 @@
+import * as childProcess from 'child_process';
+import Xev from 'xev';
+
+const ev = new Xev();
+
+export default function() {
+	const log = [];
+
+	const p = childProcess.fork(__dirname + '/notes-stats-child.js');
+
+	p.on('message', stats => {
+		ev.emit('notesStats', stats);
+		log.push(stats);
+		if (log.length > 100) log.shift();
+	});
+
+	ev.on('requestNotesStatsLog', id => {
+		ev.emit('notesStatsLog:' + id, log);
+	});
+}
diff --git a/src/server-stats.ts b/src/server-stats.ts
index 85aa85b682..7b0d4a8576 100644
--- a/src/server-stats.ts
+++ b/src/server-stats.ts
@@ -6,7 +6,7 @@ import Xev from 'xev';
 const ev = new Xev();
 
 /**
- * Report stats regularly
+ * Report server stats regularly
  */
 export default function() {
 	const log = [];
diff --git a/src/server/api/stream/notes-stats.ts b/src/server/api/stream/notes-stats.ts
new file mode 100644
index 0000000000..739b325848
--- /dev/null
+++ b/src/server/api/stream/notes-stats.ts
@@ -0,0 +1,35 @@
+import * as websocket from 'websocket';
+import Xev from 'xev';
+
+const ev = new Xev();
+
+export default function(request: websocket.request, connection: websocket.connection): void {
+	const onStats = stats => {
+		connection.send(JSON.stringify({
+			type: 'stats',
+			body: stats
+		}));
+	};
+
+	connection.on('message', async data => {
+		const msg = JSON.parse(data.utf8Data);
+
+		switch (msg.type) {
+			case 'requestLog':
+				ev.once('notesStatsLog:' + msg.id, statsLog => {
+					connection.send(JSON.stringify({
+						type: 'statsLog',
+						body: statsLog
+					}));
+				});
+				ev.emit('requestNotesStatsLog', msg.id);
+				break;
+		}
+	});
+
+	ev.addListener('notesStats', onStats);
+
+	connection.on('close', () => {
+		ev.removeListener('notesStats', onStats);
+	});
+}
diff --git a/src/server/api/stream/server.ts b/src/server/api/stream/server-stats.ts
similarity index 100%
rename from src/server/api/stream/server.ts
rename to src/server/api/stream/server-stats.ts
diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts
index 6825b6336a..2d4cfc108f 100644
--- a/src/server/api/streaming.ts
+++ b/src/server/api/streaming.ts
@@ -12,7 +12,8 @@ import messagingStream from './stream/messaging';
 import messagingIndexStream from './stream/messaging-index';
 import othelloGameStream from './stream/othello-game';
 import othelloStream from './stream/othello';
-import serverStream from './stream/server';
+import serverStatsStream from './stream/server-stats';
+import notesStatsStream from './stream/notes-stats';
 import requestsStream from './stream/requests';
 import { ParsedUrlQuery } from 'querystring';
 import authenticate from './authenticate';
@@ -28,8 +29,13 @@ module.exports = (server: http.Server) => {
 	ws.on('request', async (request) => {
 		const connection = request.accept();
 
-		if (request.resourceURL.pathname === '/server') {
-			serverStream(request, connection);
+		if (request.resourceURL.pathname === '/server-stats') {
+			serverStatsStream(request, connection);
+			return;
+		}
+
+		if (request.resourceURL.pathname === '/notes-stats') {
+			notesStatsStream(request, connection);
 			return;
 		}
 

From 6e8a1086d8f76aec3f245ac177d2d606e2d3104c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 04:15:18 +0900
Subject: [PATCH 204/369] 2.34.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index a18f37e0a2..35160efe42 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.33.2",
-	"clientVersion": "1.0.6294",
+	"version": "2.34.0",
+	"clientVersion": "1.0.6302",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 0ce9c057e132bf3cf42c5c51b90c4702d0cf7d84 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 06:04:41 +0900
Subject: [PATCH 205/369] Fix chart rendering

---
 .../app/common/views/widgets/posts-monitor.vue     | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue
index bdf811bad0..ee1d6f91fe 100644
--- a/src/client/app/common/views/widgets/posts-monitor.vue
+++ b/src/client/app/common/views/widgets/posts-monitor.vue
@@ -121,15 +121,15 @@ export default define({
 			this.save();
 		},
 		draw() {
-			const stats = this.props.view == 0 ? this.stats.slice(0, 50) : this.stats;
-			const fediPeak = Math.max.apply(null, this.stats.map(x => x.all)) || 1;
-			const localPeak = Math.max.apply(null, this.stats.map(x => x.local)) || 1;
+			const stats = this.props.view == 0 ? this.stats.slice(50, 100) : this.stats;
+			const fediPeak = Math.max.apply(null, stats.map(x => x.all)) || 1;
+			const localPeak = Math.max.apply(null, stats.map(x => x.local)) || 1;
 
-			this.fediPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' ');
-			this.localPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' ');
+			this.fediPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' ');
+			this.localPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' ');
 
-			this.fediPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
-			this.localPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
+			this.fediPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
+			this.localPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
 		},
 		onStats(stats) {
 			this.stats.push(stats);

From e0a6d9740cb3139d725e86aaae15402877da70ca Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 06:21:13 +0900
Subject: [PATCH 206/369] :v:

---
 src/client/app/common/views/widgets/posts-monitor.vue | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue
index ee1d6f91fe..3f60f1da63 100644
--- a/src/client/app/common/views/widgets/posts-monitor.vue
+++ b/src/client/app/common/views/widgets/posts-monitor.vue
@@ -12,6 +12,10 @@
 						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
 					</linearGradient>
 					<mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
+						<polygon
+							:points="fediPolygonPoints"
+							fill="#fff"
+							fill-opacity="0.5"/>
 						<polyline
 							:points="fediPolylinePoints"
 							fill="none"
@@ -32,6 +36,10 @@
 						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
 					</linearGradient>
 					<mask :id="localMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
+						<polygon
+							:points="localPolygonPoints"
+							fill="#fff"
+							fill-opacity="0.5"/>
 						<polyline
 							:points="localPolylinePoints"
 							fill="none"
@@ -121,7 +129,7 @@ export default define({
 			this.save();
 		},
 		draw() {
-			const stats = this.props.view == 0 ? this.stats.slice(50, 100) : this.stats;
+			const stats = this.props.view == 0 ? this.stats.slice(-50) : this.stats;
 			const fediPeak = Math.max.apply(null, stats.map(x => x.all)) || 1;
 			const localPeak = Math.max.apply(null, stats.map(x => x.local)) || 1;
 

From bdec56a543ad3166ca9a8a2a3bd75327e4b12054 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 06:25:41 +0900
Subject: [PATCH 207/369] :v:

---
 src/client/app/desktop/views/pages/deck/deck.notifications.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
index afe2cd1cbd..f54ad1a3cd 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue
@@ -96,7 +96,7 @@ export default Vue.extend({
 		fetchMoreNotifications() {
 			this.fetchingMoreNotifications = true;
 
-			const max = 30;
+			const max = 20;
 
 			(this as any).api('i/notifications', {
 				limit: max + 1,

From d193cbf2b750f87e2e84a7cd197a6b2f55d4a250 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 06:27:12 +0900
Subject: [PATCH 208/369] :v:

---
 .../common/views/widgets/posts-monitor.vue    | 48 +++++++++----------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue
index 3f60f1da63..1f07342fe0 100644
--- a/src/client/app/common/views/widgets/posts-monitor.vue
+++ b/src/client/app/common/views/widgets/posts-monitor.vue
@@ -6,30 +6,6 @@
 
 		<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode">
 			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 2">
-				<defs>
-					<linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0">
-						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
-						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
-					</linearGradient>
-					<mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
-						<polygon
-							:points="fediPolygonPoints"
-							fill="#fff"
-							fill-opacity="0.5"/>
-						<polyline
-							:points="fediPolylinePoints"
-							fill="none"
-							stroke="#fff"
-							stroke-width="1"/>
-					</mask>
-				</defs>
-				<rect
-					x="-1" y="-1"
-					:width="viewBoxX + 2" :height="viewBoxY + 2"
-					:style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/>
-				<text x="1" y="5">Fedi</text>
-			</svg>
-			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1">
 				<defs>
 					<linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0">
 						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
@@ -53,6 +29,30 @@
 					:style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/>
 				<text x="1" y="5">Local</text>
 			</svg>
+			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1">
+				<defs>
+					<linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0">
+						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
+						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
+					</linearGradient>
+					<mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
+						<polygon
+							:points="fediPolygonPoints"
+							fill="#fff"
+							fill-opacity="0.5"/>
+						<polyline
+							:points="fediPolylinePoints"
+							fill="none"
+							stroke="#fff"
+							stroke-width="1"/>
+					</mask>
+				</defs>
+				<rect
+					x="-1" y="-1"
+					:width="viewBoxX + 2" :height="viewBoxY + 2"
+					:style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/>
+				<text x="1" y="5">Fedi</text>
+			</svg>
 		</div>
 	</mk-widget-container>
 </div>

From 52db63bca2b1db993e2fa2b41658cc17145062dc Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 06:28:22 +0900
Subject: [PATCH 209/369] 2.34.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 35160efe42..a8ce314e99 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.34.0",
-	"clientVersion": "1.0.6302",
+	"version": "2.34.1",
+	"clientVersion": "1.0.6318",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 944000c05c175a065c783319ecc65fa84088ad8a Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 06:52:33 +0900
Subject: [PATCH 210/369] Update README.md

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 580c639726..f8738421cf 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ ultimately sophisticated professional microblogging software.
 * Reactions
 * User lists
 * Customizable column view (known as MisskeyDeck)
+  * and widgets!
 * Private messages
 * Mute
 * Streaming

From f34f8d304c0fa286b3972e7dfac064e74a00d4ae Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 08:38:30 +0900
Subject: [PATCH 211/369] Improve performance

---
 src/client/app/common/views/components/time.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/common/views/components/time.vue b/src/client/app/common/views/components/time.vue
index 58ed115620..aebfb33897 100644
--- a/src/client/app/common/views/components/time.vue
+++ b/src/client/app/common/views/components/time.vue
@@ -59,7 +59,7 @@ export default Vue.extend({
 	created() {
 		if (this.mode == 'relative' || this.mode == 'detail') {
 			this.tick();
-			this.tickId = setInterval(this.tick, 5000);
+			this.tickId = setInterval(this.tick, 10000);
 		}
 	},
 	destroyed() {

From e166ad678014585c12c779bc2d72e82a366362e6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 10:06:27 +0900
Subject: [PATCH 212/369] Better init screen

---
 src/client/app/base.pug |  8 ++++----
 src/client/app/init.css | 40 ++++++++++++++--------------------------
 2 files changed, 18 insertions(+), 30 deletions(-)

diff --git a/src/client/app/base.pug b/src/client/app/base.pug
index a77a8a9595..11b150bc67 100644
--- a/src/client/app/base.pug
+++ b/src/client/app/base.pug
@@ -42,7 +42,7 @@ html
 			| JavaScriptを有効にしてください
 			br
 			| Please turn on your JavaScript
-		div#ini: p
-			span .
-			span .
-			span .
+		div#ini.
+			<svg viewBox="0 0 50 50">
+				<path fill=#{themeColor} d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z" />
+			</svg>
diff --git a/src/client/app/init.css b/src/client/app/init.css
index fa59195f71..6ee25d64e2 100644
--- a/src/client/app/init.css
+++ b/src/client/app/init.css
@@ -32,42 +32,30 @@ body > noscript {
 	left: 0;
 	width: 100%;
 	height: 100%;
-	text-align: center;
 	background: #fff;
 	cursor: wait;
 }
-	#ini > p {
-		display: block;
-		user-select: none;
-		margin: 32px;
-		font-size: 4em;
-		color: #555;
+	#ini > svg {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		margin: auto;
+		width: 64px;
+		height: 64px;
+		animation: ini 0.6s infinite linear;
 	}
-		#ini > p > span {
-			animation: ini 1.4s infinite ease-in-out both;
-		}
-		#ini > p > span:nth-child(1) {
-			animation-delay: 0s;
-		}
-		#ini > p > span:nth-child(2) {
-			animation-delay: 0.16s;
-		}
-		#ini > p > span:nth-child(3) {
-			animation-delay: 0.32s;
-		}
 
 html[data-darkmode] #ini {
 	background: #191b22;
 }
-	html[data-darkmode] #ini > p {
-		color: #fff;
-	}
 
 @keyframes ini {
-	0%, 80%, 100% {
-		opacity: 1;
+	from {
+		transform: rotate(0deg);
 	}
-	40% {
-		opacity: 0;
+	to {
+		transform: rotate(360deg);
 	}
 }

From 763676a18c894b9499aeecb91747681d3b856062 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 10:12:03 +0900
Subject: [PATCH 213/369] :v:

---
 src/notes-stats-child.ts | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/notes-stats-child.ts b/src/notes-stats-child.ts
index 0e0f14eaf1..5f85a2a3cc 100644
--- a/src/notes-stats-child.ts
+++ b/src/notes-stats-child.ts
@@ -1,13 +1,15 @@
 import Note from './models/note';
 
+const interval = 5000;
+
 setInterval(async () => {
 	const [all, local] = await Promise.all([Note.count({
 		createdAt: {
-			$gte: new Date(Date.now() - 3000)
+			$gte: new Date(Date.now() - interval)
 		}
 	}), Note.count({
 		createdAt: {
-			$gte: new Date(Date.now() - 3000)
+			$gte: new Date(Date.now() - interval)
 		},
 		'_user.host': null
 	})]);
@@ -17,4 +19,4 @@ setInterval(async () => {
 	};
 
 	process.send(stats);
-}, 3000);
+}, interval);

From 30d5b8d65b1e85941304f00eb9621e037ebda147 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 10:15:45 +0900
Subject: [PATCH 214/369] :art:

---
 src/client/app/desktop/views/components/notifications.vue     | 2 +-
 src/client/app/desktop/views/pages/deck/deck.note.vue         | 2 +-
 src/client/app/desktop/views/pages/deck/deck.notification.vue | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue
index ada97d5c86..e479ffadbf 100644
--- a/src/client/app/desktop/views/components/notifications.vue
+++ b/src/client/app/desktop/views/components/notifications.vue
@@ -206,7 +206,7 @@ root(isDark)
 				margin 0
 				padding 16px
 				overflow-wrap break-word
-				font-size 12px
+				font-size 13px
 				border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
 
 				&:last-child
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index 795bd10fcc..d94b092412 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -200,7 +200,7 @@ export default Vue.extend({
 @import '~const.styl'
 
 root(isDark)
-	font-size 12px
+	font-size 13px
 	border-bottom solid 1px isDark ? #1c2023 : #eaeaea
 
 	&:last-of-type
diff --git a/src/client/app/desktop/views/pages/deck/deck.notification.vue b/src/client/app/desktop/views/pages/deck/deck.notification.vue
index a145a94f8a..a379adc69e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notification.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notification.vue
@@ -112,7 +112,7 @@ export default Vue.extend({
 root(isDark)
 	> .notification
 		padding 16px
-		font-size 12px
+		font-size 13px
 		overflow-wrap break-word
 
 		&:after

From 773b2aa3d17d00552fe4c1ff37f924f0d297e051 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 10:16:29 +0900
Subject: [PATCH 215/369] 2.34.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index a8ce314e99..701e61db5b 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.34.1",
-	"clientVersion": "1.0.6318",
+	"version": "2.34.2",
+	"clientVersion": "1.0.6325",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From ccb9ed3489512c028c7c5cae7387a49441f6a666 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 11:29:50 +0900
Subject: [PATCH 216/369] :art:

---
 .../common/views/widgets/posts-monitor.vue    | 39 ++++++++++++++-----
 .../views/widgets/server.cpu-memory.vue       | 37 ++++++++++++++----
 2 files changed, 59 insertions(+), 17 deletions(-)

diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue
index 1f07342fe0..801307be54 100644
--- a/src/client/app/common/views/widgets/posts-monitor.vue
+++ b/src/client/app/common/views/widgets/posts-monitor.vue
@@ -5,7 +5,7 @@
 		<button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button>
 
 		<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode">
-			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 2">
+			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2">
 				<defs>
 					<linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0">
 						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
@@ -21,15 +21,20 @@
 							fill="none"
 							stroke="#fff"
 							stroke-width="1"/>
+						<circle
+							:cx="localHeadX"
+							:cy="localHeadY"
+							r="1.5"
+							fill="#fff"/>
 					</mask>
 				</defs>
 				<rect
-					x="-1" y="-1"
-					:width="viewBoxX + 2" :height="viewBoxY + 2"
+					x="-2" y="-2"
+					:width="viewBoxX + 4" :height="viewBoxY + 4"
 					:style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/>
 				<text x="1" y="5">Local</text>
 			</svg>
-			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1">
+			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 1">
 				<defs>
 					<linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0">
 						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
@@ -45,11 +50,16 @@
 							fill="none"
 							stroke="#fff"
 							stroke-width="1"/>
+						<circle
+							:cx="fediHeadX"
+							:cy="fediHeadY"
+							r="1.5"
+							fill="#fff"/>
 					</mask>
 				</defs>
 				<rect
-					x="-1" y="-1"
-					:width="viewBoxX + 2" :height="viewBoxY + 2"
+					x="-2" y="-2"
+					:width="viewBoxX + 4" :height="viewBoxY + 4"
 					:style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/>
 				<text x="1" y="5">Fedi</text>
 			</svg>
@@ -82,7 +92,11 @@ export default define({
 			fediPolylinePoints: '',
 			localPolylinePoints: '',
 			fediPolygonPoints: '',
-			localPolygonPoints: ''
+			localPolygonPoints: '',
+			fediHeadX: null,
+			fediHeadY: null,
+			localHeadX: null,
+			localHeadY: null
 		};
 	},
 	computed: {
@@ -133,11 +147,18 @@ export default define({
 			const fediPeak = Math.max.apply(null, stats.map(x => x.all)) || 1;
 			const localPeak = Math.max.apply(null, stats.map(x => x.local)) || 1;
 
-			this.fediPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' ');
-			this.localPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' ');
+			const fediPolylinePoints = stats.map((s, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (s.all / fediPeak)) * this.viewBoxY]);
+			const localPolylinePoints = stats.map((s, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (s.local / localPeak)) * this.viewBoxY]);
+			this.fediPolylinePoints = fediPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
+			this.localPolylinePoints = localPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
 
 			this.fediPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
 			this.localPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
+
+			this.fediHeadX = fediPolylinePoints[fediPolylinePoints.length - 1][0];
+			this.fediHeadY = fediPolylinePoints[fediPolylinePoints.length - 1][1];
+			this.localHeadX = localPolylinePoints[localPolylinePoints.length - 1][0];
+			this.localHeadY = localPolylinePoints[localPolylinePoints.length - 1][1];
 		},
 		onStats(stats) {
 			this.stats.push(stats);
diff --git a/src/client/app/common/views/widgets/server.cpu-memory.vue b/src/client/app/common/views/widgets/server.cpu-memory.vue
index 6bf998c249..da6b9f799f 100644
--- a/src/client/app/common/views/widgets/server.cpu-memory.vue
+++ b/src/client/app/common/views/widgets/server.cpu-memory.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="cpu-memory">
-	<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none">
+	<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
 		<defs>
 			<linearGradient :id="cpuGradientId" x1="0" x2="0" y1="1" y2="0">
 				<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
@@ -16,15 +16,20 @@
 					fill="none"
 					stroke="#fff"
 					stroke-width="1"/>
+				<circle
+					:cx="cpuHeadX"
+					:cy="cpuHeadY"
+					r="1.5"
+					fill="#fff"/>
 			</mask>
 		</defs>
 		<rect
-			x="-1" y="-1"
-			:width="viewBoxX + 2" :height="viewBoxY + 2"
+			x="-2" y="-2"
+			:width="viewBoxX + 4" :height="viewBoxY + 4"
 			:style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/>
 		<text x="1" y="5">CPU <tspan>{{ cpuP }}%</tspan></text>
 	</svg>
-	<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none">
+	<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
 		<defs>
 			<linearGradient :id="memGradientId" x1="0" x2="0" y1="1" y2="0">
 				<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
@@ -40,11 +45,16 @@
 					fill="none"
 					stroke="#fff"
 					stroke-width="1"/>
+				<circle
+					:cx="memHeadX"
+					:cy="memHeadY"
+					r="1.5"
+					fill="#fff"/>
 			</mask>
 		</defs>
 		<rect
-			x="-1" y="-1"
-			:width="viewBoxX + 2" :height="viewBoxY + 2"
+			x="-2" y="-2"
+			:width="viewBoxX + 4" :height="viewBoxY + 4"
 			:style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/>
 		<text x="1" y="5">MEM <tspan>{{ memP }}%</tspan></text>
 	</svg>
@@ -70,6 +80,10 @@ export default Vue.extend({
 			memPolylinePoints: '',
 			cpuPolygonPoints: '',
 			memPolygonPoints: '',
+			cpuHeadX: null,
+			cpuHeadY: null,
+			memHeadX: null,
+			memHeadY: null,
 			cpuP: '',
 			memP: ''
 		};
@@ -92,12 +106,19 @@ export default Vue.extend({
 			this.stats.push(stats);
 			if (this.stats.length > 50) this.stats.shift();
 
-			this.cpuPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - s.cpu_usage) * this.viewBoxY}`).join(' ');
-			this.memPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.mem.used / s.mem.total)) * this.viewBoxY}`).join(' ');
+			const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]);
+			const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]);
+			this.cpuPolylinePoints = cpuPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
+			this.memPolylinePoints = memPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
 
 			this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.cpuPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
 			this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.memPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
 
+			this.cpuHeadX = cpuPolylinePoints[cpuPolylinePoints.length - 1][0];
+			this.cpuHeadY = cpuPolylinePoints[cpuPolylinePoints.length - 1][1];
+			this.memHeadX = memPolylinePoints[memPolylinePoints.length - 1][0];
+			this.memHeadY = memPolylinePoints[memPolylinePoints.length - 1][1];
+
 			this.cpuP = (stats.cpu_usage * 100).toFixed(0);
 			this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
 		},

From 42a4f92cfa6f0e62cab93f7b1e7805861ddaa967 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 11:40:42 +0900
Subject: [PATCH 217/369] Fix #1125

---
 .../desktop/views/components/activity.calendar.vue   |  6 +++---
 .../app/desktop/views/components/activity.chart.vue  | 12 ++++++------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/client/app/desktop/views/components/activity.calendar.vue b/src/client/app/desktop/views/components/activity.calendar.vue
index e488571070..1a88d1a994 100644
--- a/src/client/app/desktop/views/components/activity.calendar.vue
+++ b/src/client/app/desktop/views/components/activity.calendar.vue
@@ -1,5 +1,5 @@
 <template>
-<svg viewBox="0 0 21 7" preserveAspectRatio="none">
+<svg viewBox="0 0 21 7">
 	<rect v-for="record in data" class="day"
 		width="1" height="1"
 		:x="record.x" :y="record.date.weekday"
@@ -15,7 +15,7 @@
 		style="pointer-events: none;"/>
 	<rect class="today"
 		width="1" height="1"
-		:x="data[data.length - 1].x" :y="data[data.length - 1].date.weekday"
+		:x="data[0].x" :y="data[0].date.weekday"
 		rx="1" ry="1"
 		fill="none"
 		stroke-width="0.1"
@@ -33,7 +33,7 @@ export default Vue.extend({
 		const peak = Math.max.apply(null, this.data.map(d => d.total));
 
 		let x = 0;
-		this.data.reverse().forEach(d => {
+		this.data.slice().reverse().forEach(d => {
 			d.x = x;
 			d.date.weekday = (new Date(d.date.year, d.date.month - 1, d.date.day)).getDay();
 
diff --git a/src/client/app/desktop/views/components/activity.chart.vue b/src/client/app/desktop/views/components/activity.chart.vue
index ff489d988b..202eabe90d 100644
--- a/src/client/app/desktop/views/components/activity.chart.vue
+++ b/src/client/app/desktop/views/components/activity.chart.vue
@@ -1,5 +1,5 @@
 <template>
-<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" @mousedown.prevent="onMousedown">
+<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" @mousedown.prevent="onMousedown">
 	<title>%i18n:@total%<br/>%i18n:@notes%<br/>%i18n:@replies%<br/>%i18n:@renotes%</title>
 	<polyline
 		:points="pointsNote"
@@ -55,7 +55,6 @@ export default Vue.extend({
 		};
 	},
 	created() {
-		this.data.reverse();
 		this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
 		this.render();
 	},
@@ -63,10 +62,11 @@ export default Vue.extend({
 		render() {
 			const peak = Math.max.apply(null, this.data.map(d => d.total));
 			if (peak != 0) {
-				this.pointsNote = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' ');
-				this.pointsReply = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' ');
-				this.pointsRenote = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' ');
-				this.pointsTotal = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ');
+				const data = this.data.slice().reverse();
+				this.pointsNote = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' ');
+				this.pointsReply = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' ');
+				this.pointsRenote = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' ');
+				this.pointsTotal = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ');
 			}
 		},
 		onMousedown(e) {

From af2d36a3c99de25292a825ca25c4cfcf6b3daa2d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 11:41:22 +0900
Subject: [PATCH 218/369] 2.34.3

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 701e61db5b..aea105b920 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.34.2",
-	"clientVersion": "1.0.6325",
+	"version": "2.34.3",
+	"clientVersion": "1.0.6328",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 8807894890b7c09619815c4f8e3d9a14a32c5d6d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 22:25:15 +0900
Subject: [PATCH 219/369] Fix bug

---
 src/client/app/store.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/client/app/store.ts b/src/client/app/store.ts
index 0dbdf9bd5e..267c804fbd 100644
--- a/src/client/app/store.ts
+++ b/src/client/app/store.ts
@@ -180,6 +180,7 @@ export default (os: MiOS) => new Vuex.Store({
 				removeDeckColumn(state, id) {
 					state.deck.columns = state.deck.columns.filter(c => c.id != id);
 					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
+					state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
 				},
 
 				swapDeckColumn(state, x) {

From 5bbd318518c908a061cf9b989d84151b6d7bbebf Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 9 Jun 2018 23:52:11 +0900
Subject: [PATCH 220/369] Update message

---
 src/client/app/safe.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/client/app/safe.js b/src/client/app/safe.js
index 2fd5361725..3d73fa1a9c 100644
--- a/src/client/app/safe.js
+++ b/src/client/app/safe.js
@@ -5,10 +5,10 @@
 // Detect an old browser
 if (!('fetch' in window)) {
 	alert(
-		'お使いのブラウザが古いためMisskeyを動作させることができません。' +
+		'お使いのブラウザ(またはOS)が古いためMisskeyを動作させることができません。' +
 		'バージョンを最新のものに更新するか、別のブラウザをお試しください。' +
 		'\n\n' +
-		'Your browser seems outdated. ' +
+		'Your browser (or your OS) seems outdated. ' +
 		'To run Misskey, please update your browser to latest version or try other browsers.');
 }
 

From 92999dcaf214de05bbf26f2415e156966512766f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 00:39:30 +0900
Subject: [PATCH 221/369] Update gitignore

---
 .gitignore | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 41fef982c4..197c1ec4d2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,4 @@ npm-debug.log
 run.bat
 api-docs.json
 package-lock.json
-yarn.lock
+*.log

From 72c4ccaee85551bd5f997c14dd9723b9915c0ef4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 00:41:57 +0900
Subject: [PATCH 222/369] Clean up dependencies

---
 package.json | 2 --
 1 file changed, 2 deletions(-)

diff --git a/package.json b/package.json
index aea105b920..a0e1500e82 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,6 @@
 		"@types/debug": "0.0.30",
 		"@types/deep-equal": "1.0.1",
 		"@types/elasticsearch": "5.0.23",
-		"@types/eventemitter3": "2.0.2",
 		"@types/gm": "1.18.0",
 		"@types/gulp": "3.8.36",
 		"@types/gulp-htmlmin": "1.3.32",
@@ -63,7 +62,6 @@
 		"@types/mkdirp": "0.5.2",
 		"@types/mocha": "5.2.0",
 		"@types/mongodb": "3.0.18",
-		"@types/monk": "6.0.0",
 		"@types/ms": "0.7.30",
 		"@types/node": "10.1.2",
 		"@types/nopt": "3.0.29",

From f9d5af06006edf2389b88e8b262d880989960570 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 01:01:28 +0900
Subject: [PATCH 223/369] MissketDeck: Implement media view tl

---
 locales/ja.yml                                |  4 ++
 .../desktop/views/pages/deck/deck.list-tl.vue |  7 +++-
 .../desktop/views/pages/deck/deck.note.vue    | 42 +++++++++++++++++--
 .../desktop/views/pages/deck/deck.notes.vue   |  7 +++-
 .../views/pages/deck/deck.tl-column.vue       |  6 +--
 .../app/desktop/views/pages/deck/deck.tl.vue  |  7 +++-
 6 files changed, 63 insertions(+), 10 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 212ba90b69..dbc4d58761 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -668,6 +668,10 @@ desktop/views/components/window.vue:
   popout: "ポップアウト"
   close: "閉じる"
 
+desktop/views/pages/deck/deck.tl-column.vue:
+  is-media-only: "メディア投稿のみ"
+  is-media-view: "メディアビュー"
+
 desktop/views/pages/welcome.vue:
   about: "詳しく..."
   gotit: "わかった"
diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
index ee4e89747b..d2f46bd8be 100644
--- a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue
@@ -1,5 +1,5 @@
 <template>
-	<x-notes ref="timeline" :more="existMore ? more : null"/>
+	<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
 </template>
 
 <script lang="ts">
@@ -23,6 +23,11 @@ export default Vue.extend({
 			type: Boolean,
 			required: false,
 			default: false
+		},
+		mediaView: {
+			type: Boolean,
+			required: false,
+			default: false
 		}
 	},
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index d94b092412..a888ea7b0e 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="zyjjkidcqjnlegkqebitfviomuqmseqk" :class="{ renote: isRenote }">
+<div v-if="!mediaView" class="zyjjkidcqjnlegkqebitfviomuqmseqk" :class="{ renote: isRenote }">
 	<div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
 		<x-sub :note="p.reply"/>
 	</div>
@@ -55,6 +55,14 @@
 		</div>
 	</article>
 </div>
+<div v-else class="srwrkujossgfuhrbnvqkybtzxpblgchi">
+	<div v-if="note.media.length > 0">
+		<mk-media-list :media-list="note.media"/>
+	</div>
+	<div v-if="note.renote && note.renote.media.length > 0">
+		<mk-media-list :media-list="note.renote.media"/>
+	</div>
+</div>
 </template>
 
 <script lang="ts">
@@ -71,7 +79,17 @@ export default Vue.extend({
 		XSub
 	},
 
-	props: ['note'],
+	props: {
+		note: {
+			type: Object,
+			required: true
+		},
+		mediaView: {
+			type: Boolean,
+			required: false,
+			default: false
+		}
+	},
 
 	data() {
 		return {
@@ -199,6 +217,16 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
+mediaRoot(isDark)
+	font-size 13px
+	margin 4px 12px
+
+	&:first-child
+		margin-top 12px
+
+	&:last-child
+		margin-bottom 12px
+
 root(isDark)
 	font-size 13px
 	border-bottom solid 1px isDark ? #1c2023 : #eaeaea
@@ -257,7 +285,7 @@ root(isDark)
 
 	> article
 		display flex
-		padding 16px 16px 9px
+		padding 16px 16px 4px
 
 		> .avatar
 			flex-shrink 0
@@ -408,7 +436,7 @@ root(isDark)
 			> footer
 				> button
 					margin 0
-					padding 8px
+					padding 4px 8px 8px 8px
 					background transparent
 					border none
 					box-shadow none
@@ -436,4 +464,10 @@ root(isDark)
 .zyjjkidcqjnlegkqebitfviomuqmseqk:not([data-darkmode])
 	root(false)
 
+.srwrkujossgfuhrbnvqkybtzxpblgchi[data-darkmode]
+	mediaRoot(true)
+
+.srwrkujossgfuhrbnvqkybtzxpblgchi:not([data-darkmode])
+	mediaRoot(false)
+
 </style>
diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue
index 1f1ca6ad5e..8862b0e0fc 100644
--- a/src/client/app/desktop/views/pages/deck/deck.notes.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue
@@ -9,7 +9,7 @@
 
 	<transition-group name="mk-notes" class="transition">
 		<template v-for="(note, i) in _notes">
-			<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
+			<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" :media-view="mediaView"/>
 			<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
 				<span>%fa:angle-up%{{ note._datetext }}</span>
 				<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
@@ -44,6 +44,11 @@ export default Vue.extend({
 		more: {
 			type: Function,
 			required: false
+		},
+		mediaView: {
+			type: Boolean,
+			required: false,
+			default: false
 		}
 	},
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
index a8e0177baa..ffe1da670b 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue
@@ -8,12 +8,12 @@
 		<span>{{ name }}</span>
 	</span>
 
-	<div class="editor" v-if="edit">
+	<div class="editor" style="padding:0 12px" v-if="edit">
 		<mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/>
 		<mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/>
 	</div>
-	<x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/>
-	<x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/>
+	<x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/>
+	<x-tl v-else :src="column.type" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/>
 </x-column>
 </template>
 
diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue
index 47aa8c6413..8e05f09c5d 100644
--- a/src/client/app/desktop/views/pages/deck/deck.tl.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue
@@ -1,5 +1,5 @@
 <template>
-	<x-notes ref="timeline" :more="existMore ? more : null"/>
+	<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
 </template>
 
 <script lang="ts">
@@ -23,6 +23,11 @@ export default Vue.extend({
 			type: Boolean,
 			required: false,
 			default: false
+		},
+		mediaView: {
+			type: Boolean,
+			required: false,
+			default: false
 		}
 	},
 

From 149b2ee5a7b177b4caa2bef8c62c499c4a66536e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 01:04:31 +0900
Subject: [PATCH 224/369] Update sentences

---
 locales/ja.yml | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index dbc4d58761..228893e4af 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -60,7 +60,7 @@ common:
     timemachine: "カレンダー(タイムマシン)"
     activity: "アクティビティ"
     rss: "RSSリーダー"
-    memo: "メモ"
+    memo: "付箋"
     trends: "トレンド"
     photo-stream: "フォトストリーム"
     posts-monitor: "投稿チャート"
@@ -69,7 +69,7 @@ common:
     broadcast: "ブロードキャスト"
     notifications: "通知"
     users: "おすすめユーザー"
-    polls: "投票"
+    polls: "アンケート"
     post-form: "投稿フォーム"
     messaging: "メッセージ"
     server: "サーバー情報"
@@ -168,11 +168,11 @@ common/views/components/poll.vue:
   voted: "投票済み"
 
 common/views/components/poll-editor.vue:
-  no-only-one-choice: "投票には、選択肢が最低2つ必要です"
+  no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
   choice-n: "選択肢{}"
   remove: "この選択肢を削除"
   add: "+選択肢を追加"
-  destroy: "投票を破棄"
+  destroy: "アンケートを破棄"
 
 common/views/components/reaction-picker.vue:
   choose-reaction: "リアクションを選択"
@@ -259,7 +259,7 @@ common/views/widgets/server.vue:
   toggle: "表示を切り替え"
 
 common/views/widgets/memo.vue:
-  title: "メモ"
+  title: "付箋"
   memo: "ここに書いて!"
   save: "保存"
 
@@ -438,7 +438,7 @@ desktop/views/components/post-form.vue:
   attach-media-from-drive: "ドライブからメディアを添付"
   attach-cancel: "添付取り消し"
   insert-a-kao: "v(‘ω’)v"
-  create-poll: "投票を作成"
+  create-poll: "アンケートを作成"
   text-remain: "残り{}文字"
 
 desktop/views/components/post-form-window.vue:
@@ -604,7 +604,7 @@ desktop/views/components/sub-note-content.vue:
   private: "この投稿は非公開です"
   deleted: "この投稿は削除されました"
   media-count: "{}つのメディア"
-  poll: "投票"
+  poll: "アンケート"
 
 desktop/views/components/taskmanager.vue:
   title: "タスクマネージャ"
@@ -751,7 +751,7 @@ desktop/views/widgets/notifications.vue:
   settings: "通知の設定"
 
 desktop/views/widgets/polls.vue:
-  title: "投票"
+  title: "アンケート"
   refresh: "他を見る"
   nothing: "ありません!"
 
@@ -869,7 +869,7 @@ mobile/views/components/sub-note-content.vue:
   private: "この投稿は非公開です"
   deleted: "この投稿は削除されました"
   media-count: "{}つのメディア"
-  poll: "投票"
+  poll: "アンケート"
 
 mobile/views/components/timeline.vue:
   empty: "投稿がありません"

From 56df89f8dd23e69131a6677a78c8d243bd3531c3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 01:22:44 +0900
Subject: [PATCH 225/369] 2.35.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index a0e1500e82..4d82ad8f43 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.34.3",
-	"clientVersion": "1.0.6328",
+	"version": "2.35.0",
+	"clientVersion": "1.0.6358",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 5d01e19ce7cf886c2ba99ad90c9f3479ef6706b3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 03:27:10 +0900
Subject: [PATCH 226/369] Fix bug

---
 .../app/common/views/components/menu.vue      | 30 ++++++++++++++-----
 .../app/common/views/components/note-menu.vue | 10 ++++---
 .../desktop/views/components/context-menu.vue |  8 ++---
 3 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue
index cf3a09e672..9b16732b9a 100644
--- a/src/client/app/common/views/components/menu.vue
+++ b/src/client/app/common/views/components/menu.vue
@@ -15,7 +15,20 @@ import Vue from 'vue';
 import * as anime from 'animejs';
 
 export default Vue.extend({
-	props: ['source', 'compact', 'items'],
+	props: {
+		source: {
+			required: true
+		},
+		items: {
+			type: Array,
+			required: true
+		},
+		compact: {
+			type: Boolean,
+			required: false,
+			default: false
+		}
+	},
 	data() {
 		return {
 			hukidasi: !this.compact
@@ -44,13 +57,13 @@ export default Vue.extend({
 				top = y;
 			}
 
-			if (left + width > window.innerWidth) {
-				left = window.innerWidth - width;
+			if (left + width - window.pageXOffset > window.innerWidth) {
+				left = window.innerWidth - width + window.pageXOffset;
 				this.hukidasi = false;
 			}
 
-			if (top + height > window.innerHeight) {
-				top = window.innerHeight - height;
+			if (top + height - window.pageYOffset > window.innerHeight) {
+				top = window.innerHeight - height + window.pageYOffset;
 				this.hukidasi = false;
 			}
 
@@ -139,9 +152,13 @@ $border-color = rgba(27, 31, 35, 0.15)
 			transform-origin center -($balloon-size)
 
 			&:before
+			&:after
 				content ""
 				display block
 				position absolute
+				pointer-events none
+
+			&:before
 				top -($balloon-size * 2)
 				left s('calc(50% - %s)', $balloon-size)
 				border-top solid $balloon-size transparent
@@ -150,9 +167,6 @@ $border-color = rgba(27, 31, 35, 0.15)
 				border-bottom solid $balloon-size $border-color
 
 			&:after
-				content ""
-				display block
-				position absolute
 				top -($balloon-size * 2) + 1.5px
 				left s('calc(50% - %s)', $balloon-size)
 				border-top solid $balloon-size transparent
diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue
index 4a8aae9e49..889f63779f 100644
--- a/src/client/app/common/views/components/note-menu.vue
+++ b/src/client/app/common/views/components/note-menu.vue
@@ -1,6 +1,6 @@
 <template>
-<div class="mk-note-menu" style="position:initial">
-	<mk-menu ref="menu" :source="source" :compact="compact" :items="items" @closed="$destroy"/>
+<div style="position:initial">
+	<mk-menu :source="source" :compact="compact" :items="items" @closed="closed"/>
 </div>
 </template>
 
@@ -63,8 +63,10 @@ export default Vue.extend({
 			});
 		},
 
-		close() {
-			this.$refs.menu.close();
+		closed() {
+			this.$nextTick(() => {
+				this.$destroy();
+			});
 		}
 	}
 });
diff --git a/src/client/app/desktop/views/components/context-menu.vue b/src/client/app/desktop/views/components/context-menu.vue
index a9a083ec0a..afb6838eb6 100644
--- a/src/client/app/desktop/views/components/context-menu.vue
+++ b/src/client/app/desktop/views/components/context-menu.vue
@@ -23,12 +23,12 @@ export default Vue.extend({
 			let x = this.x;
 			let y = this.y;
 
-			if (x + width > window.innerWidth) {
-				x = window.innerWidth - width;
+			if (x + width - window.pageXOffset > window.innerWidth) {
+				x = window.innerWidth - width + window.pageXOffset;
 			}
 
-			if (y + height > window.innerHeight) {
-				y = window.innerHeight - height;
+			if (y + height - window.pageYOffset > window.innerHeight) {
+				y = window.innerHeight - height + window.pageYOffset;
 			}
 
 			this.$el.style.left = x + 'px';

From 6630ca595c56b32d544638e693c0621a6eb9222d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 03:31:13 +0900
Subject: [PATCH 227/369] :art:

---
 src/client/app/common/views/components/note-menu.vue | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue
index 889f63779f..27a49a6536 100644
--- a/src/client/app/common/views/components/note-menu.vue
+++ b/src/client/app/common/views/components/note-menu.vue
@@ -13,21 +13,25 @@ export default Vue.extend({
 		items() {
 			const items = [];
 			items.push({
+				icon: '%fa:star%',
 				text: '%i18n:@favorite%',
 				action: this.favorite
 			});
 			if (this.note.userId == this.$store.state.i.id) {
 				items.push({
+					icon: '%fa:thumbtack%',
 					text: '%i18n:@pin%',
 					action: this.pin
 				});
 				items.push({
+					icon: '%fa:trash-alt R%',
 					text: '%i18n:@delete%',
 					action: this.del
 				});
 			}
 			if (this.note.uri) {
 				items.push({
+					icon: '%fa:external-link-square-alt%',
 					text: '%i18n:@remote%',
 					action: () => {
 						window.open(this.note.uri, '_blank');

From 7e3bf06db13cd2d038e43ba03699eadbf7526fde Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 03:31:42 +0900
Subject: [PATCH 228/369] 2.35.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 4d82ad8f43..dde0f8d5d8 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.35.0",
-	"clientVersion": "1.0.6358",
+	"version": "2.35.1",
+	"clientVersion": "1.0.6360",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 22df79573330bf6dd9309baa2bf65f5a6ac8db0a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 03:47:09 +0900
Subject: [PATCH 229/369] Fix bug

---
 src/text/html.ts | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/text/html.ts b/src/text/html.ts
index 40f86e4b2b..4d0b4267f9 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -24,9 +24,9 @@ const handlers = {
 	},
 
 	hashtag({ document }, { hashtag }) {
-		const a = document.createElement('a');
-		a.href = '/search?q=#' + hashtag;
-		a.textContent = hashtag;
+		const span = document.createElement('span');
+		span.textContent = hashtag;
+		document.body.appendChild(span);
 	},
 
 	'inline-code'({ document }, { code }) {

From 50b37a8420ab106b674bab3c407c46f9cb706af4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 03:48:38 +0900
Subject: [PATCH 230/369] oops

---
 src/text/html.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/text/html.ts b/src/text/html.ts
index 4d0b4267f9..58038bc31b 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -25,7 +25,7 @@ const handlers = {
 
 	hashtag({ document }, { hashtag }) {
 		const span = document.createElement('span');
-		span.textContent = hashtag;
+		span.textContent = '#' + hashtag;
 		document.body.appendChild(span);
 	},
 

From 8bcf44bc16866741eed2af5f8757ee13816779fa Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 03:55:51 +0900
Subject: [PATCH 231/369] :v:

---
 src/text/html.ts | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/text/html.ts b/src/text/html.ts
index 58038bc31b..53d4e8a52d 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -24,9 +24,11 @@ const handlers = {
 	},
 
 	hashtag({ document }, { hashtag }) {
-		const span = document.createElement('span');
-		span.textContent = '#' + hashtag;
-		document.body.appendChild(span);
+		const a = document.createElement('a');
+		a.href = config.url + '/search?q=#' + hashtag;
+		a.textContent = '#' + hashtag;
+		a.setAttribute('rel', 'tag');
+		document.body.appendChild(a);
 	},
 
 	'inline-code'({ document }, { code }) {

From c8dd8341ca4cdb8d6c97a7730b0850828e7a2017 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 03:58:12 +0900
Subject: [PATCH 232/369] 2.35.2

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index dde0f8d5d8..a32ef94015 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.35.1",
+	"version": "2.35.2",
 	"clientVersion": "1.0.6360",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From b29ff0e94b3480f8e57425c4a98d1d44d9d41572 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 08:03:02 +0900
Subject: [PATCH 233/369] :v:

---
 src/client/app/common/views/components/time.vue | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/client/app/common/views/components/time.vue b/src/client/app/common/views/components/time.vue
index aebfb33897..700643ff05 100644
--- a/src/client/app/common/views/components/time.vue
+++ b/src/client/app/common/views/components/time.vue
@@ -58,18 +58,21 @@ export default Vue.extend({
 	},
 	created() {
 		if (this.mode == 'relative' || this.mode == 'detail') {
-			this.tick();
-			this.tickId = setInterval(this.tick, 10000);
+			this.tickId = window.requestAnimationFrame(this.tick);
 		}
 	},
 	destroyed() {
 		if (this.mode === 'relative' || this.mode === 'detail') {
-			clearInterval(this.tickId);
+			window.clearTimeout(this.tickId);
 		}
 	},
 	methods: {
 		tick() {
 			this.now = new Date();
+
+			this.tickId = setTimeout(() => {
+				window.requestAnimationFrame(this.tick);
+			}, 10000);
 		}
 	}
 });

From 951b2346ab5760490aa408f147cc17ce4548ca52 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 08:15:05 +0900
Subject: [PATCH 234/369] :v:

---
 src/models/drive-file.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts
index bb98c11a93..5fa76f4bf8 100644
--- a/src/models/drive-file.ts
+++ b/src/models/drive-file.ts
@@ -9,7 +9,7 @@ import User from './user';
 import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumbnail';
 
 const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
-DriveFile.createIndex('md5');
+DriveFile.createIndex('md5', { sparse: true });
 DriveFile.createIndex('metadata.uri', { sparse: true, unique: true });
 export default DriveFile;
 

From 16d4b168724295f2b81afb052c0ab2f76919e93c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 08:21:48 +0900
Subject: [PATCH 235/369] Revert ":v:"

This reverts commit 951b2346ab5760490aa408f147cc17ce4548ca52.
---
 src/models/drive-file.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts
index 5fa76f4bf8..bb98c11a93 100644
--- a/src/models/drive-file.ts
+++ b/src/models/drive-file.ts
@@ -9,7 +9,7 @@ import User from './user';
 import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumbnail';
 
 const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
-DriveFile.createIndex('md5', { sparse: true });
+DriveFile.createIndex('md5');
 DriveFile.createIndex('metadata.uri', { sparse: true, unique: true });
 export default DriveFile;
 

From bee77afb7f1215ff660ddd1098a881098b2257f1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 08:34:46 +0900
Subject: [PATCH 236/369] Fix bug

---
 src/models/user.ts                      | 16 ++++++++++------
 src/remote/activitypub/models/person.ts | 11 +++++++----
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/src/models/user.ts b/src/models/user.ts
index 2d4d7dc184..c389f477ab 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -405,13 +405,17 @@ export const pack = (
 		delete _user.publicKey;
 	}
 
-	_user.avatarUrl = _user.avatarId != null
-		? `${config.drive_url}/${_user.avatarId}`
-		: `${config.drive_url}/default-avatar.jpg`;
+	if (_user.avatarUrl == null) {
+		_user.avatarUrl = _user.avatarId != null
+			? `${config.drive_url}/${_user.avatarId}`
+			: `${config.drive_url}/default-avatar.jpg`;
+	}
 
-	_user.bannerUrl = _user.bannerId != null
-		? `${config.drive_url}/${_user.bannerId}`
-		: null;
+	if (_user.bannerUrl == null) {
+		_user.bannerUrl = _user.bannerId != null
+			? `${config.drive_url}/${_user.bannerId}`
+			: null;
+	}
 
 	_user.wallpaperUrl = _user.wallpaperId != null
 		? `${config.drive_url}/${_user.wallpaperId}`
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index b720c445c6..3bc04b8cbe 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -9,6 +9,7 @@ import webFinger from '../../webfinger';
 import Resolver from '../resolver';
 import { resolveImage } from './image';
 import { isCollectionOrOrderedCollection, IObject, IPerson } from '../type';
+import { IDriveFile } from '../../../models/drive-file';
 
 const log = debug('misskey:activitypub');
 
@@ -190,21 +191,23 @@ export async function updatePerson(value: string | IObject, resolver?: Resolver)
 	const summaryDOM = JSDOM.fragment(person.summary);
 
 	// アイコンとヘッダー画像をフェッチ
-	const [avatarId, bannerId] = (await Promise.all([
+	const [avatar, banner] = (await Promise.all<IDriveFile>([
 		person.icon,
 		person.image
 	].map(img =>
 		img == null
 			? Promise.resolve(null)
 			: resolveImage(exist, img)
-	))).map(file => file != null ? file._id : null);
+	)));
 
 	// Update user
 	await User.update({ _id: exist._id }, {
 		$set: {
 			updatedAt: new Date(),
-			avatarId,
-			bannerId,
+			avatarId: avatar ? avatar._id : null,
+			bannerId: banner ? banner._id : null,
+			avatarUrl: avatar && avatar.metadata.isMetaOnly ? avatar.metadata.url : null,
+			bannerUrl: banner && banner.metadata.isMetaOnly ? banner.metadata.url : null,
 			description: summaryDOM.textContent,
 			followersCount,
 			followingCount,

From 119d38ea08114427450eec11265b76bb27862bf5 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 08:41:57 +0900
Subject: [PATCH 237/369] Fix bug

---
 src/models/user.ts                      |  2 ++
 src/remote/activitypub/models/person.ts | 20 +++++++++++++++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/models/user.ts b/src/models/user.ts
index c389f477ab..f0620a6cfd 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -48,6 +48,8 @@ type IUserBase = {
 	usernameLower: string;
 	avatarId: mongo.ObjectID;
 	bannerId: mongo.ObjectID;
+	avatarUrl?: string;
+	bannerUrl?: string;
 	wallpaperId: mongo.ObjectID;
 	data: any;
 	description: string;
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index 3bc04b8cbe..96e73406b2 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -118,19 +118,33 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
 	}
 
 	//#region アイコンとヘッダー画像をフェッチ
-	const [avatarId, bannerId] = (await Promise.all([
+	const [avatar, banner] = (await Promise.all<IDriveFile>([
 		person.icon,
 		person.image
 	].map(img =>
 		img == null
 			? Promise.resolve(null)
 			: resolveImage(user, img)
-	))).map(file => file != null ? file._id : null);
+	)));
 
-	User.update({ _id: user._id }, { $set: { avatarId, bannerId } });
+	const avatarId = avatar ? avatar._id : null;
+	const bannerId = banner ? banner._id : null;
+	const avatarUrl = avatar && avatar.metadata.isMetaOnly ? avatar.metadata.url : null;
+	const bannerUrl = banner && banner.metadata.isMetaOnly ? banner.metadata.url : null;
+
+	await User.update({ _id: user._id }, {
+		$set: {
+			avatarId,
+			bannerId,
+			avatarUrl,
+			bannerUrl
+		}
+	});
 
 	user.avatarId = avatarId;
 	user.bannerId = bannerId;
+	user.avatarUrl = avatarUrl;
+	user.bannerUrl = bannerUrl;
 	//#endregion
 
 	return user;

From 0360337df9e12b362d09dd76dfe7de5a05e2ad40 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 08:42:29 +0900
Subject: [PATCH 238/369] 2.35.3

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index a32ef94015..08316631c2 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.35.2",
-	"clientVersion": "1.0.6360",
+	"version": "2.35.3",
+	"clientVersion": "1.0.6371",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 94ce658ab977b794b30624ff44781f61be10b06b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 12:19:19 +0900
Subject: [PATCH 239/369] =?UTF-8?q?=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5?=
 =?UTF-8?q?=E3=82=BF=E3=82=B0=E6=A4=9C=E7=B4=A2=E3=82=92=E5=AE=9F=E8=A3=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/client/app/desktop/script.ts              |   2 +
 .../desktop/views/components/note-detail.vue  |   2 +-
 .../desktop/views/components/notes.note.vue   |   2 +-
 .../desktop/views/pages/deck/deck.note.vue    |   2 +-
 src/client/app/desktop/views/pages/tag.vue    | 128 +++++++
 .../mobile/views/components/note-detail.vue   |   2 +-
 .../app/mobile/views/components/note.vue      |   2 +-
 src/models/note.ts                            |   1 +
 src/remote/activitypub/renderer/hashtag.ts    |   2 +-
 src/server/api/endpoints.ts                   |   3 +
 .../api/endpoints/notes/search_by_tag.ts      | 329 ++++++++++++++++++
 src/text/html.ts                              |   2 +-
 12 files changed, 470 insertions(+), 7 deletions(-)
 create mode 100644 src/client/app/desktop/views/pages/tag.vue
 create mode 100644 src/server/api/endpoints/notes/search_by_tag.ts

diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index 61f1f5b870..8b1623ce45 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -33,6 +33,7 @@ import MkHomeCustomize from './views/pages/home-customize.vue';
 import MkMessagingRoom from './views/pages/messaging-room.vue';
 import MkNote from './views/pages/note.vue';
 import MkSearch from './views/pages/search.vue';
+import MkTag from './views/pages/tag.vue';
 import MkOthello from './views/pages/othello.vue';
 
 /**
@@ -60,6 +61,7 @@ init(async (launch) => {
 			{ path: '/i/lists/:list', component: MkUserList },
 			{ path: '/selectdrive', component: MkSelectDrive },
 			{ path: '/search', component: MkSearch },
+			{ path: '/tags/:tag', component: MkTag },
 			{ path: '/othello', component: MkOthello },
 			{ path: '/othello/:game', component: MkOthello },
 			{ path: '/@:user', component: MkUser },
diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue
index 2f28d223dd..4b5e5bebdf 100644
--- a/src/client/app/desktop/views/components/note-detail.vue
+++ b/src/client/app/desktop/views/components/note-detail.vue
@@ -48,7 +48,7 @@
 			<mk-poll v-if="p.poll" :note="p"/>
 			<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
 			<div class="tags" v-if="p.tags && p.tags.length > 0">
-				<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
+				<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
 			</div>
 			<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
 			<div class="map" v-if="p.geo" ref="map"></div>
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index 2f185e335a..ee11fcc55f 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -33,7 +33,7 @@
 					</div>
 					<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
 					<div class="tags" v-if="p.tags && p.tags.length > 0">
-						<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
+						<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
 					</div>
 					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
 					<div class="map" v-if="p.geo" ref="map"></div>
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index a888ea7b0e..bf830b92ef 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -33,7 +33,7 @@
 					</div>
 					<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
 					<div class="tags" v-if="p.tags && p.tags.length > 0">
-						<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
+						<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
 					</div>
 					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
 					<div class="renote" v-if="p.renote">
diff --git a/src/client/app/desktop/views/pages/tag.vue b/src/client/app/desktop/views/pages/tag.vue
new file mode 100644
index 0000000000..0b8fd81ac1
--- /dev/null
+++ b/src/client/app/desktop/views/pages/tag.vue
@@ -0,0 +1,128 @@
+<template>
+<mk-ui>
+	<header :class="$style.header">
+		<h1>#{{ $route.params.tag }}</h1>
+	</header>
+	<div :class="$style.loading" v-if="fetching">
+		<mk-ellipsis-icon/>
+	</div>
+	<p :class="$style.empty" v-if="!fetching && empty">%fa:search%「{{ q }}」に関する投稿は見つかりませんでした。</p>
+	<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import Progress from '../../../common/scripts/loading';
+
+const limit = 20;
+
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			moreFetching: false,
+			existMore: false,
+			offset: 0,
+			empty: false
+		};
+	},
+	watch: {
+		$route: 'fetch'
+	},
+	mounted() {
+		document.addEventListener('keydown', this.onDocumentKeydown);
+		window.addEventListener('scroll', this.onScroll, { passive: true });
+
+		this.fetch();
+	},
+	beforeDestroy() {
+		document.removeEventListener('keydown', this.onDocumentKeydown);
+		window.removeEventListener('scroll', this.onScroll);
+	},
+	methods: {
+		onDocumentKeydown(e) {
+			if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') {
+				if (e.which == 84) { // t
+					(this.$refs.timeline as any).focus();
+				}
+			}
+		},
+		fetch() {
+			this.fetching = true;
+			Progress.start();
+
+			(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
+				(this as any).api('notes/search_by_tag', {
+					limit: limit + 1,
+					offset: this.offset,
+					tag: this.$route.params.tag
+				}).then(notes => {
+					if (notes.length == 0) this.empty = true;
+					if (notes.length == limit + 1) {
+						notes.pop();
+						this.existMore = true;
+					}
+					res(notes);
+					this.fetching = false;
+					Progress.done();
+				}, rej);
+			}));
+		},
+		more() {
+			this.offset += limit;
+
+			const promise = (this as any).api('notes/search_by_tag', {
+				limit: limit + 1,
+				offset: this.offset,
+				tag: this.$route.params.tag
+			});
+
+			promise.then(notes => {
+				if (notes.length == limit + 1) {
+					notes.pop();
+				} else {
+					this.existMore = false;
+				}
+				notes.forEach(n => (this.$refs.timeline as any).append(n));
+				this.moreFetching = false;
+			});
+
+			return promise;
+		}
+	}
+});
+</script>
+
+<style lang="stylus" module>
+.header
+	width 100%
+	max-width 600px
+	margin 0 auto
+	color #555
+
+.notes
+	width 600px
+	margin 0 auto
+	border solid 1px rgba(#000, 0.075)
+	border-radius 6px
+	overflow hidden
+
+.loading
+	padding 64px 0
+
+.empty
+	display block
+	margin 0 auto
+	padding 32px
+	max-width 400px
+	text-align center
+	color #999
+
+	> [data-fa]
+		display block
+		margin-bottom 16px
+		font-size 3em
+		color #ccc
+
+</style>
diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue
index bdbb8876df..f3e77d7062 100644
--- a/src/client/app/mobile/views/components/note-detail.vue
+++ b/src/client/app/mobile/views/components/note-detail.vue
@@ -41,7 +41,7 @@
 				<mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/>
 			</div>
 			<div class="tags" v-if="p.tags && p.tags.length > 0">
-				<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
+				<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
 			</div>
 			<div class="media" v-if="p.media.length > 0">
 				<mk-media-list :media-list="p.media" :raw="true"/>
diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue
index 62cee0abfc..4498bb5633 100644
--- a/src/client/app/mobile/views/components/note.vue
+++ b/src/client/app/mobile/views/components/note.vue
@@ -33,7 +33,7 @@
 					</div>
 					<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
 					<div class="tags" v-if="p.tags && p.tags.length > 0">
-						<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
+						<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
 					</div>
 					<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
 					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
diff --git a/src/models/note.ts b/src/models/note.ts
index d4681b7b70..359d953735 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -16,6 +16,7 @@ import Following from './following';
 const Note = db.get<INote>('notes');
 Note.createIndex('uri', { sparse: true, unique: true });
 Note.createIndex('userId');
+Note.createIndex('tags', { sparse: true });
 Note.createIndex({
 	createdAt: -1
 });
diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts
index cf0b07b48a..50761c8684 100644
--- a/src/remote/activitypub/renderer/hashtag.ts
+++ b/src/remote/activitypub/renderer/hashtag.ts
@@ -2,6 +2,6 @@ import config from '../../../config';
 
 export default tag => ({
 	type: 'Hashtag',
-	href: `${config.url}/search?q=#${encodeURIComponent(tag)}`,
+	href: `${config.url}/tags/${encodeURIComponent(tag)}`,
 	name: '#' + tag
 });
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 94e649d29b..91e5298e73 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -525,6 +525,9 @@ const endpoints: Endpoint[] = [
 	{
 		name: 'notes/search'
 	},
+	{
+		name: 'notes/search_by_tag'
+	},
 	{
 		name: 'notes/timeline',
 		withCredential: true,
diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts
new file mode 100644
index 0000000000..4cf070f4ce
--- /dev/null
+++ b/src/server/api/endpoints/notes/search_by_tag.ts
@@ -0,0 +1,329 @@
+import $ from 'cafy'; import ID from '../../../../cafy-id';
+import Note from '../../../../models/note';
+import User from '../../../../models/user';
+import Mute from '../../../../models/mute';
+import { getFriendIds } from '../../common/get-friends';
+import { pack } from '../../../../models/note';
+
+/**
+ * Search notes by tag
+ */
+module.exports = (params, me) => new Promise(async (res, rej) => {
+	// Get 'tag' parameter
+	const [tag, tagError] = $.str.get(params.tag);
+	if (tagError) return rej('invalid tag param');
+
+	// Get 'includeUserIds' parameter
+	const [includeUserIds = [], includeUserIdsErr] = $.arr($.type(ID)).optional().get(params.includeUserIds);
+	if (includeUserIdsErr) return rej('invalid includeUserIds param');
+
+	// Get 'excludeUserIds' parameter
+	const [excludeUserIds = [], excludeUserIdsErr] = $.arr($.type(ID)).optional().get(params.excludeUserIds);
+	if (excludeUserIdsErr) return rej('invalid excludeUserIds param');
+
+	// Get 'includeUserUsernames' parameter
+	const [includeUserUsernames = [], includeUserUsernamesErr] = $.arr($.str).optional().get(params.includeUserUsernames);
+	if (includeUserUsernamesErr) return rej('invalid includeUserUsernames param');
+
+	// Get 'excludeUserUsernames' parameter
+	const [excludeUserUsernames = [], excludeUserUsernamesErr] = $.arr($.str).optional().get(params.excludeUserUsernames);
+	if (excludeUserUsernamesErr) return rej('invalid excludeUserUsernames param');
+
+	// Get 'following' parameter
+	const [following = null, followingErr] = $.bool.optional().nullable().get(params.following);
+	if (followingErr) return rej('invalid following param');
+
+	// Get 'mute' parameter
+	const [mute = 'mute_all', muteErr] = $.str.optional().get(params.mute);
+	if (muteErr) return rej('invalid mute param');
+
+	// Get 'reply' parameter
+	const [reply = null, replyErr] = $.bool.optional().nullable().get(params.reply);
+	if (replyErr) return rej('invalid reply param');
+
+	// Get 'renote' parameter
+	const [renote = null, renoteErr] = $.bool.optional().nullable().get(params.renote);
+	if (renoteErr) return rej('invalid renote param');
+
+	// Get 'media' parameter
+	const [media = null, mediaErr] = $.bool.optional().nullable().get(params.media);
+	if (mediaErr) return rej('invalid media param');
+
+	// Get 'poll' parameter
+	const [poll = null, pollErr] = $.bool.optional().nullable().get(params.poll);
+	if (pollErr) return rej('invalid poll param');
+
+	// Get 'sinceDate' parameter
+	const [sinceDate, sinceDateErr] = $.num.optional().get(params.sinceDate);
+	if (sinceDateErr) throw 'invalid sinceDate param';
+
+	// Get 'untilDate' parameter
+	const [untilDate, untilDateErr] = $.num.optional().get(params.untilDate);
+	if (untilDateErr) throw 'invalid untilDate param';
+
+	// Get 'offset' parameter
+	const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset);
+	if (offsetErr) return rej('invalid offset param');
+
+	// Get 'limit' parameter
+	const [limit = 10, limitErr] = $.num.optional().range(1, 30).get(params.limit);
+	if (limitErr) return rej('invalid limit param');
+
+	let includeUsers = includeUserIds;
+	if (includeUserUsernames != null) {
+		const ids = (await Promise.all(includeUserUsernames.map(async (username) => {
+			const _user = await User.findOne({
+				usernameLower: username.toLowerCase()
+			});
+			return _user ? _user._id : null;
+		}))).filter(id => id != null);
+		includeUsers = includeUsers.concat(ids);
+	}
+
+	let excludeUsers = excludeUserIds;
+	if (excludeUserUsernames != null) {
+		const ids = (await Promise.all(excludeUserUsernames.map(async (username) => {
+			const _user = await User.findOne({
+				usernameLower: username.toLowerCase()
+			});
+			return _user ? _user._id : null;
+		}))).filter(id => id != null);
+		excludeUsers = excludeUsers.concat(ids);
+	}
+
+	search(res, rej, me, tag, includeUsers, excludeUsers, following,
+			mute, reply, renote, media, poll, sinceDate, untilDate, offset, limit);
+});
+
+async function search(
+	res, rej, me, tag, includeUserIds, excludeUserIds, following,
+	mute, reply, renote, media, poll, sinceDate, untilDate, offset, max) {
+
+	let q: any = {
+		$and: [{
+			tags: tag
+		}]
+	};
+
+	const push = x => q.$and.push(x);
+
+	if (includeUserIds && includeUserIds.length != 0) {
+		push({
+			userId: {
+				$in: includeUserIds
+			}
+		});
+	} else if (excludeUserIds && excludeUserIds.length != 0) {
+		push({
+			userId: {
+				$nin: excludeUserIds
+			}
+		});
+	}
+
+	if (following != null && me != null) {
+		const ids = await getFriendIds(me._id, false);
+		push({
+			userId: following ? {
+				$in: ids
+			} : {
+				$nin: ids.concat(me._id)
+			}
+		});
+	}
+
+	if (me != null) {
+		const mutes = await Mute.find({
+			muterId: me._id,
+			deletedAt: { $exists: false }
+		});
+		const mutedUserIds = mutes.map(m => m.muteeId);
+
+		switch (mute) {
+			case 'mute_all':
+				push({
+					userId: {
+						$nin: mutedUserIds
+					},
+					'_reply.userId': {
+						$nin: mutedUserIds
+					},
+					'_renote.userId': {
+						$nin: mutedUserIds
+					}
+				});
+				break;
+			case 'mute_related':
+				push({
+					'_reply.userId': {
+						$nin: mutedUserIds
+					},
+					'_renote.userId': {
+						$nin: mutedUserIds
+					}
+				});
+				break;
+			case 'mute_direct':
+				push({
+					userId: {
+						$nin: mutedUserIds
+					}
+				});
+				break;
+			case 'direct_only':
+				push({
+					userId: {
+						$in: mutedUserIds
+					}
+				});
+				break;
+			case 'related_only':
+				push({
+					$or: [{
+						'_reply.userId': {
+							$in: mutedUserIds
+						}
+					}, {
+						'_renote.userId': {
+							$in: mutedUserIds
+						}
+					}]
+				});
+				break;
+			case 'all_only':
+				push({
+					$or: [{
+						userId: {
+							$in: mutedUserIds
+						}
+					}, {
+						'_reply.userId': {
+							$in: mutedUserIds
+						}
+					}, {
+						'_renote.userId': {
+							$in: mutedUserIds
+						}
+					}]
+				});
+				break;
+		}
+	}
+
+	if (reply != null) {
+		if (reply) {
+			push({
+				replyId: {
+					$exists: true,
+					$ne: null
+				}
+			});
+		} else {
+			push({
+				$or: [{
+					replyId: {
+						$exists: false
+					}
+				}, {
+					replyId: null
+				}]
+			});
+		}
+	}
+
+	if (renote != null) {
+		if (renote) {
+			push({
+				renoteId: {
+					$exists: true,
+					$ne: null
+				}
+			});
+		} else {
+			push({
+				$or: [{
+					renoteId: {
+						$exists: false
+					}
+				}, {
+					renoteId: null
+				}]
+			});
+		}
+	}
+
+	if (media != null) {
+		if (media) {
+			push({
+				mediaIds: {
+					$exists: true,
+					$ne: null
+				}
+			});
+		} else {
+			push({
+				$or: [{
+					mediaIds: {
+						$exists: false
+					}
+				}, {
+					mediaIds: null
+				}]
+			});
+		}
+	}
+
+	if (poll != null) {
+		if (poll) {
+			push({
+				poll: {
+					$exists: true,
+					$ne: null
+				}
+			});
+		} else {
+			push({
+				$or: [{
+					poll: {
+						$exists: false
+					}
+				}, {
+					poll: null
+				}]
+			});
+		}
+	}
+
+	if (sinceDate) {
+		push({
+			createdAt: {
+				$gt: new Date(sinceDate)
+			}
+		});
+	}
+
+	if (untilDate) {
+		push({
+			createdAt: {
+				$lt: new Date(untilDate)
+			}
+		});
+	}
+
+	if (q.$and.length == 0) {
+		q = {};
+	}
+
+	// Search notes
+	const notes = await Note
+		.find(q, {
+			sort: {
+				_id: -1
+			},
+			limit: max,
+			skip: offset
+		});
+
+	// Serialize
+	res(await Promise.all(notes.map(note => pack(note, me))));
+}
diff --git a/src/text/html.ts b/src/text/html.ts
index 53d4e8a52d..70b341689a 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -25,7 +25,7 @@ const handlers = {
 
 	hashtag({ document }, { hashtag }) {
 		const a = document.createElement('a');
-		a.href = config.url + '/search?q=#' + hashtag;
+		a.href = config.url + '/tags/' + hashtag;
 		a.textContent = '#' + hashtag;
 		a.setAttribute('rel', 'tag');
 		document.body.appendChild(a);

From 2ef78bcd409547956088cfa259c05e3fe85b0da3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 12:21:44 +0900
Subject: [PATCH 240/369] :pizza:

---
 .../app/desktop/views/components/ui.header.search.vue       | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/components/ui.header.search.vue b/src/client/app/desktop/views/components/ui.header.search.vue
index 1ed28ba3a8..b6149a1878 100644
--- a/src/client/app/desktop/views/components/ui.header.search.vue
+++ b/src/client/app/desktop/views/components/ui.header.search.vue
@@ -17,7 +17,11 @@ export default Vue.extend({
 	},
 	methods: {
 		onSubmit() {
-			location.href = `/search?q=${encodeURIComponent(this.q)}`;
+			if (this.q.startsWith('#')) {
+				this.$router.push(`/tags/${encodeURIComponent(this.q.substr(1))}`);
+			} else {
+				this.$router.push(`/search?q=${encodeURIComponent(this.q)}`);
+			}
 		}
 	}
 });

From 20ec4104c6c18c0bffb1cd15b00bd8dd7d75d5c5 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 12:22:48 +0900
Subject: [PATCH 241/369] 2.36.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 08316631c2..3387d04e55 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.35.3",
-	"clientVersion": "1.0.6371",
+	"version": "2.36.0",
+	"clientVersion": "1.0.6376",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 9d248dbb5ace6b29173f6df1ec484a14f2d22bad Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 12:29:19 +0900
Subject: [PATCH 242/369] :art:

---
 .../app/desktop/views/components/note-preview.vue  | 14 ++++++++++++--
 .../app/desktop/views/pages/deck/deck.note.vue     |  2 +-
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue
index 2599439f09..2a49557247 100644
--- a/src/client/app/desktop/views/components/note-preview.vue
+++ b/src/client/app/desktop/views/components/note-preview.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="mk-note-preview" :title="title">
-	<mk-avatar class="avatar" :user="note.user"/>
+	<mk-avatar class="avatar" :user="note.user" v-if="!mini"/>
 	<div class="main">
 		<mk-note-header class="header" :note="note" :mini="true"/>
 		<div class="body">
@@ -15,7 +15,17 @@ import Vue from 'vue';
 import dateStringify from '../../../common/scripts/date-stringify';
 
 export default Vue.extend({
-	props: ['note'],
+	props: {
+		note: {
+			type: Object,
+			required: true
+		},
+		mini: {
+			type: Boolean,
+			required: false,
+			default: false
+		}
+	},
 	computed: {
 		title(): string {
 			return dateStringify(this.note.createdAt);
diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue
index bf830b92ef..5a8dc2ea65 100644
--- a/src/client/app/desktop/views/pages/deck/deck.note.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.note.vue
@@ -37,7 +37,7 @@
 					</div>
 					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
 					<div class="renote" v-if="p.renote">
-						<mk-note-preview :note="p.renote"/>
+						<mk-note-preview :note="p.renote" :mini="true"/>
 					</div>
 				</div>
 				<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>

From fd88955696ae8e25474fbbd72c3eed27963e9f58 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 10 Jun 2018 12:36:48 +0900
Subject: [PATCH 243/369] :v:

---
 locales/ja.yml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/locales/ja.yml b/locales/ja.yml
index 228893e4af..64ee00dba5 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -672,6 +672,11 @@ desktop/views/pages/deck/deck.tl-column.vue:
   is-media-only: "メディア投稿のみ"
   is-media-view: "メディアビュー"
 
+desktop/views/pages/deck/deck.note.vue:
+  reposted-by: "{}がRenote"
+  private: "この投稿は非公開です"
+  deleted: "この投稿は削除されました"
+
 desktop/views/pages/welcome.vue:
   about: "詳しく..."
   gotit: "わかった"

From b60903e2b4e781f9e50250bf7674693036d4b2e4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 00:24:03 +0900
Subject: [PATCH 244/369] :pizza:

---
 src/db/mongodb.ts | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/src/db/mongodb.ts b/src/db/mongodb.ts
index 0f6d27ca15..05bb72bfde 100644
--- a/src/db/mongodb.ts
+++ b/src/db/mongodb.ts
@@ -12,10 +12,7 @@ const uri = u && p
  */
 import mongo from 'monk';
 
-const db = mongo(uri, {
-	poolSize: 16,
-	keepAlive: 1
-});
+const db = mongo(uri);
 
 export default db;
 

From 96ab0e7b4caee288b605ba2799878f89d0e67429 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 00:27:16 +0900
Subject: [PATCH 245/369] :v:

---
 src/models/note.ts | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/models/note.ts b/src/models/note.ts
index 359d953735..4e2fc5d6be 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -15,8 +15,6 @@ import Following from './following';
 
 const Note = db.get<INote>('notes');
 Note.createIndex('uri', { sparse: true, unique: true });
-Note.createIndex('userId');
-Note.createIndex('tags', { sparse: true });
 Note.createIndex({
 	createdAt: -1
 });

From 72ab5c143e796c24e2d8aba26da34c12c00cab23 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 01:07:34 +0900
Subject: [PATCH 246/369] Revert ":v:"

This reverts commit 96ab0e7b4caee288b605ba2799878f89d0e67429.
---
 src/models/note.ts | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/models/note.ts b/src/models/note.ts
index 4e2fc5d6be..359d953735 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -15,6 +15,8 @@ import Following from './following';
 
 const Note = db.get<INote>('notes');
 Note.createIndex('uri', { sparse: true, unique: true });
+Note.createIndex('userId');
+Note.createIndex('tags', { sparse: true });
 Note.createIndex({
 	createdAt: -1
 });

From 600482660ba79f07cce03faf0306debee8db3ed1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 01:12:37 +0900
Subject: [PATCH 247/369] =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=81=AF=E6=9C=80?=
 =?UTF-8?q?=E5=A4=A7100=E6=96=87=E5=AD=97=E3=81=BE=E3=81=A7=E3=81=AB?=
 =?UTF-8?q?=E3=81=97=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/services/note/create.ts | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index f820182a42..ddf07716e4 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -94,7 +94,7 @@ export default async (user: IUser, data: {
 	if (data.visibility == null) data.visibility = 'public';
 	if (data.viaMobile == null) data.viaMobile = false;
 
-	const tags = data.tags || [];
+	let tags = data.tags || [];
 
 	let tokens: any[] = null;
 
@@ -114,6 +114,8 @@ export default async (user: IUser, data: {
 		});
 	}
 
+	tags = tags.filter(tag => tag.length <= 100);
+
 	if (data.visibleUsers) {
 		data.visibleUsers = data.visibleUsers.filter(x => x != null);
 	}

From 8baddf2ea3fb32422df88f577a3ffd3064304c9d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 01:14:29 +0900
Subject: [PATCH 248/369] Fix #1695

---
 src/client/app/common/views/components/visibility-chooser.vue | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/client/app/common/views/components/visibility-chooser.vue b/src/client/app/common/views/components/visibility-chooser.vue
index 592367cd6d..cc9c75095e 100644
--- a/src/client/app/common/views/components/visibility-chooser.vue
+++ b/src/client/app/common/views/components/visibility-chooser.vue
@@ -203,6 +203,7 @@ root(isDark)
 				justify-content center
 				align-items center
 				margin-right 10px
+				width 16px
 
 			> *:last-child
 				flex 1 1 auto

From f499630c2b146d08c79136e136612019ae9580ec Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 01:28:45 +0900
Subject: [PATCH 249/369] 2.36.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 3387d04e55..5bd36f36f2 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.36.0",
-	"clientVersion": "1.0.6376",
+	"version": "2.36.1",
+	"clientVersion": "1.0.6396",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From e70fb71a04dcd669509ca0298a22532445aade48 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 02:18:00 +0900
Subject: [PATCH 250/369] Update example.yml

---
 .config/example.yml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/.config/example.yml b/.config/example.yml
index 4772a1f22f..955acfabf6 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -55,3 +55,7 @@ twitter:
 
   # インテグレーション用アプリのコンシューマーシークレット
   consumer_secret:
+
+# true にすると、リモートのファイルをキャッシュしなくなります(直リンクします)。
+# ストレージ容量を節約することができますが、「リモートメディアを表示しない」設定をオンにしているユーザーは、リモートの画像などは見えなくなります。
+preventCache: false

From dc3c80e3cef48bbbb1de2c5d8c6fb462b25de6e0 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 06:48:25 +0900
Subject: [PATCH 251/369] wip

---
 src/daemons/hashtags-stats-child.ts     | 60 +++++++++++++++++++++++++
 src/daemons/hashtags-stats.ts           | 20 +++++++++
 src/{ => daemons}/notes-stats-child.ts  | 10 +++--
 src/{ => daemons}/notes-stats.ts        |  0
 src/{ => daemons}/server-stats.ts       | 10 ++++-
 src/index.ts                            |  6 ++-
 src/server/api/stream/hashtags-stats.ts | 35 +++++++++++++++
 src/server/api/streaming.ts             |  6 +++
 8 files changed, 140 insertions(+), 7 deletions(-)
 create mode 100644 src/daemons/hashtags-stats-child.ts
 create mode 100644 src/daemons/hashtags-stats.ts
 rename src/{ => daemons}/notes-stats-child.ts (75%)
 rename src/{ => daemons}/notes-stats.ts (100%)
 rename src/{ => daemons}/server-stats.ts (88%)
 create mode 100644 src/server/api/stream/hashtags-stats.ts

diff --git a/src/daemons/hashtags-stats-child.ts b/src/daemons/hashtags-stats-child.ts
new file mode 100644
index 0000000000..3f7f4d6e9e
--- /dev/null
+++ b/src/daemons/hashtags-stats-child.ts
@@ -0,0 +1,60 @@
+import Note from '../models/note';
+
+// 10分
+const interval = 1000 * 60 * 10;
+
+async function tick() {
+	const res = await Note.aggregate([{
+		$match: {
+			createdAt: {
+				$gt: new Date(Date.now() - interval)
+			},
+			tags: {
+				$exists: true,
+				$ne: []
+			}
+		}
+	}, {
+		$unwind: '$tags'
+	}, {
+		$group: {
+			_id: '$tags',
+			count: {
+				$sum: 1
+			}
+		}
+	}, {
+		$group: {
+			_id: null,
+			tags: {
+				$push: {
+					tag: '$_id',
+					count: '$count'
+				}
+			}
+		}
+	}, {
+		$project: {
+			_id: false,
+			tags: true
+		}
+	}]) as {
+		tags: Array<{
+			tag: string;
+			count: number;
+		}>
+	};
+
+	const stats = res.tags
+		.sort((a, b) => a.count - b.count)
+		.map(tag => [tag.tag, tag.count])
+		.slice(0, 10);
+
+	console.log(stats);
+
+	process.send(stats);
+}
+
+tick();
+
+setInterval(tick, interval);
diff --git a/src/daemons/hashtags-stats.ts b/src/daemons/hashtags-stats.ts
new file mode 100644
index 0000000000..5ed028ac33
--- /dev/null
+++ b/src/daemons/hashtags-stats.ts
@@ -0,0 +1,20 @@
+import * as childProcess from 'child_process';
+import Xev from 'xev';
+
+const ev = new Xev();
+
+export default function() {
+	const log = [];
+
+	const p = childProcess.fork(__dirname + '/hashtags-stats-child.js');
+
+	p.on('message', stats => {
+		ev.emit('hashtagsStats', stats);
+		log.push(stats);
+		if (log.length > 30) log.shift();
+	});
+
+	ev.on('requestHashTagsStatsLog', id => {
+		ev.emit('hashtagsStatsLog:' + id, log);
+	});
+}
diff --git a/src/notes-stats-child.ts b/src/daemons/notes-stats-child.ts
similarity index 75%
rename from src/notes-stats-child.ts
rename to src/daemons/notes-stats-child.ts
index 5f85a2a3cc..7f54a36bff 100644
--- a/src/notes-stats-child.ts
+++ b/src/daemons/notes-stats-child.ts
@@ -1,8 +1,8 @@
-import Note from './models/note';
+import Note from '../models/note';
 
 const interval = 5000;
 
-setInterval(async () => {
+async function tick() {
 	const [all, local] = await Promise.all([Note.count({
 		createdAt: {
 			$gte: new Date(Date.now() - interval)
@@ -19,4 +19,8 @@ setInterval(async () => {
 	};
 
 	process.send(stats);
-}, interval);
+}
+
+tick();
+
+setInterval(tick, interval);
diff --git a/src/notes-stats.ts b/src/daemons/notes-stats.ts
similarity index 100%
rename from src/notes-stats.ts
rename to src/daemons/notes-stats.ts
diff --git a/src/server-stats.ts b/src/daemons/server-stats.ts
similarity index 88%
rename from src/server-stats.ts
rename to src/daemons/server-stats.ts
index 7b0d4a8576..1403402508 100644
--- a/src/server-stats.ts
+++ b/src/daemons/server-stats.ts
@@ -5,6 +5,8 @@ import Xev from 'xev';
 
 const ev = new Xev();
 
+const interval = 1000;
+
 /**
  * Report server stats regularly
  */
@@ -15,7 +17,7 @@ export default function() {
 		ev.emit('serverStatsLog:' + id, log);
 	});
 
-	setInterval(() => {
+	async function tick() {
 		osUtils.cpuUsage(cpuUsage => {
 			const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/');
 			const stats = {
@@ -32,5 +34,9 @@ export default function() {
 			log.push(stats);
 			if (log.length > 50) log.shift();
 		});
-	}, 1000);
+	}
+
+	tick();
+
+	setInterval(tick, interval);
 }
diff --git a/src/index.ts b/src/index.ts
index 4a98b7564c..27c5dd0275 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -17,8 +17,9 @@ import ProgressBar from './utils/cli/progressbar';
 import EnvironmentInfo from './utils/environmentInfo';
 import MachineInfo from './utils/machineInfo';
 import DependencyInfo from './utils/dependencyInfo';
-import serverStats from './server-stats';
-import notesStats from './notes-stats';
+import serverStats from './daemons/server-stats';
+import notesStats from './daemons/notes-stats';
+import hashtagsStats from './daemons/hashtags-stats';
 
 import loadConfig from './config/load';
 import { Config } from './config/types';
@@ -52,6 +53,7 @@ function main() {
 		ev.mount();
 		serverStats();
 		notesStats();
+		hashtagsStats();
 	} else {
 		workerMain(opt);
 	}
diff --git a/src/server/api/stream/hashtags-stats.ts b/src/server/api/stream/hashtags-stats.ts
new file mode 100644
index 0000000000..47183467f5
--- /dev/null
+++ b/src/server/api/stream/hashtags-stats.ts
@@ -0,0 +1,35 @@
+import * as websocket from 'websocket';
+import Xev from 'xev';
+
+const ev = new Xev();
+
+export default function(request: websocket.request, connection: websocket.connection): void {
+	const onStats = stats => {
+		connection.send(JSON.stringify({
+			type: 'stats',
+			body: stats
+		}));
+	};
+
+	connection.on('message', async data => {
+		const msg = JSON.parse(data.utf8Data);
+
+		switch (msg.type) {
+			case 'requestLog':
+				ev.once('hashtagsStatsLog:' + msg.id, statsLog => {
+					connection.send(JSON.stringify({
+						type: 'statsLog',
+						body: statsLog
+					}));
+				});
+				ev.emit('requestHashtagsStatsLog', msg.id);
+				break;
+		}
+	});
+
+	ev.addListener('hashtagsStats', onStats);
+
+	connection.on('close', () => {
+		ev.removeListener('hashtagsStats', onStats);
+	});
+}
diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts
index 2d4cfc108f..e4156096ef 100644
--- a/src/server/api/streaming.ts
+++ b/src/server/api/streaming.ts
@@ -14,6 +14,7 @@ import othelloGameStream from './stream/othello-game';
 import othelloStream from './stream/othello';
 import serverStatsStream from './stream/server-stats';
 import notesStatsStream from './stream/notes-stats';
+import hashtagsStatsStream from './stream/hashtags-stats';
 import requestsStream from './stream/requests';
 import { ParsedUrlQuery } from 'querystring';
 import authenticate from './authenticate';
@@ -39,6 +40,11 @@ module.exports = (server: http.Server) => {
 			return;
 		}
 
+		if (request.resourceURL.pathname === '/hashtags-stats') {
+			hashtagsStatsStream(request, connection);
+			return;
+		}
+
 		if (request.resourceURL.pathname === '/requests') {
 			requestsStream(request, connection);
 			return;

From 7518e30dcf73ee9b7b385eb4f5878b77d3ea3cc4 Mon Sep 17 00:00:00 2001
From: otofune <otofune@gmail.com>
Date: Mon, 11 Jun 2018 06:40:27 +0900
Subject: [PATCH 252/369] :up: move some packages to devDependencies that non
 required by server

presumed by:
- move-to-devdependencies.fish
```fish
set targets (ls src | grep -v client | xargs -I'%' echo "src/%")
alias from_import="git grep 'import ' $targets | grep -v 'from \'\.' | grep -v 'from \"\.' | cut -d: -f2 | cut -d\; -f1 | rev | cut -d' ' -f1 | rev | cut -d\' -f2 | sort | uniq | grep -v '^readline\$' | grep -v '^zlib\$' | grep -v '^os\$' | grep -v '^http\$' | grep -v '^fs\$' | grep -v '^events\$' | grep -v '^crypto\$' | grep -v '^child_process\$' | grep -v '^cluster\$'`"
alias from_require="git grep 'require(' $targets | grep -v '(\'\.' | cut -d= -f2 | grep -v '__dirname' | grep require | cut -d' ' -f2 | cut -d')' -f1 | cut -d'(' -f2 | cut -d'\'' -f2 | sort | uniq | grep -v '^readline\$' | grep -v '^zlib\$' | grep -v '^os\$' | grep -v '^http\$' | grep -v '^fs\$' | grep -v '^events\$' | grep -v '^crypto\$' | grep -v '^child_process\$' | grep -v '^cluster\$'"
from_import | xargs npm uninstall --save-dev
from_require | xargs npm uninstall --save-dev
from_import | xargs npm install --save
from_require | xargs npm install --save
git show HEAD:require | node revert-pinning-dependencies.js
```
- revert-pinning-dependencies.js
```js
const readFromStdin = () => new Promise((resolve, reject) => {
  const chunks = []

  process.stdin.setEncoding('utf8')

  process.stdin.on('readable', () => {
    const chunk = process.stdin.read()
    if (chunk == null) return
    chunks.push(chunk)
  })

  process.stdin.on('end', () => {
    return resolve(chunks.join('\n'))
  })
})

async function main () {
  const fs = require('fs')

  const raw = await readFromStdin()
  const head = JSON.parse(raw)
  const now = JSON.parse(fs.readFileSync('package.json'))

  Object.keys(now.dependencies).forEach(key => {
    now.dependencies[key] = head.dependencies[key]
  })

  fs.writeFileSync('package.json', JSON.stringify(now,null,'\t'))
}

main().catch(console.error)
```
---
 package.json | 122 ++++++++++++++++++++++++++-------------------------
 1 file changed, 62 insertions(+), 60 deletions(-)

diff --git a/package.json b/package.json
index 5bd36f36f2..dd85c21629 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,66 @@
 		"@fortawesome/fontawesome-free-solid": "5.0.2",
 		"@koa/cors": "2.2.1",
 		"@prezzemolo/rap": "0.1.2",
+		"autwh": "0.1.0",
+		"bcryptjs": "2.4.3",
+		"cafy": "8.0.0",
+		"chalk": "2.4.1",
+		"crc-32": "1.2.0",
+		"debug": "3.1.0",
+		"deepcopy": "0.6.3",
+		"diskusage": "0.2.4",
+		"elasticsearch": "15.0.0",
+		"emojilib": "2.2.12",
+		"escape-regexp": "0.0.1",
+		"file-type": "8.0.0",
+		"gm": "1.23.1",
+		"http-signature": "1.2.0",
+		"is-root": "2.0.0",
+		"is-url": "1.2.4",
+		"js-yaml": "3.11.0",
+		"jsdom": "11.11.0",
+		"koa": "2.5.1",
+		"koa-bodyparser": "4.2.1",
+		"koa-compress": "3.0.0",
+		"koa-favicon": "2.0.1",
+		"koa-json-body": "5.3.0",
+		"koa-logger": "3.2.0",
+		"koa-mount": "3.0.0",
+		"koa-multer": "1.0.2",
+		"koa-router": "7.4.0",
+		"koa-send": "4.1.3",
+		"koa-slow": "2.1.0",
+		"koa-views": "6.1.4",
+		"kue": "0.11.6",
+		"mongodb": "3.0.10",
+		"monk": "6.0.6",
+		"ms": "2.1.1",
+		"nopt": "4.0.1",
+		"os-utils": "0.0.14",
+		"parse5": "5.0.0",
+		"prominence": "0.2.0",
+		"promise-sequential": "1.1.1",
+		"punycode": "2.1.1",
+		"qrcode": "1.2.0",
+		"ratelimiter": "3.0.3",
+		"recaptcha-promise": "0.1.3",
+		"reconnecting-websocket": "3.2.2",
+		"redis": "2.8.0",
+		"request": "2.87.0",
+		"request-promise-native": "1.0.5",
+		"rndstr": "1.0.0",
+		"speakeasy": "2.0.0",
+		"summaly": "2.0.6",
+		"tcp-port-used": "0.1.2",
+		"tmp": "0.0.33",
+		"uuid": "3.2.1",
+		"web-push": "3.3.1",
+		"webfinger.js": "2.6.6",
+		"websocket": "1.0.26",
+		"ws": "5.2.0",
+		"xev": "2.0.1"
+	},
+	"devDependencies": {
 		"@prezzemolo/zip": "0.0.3",
 		"@types/bcryptjs": "2.4.1",
 		"@types/debug": "0.0.30",
@@ -84,30 +144,17 @@
 		"@types/ws": "5.1.1",
 		"animejs": "2.2.0",
 		"autosize": "4.0.2",
-		"autwh": "0.1.0",
-		"bcryptjs": "2.4.3",
 		"bootstrap-vue": "2.0.0-rc.6",
-		"cafy": "8.0.0",
-		"chalk": "2.4.1",
-		"crc-32": "1.2.0",
 		"css-loader": "0.28.11",
-		"debug": "3.1.0",
 		"deep-equal": "1.0.1",
-		"deepcopy": "0.6.3",
-		"diskusage": "0.2.4",
 		"dompurify": "1.0.4",
-		"elasticsearch": "15.0.0",
 		"element-ui": "2.3.9",
-		"emojilib": "2.2.12",
-		"escape-regexp": "0.0.1",
 		"eslint": "4.19.1",
 		"eslint-plugin-vue": "4.5.0",
 		"eventemitter3": "3.1.0",
 		"exif-js": "2.3.0",
 		"file-loader": "1.1.11",
-		"file-type": "8.0.0",
 		"fuckadblock": "3.2.1",
-		"gm": "1.23.1",
 		"gulp": "3.9.1",
 		"gulp-cssnano": "2.1.3",
 		"gulp-htmlmin": "4.0.0",
@@ -125,71 +172,32 @@
 		"hard-source-webpack-plugin": "0.6.10",
 		"highlight.js": "9.12.0",
 		"html-minifier": "3.5.16",
-		"http-signature": "1.2.0",
 		"inquirer": "5.2.0",
-		"is-root": "2.0.0",
-		"is-url": "1.2.4",
-		"js-yaml": "3.11.0",
-		"jsdom": "11.11.0",
-		"koa": "2.5.1",
-		"koa-bodyparser": "4.2.1",
-		"koa-compress": "3.0.0",
-		"koa-favicon": "2.0.1",
-		"koa-json-body": "5.3.0",
-		"koa-logger": "3.2.0",
-		"koa-mount": "3.0.0",
-		"koa-multer": "1.0.2",
-		"koa-router": "7.4.0",
-		"koa-send": "4.1.3",
-		"koa-slow": "2.1.0",
-		"koa-views": "6.1.4",
-		"kue": "0.11.6",
 		"license-checker": "20.0.0",
 		"loader-utils": "1.1.0",
 		"mecab-async": "0.1.2",
 		"mkdirp": "0.5.1",
 		"mocha": "5.2.0",
 		"moji": "0.5.1",
-		"mongodb": "3.0.10",
-		"monk": "6.0.6",
-		"ms": "2.1.1",
 		"nan": "2.10.0",
 		"node-sass": "4.9.0",
 		"node-sass-json-importer": "3.2.0",
-		"nopt": "4.0.1",
 		"nprogress": "0.2.0",
 		"object-assign-deep": "0.4.0",
 		"on-build-webpack": "0.1.0",
-		"os-utils": "0.0.14",
-		"parse5": "5.0.0",
 		"progress-bar-webpack-plugin": "1.11.0",
-		"prominence": "0.2.0",
-		"promise-sequential": "1.1.1",
 		"pug": "2.0.3",
-		"punycode": "2.1.1",
-		"qrcode": "1.2.0",
-		"ratelimiter": "3.0.3",
-		"recaptcha-promise": "0.1.3",
-		"reconnecting-websocket": "3.2.2",
-		"redis": "2.8.0",
-		"request": "2.87.0",
-		"request-promise-native": "1.0.5",
 		"rimraf": "2.6.2",
-		"rndstr": "1.0.0",
 		"s-age": "1.1.2",
 		"sass-loader": "7.0.1",
 		"seedrandom": "2.4.3",
 		"single-line-log": "1.1.2",
-		"speakeasy": "2.0.0",
 		"style-loader": "0.21.0",
 		"stylus": "0.54.5",
 		"stylus-loader": "3.0.2",
-		"summaly": "2.0.6",
 		"swagger-jsdoc": "1.9.7",
 		"syuilo-password-strength": "0.0.1",
-		"tcp-port-used": "0.1.2",
 		"textarea-caret": "3.1.0",
-		"tmp": "0.0.33",
 		"ts-loader": "4.3.0",
 		"ts-node": "6.0.4",
 		"tslint": "5.10.0",
@@ -197,7 +205,6 @@
 		"typescript-eslint-parser": "15.0.0",
 		"uglify-es": "3.3.9",
 		"url-loader": "1.0.1",
-		"uuid": "3.2.1",
 		"v-animate-css": "0.0.2",
 		"vue": "2.5.16",
 		"vue-cropperjs": "2.2.0",
@@ -210,12 +217,7 @@
 		"vuedraggable": "2.16.0",
 		"vuex": "3.0.1",
 		"vuex-persistedstate": "^2.5.4",
-		"web-push": "3.3.1",
-		"webfinger.js": "2.6.6",
 		"webpack": "4.9.1",
-		"webpack-cli": "2.1.4",
-		"websocket": "1.0.26",
-		"ws": "5.2.0",
-		"xev": "2.0.1"
+		"webpack-cli": "2.1.4"
 	}
-}
+}
\ No newline at end of file

From 2ec25a7729e8d2fa6734bdf25ffb5a1b35ca2d5b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 09:11:32 +0900
Subject: [PATCH 253/369] wip

---
 .../app/common/views/widgets/hashtags.vue     | 97 +++++++++++++++++++
 src/client/app/common/views/widgets/index.ts  |  2 +
 .../app/desktop/views/components/home.vue     |  1 +
 .../views/pages/deck/deck.widgets-column.vue  |  1 +
 src/client/app/mobile/views/pages/widgets.vue |  1 +
 src/index.ts                                  |  2 -
 src/server/api/endpoints.ts                   |  5 +
 src/server/api/endpoints/hashtags/trend.ts    | 78 +++++++++++++++
 src/server/api/stream/hashtags-stats.ts       | 35 -------
 src/server/api/streaming.ts                   |  6 --
 10 files changed, 185 insertions(+), 43 deletions(-)
 create mode 100644 src/client/app/common/views/widgets/hashtags.vue
 create mode 100644 src/server/api/endpoints/hashtags/trend.ts
 delete mode 100644 src/server/api/stream/hashtags-stats.ts

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
new file mode 100644
index 0000000000..0ac62af705
--- /dev/null
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -0,0 +1,97 @@
+<template>
+<div class="mkw-hashtags">
+	<mk-widget-container :show-header="!props.compact">
+		<template slot="header">%fa:hashtag%%i18n:@title%</template>
+
+		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
+			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
+			<div v-else>
+				<router-link v-for="stat in stats" :key="stat.tag" :to="`/tags/${ stat.tag }`">{{ stat.tag }}</router-link>
+			</div>
+		</div>
+	</mk-widget-container>
+</div>
+</template>
+
+<script lang="ts">
+import define from '../../../common/define-widget';
+export default define({
+	name: 'hashtags',
+	props: () => ({
+		compact: false
+	})
+}).extend({
+	data() {
+		return {
+			stats: [],
+			fetching: true,
+			clock: null
+		};
+	},
+	mounted() {
+		this.fetch();
+		this.clock = setInterval(this.fetch, 1000 * 60 * 10);
+	},
+	beforeDestroy() {
+		clearInterval(this.clock);
+	},
+	methods: {
+		func() {
+			this.props.compact = !this.props.compact;
+			this.save();
+		},
+		fetch() {
+			(this as any).api('hashtags/trend').then(stats => {
+				this.stats = stats;
+				this.fetching = false;
+			});
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+root(isDark)
+	.mkw-rss--body
+		.feed
+			padding 12px 16px
+			font-size 0.9em
+
+			> a
+				display block
+				padding 4px 0
+				color isDark ? #9aa4b3 : #666
+				border-bottom dashed 1px isDark ? #1c2023 : #eee
+
+				&:last-child
+					border-bottom none
+
+		.fetching
+			margin 0
+			padding 16px
+			text-align center
+			color #aaa
+
+			> [data-fa]
+				margin-right 4px
+
+		&[data-mobile]
+			background isDark ? #21242f : #f3f3f3
+
+			.feed
+				padding 0
+
+				> a
+					padding 8px 16px
+					border-bottom none
+
+					&:nth-child(even)
+						background isDark ? rgba(#000, 0.05) : rgba(#fff, 0.7)
+
+.mkw-rss[data-darkmode]
+	root(true)
+
+.mkw-rss:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts
index 0190393ba7..7d548ef353 100644
--- a/src/client/app/common/views/widgets/index.ts
+++ b/src/client/app/common/views/widgets/index.ts
@@ -13,6 +13,7 @@ import wSlideshow from './slideshow.vue';
 import wTips from './tips.vue';
 import wDonation from './donation.vue';
 import wNav from './nav.vue';
+import wHashtags from './hashtags.vue';
 
 Vue.component('mkw-analog-clock', wAnalogClock);
 Vue.component('mkw-nav', wNav);
@@ -27,3 +28,4 @@ Vue.component('mkw-posts-monitor', wPostsMonitor);
 Vue.component('mkw-memo', wMemo);
 Vue.component('mkw-rss', wRss);
 Vue.component('mkw-version', wVersion);
+Vue.component('mkw-hashtags', wHashtags);
diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index cac1fd935b..8774aada63 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -23,6 +23,7 @@
 					<option value="post-form">%i18n:common.widgets.post-form%</option>
 					<option value="messaging">%i18n:common.widgets.messaging%</option>
 					<option value="memo">%i18n:common.widgets.memo%</option>
+					<option value="hashtags">%i18n:common.widgets.hashtags%</option>
 					<option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option>
 					<option value="server">%i18n:common.widgets.server%</option>
 					<option value="donation">%i18n:common.widgets.donation%</option>
diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 2a3a2472dc..a41bf8c3ca 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -23,6 +23,7 @@
 					<option value="post-form">%i18n:common.widgets.post-form%</option>
 					<option value="messaging">%i18n:common.widgets.messaging%</option>
 					<option value="memo">%i18n:common.widgets.memo%</option>
+					<option value="hashtags">%i18n:common.widgets.hashtags%</option>
 					<option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option>
 					<option value="server">%i18n:common.widgets.server%</option>
 					<option value="donation">%i18n:common.widgets.donation%</option>
diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue
index ea8580b4d0..294c80e7a0 100644
--- a/src/client/app/mobile/views/pages/widgets.vue
+++ b/src/client/app/mobile/views/pages/widgets.vue
@@ -15,6 +15,7 @@
 					<option value="rss">%i18n:common.widgets.rss%</option>
 					<option value="photo-stream">%i18n:common.widgets.photo-stream%</option>
 					<option value="slideshow">%i18n:common.widgets.slideshow%</option>
+					<option value="hashtags">%i18n:common.widgets.hashtags%</option>
 					<option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option>
 					<option value="version">%i18n:common.widgets.version%</option>
 					<option value="server">%i18n:common.widgets.server%</option>
diff --git a/src/index.ts b/src/index.ts
index 27c5dd0275..35cf5a243b 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -19,7 +19,6 @@ import MachineInfo from './utils/machineInfo';
 import DependencyInfo from './utils/dependencyInfo';
 import serverStats from './daemons/server-stats';
 import notesStats from './daemons/notes-stats';
-import hashtagsStats from './daemons/hashtags-stats';
 
 import loadConfig from './config/load';
 import { Config } from './config/types';
@@ -53,7 +52,6 @@ function main() {
 		ev.mount();
 		serverStats();
 		notesStats();
-		hashtagsStats();
 	} else {
 		workerMain(opt);
 	}
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 91e5298e73..5f0a020d6f 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -628,6 +628,11 @@ const endpoints: Endpoint[] = [
 		withCredential: true
 	},
 
+	{
+		name: 'hashtags/trend',
+		withCredential: true
+	},
+
 	{
 		name: 'messaging/history',
 		withCredential: true,
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
new file mode 100644
index 0000000000..3b95e1fa4c
--- /dev/null
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -0,0 +1,78 @@
+import Note from '../../../../models/note';
+
+/**
+ * Get trends of hashtags
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+	// 10分
+	const interval = 1000 * 60 * 10;
+
+	const data = await Note.aggregate([{
+		$match: {
+			createdAt: {
+				$gt: new Date(Date.now() - interval)
+			},
+			tags: {
+				$exists: true,
+				$ne: []
+			}
+		}
+	}, {
+		$unwind: '$tags'
+	}, {
+		$group: {
+			_id: '$tags',
+			count: {
+				$sum: 1
+			}
+		}
+	}, {
+		$group: {
+			_id: null,
+			tags: {
+				$push: {
+					tag: '$_id',
+					count: '$count'
+				}
+			}
+		}
+	}, {
+		$project: {
+			_id: false,
+			tags: true
+		}
+	}]) as Array<{
+		tags: Array<{
+			tag: string;
+			count: number;
+		}>
+	}>;
+
+	const hots = data[0].tags
+		.sort((a, b) => a.count - b.count)
+		.map(tag => tag.tag)
+		.slice(0, 10);
+
+	const countPromises: Array<Promise<number[]>> = [];
+
+	for (let i = 0; i < 10; i++) {
+		countPromises.push(Promise.all(hots.map(tag => Note.count({
+			tags: tag,
+			createdAt: {
+				$lt: new Date(Date.now() - (interval * i)),
+				$gt: new Date(Date.now() - (interval * (i + 1)))
+			}
+		}))));
+	}
+
+	const countsLog = await Promise.all(countPromises);
+
+	const stats = hots.map((tag, i) => ({
+		tag,
+		chart: countsLog.map(counts => counts[i])
+	}));
+
+	console.log(stats);
+
+	res(stats);
+});
diff --git a/src/server/api/stream/hashtags-stats.ts b/src/server/api/stream/hashtags-stats.ts
deleted file mode 100644
index 47183467f5..0000000000
--- a/src/server/api/stream/hashtags-stats.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import * as websocket from 'websocket';
-import Xev from 'xev';
-
-const ev = new Xev();
-
-export default function(request: websocket.request, connection: websocket.connection): void {
-	const onStats = stats => {
-		connection.send(JSON.stringify({
-			type: 'stats',
-			body: stats
-		}));
-	};
-
-	connection.on('message', async data => {
-		const msg = JSON.parse(data.utf8Data);
-
-		switch (msg.type) {
-			case 'requestLog':
-				ev.once('hashtagsStatsLog:' + msg.id, statsLog => {
-					connection.send(JSON.stringify({
-						type: 'statsLog',
-						body: statsLog
-					}));
-				});
-				ev.emit('requestHashtagsStatsLog', msg.id);
-				break;
-		}
-	});
-
-	ev.addListener('hashtagsStats', onStats);
-
-	connection.on('close', () => {
-		ev.removeListener('hashtagsStats', onStats);
-	});
-}
diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts
index e4156096ef..2d4cfc108f 100644
--- a/src/server/api/streaming.ts
+++ b/src/server/api/streaming.ts
@@ -14,7 +14,6 @@ import othelloGameStream from './stream/othello-game';
 import othelloStream from './stream/othello';
 import serverStatsStream from './stream/server-stats';
 import notesStatsStream from './stream/notes-stats';
-import hashtagsStatsStream from './stream/hashtags-stats';
 import requestsStream from './stream/requests';
 import { ParsedUrlQuery } from 'querystring';
 import authenticate from './authenticate';
@@ -40,11 +39,6 @@ module.exports = (server: http.Server) => {
 			return;
 		}
 
-		if (request.resourceURL.pathname === '/hashtags-stats') {
-			hashtagsStatsStream(request, connection);
-			return;
-		}
-
 		if (request.resourceURL.pathname === '/requests') {
 			requestsStream(request, connection);
 			return;

From 7d7193cb63ac8811152707a6896e5cf7ae05258c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 11:24:29 +0900
Subject: [PATCH 254/369] :v:

---
 locales/ja.yml                                |  3 +
 .../common/views/widgets/hashtags.chart.vue   | 78 +++++++++++++++++++
 .../app/common/views/widgets/hashtags.vue     | 57 +++++++-------
 src/server/api/endpoints/hashtags/trend.ts    | 12 ++-
 4 files changed, 119 insertions(+), 31 deletions(-)
 create mode 100644 src/client/app/common/views/widgets/hashtags.chart.vue

diff --git a/locales/ja.yml b/locales/ja.yml
index 64ee00dba5..da751c9e39 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -254,6 +254,9 @@ common/views/widgets/posts-monitor.vue:
   title: "投稿チャート"
   toggle: "表示を切り替え"
 
+common/views/widgets/hashtags.vue:
+  title: "ハッシュタグ"
+
 common/views/widgets/server.vue:
   title: "サーバー情報"
   toggle: "表示を切り替え"
diff --git a/src/client/app/common/views/widgets/hashtags.chart.vue b/src/client/app/common/views/widgets/hashtags.chart.vue
new file mode 100644
index 0000000000..19b56ef283
--- /dev/null
+++ b/src/client/app/common/views/widgets/hashtags.chart.vue
@@ -0,0 +1,78 @@
+<template>
+<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
+	<defs>
+		<linearGradient :id="gradientId" x1="0" x2="0" y1="1" y2="0">
+			<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
+			<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
+		</linearGradient>
+		<mask :id="maskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
+			<polygon
+				:points="polygonPoints"
+				fill="#fff"
+				fill-opacity="0.5"/>
+			<polyline
+				:points="polylinePoints"
+				fill="none"
+				stroke="#fff"
+				stroke-width="0.7"/>
+			<circle
+				:cx="headX"
+				:cy="headY"
+				r="1.2"
+				fill="#fff"/>
+		</mask>
+	</defs>
+	<rect
+		x="-2" y="-2"
+		:width="viewBoxX + 4" :height="viewBoxY + 4"
+		:style="`stroke: none; fill: url(#${ gradientId }); mask: url(#${ maskId })`"/>
+</svg>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import * as uuid from 'uuid';
+
+export default Vue.extend({
+	props: {
+		src: {
+			type: Array,
+			required: true
+		}
+	},
+	data() {
+		return {
+			viewBoxX: 50,
+			viewBoxY: 30,
+			gradientId: uuid(),
+			maskId: uuid(),
+			polylinePoints: '',
+			polygonPoints: '',
+			headX: null,
+			headY: null
+		};
+	},
+	watch: {
+		src() {
+			this.draw();
+		}
+	},
+	created() {
+		this.draw();
+	},
+	methods: {
+		draw() {
+			const stats = this.src.slice().reverse();
+			const peak = Math.max.apply(null, stats) || 1;
+
+			const polylinePoints = stats.map((x, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (x / peak)) * this.viewBoxY]);
+			this.polylinePoints = polylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
+
+			this.polygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
+
+			this.headX = polylinePoints[polylinePoints.length - 1][0];
+			this.headY = polylinePoints[polylinePoints.length - 1][1];
+		}
+	}
+});
+</script>
diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 0ac62af705..c4647ee0f9 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -6,7 +6,12 @@
 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
 			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
 			<div v-else>
-				<router-link v-for="stat in stats" :key="stat.tag" :to="`/tags/${ stat.tag }`">{{ stat.tag }}</router-link>
+				<div v-for="stat in stats" :key="stat.tag">
+					<div class="tag">
+						<router-link :to="`/tags/${ stat.tag }`">#{{ stat.tag }}</router-link>
+					</div>
+					<x-chart class="chart" :src="stat.chart"/>
+				</div>
 			</div>
 		</div>
 	</mk-widget-container>
@@ -15,12 +20,17 @@
 
 <script lang="ts">
 import define from '../../../common/define-widget';
+import XChart from './hashtags.chart.vue';
+
 export default define({
 	name: 'hashtags',
 	props: () => ({
 		compact: false
 	})
 }).extend({
+	components: {
+		XChart
+	},
 	data() {
 		return {
 			stats: [],
@@ -52,21 +62,8 @@ export default define({
 
 <style lang="stylus" scoped>
 root(isDark)
-	.mkw-rss--body
-		.feed
-			padding 12px 16px
-			font-size 0.9em
-
-			> a
-				display block
-				padding 4px 0
-				color isDark ? #9aa4b3 : #666
-				border-bottom dashed 1px isDark ? #1c2023 : #eee
-
-				&:last-child
-					border-bottom none
-
-		.fetching
+	.mkw-hashtags--body
+		> .fetching
 			margin 0
 			padding 16px
 			text-align center
@@ -75,23 +72,29 @@ root(isDark)
 			> [data-fa]
 				margin-right 4px
 
-		&[data-mobile]
-			background isDark ? #21242f : #f3f3f3
+		> div
+			> div
+				display flex
+				align-items center
+				padding 16px
 
-			.feed
-				padding 0
+				&:not(:last-child)
+					border-bottom solid 1px #393f4f
 
-				> a
-					padding 8px 16px
-					border-bottom none
+				> .tag
+					flex 1
 
-					&:nth-child(even)
-						background isDark ? rgba(#000, 0.05) : rgba(#fff, 0.7)
+					> a
+						color #9baec8
 
-.mkw-rss[data-darkmode]
+				> .chart
+					width 50px
+					height 30px
+
+.mkw-hashtags[data-darkmode]
 	root(true)
 
-.mkw-rss:not([data-darkmode])
+.mkw-hashtags:not([data-darkmode])
 	root(false)
 
 </style>
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 3b95e1fa4c..6a49fec3d8 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -4,13 +4,10 @@ import Note from '../../../../models/note';
  * Get trends of hashtags
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
-	// 10分
-	const interval = 1000 * 60 * 10;
-
 	const data = await Note.aggregate([{
 		$match: {
 			createdAt: {
-				$gt: new Date(Date.now() - interval)
+				$gt: new Date(Date.now() - 1000 * 60 * 60)
 			},
 			tags: {
 				$exists: true,
@@ -48,6 +45,10 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		}>
 	}>;
 
+	if (data.length == 0) {
+		return res([]);
+	}
+
 	const hots = data[0].tags
 		.sort((a, b) => a.count - b.count)
 		.map(tag => tag.tag)
@@ -56,6 +57,9 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	const countPromises: Array<Promise<number[]>> = [];
 
 	for (let i = 0; i < 10; i++) {
+		// 10分
+		const interval = 1000 * 60 * 10;
+
 		countPromises.push(Promise.all(hots.map(tag => Note.count({
 			tags: tag,
 			createdAt: {

From 7cca509eb303813057e27a95a9e4883eca8c0fcd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 11:27:21 +0900
Subject: [PATCH 255/369] :v:

---
 src/server/api/endpoints/hashtags/trend.ts | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 6a49fec3d8..c888a6cbb5 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -50,7 +50,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	}
 
 	const hots = data[0].tags
-		.sort((a, b) => a.count - b.count)
+		.sort((a, b) => b.count - a.count)
 		.map(tag => tag.tag)
 		.slice(0, 10);
 
@@ -76,7 +76,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		chart: countsLog.map(counts => counts[i])
 	}));
 
-	console.log(stats);
-
 	res(stats);
 });

From df9cb7cf6ebd51612531c2c85e8ba2d2260ded30 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 11:44:26 +0900
Subject: [PATCH 256/369] 2.37.0

---
 package.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/package.json b/package.json
index dd85c21629..7a297bb9a8 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.36.1",
-	"clientVersion": "1.0.6396",
+	"version": "2.37.0",
+	"clientVersion": "1.0.6419",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,
@@ -220,4 +220,4 @@
 		"webpack": "4.9.1",
 		"webpack-cli": "2.1.4"
 	}
-}
\ No newline at end of file
+}

From da612ef789c4c3a64c869fbba75e0db66fe17e27 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 11:45:10 +0900
Subject: [PATCH 257/369] :v:

---
 locales/ja.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/locales/ja.yml b/locales/ja.yml
index da751c9e39..4ce8caaa18 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -76,6 +76,7 @@ common:
     donation: "寄付のお願い"
     nav: "ナビゲーション"
     tips: "ヒント"
+    hashtags: "ハッシュタグ"
 
   deck:
     widgets: "ウィジェット"

From c0a3ae26121506d75d02c484db67fe0cc5bf1971 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 11:45:27 +0900
Subject: [PATCH 258/369] 2.37.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 7a297bb9a8..4d0cdf8cf7 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.0",
+	"version": "2.37.1",
 	"clientVersion": "1.0.6419",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From c3e375e8a54ccfd164a95ef642ec43eeac77c727 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 12:52:47 +0900
Subject: [PATCH 259/369] :v:

---
 .../common/views/widgets/hashtags.chart.vue    | 18 +++++++++++-------
 .../app/common/views/widgets/hashtags.vue      |  6 +++---
 src/server/api/endpoints/hashtags/trend.ts     |  2 +-
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/client/app/common/views/widgets/hashtags.chart.vue b/src/client/app/common/views/widgets/hashtags.chart.vue
index 19b56ef283..b435188616 100644
--- a/src/client/app/common/views/widgets/hashtags.chart.vue
+++ b/src/client/app/common/views/widgets/hashtags.chart.vue
@@ -1,5 +1,5 @@
 <template>
-<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
+<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" style="overflow:visible">
 	<defs>
 		<linearGradient :id="gradientId" x1="0" x2="0" y1="1" y2="0">
 			<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
@@ -14,17 +14,17 @@
 				:points="polylinePoints"
 				fill="none"
 				stroke="#fff"
-				stroke-width="0.7"/>
+				stroke-width="2"/>
 			<circle
 				:cx="headX"
 				:cy="headY"
-				r="1.2"
+				r="3"
 				fill="#fff"/>
 		</mask>
 	</defs>
 	<rect
-		x="-2" y="-2"
-		:width="viewBoxX + 4" :height="viewBoxY + 4"
+		x="-10" y="-10"
+		:width="viewBoxX + 20" :height="viewBoxY + 20"
 		:style="`stroke: none; fill: url(#${ gradientId }); mask: url(#${ maskId })`"/>
 </svg>
 </template>
@@ -65,10 +65,14 @@ export default Vue.extend({
 			const stats = this.src.slice().reverse();
 			const peak = Math.max.apply(null, stats) || 1;
 
-			const polylinePoints = stats.map((x, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (x / peak)) * this.viewBoxY]);
+			const polylinePoints = stats.map((n, i) => [
+				i * (this.viewBoxX / (stats.length - 1)),
+				(1 - (n / peak)) * this.viewBoxY
+			]);
+
 			this.polylinePoints = polylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
 
-			this.polygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
+			this.polygonPoints = `0,${ this.viewBoxY } ${ this.polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
 
 			this.headX = polylinePoints[polylinePoints.length - 1][0];
 			this.headY = polylinePoints[polylinePoints.length - 1][1];
diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index c4647ee0f9..9d523f321f 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -79,16 +79,16 @@ root(isDark)
 				padding 16px
 
 				&:not(:last-child)
-					border-bottom solid 1px #393f4f
+					border-bottom solid 1px isDark ? #393f4f : #eee
 
 				> .tag
 					flex 1
 
 					> a
-						color #9baec8
+						font-size 14px
+						color isDark ? #9baec8 : #65727b
 
 				> .chart
-					width 50px
 					height 30px
 
 .mkw-hashtags[data-darkmode]
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index c888a6cbb5..443d7d2034 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -52,7 +52,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	const hots = data[0].tags
 		.sort((a, b) => b.count - a.count)
 		.map(tag => tag.tag)
-		.slice(0, 10);
+		.slice(0, 5);
 
 	const countPromises: Array<Promise<number[]>> = [];
 

From 6f724827bd5f54d2eeea222f52af8c178e1198da Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 13:45:32 +0900
Subject: [PATCH 260/369] :v:

---
 locales/ja.yml                                |  1 +
 .../app/common/views/widgets/hashtags.vue     | 11 ++-
 src/server/api/endpoints/hashtags/trend.ts    | 69 ++++++++++---------
 3 files changed, 48 insertions(+), 33 deletions(-)

diff --git a/locales/ja.yml b/locales/ja.yml
index 4ce8caaa18..1b4fc15071 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -257,6 +257,7 @@ common/views/widgets/posts-monitor.vue:
 
 common/views/widgets/hashtags.vue:
   title: "ハッシュタグ"
+  count: "{}人が投稿"
 
 common/views/widgets/server.vue:
   title: "サーバー情報"
diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 9d523f321f..f6fd091b79 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -9,6 +9,7 @@
 				<div v-for="stat in stats" :key="stat.tag">
 					<div class="tag">
 						<router-link :to="`/tags/${ stat.tag }`">#{{ stat.tag }}</router-link>
+						<p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p>
 					</div>
 					<x-chart class="chart" :src="stat.chart"/>
 				</div>
@@ -83,10 +84,16 @@ root(isDark)
 
 				> .tag
 					flex 1
+					font-size 14px
+					color isDark ? #9baec8 : #65727b
 
 					> a
-						font-size 14px
-						color isDark ? #9baec8 : #65727b
+						color inherit
+
+					> p
+						margin 0
+						font-size 75%
+						opacity 0.7
 
 				> .chart
 					height 30px
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 443d7d2034..07317d1db2 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -18,49 +18,48 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		$unwind: '$tags'
 	}, {
 		$group: {
-			_id: '$tags',
-			count: {
-				$sum: 1
-			}
-		}
-	}, {
-		$group: {
-			_id: null,
-			tags: {
-				$push: {
-					tag: '$_id',
-					count: '$count'
-				}
-			}
-		}
-	}, {
-		$project: {
-			_id: false,
-			tags: true
+			_id: { tags: '$tags', userId: '$userId' }
 		}
 	}]) as Array<{
-		tags: Array<{
-			tag: string;
-			count: number;
-		}>
+		_id: {
+			tags: string;
+			userId: any;
+		}
 	}>;
 
 	if (data.length == 0) {
 		return res([]);
 	}
 
-	const hots = data[0].tags
+	const tags = [];
+
+	data.map(x => x._id).forEach(x => {
+		const i = tags.findIndex(tag => tag.name == x.tags);
+		if (i != -1) {
+			tags[i].count++;
+		} else {
+			tags.push({
+				name: x.tags,
+				count: 1
+			});
+		}
+	});
+
+	const hots = tags
 		.sort((a, b) => b.count - a.count)
-		.map(tag => tag.tag)
+		.map(tag => tag.name)
 		.slice(0, 5);
 
-	const countPromises: Array<Promise<number[]>> = [];
+	const countPromises: Array<Promise<any[]>> = [];
 
-	for (let i = 0; i < 10; i++) {
-		// 10分
-		const interval = 1000 * 60 * 10;
+	const range = 20;
 
-		countPromises.push(Promise.all(hots.map(tag => Note.count({
+	// 10分
+	const interval = 1000 * 60 * 10;
+
+	for (let i = 0; i < range; i++) {
+
+		countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', {
 			tags: tag,
 			createdAt: {
 				$lt: new Date(Date.now() - (interval * i)),
@@ -71,9 +70,17 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 
 	const countsLog = await Promise.all(countPromises);
 
+	const totalCounts: any = await Promise.all(hots.map(tag => Note.distinct('userId', {
+		tags: tag,
+		createdAt: {
+			$gt: new Date(Date.now() - (interval * range))
+		}
+	})));
+
 	const stats = hots.map((tag, i) => ({
 		tag,
-		chart: countsLog.map(counts => counts[i])
+		chart: countsLog.map(counts => counts[i].length),
+		usersCount: totalCounts[i].length
 	}));
 
 	res(stats);

From ebd189fb2740c3ce2f0d87a2078b1293c9d65e55 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 13:46:23 +0900
Subject: [PATCH 261/369] :pizza:

---
 src/client/app/common/views/widgets/hashtags.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index f6fd091b79..74b5b76479 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -66,7 +66,7 @@ root(isDark)
 	.mkw-hashtags--body
 		> .fetching
 			margin 0
-			padding 16px
+			padding 12px 16px
 			text-align center
 			color #aaa
 

From 36215d50bd5393e039183bcf822e38bcbd02a037 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 13:48:07 +0900
Subject: [PATCH 262/369] 2.37.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 4d0cdf8cf7..2ba4c7fc34 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.1",
-	"clientVersion": "1.0.6419",
+	"version": "2.37.2",
+	"clientVersion": "1.0.6437",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From b87e7e50b6c1064319564b459f4456a3bb83da72 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 13:49:53 +0900
Subject: [PATCH 263/369] Clean up

---
 src/server/api/endpoints/hashtags/trend.ts | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 07317d1db2..faf4e582fa 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -3,7 +3,7 @@ import Note from '../../../../models/note';
 /**
  * Get trends of hashtags
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = () => new Promise(async (res, rej) => {
 	const data = await Note.aggregate([{
 		$match: {
 			createdAt: {
@@ -58,7 +58,6 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	const interval = 1000 * 60 * 10;
 
 	for (let i = 0; i < range; i++) {
-
 		countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', {
 			tags: tag,
 			createdAt: {

From e0f847e539455187b5f72bb68e89e6b97d7377f3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 14:06:23 +0900
Subject: [PATCH 264/369] :v:

---
 src/client/app/common/views/widgets/hashtags.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 74b5b76479..809f87f6f2 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -41,7 +41,7 @@ export default define({
 	},
 	mounted() {
 		this.fetch();
-		this.clock = setInterval(this.fetch, 1000 * 60 * 10);
+		this.clock = setInterval(this.fetch, 1000 * 60);
 	},
 	beforeDestroy() {
 		clearInterval(this.clock);

From bb53db905f8765c0e0faa0fa69e71ba5bcee799e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 14:16:21 +0900
Subject: [PATCH 265/369] :v:

---
 src/client/app/common/views/widgets/hashtags.vue | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 809f87f6f2..8c9ca5d419 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -8,7 +8,7 @@
 			<div v-else>
 				<div v-for="stat in stats" :key="stat.tag">
 					<div class="tag">
-						<router-link :to="`/tags/${ stat.tag }`">#{{ stat.tag }}</router-link>
+						<router-link :to="`/tags/${ stat.tag }`" :title="stat.tag">#{{ stat.tag }}</router-link>
 						<p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p>
 					</div>
 					<x-chart class="chart" :src="stat.chart"/>
@@ -84,10 +84,16 @@ root(isDark)
 
 				> .tag
 					flex 1
+					overflow hidden
 					font-size 14px
 					color isDark ? #9baec8 : #65727b
 
 					> a
+						display block
+						width 100%
+						white-space nowrap
+						overflow hidden
+						text-overflow ellipsis
 						color inherit
 
 					> p

From 91db24fcfc942983e11e6d14ddc89597da4f6648 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 11 Jun 2018 14:16:46 +0900
Subject: [PATCH 266/369] 2.37.3

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 2ba4c7fc34..5ef951a875 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.2",
-	"clientVersion": "1.0.6437",
+	"version": "2.37.3",
+	"clientVersion": "1.0.6453",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 90337adbbcd5dff8ff23ec353ffca51b9a4b48ca Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 01:41:17 +0900
Subject: [PATCH 267/369] Improve hashtag trend detection

---
 src/server/api/endpoints/hashtags/trend.ts | 37 ++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index faf4e582fa..170580dd80 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -1,13 +1,23 @@
 import Note from '../../../../models/note';
 
+/*
+トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
+ユニーク投稿数とはそのハッシュタグと投稿ユーザーのペアのカウントで、例えば同じユーザーが複数回同じハッシュタグを投稿してもそのハッシュタグのユニーク投稿数は1とカウントされる
+*/
+
+const rangeA = 1000 * 60 * 10; // 10分
+const rangeB = 1000 * 60 * 60; // 1時間
+const coefficient = 2; // 「n倍」の部分
+
 /**
  * Get trends of hashtags
  */
 module.exports = () => new Promise(async (res, rej) => {
+	//#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計
 	const data = await Note.aggregate([{
 		$match: {
 			createdAt: {
-				$gt: new Date(Date.now() - 1000 * 60 * 60)
+				$gt: new Date(Date.now() - rangeA)
 			},
 			tags: {
 				$exists: true,
@@ -26,6 +36,7 @@ module.exports = () => new Promise(async (res, rej) => {
 			userId: any;
 		}
 	}>;
+	//#endregion
 
 	if (data.length == 0) {
 		return res([]);
@@ -33,6 +44,7 @@ module.exports = () => new Promise(async (res, rej) => {
 
 	const tags = [];
 
+	// カウント
 	data.map(x => x._id).forEach(x => {
 		const i = tags.findIndex(tag => tag.name == x.tags);
 		if (i != -1) {
@@ -45,11 +57,31 @@ module.exports = () => new Promise(async (res, rej) => {
 		}
 	});
 
-	const hots = tags
+	//#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する
+	const hotsPromises = tags.map(async tag => {
+		const passedCount = (await Note.distinct('userId', {
+			tags: tag,
+			createdAt: {
+				$lt: new Date(Date.now() - rangeA),
+				$gt: new Date(Date.now() - rangeB)
+			}
+		}) as any).length;
+
+		if (passedCount > (tag.count * coefficient)) {
+			return tag;
+		} else {
+			return null;
+		}
+	});
+	//#endregion
+
+	const hots = (await Promise.all(hotsPromises))
+		.filter(x => x != null)
 		.sort((a, b) => b.count - a.count)
 		.map(tag => tag.name)
 		.slice(0, 5);
 
+	//#region 2で話題と判定されたタグそれぞれについて過去の投稿数グラフを取得する
 	const countPromises: Array<Promise<any[]>> = [];
 
 	const range = 20;
@@ -75,6 +107,7 @@ module.exports = () => new Promise(async (res, rej) => {
 			$gt: new Date(Date.now() - (interval * range))
 		}
 	})));
+	//#endregion
 
 	const stats = hots.map((tag, i) => ({
 		tag,

From c61050244e5e84833688c1aaaea1ebc3be5e72f4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 01:43:56 +0900
Subject: [PATCH 268/369] =?UTF-8?q?=E5=A4=89=E6=95=B0=E8=AA=BF=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/server/api/endpoints/hashtags/trend.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 170580dd80..257718014d 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -6,8 +6,8 @@ import Note from '../../../../models/note';
 */
 
 const rangeA = 1000 * 60 * 10; // 10分
-const rangeB = 1000 * 60 * 60; // 1時間
-const coefficient = 2; // 「n倍」の部分
+const rangeB = 1000 * 60 * 40; // 40分
+const coefficient = 1.5; // 「n倍」の部分
 
 /**
  * Get trends of hashtags

From 944f9524e2dcd327ca1cb1eea6dc31eb75cbaddb Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 01:45:58 +0900
Subject: [PATCH 269/369] Fix bug

---
 src/server/api/endpoints/hashtags/trend.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 257718014d..3ad143aaf0 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -60,7 +60,7 @@ module.exports = () => new Promise(async (res, rej) => {
 	//#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する
 	const hotsPromises = tags.map(async tag => {
 		const passedCount = (await Note.distinct('userId', {
-			tags: tag,
+			tags: tag.name,
 			createdAt: {
 				$lt: new Date(Date.now() - rangeA),
 				$gt: new Date(Date.now() - rangeB)

From f90e9596d48827c9f290a7f139e610fabc1308ad Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 01:48:29 +0900
Subject: [PATCH 270/369] Fix bug

---
 src/server/api/endpoints/hashtags/trend.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 3ad143aaf0..91fbd2f9fd 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -67,7 +67,7 @@ module.exports = () => new Promise(async (res, rej) => {
 			}
 		}) as any).length;
 
-		if (passedCount > (tag.count * coefficient)) {
+		if (tag.count > (passedCount * coefficient)) {
 			return tag;
 		} else {
 			return null;

From 03fbae7b6d6125b6901734768da185d66f923199 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 01:51:51 +0900
Subject: [PATCH 271/369] =?UTF-8?q?=E5=A4=89=E6=95=B0=E8=AA=BF=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/server/api/endpoints/hashtags/trend.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 91fbd2f9fd..43048c1c9f 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -5,8 +5,8 @@ import Note from '../../../../models/note';
 ユニーク投稿数とはそのハッシュタグと投稿ユーザーのペアのカウントで、例えば同じユーザーが複数回同じハッシュタグを投稿してもそのハッシュタグのユニーク投稿数は1とカウントされる
 */
 
-const rangeA = 1000 * 60 * 10; // 10分
-const rangeB = 1000 * 60 * 40; // 40分
+const rangeA = 1000 * 60 * 30; // 30分
+const rangeB = 1000 * 60 * 120; // 2時間
 const coefficient = 1.5; // 「n倍」の部分
 
 /**

From ebde84214e57eb5a3af9f28a6671710d78232bfd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 02:00:05 +0900
Subject: [PATCH 272/369] Improve hashtag trend detection

---
 src/server/api/endpoints/hashtags/trend.ts | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 43048c1c9f..efd74a21e0 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -8,6 +8,7 @@ import Note from '../../../../models/note';
 const rangeA = 1000 * 60 * 30; // 30分
 const rangeB = 1000 * 60 * 120; // 2時間
 const coefficient = 1.5; // 「n倍」の部分
+const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか
 
 /**
  * Get trends of hashtags
@@ -42,7 +43,7 @@ module.exports = () => new Promise(async (res, rej) => {
 		return res([]);
 	}
 
-	const tags = [];
+	let tags = [];
 
 	// カウント
 	data.map(x => x._id).forEach(x => {
@@ -57,6 +58,9 @@ module.exports = () => new Promise(async (res, rej) => {
 		}
 	});
 
+	// 最低要求投稿者数を下回るならカットする
+	tags = tags.filter(tag => tag.count >= requiredUsers);
+
 	//#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する
 	const hotsPromises = tags.map(async tag => {
 		const passedCount = (await Note.distinct('userId', {

From bbfccb0bbfbe4720e1df11559172f369c085c56d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 02:03:18 +0900
Subject: [PATCH 273/369] :art:

---
 src/client/app/common/views/widgets/hashtags.vue | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 8c9ca5d419..1f1e6ceb52 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -5,7 +5,7 @@
 
 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
 			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
-			<div v-else>
+			<transition-group v-else tag="div" name="chart">
 				<div v-for="stat in stats" :key="stat.tag">
 					<div class="tag">
 						<router-link :to="`/tags/${ stat.tag }`" :title="stat.tag">#{{ stat.tag }}</router-link>
@@ -13,7 +13,7 @@
 					</div>
 					<x-chart class="chart" :src="stat.chart"/>
 				</div>
-			</div>
+			</transition-group>
 		</div>
 	</mk-widget-container>
 </div>
@@ -74,6 +74,14 @@ root(isDark)
 				margin-right 4px
 
 		> div
+			.chart-enter
+			.chart-leave-to
+				opacity 0
+				transform translateY(-30px)
+
+			> *
+				transition transform .3s ease, opacity .3s ease
+
 			> div
 				display flex
 				align-items center

From 2e680c3d1e0ab3f3beb0aa5d62483267c75d99e3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 02:18:29 +0900
Subject: [PATCH 274/369] Fix bug

---
 src/client/app/common/views/widgets/hashtags.chart.vue | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/client/app/common/views/widgets/hashtags.chart.vue b/src/client/app/common/views/widgets/hashtags.chart.vue
index b435188616..723a3947f8 100644
--- a/src/client/app/common/views/widgets/hashtags.chart.vue
+++ b/src/client/app/common/views/widgets/hashtags.chart.vue
@@ -49,7 +49,8 @@ export default Vue.extend({
 			polylinePoints: '',
 			polygonPoints: '',
 			headX: null,
-			headY: null
+			headY: null,
+			clock: null
 		};
 	},
 	watch: {
@@ -59,6 +60,12 @@ export default Vue.extend({
 	},
 	created() {
 		this.draw();
+
+		// Vueが何故かWatchを発動させない場合があるので
+		this.clock = setInterval(this.draw, 1000);
+	},
+	beforeDestroy() {
+		clearInterval(this.clock);
 	},
 	methods: {
 		draw() {

From 2fcc3bb1eaf067411928432e59bc5303e5249af2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 02:19:00 +0900
Subject: [PATCH 275/369] 2.37.4

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 5ef951a875..843bab6880 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.3",
-	"clientVersion": "1.0.6453",
+	"version": "2.37.4",
+	"clientVersion": "1.0.6465",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From d8ff37fc456eb1122361d74863273bd4b66ecf79 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 02:28:28 +0900
Subject: [PATCH 276/369] :v:

---
 locales/ja.yml                                   | 1 +
 src/client/app/common/views/widgets/hashtags.vue | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/locales/ja.yml b/locales/ja.yml
index 1b4fc15071..ed0691ea50 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -258,6 +258,7 @@ common/views/widgets/posts-monitor.vue:
 common/views/widgets/hashtags.vue:
   title: "ハッシュタグ"
   count: "{}人が投稿"
+  empty: "トレンドなし"
 
 common/views/widgets/server.vue:
   title: "サーバー情報"
diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 1f1e6ceb52..9dae7661ab 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -5,6 +5,7 @@
 
 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
 			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
+			<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%<mk-ellipsis/></p>
 			<transition-group v-else tag="div" name="chart">
 				<div v-for="stat in stats" :key="stat.tag">
 					<div class="tag">
@@ -65,6 +66,7 @@ export default define({
 root(isDark)
 	.mkw-hashtags--body
 		> .fetching
+		> .empty
 			margin 0
 			padding 12px 16px
 			text-align center

From ed67e3506b5244e1b79cbb8b5de6951ff9592e42 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 02:46:54 +0900
Subject: [PATCH 277/369] :v:

---
 .../app/common/views/widgets/hashtags.vue     |  2 +-
 src/server/api/endpoints/hashtags/trend.ts    | 27 ++++++++++++++-----
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 9dae7661ab..65866d70d7 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -5,7 +5,7 @@
 
 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
 			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
-			<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%<mk-ellipsis/></p>
+			<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
 			<transition-group v-else tag="div" name="chart">
 				<div v-for="stat in stats" :key="stat.tag">
 					<div class="tag">
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index efd74a21e0..df7addab98 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -10,6 +10,8 @@ const rangeB = 1000 * 60 * 120; // 2時間
 const coefficient = 1.5; // 「n倍」の部分
 const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか
 
+const max = 5;
+
 /**
  * Get trends of hashtags
  */
@@ -43,7 +45,7 @@ module.exports = () => new Promise(async (res, rej) => {
 		return res([]);
 	}
 
-	let tags = [];
+	const tags = [];
 
 	// カウント
 	data.map(x => x._id).forEach(x => {
@@ -59,10 +61,10 @@ module.exports = () => new Promise(async (res, rej) => {
 	});
 
 	// 最低要求投稿者数を下回るならカットする
-	tags = tags.filter(tag => tag.count >= requiredUsers);
+	const limitedTags = tags.filter(tag => tag.count >= requiredUsers);
 
 	//#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する
-	const hotsPromises = tags.map(async tag => {
+	const hotsPromises = limitedTags.map(async tag => {
 		const passedCount = (await Note.distinct('userId', {
 			tags: tag.name,
 			createdAt: {
@@ -71,7 +73,7 @@ module.exports = () => new Promise(async (res, rej) => {
 			}
 		}) as any).length;
 
-		if (tag.count > (passedCount * coefficient)) {
+		if (tag.count >= (passedCount * coefficient)) {
 			return tag;
 		} else {
 			return null;
@@ -79,13 +81,24 @@ module.exports = () => new Promise(async (res, rej) => {
 	});
 	//#endregion
 
-	const hots = (await Promise.all(hotsPromises))
+	// タグを人気順に並べ替え
+	let hots = (await Promise.all(hotsPromises))
 		.filter(x => x != null)
 		.sort((a, b) => b.count - a.count)
 		.map(tag => tag.name)
-		.slice(0, 5);
+		.slice(0, max);
 
-	//#region 2で話題と判定されたタグそれぞれについて過去の投稿数グラフを取得する
+	//#region 3. もし上記の方法でのトレンド抽出の結果、求められているタグ数に達しなければ「ただ単に現在投稿数が多いハッシュタグ」に切り替える
+	if (hots.length < max) {
+		hots = hots.concat(tags
+			.filter(tag => hots.indexOf(tag.name) == -1)
+			.sort((a, b) => b.count - a.count)
+			.map(tag => tag.name)
+			.slice(0, max - hots.length));
+	}
+	//#endregion
+
+	//#region 2(または3)で話題と判定されたタグそれぞれについて過去の投稿数グラフを取得する
 	const countPromises: Array<Promise<any[]>> = [];
 
 	const range = 20;

From 399eb60809f1e7c7b60c2f037ac601abd760ddd0 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 02:47:17 +0900
Subject: [PATCH 278/369] 2.37.5

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 843bab6880..278612d572 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.4",
-	"clientVersion": "1.0.6465",
+	"version": "2.37.5",
+	"clientVersion": "1.0.6468",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From b18013025f3383428fe6db1bd41ef23c3cf2897e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 08:09:27 +0900
Subject: [PATCH 279/369] :art:

---
 src/client/app/common/views/widgets/hashtags.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 65866d70d7..89b9976981 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -68,7 +68,7 @@ root(isDark)
 		> .fetching
 		> .empty
 			margin 0
-			padding 12px 16px
+			padding 16px
 			text-align center
 			color #aaa
 
@@ -87,7 +87,7 @@ root(isDark)
 			> div
 				display flex
 				align-items center
-				padding 16px
+				padding 14px 16px
 
 				&:not(:last-child)
 					border-bottom solid 1px isDark ? #393f4f : #eee

From 1af50fd7b89e2e7c117a00a9e0ad731c4a30f0a2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 08:43:48 +0900
Subject: [PATCH 280/369] =?UTF-8?q?=E5=86=97=E9=95=B7=E3=81=AA=E3=83=8F?=
 =?UTF-8?q?=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF=E3=82=B0=E3=81=AE=E8=A1=A8?=
 =?UTF-8?q?=E7=A4=BA=E3=82=92=E7=84=A1=E3=81=8F=E3=81=97=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/client/app/common/views/components/note-html.ts | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts
index f86b50659e..2fa13b16e1 100644
--- a/src/client/app/common/views/components/note-html.ts
+++ b/src/client/app/common/views/components/note-html.ts
@@ -40,6 +40,14 @@ export default Vue.component('mk-note-html', {
 			ast = this.ast;
 		}
 
+		if (ast.filter(x => x.type != 'hashtag').length == 0) {
+			return;
+		}
+
+		while (ast[ast.length - 1].type == 'hashtag') {
+			ast.pop();
+		}
+
 		// Parse ast to DOM
 		const els = flatten(ast.map(token => {
 			switch (token.type) {

From cea44834bbe3b492a2bb7ba4a1adba6c372c340c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 08:58:50 +0900
Subject: [PATCH 281/369] Improve usability

---
 .../views/pages/deck/deck.widgets-column.vue  | 38 +++++++++++++------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index a41bf8c3ca..05e7f88a25 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -5,7 +5,7 @@
 	<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
 		<template v-if="edit">
 			<header>
-				<select v-model="widgetAdderSelected">
+				<select v-model="widgetAdderSelected" @change="addWidget">
 					<option value="profile">%i18n:common.widgets.profile%</option>
 					<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
 					<option value="calendar">%i18n:common.widgets.calendar%</option>
@@ -30,20 +30,15 @@
 					<option value="nav">%i18n:common.widgets.nav%</option>
 					<option value="tips">%i18n:common.widgets.tips%</option>
 				</select>
-				<button @click="addWidget">%i18n:@add%</button>
 			</header>
 			<x-draggable
 				:list="column.widgets"
-				:options="{ handle: '.handle', animation: 150 }"
+				:options="{ animation: 150 }"
 				@sort="onWidgetSort"
 			>
-				<div v-for="widget in column.widgets" class="customize-container" :key="widget.id">
-					<header>
-						<span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button>
-					</header>
-					<div @click="widgetFunc(widget.id)">
-						<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/>
-					</div>
+				<div v-for="widget in column.widgets" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="widgetFunc(widget.id)">
+					<button class="remove" @click="removeWidget(widget)">%fa:times%</button>
+					<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/>
 				</div>
 			</x-draggable>
 		</template>
@@ -142,6 +137,13 @@ export default Vue.extend({
 
 root(isDark)
 	.gqpwvtwtprsbmnssnbicggtwqhmylhnq
+		> header
+			padding 16px
+
+			> *
+				width 100%
+				padding 4px
+
 		.widget, .customize-container
 			margin 8px
 
@@ -149,7 +151,21 @@ root(isDark)
 				margin-top 0
 
 		.customize-container
-			background #fff
+			cursor move
+
+			> *:not(.remove)
+				pointer-events none
+
+			> .remove
+				position absolute
+				z-index 1
+				top 8px
+				right 8px
+				width 32px
+				height 32px
+				color #fff
+				background rgba(#000, 0.7)
+				border-radius 4px
 
 		> header
 			color isDark ? #fff : #000

From 460147fea23b374ef57c6bd71fd52cef122755e7 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 08:59:36 +0900
Subject: [PATCH 282/369] 2.37.6

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 278612d572..67f6155038 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.5",
-	"clientVersion": "1.0.6468",
+	"version": "2.37.6",
+	"clientVersion": "1.0.6472",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From d6e5dc2167540776c992b96062b5c133e22dec99 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 09:10:34 +0900
Subject: [PATCH 283/369] Fix bugs

---
 src/client/app/common/views/components/note-html.ts | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts
index 2fa13b16e1..8ace375823 100644
--- a/src/client/app/common/views/components/note-html.ts
+++ b/src/client/app/common/views/components/note-html.ts
@@ -44,7 +44,10 @@ export default Vue.component('mk-note-html', {
 			return;
 		}
 
-		while (ast[ast.length - 1].type == 'hashtag') {
+		while (
+			ast[ast.length - 1].type == 'hashtag' ||
+			(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == ' ') ||
+			(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n')) {
 			ast.pop();
 		}
 
@@ -100,7 +103,7 @@ export default Vue.component('mk-note-html', {
 				case 'hashtag':
 					return createElement('a', {
 						attrs: {
-							href: `${url}/search?q=${token.content}`,
+							href: `${url}/tags/${token.content}`,
 							target: '_blank'
 						}
 					}, token.content);

From f968d05ea0917e3b61502e046c7d81303727e7a7 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 09:10:52 +0900
Subject: [PATCH 284/369] 2.37.7

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 67f6155038..acec8eff76 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.6",
-	"clientVersion": "1.0.6472",
+	"version": "2.37.7",
+	"clientVersion": "1.0.6474",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 8230935fd343be28bd71fb279e4f37aed796c58a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 11:27:35 +0900
Subject: [PATCH 285/369] :art:

---
 src/client/app/common/views/widgets/hashtags.vue | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 89b9976981..9ab855d927 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -76,13 +76,8 @@ root(isDark)
 				margin-right 4px
 
 		> div
-			.chart-enter
-			.chart-leave-to
-				opacity 0
-				transform translateY(-30px)
-
-			> *
-				transition transform .3s ease, opacity .3s ease
+			.chart-move
+				transition transform 1s ease
 
 			> div
 				display flex

From e3f6d42a479a00cc9f73bff26a6b863201341847 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 11:38:44 +0900
Subject: [PATCH 286/369] Fix bug

---
 src/client/app/common/views/components/note-html.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts
index 8ace375823..4941ee9783 100644
--- a/src/client/app/common/views/components/note-html.ts
+++ b/src/client/app/common/views/components/note-html.ts
@@ -103,7 +103,7 @@ export default Vue.component('mk-note-html', {
 				case 'hashtag':
 					return createElement('a', {
 						attrs: {
-							href: `${url}/tags/${token.content}`,
+							href: `${url}/tags/${token.hashtag}`,
 							target: '_blank'
 						}
 					}, token.content);

From 8bc47baf4f47d29afb1c25e2ec3807384d06f812 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 18:54:36 +0900
Subject: [PATCH 287/369] #1710

---
 src/models/note.ts                      |  2 +-
 src/server/api/stream/home.ts           | 10 +++++++++-
 src/server/api/stream/local-timeline.ts |  8 ++++++++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/models/note.ts b/src/models/note.ts
index 359d953735..3bbfec0103 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -289,7 +289,7 @@ export const pack = async (
 
 		// Poll
 		if (meId && _note.poll && !hide) {
-			_note.poll = (async (poll) => {
+			_note.poll = (async poll => {
 				const vote = await PollVote
 					.findOne({
 						userId: meId,
diff --git a/src/server/api/stream/home.ts b/src/server/api/stream/home.ts
index 54fde2d776..d9b8f7fb96 100644
--- a/src/server/api/stream/home.ts
+++ b/src/server/api/stream/home.ts
@@ -4,7 +4,7 @@ import * as debug from 'debug';
 
 import User, { IUser } from '../../../models/user';
 import Mute from '../../../models/mute';
-import { pack as packNote } from '../../../models/note';
+import { pack as packNote, pack } from '../../../models/note';
 import readNotification from '../common/read-notification';
 import call from '../call';
 import { IApp } from '../../../models/app';
@@ -48,6 +48,14 @@ export default async function(
 					}
 					//#endregion
 
+					// Renoteなら再pack
+					if (x.type == 'note' && x.body.renoteId != null) {
+						x.body.renote = await pack(x.body.renoteId, user, {
+							detail: true
+						});
+						data = JSON.stringify(x);
+					}
+
 					connection.send(data);
 				} catch (e) {
 					connection.send(data);
diff --git a/src/server/api/stream/local-timeline.ts b/src/server/api/stream/local-timeline.ts
index a790ba878b..8f6a445be0 100644
--- a/src/server/api/stream/local-timeline.ts
+++ b/src/server/api/stream/local-timeline.ts
@@ -3,6 +3,7 @@ import * as redis from 'redis';
 
 import { IUser } from '../../../models/user';
 import Mute from '../../../models/mute';
+import { pack } from '../../../models/note';
 
 export default async function(
 	request: websocket.request,
@@ -31,6 +32,13 @@ export default async function(
 		}
 		//#endregion
 
+		// Renoteなら再pack
+		if (note.renoteId != null) {
+			note.renote = await pack(note.renoteId, user, {
+				detail: true
+			});
+		}
+
 		connection.send(JSON.stringify({
 			type: 'note',
 			body: note

From 413fbb3d0c6040fe88730f5d4f65d1add3b1e59e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 19:03:57 +0900
Subject: [PATCH 288/369] =?UTF-8?q?=E3=83=A2=E3=83=90=E3=82=A4=E3=83=AB?=
 =?UTF-8?q?=E3=81=A7=E3=82=82=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF?=
 =?UTF-8?q?=E3=82=B0=E3=82=92=E6=A4=9C=E7=B4=A2=E3=81=A7=E3=81=8D=E3=82=8B?=
 =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/client/app/mobile/script.ts           |  2 +
 src/client/app/mobile/views/pages/tag.vue | 81 +++++++++++++++++++++++
 2 files changed, 83 insertions(+)
 create mode 100644 src/client/app/mobile/views/pages/tag.vue

diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index 300615ec58..d505b38dcc 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -42,6 +42,7 @@ import MkUserLists from './views/pages/user-lists.vue';
 import MkUserList from './views/pages/user-list.vue';
 import MkSettings from './views/pages/settings.vue';
 import MkOthello from './views/pages/othello.vue';
+import MkTag from './views/pages/tag.vue';
 
 Vue.use(MdCard);
 Vue.use(MdButton);
@@ -88,6 +89,7 @@ init((launch) => {
 			{ path: '/i/drive/file/:file', component: MkDrive },
 			{ path: '/selectdrive', component: MkSelectDrive },
 			{ path: '/search', component: MkSearch },
+			{ path: '/tags/:tag', component: MkTag },
 			{ path: '/othello', name: 'othello', component: MkOthello },
 			{ path: '/othello/:game', component: MkOthello },
 			{ path: '/@:user', component: MkUser },
diff --git a/src/client/app/mobile/views/pages/tag.vue b/src/client/app/mobile/views/pages/tag.vue
new file mode 100644
index 0000000000..b4c993e667
--- /dev/null
+++ b/src/client/app/mobile/views/pages/tag.vue
@@ -0,0 +1,81 @@
+<template>
+<mk-ui>
+	<span slot="header">%fa:hashtag%{{ $route.params.tag }}</span>
+
+	<main>
+		<p v-if="!fetching && empty">%fa:search%「{{ q }}」に関する投稿は見つかりませんでした。</p>
+		<mk-notes ref="timeline" :more="existMore ? more : null"/>
+	</main>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import Progress from '../../../common/scripts/loading';
+
+const limit = 20;
+
+export default Vue.extend({
+	data() {
+		return {
+			fetching: true,
+			moreFetching: false,
+			existMore: false,
+			offset: 0,
+			empty: false
+		};
+	},
+	watch: {
+		$route: 'fetch'
+	},
+	mounted() {
+		this.$nextTick(() => {
+			this.fetch();
+		});
+	},
+	methods: {
+		fetch() {
+			this.fetching = true;
+			Progress.start();
+
+			(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
+				(this as any).api('notes/search_by_tag', {
+					limit: limit + 1,
+					offset: this.offset,
+					tag: this.$route.params.tag
+				}).then(notes => {
+					if (notes.length == 0) this.empty = true;
+					if (notes.length == limit + 1) {
+						notes.pop();
+						this.existMore = true;
+					}
+					res(notes);
+					this.fetching = false;
+					Progress.done();
+				}, rej);
+			}));
+		},
+		more() {
+			this.offset += limit;
+
+			const promise = (this as any).api('notes/search_by_tag', {
+				limit: limit + 1,
+				offset: this.offset,
+				tag: this.$route.params.tag
+			});
+
+			promise.then(notes => {
+				if (notes.length == limit + 1) {
+					notes.pop();
+				} else {
+					this.existMore = false;
+				}
+				notes.forEach(n => (this.$refs.timeline as any).append(n));
+				this.moreFetching = false;
+			});
+
+			return promise;
+		}
+	}
+});
+</script>

From 0318f7344fae3265171682a016f90368e3d2a8c3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 19:05:40 +0900
Subject: [PATCH 289/369] Fix bug

---
 src/client/app/common/views/components/note-html.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts
index 4941ee9783..8fa5f380dd 100644
--- a/src/client/app/common/views/components/note-html.ts
+++ b/src/client/app/common/views/components/note-html.ts
@@ -44,10 +44,10 @@ export default Vue.component('mk-note-html', {
 			return;
 		}
 
-		while (
+		while (ast[ast.length - 1] && (
 			ast[ast.length - 1].type == 'hashtag' ||
 			(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == ' ') ||
-			(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n')) {
+			(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n'))) {
 			ast.pop();
 		}
 

From 4d914f5c0a89cfcc1a2eb674948cd9cb999965ca Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 12 Jun 2018 19:07:36 +0900
Subject: [PATCH 290/369] 2.38.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index acec8eff76..7558c445ea 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.37.7",
-	"clientVersion": "1.0.6474",
+	"version": "2.38.0",
+	"clientVersion": "1.0.6480",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 1472f0b141cdcb4f21c4db0d5ff3d84a5f8ccb93 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:11:55 +0900
Subject: [PATCH 291/369] Fix #1712

---
 src/models/note.ts                         |  5 +++++
 src/remote/activitypub/renderer/hashtag.ts |  2 +-
 src/remote/activitypub/renderer/mention.ts |  9 +++++++++
 src/remote/activitypub/renderer/note.ts    | 17 +++++++++++++++--
 src/services/note/create.ts                |  7 ++++++-
 5 files changed, 36 insertions(+), 4 deletions(-)
 create mode 100644 src/remote/activitypub/renderer/mention.ts

diff --git a/src/models/note.ts b/src/models/note.ts
index 3bbfec0103..461bb405a0 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -48,6 +48,11 @@ export type INote = {
 	repliesCount: number;
 	reactionCounts: any;
 	mentions: mongo.ObjectID[];
+	mentionedRemoteUsers: Array<{
+		uri: string;
+		username: string;
+		host: string;
+	}>;
 
 	/**
 	 * public ... 公開
diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts
index 50761c8684..a37ba63532 100644
--- a/src/remote/activitypub/renderer/hashtag.ts
+++ b/src/remote/activitypub/renderer/hashtag.ts
@@ -1,6 +1,6 @@
 import config from '../../../config';
 
-export default tag => ({
+export default (tag: string) => ({
 	type: 'Hashtag',
 	href: `${config.url}/tags/${encodeURIComponent(tag)}`,
 	name: '#' + tag
diff --git a/src/remote/activitypub/renderer/mention.ts b/src/remote/activitypub/renderer/mention.ts
new file mode 100644
index 0000000000..4cba7d6a94
--- /dev/null
+++ b/src/remote/activitypub/renderer/mention.ts
@@ -0,0 +1,9 @@
+export default (mention: {
+	uri: string;
+	username: string;
+	host: string;
+}) => ({
+	type: 'Mention',
+	href: mention.uri,
+	name: `@${mention.username}@${mention.host}`
+});
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index a05c12b388..39335a7cca 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -1,5 +1,6 @@
 import renderDocument from './document';
 import renderHashtag from './hashtag';
+import renderMention from './mention';
 import config from '../../../config';
 import DriveFile from '../../../models/drive-file';
 import Note, { INote } from '../../../models/note';
@@ -45,6 +46,18 @@ export default async function renderNote(note: INote, dive = true) {
 
 	const attributedTo = `${config.url}/users/${user._id}`;
 
+	const mentions = note.mentionedRemoteUsers && note.mentionedRemoteUsers.length > 0
+		? note.mentionedRemoteUsers.map(x => x.uri)
+		: [];
+
+	const cc = ['public', 'home', 'followers'].includes(note.visibility)
+		? [`${attributedTo}/followers`].concat(mentions)
+		: [];
+
+	const hashtagTags = (note.tags || []).map(renderHashtag);
+	const mentionTags = (note.mentionedRemoteUsers || []).map(renderMention);
+	const tag = hashtagTags.concat(mentionTags)
+
 	return {
 		id: `${config.url}/notes/${note._id}`,
 		type: 'Note',
@@ -52,9 +65,9 @@ export default async function renderNote(note: INote, dive = true) {
 		content: toHtml(note),
 		published: note.createdAt.toISOString(),
 		to: 'https://www.w3.org/ns/activitystreams#Public',
-		cc: `${attributedTo}/followers`,
+		cc,
 		inReplyTo,
 		attachment: (await promisedFiles).map(renderDocument),
-		tag: (note.tags || []).map(renderHashtag)
+		tag
 	};
 }
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index ddf07716e4..7eec7485be 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -329,7 +329,12 @@ export default async (user: IUser, data: {
 		if (mentionedUsers.length > 0) {
 			Note.update({ _id: note._id }, {
 				$set: {
-					mentions: mentionedUsers.map(u => u._id)
+					mentions: mentionedUsers.map(u => u._id),
+					mentionedRemoteUsers: mentionedUsers.filter(u => isRemoteUser(u)).map(u => ({
+						uri: (u as IRemoteUser).uri,
+						username: u.username,
+						host: u.host
+					}))
 				}
 			});
 		}

From 80c52433cc501dba736f27feef428e902a1f95f3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:15:26 +0900
Subject: [PATCH 292/369] Fix bug

---
 src/remote/activitypub/kernel/announce/note.ts | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/remote/activitypub/kernel/announce/note.ts b/src/remote/activitypub/kernel/announce/note.ts
index fe645b07b5..e258567389 100644
--- a/src/remote/activitypub/kernel/announce/note.ts
+++ b/src/remote/activitypub/kernel/announce/note.ts
@@ -15,6 +15,11 @@ const log = debug('misskey:activitypub');
 export default async function(resolver: Resolver, actor: IRemoteUser, activity: IAnnounce, note: INote): Promise<void> {
 	const uri = activity.id || activity;
 
+	// アナウンサーが凍結されていたらスキップ
+	if (actor.isSuspended) {
+		return;
+	}
+
 	if (typeof uri !== 'string') {
 		throw new Error('invalid announce');
 	}

From e635a87628746b9e8422044f350d43d86ed6b4bc Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:16:53 +0900
Subject: [PATCH 293/369] 2.38.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 7558c445ea..e1f7765a98 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.38.0",
+	"version": "2.38.1",
 	"clientVersion": "1.0.6480",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From ce27b36fd04d43dd0852e5d066d50d3236381348 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:21:55 +0900
Subject: [PATCH 294/369] Fix bug

---
 src/client/app/desktop/views/components/post-form.vue | 2 ++
 src/client/app/mobile/views/components/post-form.vue  | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index 7b2adfe707..a0670a084e 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -50,6 +50,7 @@ import * as XDraggable from 'vuedraggable';
 import getKao from '../../../common/scripts/get-kao';
 import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
 import parse from '../../../../../text/parse';
+import { host } from '../../../config';
 
 export default Vue.extend({
 	components: {
@@ -129,6 +130,7 @@ export default Vue.extend({
 
 				// 自分は除外
 				if (this.$store.state.i.username == x.username && x.host == null) return;
+				if (this.$store.state.i.username == x.username && x.host == host) return;
 
 				// 重複は除外
 				if (this.text.indexOf(`${mention} `) != -1) return;
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index 2c7feb3f8e..88853fa236 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -46,6 +46,7 @@ import * as XDraggable from 'vuedraggable';
 import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
 import getKao from '../../../common/scripts/get-kao';
 import parse from '../../../../../text/parse';
+import { host } from '../../../config';
 
 export default Vue.extend({
 	components: {
@@ -123,6 +124,7 @@ export default Vue.extend({
 
 				// 自分は除外
 				if (this.$store.state.i.username == x.username && x.host == null) return;
+				if (this.$store.state.i.username == x.username && x.host == host) return;
 
 				// 重複は除外
 				if (this.text.indexOf(`${mention} `) != -1) return;

From 1813d17b4ca834ab2220bf4955be5b120d8bb17d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:24:44 +0900
Subject: [PATCH 295/369] Fix bug

---
 src/services/note/delete.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts
index 793f0090be..3e928303d2 100644
--- a/src/services/note/delete.ts
+++ b/src/services/note/delete.ts
@@ -20,6 +20,7 @@ export default async function(user: IUser, note: INote) {
 		$set: {
 			deletedAt: new Date(),
 			text: null,
+			tags: [],
 			mediaIds: [],
 			poll: null
 		}

From 89105f56413c6d13fb294bec14a8dd1f07f79aec Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:25:27 +0900
Subject: [PATCH 296/369] 2.38.2

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index e1f7765a98..3a0b8b93a1 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.38.1",
-	"clientVersion": "1.0.6480",
+	"version": "2.38.2",
+	"clientVersion": "1.0.6486",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 7d8e70b2ac8e2073e0838eb5a5b4d428eaf24059 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:40:12 +0900
Subject: [PATCH 297/369] Fix bug

---
 src/services/note/create.ts | 110 ++++++++++++++++++------------------
 1 file changed, 56 insertions(+), 54 deletions(-)

diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 7eec7485be..f74d04ae62 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -204,6 +204,62 @@ export default async (user: IUser, data: {
 		return packAp(content);
 	};
 
+	//#region メンション
+	if (data.text) {
+		// TODO: Drop dupulicates
+		const mentionTokens = tokens
+			.filter(t => t.type == 'mention');
+
+		// TODO: Drop dupulicates
+		const mentionedUsers = (await Promise.all(mentionTokens.map(async m => {
+			try {
+				return await resolveUser(m.username, m.host);
+			} catch (e) {
+				return null;
+			}
+		}))).filter(x => x != null);
+
+		// Append mentions data
+		if (mentionedUsers.length > 0) {
+			const set = {
+				mentions: mentionedUsers.map(u => u._id),
+				mentionedRemoteUsers: mentionedUsers.filter(u => isRemoteUser(u)).map(u => ({
+					uri: (u as IRemoteUser).uri,
+					username: u.username,
+					host: u.host
+				}))
+			};
+
+			Note.update({ _id: note._id }, {
+				$set: set
+			});
+
+			Object.assign(note, set);
+		}
+
+		mentionedUsers.filter(u => isLocalUser(u)).forEach(async u => {
+			event(u, 'mention', noteObj);
+
+			// 既に言及されたユーザーに対する返信や引用renoteの場合も無視
+			if (data.reply && data.reply.userId.equals(u._id)) return;
+			if (data.renote && data.renote.userId.equals(u._id)) return;
+
+			// Create notification
+			notify(u._id, user._id, 'mention', {
+				noteId: note._id
+			});
+
+			nm.push(u._id, 'mention');
+		});
+
+		if (isLocalUser(user)) {
+			mentionedUsers.filter(u => isRemoteUser(u)).forEach(async u => {
+				deliver(user, await render(), (u as IRemoteUser).inbox);
+			});
+		}
+	}
+	//#endregion
+
 	if (!silent) {
 		if (isLocalUser(user)) {
 			if (note.visibility == 'private' || note.visibility == 'followers' || note.visibility == 'specified') {
@@ -287,60 +343,6 @@ export default async (user: IUser, data: {
 	}
 	//#endergion
 
-	//#region メンション
-	if (data.text) {
-		// TODO: Drop dupulicates
-		const mentions = tokens
-			.filter(t => t.type == 'mention');
-
-		let mentionedUsers = await Promise.all(mentions.map(async m => {
-			try {
-				return await resolveUser(m.username, m.host);
-			} catch (e) {
-				return null;
-			}
-		}));
-
-		// TODO: Drop dupulicates
-		mentionedUsers = mentionedUsers.filter(x => x != null);
-
-		mentionedUsers.filter(u => isLocalUser(u)).forEach(async u => {
-			event(u, 'mention', noteObj);
-
-			// 既に言及されたユーザーに対する返信や引用renoteの場合も無視
-			if (data.reply && data.reply.userId.equals(u._id)) return;
-			if (data.renote && data.renote.userId.equals(u._id)) return;
-
-			// Create notification
-			notify(u._id, user._id, 'mention', {
-				noteId: note._id
-			});
-
-			nm.push(u._id, 'mention');
-		});
-
-		if (isLocalUser(user)) {
-			mentionedUsers.filter(u => isRemoteUser(u)).forEach(async u => {
-				deliver(user, await render(), (u as IRemoteUser).inbox);
-			});
-		}
-
-		// Append mentions data
-		if (mentionedUsers.length > 0) {
-			Note.update({ _id: note._id }, {
-				$set: {
-					mentions: mentionedUsers.map(u => u._id),
-					mentionedRemoteUsers: mentionedUsers.filter(u => isRemoteUser(u)).map(u => ({
-						uri: (u as IRemoteUser).uri,
-						username: u.username,
-						host: u.host
-					}))
-				}
-			});
-		}
-	}
-	//#endregion
-
 	// If has in reply to note
 	if (data.reply) {
 		// Increment replies count

From 9059c149ddb96283f8fed8d3e3d492ae2380407d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 13 Jun 2018 05:40:27 +0900
Subject: [PATCH 298/369] 2.38.3

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 3a0b8b93a1..4b207d5e5a 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.38.2",
+	"version": "2.38.3",
 	"clientVersion": "1.0.6486",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From e6e02ece89e9e2af2ae0aa4c57cb9fcdb3d5b890 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 06:29:01 +0900
Subject: [PATCH 299/369] wip

---
 package.json                                  |   1 -
 src/client/app/app.styl                       |   5 -
 .../app/common/views/components/index.ts      |   2 +
 .../views/components/material/input.vue       | 129 ++++++++++++++++++
 src/client/app/mobile/script.ts               |  15 --
 src/client/app/mobile/style.styl              |   3 -
 src/client/app/mobile/views/pages/welcome.vue |  18 ++-
 .../app/mobile/views/widgets/profile.vue      |   2 +-
 src/client/md.scss                            |  13 --
 9 files changed, 145 insertions(+), 43 deletions(-)
 create mode 100644 src/client/app/common/views/components/material/input.vue
 delete mode 100644 src/client/md.scss

diff --git a/package.json b/package.json
index 4b207d5e5a..b1b8888b5c 100644
--- a/package.json
+++ b/package.json
@@ -211,7 +211,6 @@
 		"vue-js-modal": "1.3.13",
 		"vue-json-tree-view": "2.1.4",
 		"vue-loader": "15.2.1",
-		"vue-material": "^1.0.0-beta-10.2",
 		"vue-router": "3.0.1",
 		"vue-template-compiler": "2.5.16",
 		"vuedraggable": "2.16.0",
diff --git a/src/client/app/app.styl b/src/client/app/app.styl
index ba694b73ae..431b9daa65 100644
--- a/src/client/app/app.styl
+++ b/src/client/app/app.styl
@@ -7,11 +7,6 @@ html
 			cursor progress !important
 
 body
-	// for md
-	font-size 16px !important
-	line-height initial !important
-	letter-spacing initial !important
-
 	overflow-wrap break-word
 
 #error
diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index 803854468e..659c2aca2a 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -29,6 +29,7 @@ import fileTypeIcon from './file-type-icon.vue';
 import Switch from './switch.vue';
 import Othello from './othello.vue';
 import welcomeTimeline from './welcome-timeline.vue';
+import uiInput from './material/input.vue';
 
 Vue.component('mk-analog-clock', analogClock);
 Vue.component('mk-menu', menu);
@@ -59,3 +60,4 @@ Vue.component('mk-file-type-icon', fileTypeIcon);
 Vue.component('mk-switch', Switch);
 Vue.component('mk-othello', Othello);
 Vue.component('mk-welcome-timeline', welcomeTimeline);
+Vue.component('ui-input', uiInput);
diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/material/input.vue
new file mode 100644
index 0000000000..42ff0bb4b8
--- /dev/null
+++ b/src/client/app/common/views/components/material/input.vue
@@ -0,0 +1,129 @@
+<template>
+<div class="ui-input" :class="{ focused, filled }">
+	<div class="input">
+		<span class="label" ref="label"><slot></slot></span>
+		<div class="prefix" ref="prefix" @click="focus"><slot name="prefix"></slot></div>
+		<input ref="input" :value="value" @input="$emit('input', $event.target.value)" @focus="focused = true" @blur="focused = false">
+		<div class="suffix" @click="focus"><slot name="suffix"></slot></div>
+	</div>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+	props: ['value'],
+	data() {
+		return {
+			focused: false
+		}
+	},
+	computed: {
+		filled(): boolean {
+			return this.value != '' && this.value != null;
+		}
+	},
+	mounted() {
+		this.$refs.label.style.left = this.$refs.prefix.offsetWidth + 'px';
+	},
+	methods: {
+		focus() {
+			this.$refs.input.focus();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+.ui-input
+	padding-bottom 16px
+
+	> .input
+		display flex
+		margin-top 16px
+
+		&:before
+			content ''
+			display block
+			position absolute
+			bottom 0
+			left 0
+			right 0
+			height 1px
+			background rgba(#000, 0.42)
+
+		&:after
+			content ''
+			display block
+			position absolute
+			bottom 0
+			left 0
+			right 0
+			height 2px
+			background $theme-color
+			opacity 0
+			transform scaleX(0.12)
+			transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)
+			will-change border opacity transform
+
+		> .label
+			position absolute
+			top 0
+			left 0
+			pointer-events none
+			transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
+			transition-duration 0.3s
+			font-size 16px
+			line-height 32px
+			color rgba(#000, 0.54)
+			pointer-events none
+
+		> input
+			display block
+			flex 1
+			width 100%
+			padding 0
+			font-size 16px
+			line-height 32px
+			background transparent
+			border none
+			border-radius 0
+			outline none
+			box-shadow none
+
+		> .prefix
+		> .suffix
+			display block
+			align-self center
+			justify-self center
+			font-size 16px
+			line-height 32px
+			color rgba(#000, 0.54)
+
+		> .prefix
+			padding-right 4px
+
+		> .suffix
+			padding-left 4px
+
+	&.focused
+		> .input
+			&:after
+				opacity 1
+				transform scaleX(1)
+
+			> .label
+				color $theme-color
+
+	&.focused
+	&.filled
+		> .input
+			> .label
+				top -16px
+				left 0 !important
+				font-size 12px
+				line-height 20px
+
+</style>
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index d505b38dcc..a6f4359432 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -5,10 +5,6 @@
 import Vue from 'vue';
 import VueRouter from 'vue-router';
 
-import { MdCard, MdButton, MdField, MdMenu, MdList, MdSwitch, MdSubheader, MdDialog, MdDialogAlert, MdRadio } from 'vue-material/dist/components';
-import 'vue-material/dist/vue-material.min.css';
-import 'vue-material/dist/theme/default.css';
-
 // Style
 import './style.styl';
 import '../../element.scss';
@@ -44,17 +40,6 @@ import MkSettings from './views/pages/settings.vue';
 import MkOthello from './views/pages/othello.vue';
 import MkTag from './views/pages/tag.vue';
 
-Vue.use(MdCard);
-Vue.use(MdButton);
-Vue.use(MdField);
-Vue.use(MdMenu);
-Vue.use(MdList);
-Vue.use(MdSwitch);
-Vue.use(MdSubheader);
-Vue.use(MdDialog);
-Vue.use(MdDialogAlert);
-Vue.use(MdRadio);
-
 /**
  * init
  */
diff --git a/src/client/app/mobile/style.styl b/src/client/app/mobile/style.styl
index d1ab044eaf..df8f4a8fae 100644
--- a/src/client/app/mobile/style.styl
+++ b/src/client/app/mobile/style.styl
@@ -10,9 +10,6 @@ html
 	height 100%
 	background #ececed !important
 
-	// for md
-	transition none !important
-
 	&[data-darkmode]
 		background #191B22 !important
 
diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue
index 64cfa5a46c..ceb1abb9a0 100644
--- a/src/client/app/mobile/views/pages/welcome.vue
+++ b/src/client/app/mobile/views/pages/welcome.vue
@@ -7,9 +7,16 @@
 			<p>%fa:lock% ログイン</p>
 			<div>
 				<form @submit.prevent="onSubmit">
-					<input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange"/>
-					<input v-model="password" type="password" placeholder="パスワード" required/>
-					<input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/>
+					<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange">
+						<span>ユーザー名</span>
+						<span slot="prefix">@</span>
+						<span slot="suffix">@{{ host }}</span>
+					</ui-input>
+					<ui-input v-model="password" type="password" placeholder="パスワード" required>
+						<span>パスワード</span>
+						<span slot="prefix">%fa:lock%</span>
+					</ui-input>
+					<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/>
 					<button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</button>
 				</form>
 				<div>
@@ -33,7 +40,7 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import { apiUrl, copyright } from '../../../config';
+import { apiUrl, copyright, host } from '../../../config';
 
 export default Vue.extend({
 	data() {
@@ -45,7 +52,8 @@ export default Vue.extend({
 			token: '',
 			apiUrl,
 			copyright,
-			users: []
+			users: [],
+			host
 		};
 	},
 	mounted() {
diff --git a/src/client/app/mobile/views/widgets/profile.vue b/src/client/app/mobile/views/widgets/profile.vue
index beae1ffa36..a94f7e94b8 100644
--- a/src/client/app/mobile/views/widgets/profile.vue
+++ b/src/client/app/mobile/views/widgets/profile.vue
@@ -56,7 +56,7 @@ export default define({
 	left 92px
 	margin 0
 	line-height 100px
-	color #fff !important // !important is for md
+	color #fff
 	font-weight bold
 	text-shadow 0 0 8px rgba(#000, 0.5)
 
diff --git a/src/client/md.scss b/src/client/md.scss
deleted file mode 100644
index 8368365885..0000000000
--- a/src/client/md.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-/* SEE: https://vuematerial.io/themes/configuration */
-
-@import '../const.json';
-
-@import "~vue-material/dist/theme/engine";
-
-@include md-register-theme("default", (
-	primary: $themeColor,
-	accent: $themeColor
-));
-
-@import "~vue-material/dist/components/MdButton/theme";
-@import "~vue-material/dist/components/MdField/theme";

From 8814fc9c9c0614215f7e5dbe3ec1316c49e2b68d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 07:22:50 +0900
Subject: [PATCH 300/369] wip

---
 .../app/common/views/components/index.ts      |   2 +
 .../views/components/material/button.vue      |  39 ++++++
 .../views/components/material/input.vue       |  41 ++----
 src/client/app/mobile/script.ts               |   2 -
 src/client/app/mobile/views/pages/welcome.vue | 123 ++++++------------
 5 files changed, 92 insertions(+), 115 deletions(-)
 create mode 100644 src/client/app/common/views/components/material/button.vue

diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index 659c2aca2a..5dc466857c 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -30,6 +30,7 @@ import Switch from './switch.vue';
 import Othello from './othello.vue';
 import welcomeTimeline from './welcome-timeline.vue';
 import uiInput from './material/input.vue';
+import uiButton from './material/button.vue';
 
 Vue.component('mk-analog-clock', analogClock);
 Vue.component('mk-menu', menu);
@@ -61,3 +62,4 @@ Vue.component('mk-switch', Switch);
 Vue.component('mk-othello', Othello);
 Vue.component('mk-welcome-timeline', welcomeTimeline);
 Vue.component('ui-input', uiInput);
+Vue.component('ui-button', uiButton);
diff --git a/src/client/app/common/views/components/material/button.vue b/src/client/app/common/views/components/material/button.vue
new file mode 100644
index 0000000000..0c768cf4cc
--- /dev/null
+++ b/src/client/app/common/views/components/material/button.vue
@@ -0,0 +1,39 @@
+<template>
+<div class="ui-button">
+	<button>
+		<slot></slot>
+	</button>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+	props: {
+		type: {
+			type: String,
+			required: false
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+.ui-button
+	> button
+		display block
+		width 100%
+		padding 0
+		color $theme-color-foreground
+		font-weight bold
+		font-size 16px
+		line-height 44px
+		background $theme-color
+		border none
+		border-radius 6px
+		outline none
+		box-shadow none
+
+</style>
diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/material/input.vue
index 42ff0bb4b8..fe64354908 100644
--- a/src/client/app/common/views/components/material/input.vue
+++ b/src/client/app/common/views/components/material/input.vue
@@ -24,7 +24,7 @@ export default Vue.extend({
 		}
 	},
 	mounted() {
-		this.$refs.label.style.left = this.$refs.prefix.offsetWidth + 'px';
+		this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
 	},
 	methods: {
 		focus() {
@@ -38,39 +38,18 @@ export default Vue.extend({
 @import '~const.styl'
 
 .ui-input
-	padding-bottom 16px
+	margin-bottom 32px
 
 	> .input
 		display flex
 		margin-top 16px
-
-		&:before
-			content ''
-			display block
-			position absolute
-			bottom 0
-			left 0
-			right 0
-			height 1px
-			background rgba(#000, 0.42)
-
-		&:after
-			content ''
-			display block
-			position absolute
-			bottom 0
-			left 0
-			right 0
-			height 2px
-			background $theme-color
-			opacity 0
-			transform scaleX(0.12)
-			transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)
-			will-change border opacity transform
+		padding 6px 12px
+		background #f5f5f5
+		border-radius 6px
 
 		> .label
 			position absolute
-			top 0
+			top 6px
 			left 0
 			pointer-events none
 			transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
@@ -85,6 +64,8 @@ export default Vue.extend({
 			flex 1
 			width 100%
 			padding 0
+			font inherit
+			font-weight bold
 			font-size 16px
 			line-height 32px
 			background transparent
@@ -110,9 +91,7 @@ export default Vue.extend({
 
 	&.focused
 		> .input
-			&:after
-				opacity 1
-				transform scaleX(1)
+			background #eee
 
 			> .label
 				color $theme-color
@@ -121,7 +100,7 @@ export default Vue.extend({
 	&.filled
 		> .input
 			> .label
-				top -16px
+				top -20px
 				left 0 !important
 				font-size 12px
 				line-height 20px
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index a6f4359432..8ee078d621 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -2,13 +2,11 @@
  * Mobile Client
  */
 
-import Vue from 'vue';
 import VueRouter from 'vue-router';
 
 // Style
 import './style.styl';
 import '../../element.scss';
-import '../../md.scss';
 
 import init from '../init';
 
diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue
index ceb1abb9a0..07891fd56b 100644
--- a/src/client/app/mobile/views/pages/welcome.vue
+++ b/src/client/app/mobile/views/pages/welcome.vue
@@ -1,27 +1,23 @@
 <template>
 <div class="welcome">
 	<div>
-		<h1><b>Misskey</b>へようこそ</h1>
-		<p>Twitter風ミニブログSNS、Misskeyへようこそ。共有したいことを投稿したり、タイムラインでみんなの投稿を読むこともできます。<br><a href="/signup">アカウントを作成する</a></p>
+		<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey">
 		<div class="form">
-			<p>%fa:lock% ログイン</p>
+			<form @submit.prevent="onSubmit">
+				<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange">
+					<span>ユーザー名</span>
+					<span slot="prefix">@</span>
+					<span slot="suffix">@{{ host }}</span>
+				</ui-input>
+				<ui-input v-model="password" type="password" placeholder="パスワード" required>
+					<span>パスワード</span>
+					<span slot="prefix">%fa:lock%</span>
+				</ui-input>
+				<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/>
+				<ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button>
+			</form>
 			<div>
-				<form @submit.prevent="onSubmit">
-					<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange">
-						<span>ユーザー名</span>
-						<span slot="prefix">@</span>
-						<span slot="suffix">@{{ host }}</span>
-					</ui-input>
-					<ui-input v-model="password" type="password" placeholder="パスワード" required>
-						<span>パスワード</span>
-						<span slot="prefix">%fa:lock%</span>
-					</ui-input>
-					<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/>
-					<button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</button>
-				</form>
-				<div>
-					<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
-				</div>
+				<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
 			</div>
 		</div>
 		<div class="tl">
@@ -92,81 +88,44 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 .welcome
-	background linear-gradient(to bottom, #1e1d65, #bd6659)
+	background #fff
 
 	> div
 		padding 16px
 		margin 0 auto
 		max-width 500px
 
-		h1
-			margin 0
-			padding 8px
-			font-size 1.5em
-			font-weight normal
-			color #cacac3
-
-			& + p
-				margin 0 0 16px 0
-				padding 0 8px 0 8px
-				color #949fa9
+		> img
+			display block
+			max-width 200px
+			margin 0 auto
 
 		.form
 			margin-bottom 16px
-			background #fff
-			border solid 1px rgba(#000, 0.2)
-			border-radius 8px
-			overflow hidden
 
-			> p
-				margin 0
-				padding 12px 20px
-				color #555
-				background #f5f5f5
-				border-bottom solid 1px #ddd
+			> form
+				padding 16px
 
-			> div
-
-				> form
-					padding 16px
-					border-bottom solid 1px #ddd
-
-					input
-						display block
-						padding 12px
-						margin 0 0 16px 0
-						width 100%
-						font-size 1em
-						color rgba(#000, 0.7)
-						background #fff
-						outline none
-						border solid 1px #ddd
-						border-radius 4px
-
-					button
-						display block
-						width 100%
-						padding 10px
-						margin 0
-						color #333
-						font-size 1em
-						text-align center
-						text-decoration none
-						text-shadow 0 1px 0 rgba(255, 255, 255, 0.9)
-						background-image linear-gradient(#fafafa, #eaeaea)
-						border 1px solid #ddd
-						border-bottom-color #cecece
-						border-radius 4px
-
-						&:active
-							background-color #767676
-							background-image none
-							border-color #444
-							box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2)
-
-				> div
-					padding 16px
+				button
+					display block
+					width 100%
+					padding 10px
+					margin 0
+					color #333
+					font-size 1em
 					text-align center
+					text-decoration none
+					text-shadow 0 1px 0 rgba(255, 255, 255, 0.9)
+					background-image linear-gradient(#fafafa, #eaeaea)
+					border 1px solid #ddd
+					border-bottom-color #cecece
+					border-radius 4px
+
+					&:active
+						background-color #767676
+						background-image none
+						border-color #444
+						box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2)
 
 		> .tl
 			background #fff

From 3a4833818f67aec56bc3570088a1ef34466f3905 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 09:51:55 +0900
Subject: [PATCH 301/369] wip

---
 .../views/components/material/button.vue      |  3 +-
 .../views/components/material/input.vue       | 43 ++++++++--
 .../app/common/views/components/signup.vue    | 54 ++++++-------
 src/client/app/mobile/views/pages/signup.vue  | 41 ++--------
 src/client/app/mobile/views/pages/welcome.vue | 80 +++++++++----------
 5 files changed, 109 insertions(+), 112 deletions(-)

diff --git a/src/client/app/common/views/components/material/button.vue b/src/client/app/common/views/components/material/button.vue
index 0c768cf4cc..8dacedbac6 100644
--- a/src/client/app/common/views/components/material/button.vue
+++ b/src/client/app/common/views/components/material/button.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="ui-button">
-	<button>
+	<button :type="type">
 		<slot></slot>
 	</button>
 </div>
@@ -25,6 +25,7 @@ export default Vue.extend({
 	> button
 		display block
 		width 100%
+		margin 32px 0 16px 0
 		padding 0
 		color $theme-color-foreground
 		font-weight bold
diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/material/input.vue
index fe64354908..6564b3aa6c 100644
--- a/src/client/app/common/views/components/material/input.vue
+++ b/src/client/app/common/views/components/material/input.vue
@@ -3,16 +3,40 @@
 	<div class="input">
 		<span class="label" ref="label"><slot></slot></span>
 		<div class="prefix" ref="prefix" @click="focus"><slot name="prefix"></slot></div>
-		<input ref="input" :value="value" @input="$emit('input', $event.target.value)" @focus="focused = true" @blur="focused = false">
+		<input ref="input"
+				:type="type"
+				:value="value"
+				:required="required"
+				:readonly="readonly"
+				@input="$emit('input', $event.target.value)"
+				@focus="focused = true"
+				@blur="focused = false">
 		<div class="suffix" @click="focus"><slot name="suffix"></slot></div>
 	</div>
+	<div class="text"><slot name="text"></slot></div>
 </div>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
 export default Vue.extend({
-	props: ['value'],
+	props: {
+		value: {
+			required: false
+		},
+		type: {
+			type: String,
+			required: false
+		},
+		required: {
+			type: Boolean,
+			required: false
+		},
+		readonly: {
+			type: Boolean,
+			required: false
+		}
+	},
 	data() {
 		return {
 			focused: false
@@ -38,13 +62,13 @@ export default Vue.extend({
 @import '~const.styl'
 
 .ui-input
-	margin-bottom 32px
+	margin-bottom 16px
+	padding-top 16px
 
 	> .input
 		display flex
-		margin-top 16px
 		padding 6px 12px
-		background #f5f5f5
+		background rgba(#000, 0.035)
 		border-radius 6px
 
 		> .label
@@ -89,9 +113,16 @@ export default Vue.extend({
 		> .suffix
 			padding-left 4px
 
+	> .text
+		margin 8px 0
+		font-size 14px
+
+		> p
+			margin 0
+
 	&.focused
 		> .input
-			background #eee
+			background rgba(#000, 0.05)
 
 			> .label
 				color $theme-color
diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue
index f8bf7dd798..3adb10f2c3 100644
--- a/src/client/app/common/views/components/signup.vue
+++ b/src/client/app/common/views/components/signup.vue
@@ -1,20 +1,27 @@
 <template>
 <form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off">
 	<label class="username">
-		<p class="caption">%fa:at%%i18n:@username%</p>
-		<input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" placeholder="a~z、A~Z、0~9、-" autocomplete="off" required @input="onChangeUsername"/>
-		<p class="profile-page-url-preview" v-if="shouldShowProfileUrl">{{ `${url}/@${username}` }}</p>
-		<p class="info" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:@checking%</p>
-		<p class="info" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:@available%</p>
-		<p class="info" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@unavailable%</p>
-		<p class="info" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@error%</p>
-		<p class="info" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@invalid-format%</p>
-		<p class="info" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-short%</p>
-		<p class="info" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-long%</p>
+		<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername">
+			<span>%i18n:@username%</span>
+			<span slot="prefix">@</span>
+			<span slot="suffix">@{{ host }}</span>
+			<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:@checking%</p>
+			<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:@available%</p>
+			<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@unavailable%</p>
+			<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@error%</p>
+			<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@invalid-format%</p>
+			<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-short%</p>
+			<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-long%</p>
+		</ui-input>
 	</label>
 	<label class="password">
-		<p class="caption">%fa:lock%%i18n:@password%</p>
-		<input v-model="password" type="password" placeholder="%i18n:@password-placeholder%" autocomplete="off" required @input="onChangePassword"/>
+		<ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword">
+			<span>%i18n:@password%</span>
+			<span slot="prefix">%fa:lock%</span>
+			<div slot="text">
+
+			</div>
+		</ui-input>
 		<div class="meter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
 			<div class="value" ref="passwordMetar"></div>
 		</div>
@@ -23,14 +30,15 @@
 		<p class="info" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw%%i18n:@strong-password%</p>
 	</label>
 	<label class="retype-password">
-		<p class="caption">%fa:lock%%i18n:@password%(%i18n:@retype%)</p>
-		<input v-model="retypedPassword" type="password" placeholder="%i18n:@retype-placeholder%" autocomplete="off" required @input="onChangePasswordRetype"/>
+		<ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype">
+			<span>%i18n:@password% (%i18n:@retype%)</span>
+			<span slot="prefix">%fa:lock%</span>
+		</ui-input>
 		<p class="info" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw%%i18n:@password-matched%</p>
 		<p class="info" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@password-not-matched%</p>
 	</label>
 	<label class="recaptcha">
-		<p class="caption"><template v-if="recaptchaed">%fa:toggle-on%</template><template v-if="!recaptchaed">%fa:toggle-off%</template>%i18n:@recaptcha%</p>
-		<div class="g-recaptcha" data-callback="onRecaptchaed" data-expired-callback="onRecaptchaExpired" :data-sitekey="recaptchaSitekey"></div>
+		<div class="g-recaptcha" :data-sitekey="recaptchaSitekey"></div>
 	</label>
 	<label class="agree-tou">
 		<input name="agree-tou" type="checkbox" autocomplete="off" required/>
@@ -43,18 +51,18 @@
 <script lang="ts">
 import Vue from 'vue';
 const getPasswordStrength = require('syuilo-password-strength');
-import { url, docsUrl, lang, recaptchaSitekey } from '../../../config';
+import { host, url, docsUrl, lang, recaptchaSitekey } from '../../../config';
 
 export default Vue.extend({
 	data() {
 		return {
+			host,
 			username: '',
 			password: '',
 			retypedPassword: '',
 			url,
 			touUrl: `${docsUrl}/${lang}/tou`,
 			recaptchaSitekey,
-			recaptchaed: false,
 			usernameState: null,
 			passwordStrength: '',
 			passwordRetypeState: null
@@ -130,19 +138,9 @@ export default Vue.extend({
 				alert('%i18n:@some-error%');
 
 				(window as any).grecaptcha.reset();
-				this.recaptchaed = false;
 			});
 		}
 	},
-	created() {
-		(window as any).onRecaptchaed = () => {
-			this.recaptchaed = true;
-		};
-
-		(window as any).onRecaptchaExpired = () => {
-			this.recaptchaed = false;
-		};
-	},
 	mounted() {
 		const head = document.getElementsByTagName('head')[0];
 		const script = document.createElement('script');
diff --git a/src/client/app/mobile/views/pages/signup.vue b/src/client/app/mobile/views/pages/signup.vue
index b8245beb00..f2b29bca60 100644
--- a/src/client/app/mobile/views/pages/signup.vue
+++ b/src/client/app/mobile/views/pages/signup.vue
@@ -1,28 +1,18 @@
 <template>
 <div class="signup">
 	<h1>Misskeyをはじめる</h1>
-	<p>いつでも、どこからでもMisskeyを利用できます。もちろん、無料です。</p>
-	<div class="form">
-		<p>新規登録</p>
-		<div>
-			<mk-signup/>
-		</div>
-	</div>
+	<mk-signup/>
 </div>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
-export default Vue.extend({
-	mounted() {
-		document.documentElement.style.background = '#293946';
-	}
-});
+export default Vue.extend({});
 </script>
 
 <style lang="stylus" scoped>
 .signup
-	padding 16px
+	padding 32px
 	margin 0 auto
 	max-width 500px
 
@@ -30,28 +20,7 @@ export default Vue.extend({
 		margin 0
 		padding 8px
 		font-size 1.5em
-		font-weight normal
-		color #c3c6ca
-
-		& + p
-			margin 0 0 16px 0
-			padding 0 8px 0 8px
-			color #949fa9
-
-	.form
-		background #fff
-		border solid 1px rgba(#000, 0.2)
-		border-radius 8px
-		overflow hidden
-
-		> p
-			margin 0
-			padding 12px 20px
-			color #555
-			background #f5f5f5
-			border-bottom solid 1px #ddd
-
-		> div
-			padding 16px
+		font-weight bold
+		color #444
 
 </style>
diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue
index 07891fd56b..01b20aa472 100644
--- a/src/client/app/mobile/views/pages/welcome.vue
+++ b/src/client/app/mobile/views/pages/welcome.vue
@@ -2,7 +2,13 @@
 <div class="welcome">
 	<div>
 		<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey">
-		<div class="form">
+		<p class="host">{{ host }}</p>
+		<div class="about">
+			<h2>{{ name || 'unidentified' }}</h2>
+			<p v-html="description || '%i18n:common.about%'"></p>
+			<router-link class="signup" to="/signup">新規登録</router-link>
+		</div>
+		<div class="login">
 			<form @submit.prevent="onSubmit">
 				<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange">
 					<span>ユーザー名</span>
@@ -20,13 +26,6 @@
 				<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
 			</div>
 		</div>
-		<div class="tl">
-			<p>%fa:comments R% タイムラインを見てみる</p>
-			<mk-welcome-timeline/>
-		</div>
-		<div class="users">
-			<mk-avatar class="avatar" v-for="user in users" :key="user.id" :user="user"/>
-		</div>
 		<footer>
 			<small>{{ copyright }}</small>
 		</footer>
@@ -88,10 +87,11 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 .welcome
-	background #fff
+	text-align center
+	//background #fff
 
 	> div
-		padding 16px
+		padding 32px
 		margin 0 auto
 		max-width 500px
 
@@ -100,11 +100,36 @@ export default Vue.extend({
 			max-width 200px
 			margin 0 auto
 
-		.form
-			margin-bottom 16px
+		> .host
+			display block
+			text-align center
+			padding 6px 12px
+			line-height 32px
+			font-weight bold
+			color #333
+			background rgba(#000, 0.035)
+			border-radius 6px
+
+		> .about
+			margin-top 16px
+			padding 16px
+			color #444
+			background #fff
+			border-radius 6px
+
+			> h2
+				margin 0
+
+			> p
+				margin 8px
+
+			> .signup
+				font-weight bold
+
+		> .login
+			margin 16px 0
 
 			> form
-				padding 16px
 
 				button
 					display block
@@ -127,36 +152,9 @@ export default Vue.extend({
 						border-color #444
 						box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2)
 
-		> .tl
-			background #fff
-			border solid 1px rgba(#000, 0.2)
-			border-radius 8px
-			overflow hidden
-
-			> p
-				margin 0
-				padding 12px 20px
-				color #555
-				background #f5f5f5
-				border-bottom solid 1px #ddd
-
-			> .mk-welcome-timeline
-				max-height 300px
-				overflow auto
-
-		> .users
-			margin 12px 0 0 0
-
-			> *
-				display inline-block
-				margin 4px
-				width 38px
-				height 38px
-				border-radius 6px
-
 		> footer
 			text-align center
-			color #fff
+			color #444
 
 			> small
 				display block

From a1ae832129e8bfe8c082064349e2b9973be5f0e5 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 14:52:37 +0900
Subject: [PATCH 302/369] wip

---
 .../app/common/views/components/index.ts      |  12 +-
 .../app/common/views/components/signup.vue    | 182 +++------------
 .../components/{material => ui}/button.vue    |   8 +-
 .../app/common/views/components/ui/form.vue   |  28 +++
 .../app/common/views/components/ui/group.vue  |  23 ++
 .../app/common/views/components/ui/input.vue  | 215 ++++++++++++++++++
 .../app/common/views/components/ui/switch.vue | 199 ++++++++++++++++
 .../{material/input.vue => ui/textarea.vue}   |  74 +++---
 .../app/mobile/views/pages/settings.vue       | 170 ++++++--------
 .../views/pages/settings/settings.profile.vue |  83 +++----
 src/client/app/mobile/views/pages/signup.vue  |   2 +-
 src/client/app/mobile/views/pages/welcome.vue |   8 +-
 12 files changed, 658 insertions(+), 346 deletions(-)
 rename src/client/app/common/views/components/{material => ui}/button.vue (83%)
 create mode 100644 src/client/app/common/views/components/ui/form.vue
 create mode 100644 src/client/app/common/views/components/ui/group.vue
 create mode 100644 src/client/app/common/views/components/ui/input.vue
 create mode 100644 src/client/app/common/views/components/ui/switch.vue
 rename src/client/app/common/views/components/{material/input.vue => ui/textarea.vue} (64%)

diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index 5dc466857c..060af388b3 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -29,8 +29,12 @@ import fileTypeIcon from './file-type-icon.vue';
 import Switch from './switch.vue';
 import Othello from './othello.vue';
 import welcomeTimeline from './welcome-timeline.vue';
-import uiInput from './material/input.vue';
-import uiButton from './material/button.vue';
+import uiInput from './ui/input.vue';
+import uiButton from './ui/button.vue';
+import uiGroup from './ui/group.vue';
+import uiForm from './ui/form.vue';
+import uiTextarea from './ui/textarea.vue';
+import uiSwitch from './ui/switch.vue';
 
 Vue.component('mk-analog-clock', analogClock);
 Vue.component('mk-menu', menu);
@@ -63,3 +67,7 @@ Vue.component('mk-othello', Othello);
 Vue.component('mk-welcome-timeline', welcomeTimeline);
 Vue.component('ui-input', uiInput);
 Vue.component('ui-button', uiButton);
+Vue.component('ui-group', uiGroup);
+Vue.component('ui-form', uiForm);
+Vue.component('ui-textarea', uiTextarea);
+Vue.component('ui-switch', uiSwitch);
diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue
index 3adb10f2c3..d1621a4848 100644
--- a/src/client/app/common/views/components/signup.vue
+++ b/src/client/app/common/views/components/signup.vue
@@ -1,50 +1,40 @@
 <template>
 <form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off">
-	<label class="username">
-		<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername">
-			<span>%i18n:@username%</span>
-			<span slot="prefix">@</span>
-			<span slot="suffix">@{{ host }}</span>
-			<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:@checking%</p>
-			<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:@available%</p>
-			<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@unavailable%</p>
-			<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@error%</p>
-			<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@invalid-format%</p>
-			<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-short%</p>
-			<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-long%</p>
-		</ui-input>
-	</label>
-	<label class="password">
-		<ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword">
-			<span>%i18n:@password%</span>
-			<span slot="prefix">%fa:lock%</span>
-			<div slot="text">
-
-			</div>
-		</ui-input>
-		<div class="meter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
-			<div class="value" ref="passwordMetar"></div>
+	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername">
+		<span>%i18n:@username%</span>
+		<span slot="prefix">@</span>
+		<span slot="suffix">@{{ host }}</span>
+		<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p>
+		<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p>
+		<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p>
+		<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p>
+		<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p>
+		<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p>
+		<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p>
+	</ui-input>
+	<ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword" :with-password-meter="true">
+		<span>%i18n:@password%</span>
+		<span slot="prefix">%fa:lock%</span>
+		<div slot="text">
+			<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p>
+			<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p>
+			<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p>
 		</div>
-		<p class="info" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@weak-password%</p>
-		<p class="info" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw%%i18n:@normal-password%</p>
-		<p class="info" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw%%i18n:@strong-password%</p>
-	</label>
-	<label class="retype-password">
-		<ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype">
-			<span>%i18n:@password% (%i18n:@retype%)</span>
-			<span slot="prefix">%fa:lock%</span>
-		</ui-input>
-		<p class="info" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw%%i18n:@password-matched%</p>
-		<p class="info" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@password-not-matched%</p>
-	</label>
-	<label class="recaptcha">
-		<div class="g-recaptcha" :data-sitekey="recaptchaSitekey"></div>
-	</label>
-	<label class="agree-tou">
+	</ui-input>
+	<ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype">
+		<span>%i18n:@password% (%i18n:@retype%)</span>
+		<span slot="prefix">%fa:lock%</span>
+		<div slot="text">
+			<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p>
+			<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
+		</div>
+	</ui-input>
+	<div class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
+	<label class="agree-tou" style="display: block; margin: 16px 0;">
 		<input name="agree-tou" type="checkbox" autocomplete="off" required/>
 		<p><a :href="touUrl" target="_blank">利用規約</a>に同意する</p>
 	</label>
-	<button type="submit">%i18n:@create%</button>
+	<ui-button type="submit">%i18n:@create%</ui-button>
 </form>
 </template>
 
@@ -112,7 +102,6 @@ export default Vue.extend({
 
 			const strength = getPasswordStrength(this.password);
 			this.passwordStrength = strength > 0.7 ? 'high' : strength > 0.3 ? 'medium' : 'low';
-			(this.$refs.passwordMetar as any).style.width = `${strength * 100}%`;
 		},
 		onChangePasswordRetype() {
 			if (this.retypedPassword == '') {
@@ -156,100 +145,6 @@ export default Vue.extend({
 .mk-signup
 	min-width 302px
 
-	label
-		display block
-		margin 0 0 16px 0
-
-		> .caption
-			margin 0 0 4px 0
-			color #828888
-			font-size 0.95em
-
-			> [data-fa]
-				margin-right 0.25em
-				color #96adac
-
-		> .info
-			display block
-			margin 4px 0
-			font-size 0.8em
-
-			> [data-fa]
-				margin-right 0.3em
-
-		&.username
-			.profile-page-url-preview
-				display block
-				margin 4px 8px 0 4px
-				font-size 0.8em
-				color #888
-
-				&:empty
-					display none
-
-				&:not(:empty) + .info
-					margin-top 0
-
-		&.password
-			.meter
-				display block
-				margin-top 8px
-				width 100%
-				height 8px
-
-				&[data-strength='']
-					display none
-
-				&[data-strength='low']
-					> .value
-						background #d73612
-
-				&[data-strength='medium']
-					> .value
-						background #d7ca12
-
-				&[data-strength='high']
-					> .value
-						background #61bb22
-
-				> .value
-					display block
-					width 0%
-					height 100%
-					background transparent
-					border-radius 4px
-					transition all 0.1s ease
-
-	[type=text], [type=password]
-		user-select text
-		display inline-block
-		cursor auto
-		padding 0 12px
-		margin 0
-		width 100%
-		line-height 44px
-		font-size 1em
-		color #333 !important
-		background #fff !important
-		outline none
-		border solid 1px rgba(#000, 0.1)
-		border-radius 4px
-		box-shadow 0 0 0 114514px #fff inset
-		transition all .3s ease
-
-		&:hover
-			border-color rgba(#000, 0.2)
-			transition all .1s ease
-
-		&:focus
-			color $theme-color !important
-			border-color $theme-color
-			box-shadow 0 0 0 1024px #fff inset, 0 0 0 4px rgba($theme-color, 10%)
-			transition all 0s ease
-
-		&:disabled
-			opacity 0.5
-
 	.agree-tou
 		padding 4px
 		border-radius 4px
@@ -267,19 +162,4 @@ export default Vue.extend({
 			display inline
 			color #555
 
-	button
-		margin 0
-		padding 16px
-		width 100%
-		font-size 1em
-		color #fff
-		background $theme-color
-		border-radius 3px
-
-		&:hover
-			background lighten($theme-color, 5%)
-
-		&:active
-			background darken($theme-color, 5%)
-
 </style>
diff --git a/src/client/app/common/views/components/material/button.vue b/src/client/app/common/views/components/ui/button.vue
similarity index 83%
rename from src/client/app/common/views/components/material/button.vue
rename to src/client/app/common/views/components/ui/button.vue
index 8dacedbac6..57747fd469 100644
--- a/src/client/app/common/views/components/material/button.vue
+++ b/src/client/app/common/views/components/ui/button.vue
@@ -25,7 +25,7 @@ export default Vue.extend({
 	> button
 		display block
 		width 100%
-		margin 32px 0 16px 0
+		margin 0
 		padding 0
 		color $theme-color-foreground
 		font-weight bold
@@ -37,4 +37,10 @@ export default Vue.extend({
 		outline none
 		box-shadow none
 
+		&:hover
+			background lighten($theme-color, 5%)
+
+		&:active
+			background darken($theme-color, 5%)
+
 </style>
diff --git a/src/client/app/common/views/components/ui/form.vue b/src/client/app/common/views/components/ui/form.vue
new file mode 100644
index 0000000000..0893af1bce
--- /dev/null
+++ b/src/client/app/common/views/components/ui/form.vue
@@ -0,0 +1,28 @@
+<template>
+<div class="ui-form">
+	<fieldset :disabled="disabled">
+		<slot></slot>
+	</fieldset>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+	props: {
+		disabled: {
+			type: String,
+			required: false
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+.ui-form
+	> fieldset
+		border none
+
+</style>
diff --git a/src/client/app/common/views/components/ui/group.vue b/src/client/app/common/views/components/ui/group.vue
new file mode 100644
index 0000000000..fb29458ce8
--- /dev/null
+++ b/src/client/app/common/views/components/ui/group.vue
@@ -0,0 +1,23 @@
+<template>
+<div class="ui-group">
+	<header>
+		<slot name="title"></slot>
+	</header>
+
+	<slot></slot>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+.ui-group
+	> header
+		font-weight bold
+
+</style>
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
new file mode 100644
index 0000000000..7461aac7fe
--- /dev/null
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -0,0 +1,215 @@
+<template>
+<div class="ui-input" :class="{ focused, filled }">
+	<div class="input" @click="focus">
+		<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
+			<div class="value" ref="passwordMetar"></div>
+		</div>
+		<span class="label" ref="label"><slot></slot></span>
+		<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
+		<input ref="input"
+				:type="type"
+				:value="value"
+				:required="required"
+				:readonly="readonly"
+				:pattern="pattern"
+				:autocomplete="autocomplete"
+				@input="$emit('input', $event.target.value)"
+				@focus="focused = true"
+				@blur="focused = false">
+		<div class="suffix"><slot name="suffix"></slot></div>
+	</div>
+	<div class="text"><slot name="text"></slot></div>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+const getPasswordStrength = require('syuilo-password-strength');
+
+export default Vue.extend({
+	props: {
+		value: {
+			required: false
+		},
+		type: {
+			type: String,
+			required: false
+		},
+		required: {
+			type: Boolean,
+			required: false
+		},
+		readonly: {
+			type: Boolean,
+			required: false
+		},
+		pattern: {
+			type: String,
+			required: false
+		},
+		autocomplete: {
+			type: String,
+			required: false
+		},
+		withPasswordMeter: {
+			type: Boolean,
+			required: false,
+			default: false
+		}
+	},
+	data() {
+		return {
+			focused: false,
+			passwordStrength: ''
+		}
+	},
+	computed: {
+		filled(): boolean {
+			return this.value != '' && this.value != null;
+		}
+	},
+	watch: {
+		value(v) {
+			if (this.withPasswordMeter) {
+				if (v == '') {
+					this.passwordStrength = '';
+					return;
+				}
+
+				const strength = getPasswordStrength(v);
+				this.passwordStrength = strength > 0.7 ? 'high' : strength > 0.3 ? 'medium' : 'low';
+				(this.$refs.passwordMetar as any).style.width = `${strength * 100}%`;
+			}
+		}
+	},
+	mounted() {
+		if (this.$refs.prefix) {
+			this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
+		}
+	},
+	methods: {
+		focus() {
+			this.$refs.input.focus();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+.ui-input
+	margin 32px 0
+
+	> .input
+		display flex
+		padding 6px 12px
+		background rgba(#000, 0.035)
+		border-radius 6px
+
+		> .password-meter
+			position absolute
+			top 0
+			left 0
+			width 100%
+			height 100%
+			border-radius 6px
+			overflow hidden
+			opacity 0.3
+
+			&[data-strength='']
+				display none
+
+			&[data-strength='low']
+				> .value
+					background #d73612
+
+			&[data-strength='medium']
+				> .value
+					background #d7ca12
+
+			&[data-strength='high']
+				> .value
+					background #61bb22
+
+			> .value
+				display block
+				width 0%
+				height 100%
+				background transparent
+				border-radius 6px
+				transition all 0.1s ease
+
+		> .label
+			position absolute
+			top 6px
+			left 0
+			pointer-events none
+			transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
+			transition-duration 0.3s
+			font-size 16px
+			line-height 32px
+			color rgba(#000, 0.54)
+			pointer-events none
+			//will-change transform
+			transform-origin top left
+			transform scale(1)
+
+		> input
+			display block
+			flex 1
+			width 100%
+			padding 0
+			font inherit
+			font-weight bold
+			font-size 16px
+			line-height 32px
+			background transparent
+			border none
+			border-radius 0
+			outline none
+			box-shadow none
+
+		> .prefix
+		> .suffix
+			display block
+			align-self center
+			justify-self center
+			font-size 16px
+			line-height 32px
+			color rgba(#000, 0.54)
+			pointer-events none
+
+			> *
+				display block
+				min-width 16px
+
+		> .prefix
+			padding-right 4px
+
+		> .suffix
+			padding-left 4px
+
+	> .text
+		margin 6px 0
+		font-size 13px
+
+		*
+			margin 0
+
+	&.focused
+		> .input
+			background rgba(#000, 0.05)
+
+			> .label
+				color $theme-color
+
+	&.focused
+	&.filled
+		> .input
+			> .label
+				top -24px
+				left 0 !important
+				transform scale(0.8)
+
+</style>
diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue
new file mode 100644
index 0000000000..2cac6262f1
--- /dev/null
+++ b/src/client/app/common/views/components/ui/switch.vue
@@ -0,0 +1,199 @@
+<template>
+<div
+	class="ui-switch"
+	:class="{ disabled, checked }"
+	role="switch"
+	:aria-checked="checked"
+	:aria-disabled="disabled"
+	@click="switchValue"
+	@mouseover="mouseenter"
+>
+	<input
+		type="checkbox"
+		@change="handleChange"
+		ref="input"
+		:disabled="disabled"
+		@keydown.enter="switchValue"
+	>
+	<span class="button">
+		<span :style="{ transform }"></span>
+	</span>
+	<span class="label">
+		<span :aria-hidden="!checked"><slot></slot></span>
+		<p :aria-hidden="!checked">
+			<slot name="text"></slot>
+		</p>
+	</span>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+	props: {
+		value: {
+			type: Boolean,
+			default: false
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		}
+	},/*
+	created() {
+		if (!~[true, false].indexOf(this.value)) {
+			this.$emit('input', false);
+		}
+	},*/
+	computed: {
+		checked(): boolean {
+			return this.value;
+		},
+		transform(): string {
+			return this.checked ? 'translate3d(14px, 0, 0)' : '';
+		}
+	},
+	watch: {
+		value() {
+			(this.$el).style.transition = 'all 0.3s';
+			(this.$refs.input as any).checked = this.checked;
+		}
+	},
+	mounted() {
+		(this.$refs.input as any).checked = this.checked;
+	},
+	methods: {
+		mouseenter() {
+			(this.$el).style.transition = 'all 0s';
+		},
+		handleChange() {
+			(this.$el).style.transition = 'all 0.3s';
+			this.$emit('input', !this.checked);
+			this.$emit('change', !this.checked);
+			this.$nextTick(() => {
+				// set input's checked property
+				// in case parent refuses to change component's value
+				(this.$refs.input as any).checked = this.checked;
+			});
+		},
+		switchValue() {
+			!this.disabled && this.handleChange();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	display flex
+	margin 16px 0
+	cursor pointer
+	transition all 0.3s
+
+	> *
+		user-select none
+
+	&.disabled
+		opacity 0.6
+		cursor not-allowed
+
+	&.checked
+		> .button
+			background-color $theme-color
+			border-color $theme-color
+
+		> .label
+			> span
+				color $theme-color
+
+		&:hover
+			> .label
+				> span
+					color darken($theme-color, 10%)
+
+			> .button
+				background darken($theme-color, 10%)
+				border-color darken($theme-color, 10%)
+
+	&:hover
+		> .label
+			> span
+				color isDark ? #fff : #2e3338
+
+		> .button
+			$color = isDark ? #15181d : #ced2da
+			background $color
+			border-color $color
+
+	> input
+		position absolute
+		width 0
+		height 0
+		opacity 0
+		margin 0
+
+		&:focus + .button
+			&:after
+				content ""
+				pointer-events none
+				position absolute
+				top -5px
+				right -5px
+				bottom -5px
+				left -5px
+				border 2px solid rgba($theme-color, 0.3)
+				border-radius 14px
+
+	> .button
+		$color = isDark ? #1c1f25 : #dcdfe6
+
+		display inline-block
+		margin 0
+		width 46px
+		min-width 46px
+		height 32px
+		min-height 32px
+		background $color
+		border 1px solid $color
+		outline none
+		border-radius 6px
+		transition inherit
+
+		> *
+			position absolute
+			top 1px
+			left 1px
+			border-radius 6px
+			transition transform 0.3s
+			width 28px
+			height 28px
+			background-color #fff
+
+	> .label
+		margin-left 8px
+		display block
+		font-size 16px
+		cursor pointer
+		transition inherit
+
+		> span
+			display block
+			line-height 32px
+			font-weight bold
+			color isDark ? #c4ccd2 : #4a535a
+			transition inherit
+
+		> p
+			margin 0
+			//font-size 90%
+			color isDark ? #78858e : #9daab3
+
+.ui-switch[data-darkmode]
+	root(true)
+
+.ui-switch:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/ui/textarea.vue
similarity index 64%
rename from src/client/app/common/views/components/material/input.vue
rename to src/client/app/common/views/components/ui/textarea.vue
index 6564b3aa6c..0a9f60f1bc 100644
--- a/src/client/app/common/views/components/material/input.vue
+++ b/src/client/app/common/views/components/ui/textarea.vue
@@ -1,17 +1,17 @@
 <template>
-<div class="ui-input" :class="{ focused, filled }">
+<div class="ui-textarea" :class="{ focused, filled }">
 	<div class="input">
 		<span class="label" ref="label"><slot></slot></span>
-		<div class="prefix" ref="prefix" @click="focus"><slot name="prefix"></slot></div>
-		<input ref="input"
-				:type="type"
+		<textarea ref="input"
 				:value="value"
 				:required="required"
 				:readonly="readonly"
+				:pattern="pattern"
+				:autocomplete="autocomplete"
 				@input="$emit('input', $event.target.value)"
 				@focus="focused = true"
 				@blur="focused = false">
-		<div class="suffix" @click="focus"><slot name="suffix"></slot></div>
+		</textarea>
 	</div>
 	<div class="text"><slot name="text"></slot></div>
 </div>
@@ -19,15 +19,13 @@
 
 <script lang="ts">
 import Vue from 'vue';
+const getPasswordStrength = require('syuilo-password-strength');
+
 export default Vue.extend({
 	props: {
 		value: {
 			required: false
 		},
-		type: {
-			type: String,
-			required: false
-		},
 		required: {
 			type: Boolean,
 			required: false
@@ -35,11 +33,20 @@ export default Vue.extend({
 		readonly: {
 			type: Boolean,
 			required: false
+		},
+		pattern: {
+			type: String,
+			required: false
+		},
+		autocomplete: {
+			type: String,
+			required: false
 		}
 	},
 	data() {
 		return {
-			focused: false
+			focused: false,
+			passwordStrength: ''
 		}
 	},
 	computed: {
@@ -47,9 +54,6 @@ export default Vue.extend({
 			return this.value != '' && this.value != null;
 		}
 	},
-	mounted() {
-		this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
-	},
 	methods: {
 		focus() {
 			this.$refs.input.focus();
@@ -61,20 +65,18 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-.ui-input
-	margin-bottom 16px
-	padding-top 16px
+.ui-textarea
+	margin 32px 0
 
 	> .input
-		display flex
-		padding 6px 12px
+		padding 12px
 		background rgba(#000, 0.035)
 		border-radius 6px
 
 		> .label
 			position absolute
 			top 6px
-			left 0
+			left 12px
 			pointer-events none
 			transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
 			transition-duration 0.3s
@@ -82,42 +84,29 @@ export default Vue.extend({
 			line-height 32px
 			color rgba(#000, 0.54)
 			pointer-events none
+			//will-change transform
+			transform-origin top left
+			transform scale(1)
 
-		> input
+		> textarea
 			display block
-			flex 1
 			width 100%
+			min-height 100px
 			padding 0
 			font inherit
 			font-weight bold
 			font-size 16px
-			line-height 32px
 			background transparent
 			border none
 			border-radius 0
 			outline none
 			box-shadow none
 
-		> .prefix
-		> .suffix
-			display block
-			align-self center
-			justify-self center
-			font-size 16px
-			line-height 32px
-			color rgba(#000, 0.54)
-
-		> .prefix
-			padding-right 4px
-
-		> .suffix
-			padding-left 4px
-
 	> .text
-		margin 8px 0
-		font-size 14px
+		margin 6px 0
+		font-size 13px
 
-		> p
+		*
 			margin 0
 
 	&.focused
@@ -131,9 +120,8 @@ export default Vue.extend({
 	&.filled
 		> .input
 			> .label
-				top -20px
+				top -24px
 				left 0 !important
-				font-size 12px
-				line-height 20px
+				transform scale(0.8)
 
 </style>
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index 8da7a76633..716f7afc0c 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -6,125 +6,105 @@
 		<div>
 			<x-profile/>
 
-			<md-card>
-				<md-card-header>
-					<div class="md-title">%fa:palette% %i18n:@design%</div>
-				</md-card-header>
+			<ui-group>
+				<div slot="title">%fa:palette% %i18n:@design%</div>
+
+				<div>
+					<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
+				</div>
+
+				<div>
+					<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
+				</div>
+
+				<div>
+					<div class="md-body-2">%i18n:@timeline%</div>
 
-				<md-card-content>
 					<div>
-						<md-switch v-model="darkmode">%i18n:@dark-mode%</md-switch>
+						<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
 					</div>
 
 					<div>
-						<md-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</md-switch>
+						<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
 					</div>
 
 					<div>
-						<div class="md-body-2">%i18n:@timeline%</div>
-
-						<div>
-							<md-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</md-switch>
-						</div>
-
-						<div>
-							<md-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</md-switch>
-						</div>
-
-						<div>
-							<md-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch>
-						</div>
+						<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
 					</div>
+				</div>
 
-					<div>
-						<div class="md-body-2">%i18n:@post-style%</div>
+				<div>
+					<div class="md-body-2">%i18n:@post-style%</div>
 
-						<md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio>
-						<md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio>
-					</div>
-				</md-card-content>
-			</md-card>
+					<md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio>
+					<md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio>
+				</div>
+			</ui-group>
 
-			<md-card>
-				<md-card-header>
-					<div class="md-title">%fa:cog% %i18n:@behavior%</div>
-				</md-card-header>
+			<ui-group>
+				<div slot="title">%fa:cog% %i18n:@behavior%</div>
 
-				<md-card-content>
-					<div>
-						<md-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</md-switch>
-					</div>
+				<div>
+					<ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch>
+				</div>
 
-					<div>
-						<md-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch>
-					</div>
+				<div>
+					<ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch>
+				</div>
 
-					<div>
-						<md-switch v-model="loadRawImages">%i18n:@load-raw-images%</md-switch>
-					</div>
+				<div>
+					<ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch>
+				</div>
 
-					<div>
-						<md-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</md-switch>
-					</div>
+				<div>
+					<ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch>
+				</div>
 
-					<div>
-						<md-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</md-switch>
-					</div>
-				</md-card-content>
-			</md-card>
+				<div>
+					<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
+				</div>
+			</ui-group>
 
-			<md-card>
-				<md-card-header>
-					<div class="md-title">%fa:language% %i18n:@lang%</div>
-				</md-card-header>
+			<ui-group>
+				<div slot="title">%fa:language% %i18n:@lang%</div>
 
-				<md-card-content>
-					<md-field>
-						<md-select v-model="lang" placeholder="%i18n:@auto%">
-							<md-optgroup label="%i18n:@recommended%">
-								<md-option value="">%i18n:@auto%</md-option>
-							</md-optgroup>
+				<md-field>
+					<md-select v-model="lang" placeholder="%i18n:@auto%">
+						<md-optgroup label="%i18n:@recommended%">
+							<md-option value="">%i18n:@auto%</md-option>
+						</md-optgroup>
 
-							<md-optgroup label="%i18n:@specify-language%">
-								<md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option>
-							</md-optgroup>
-						</md-select>
-					</md-field>
-					<span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span>
-				</md-card-content>
-			</md-card>
+						<md-optgroup label="%i18n:@specify-language%">
+							<md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option>
+						</md-optgroup>
+					</md-select>
+				</md-field>
+				<span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span>
+			</ui-group>
 
-			<md-card>
-				<md-card-header>
-					<div class="md-title">%fa:B twitter% %i18n:@twitter%</div>
-				</md-card-header>
+			<ui-group>
+				<div slot="title">%fa:B twitter% %i18n:@twitter%</div>
 
-				<md-card-content>
-					<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
-					<p>
-						<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
-						<span v-if="$store.state.i.twitter"> or </span>
-						<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a>
-					</p>
-				</md-card-content>
-			</md-card>
+				<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
+				<p>
+					<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
+					<span v-if="$store.state.i.twitter"> or </span>
+					<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a>
+				</p>
+			</ui-group>
 
-			<md-card>
-				<md-card-header>
-					<div class="md-title">%fa:sync-alt% %i18n:@update%</div>
-				</md-card-header>
+			<ui-group>
+				<div slot="title">%fa:sync-alt% %i18n:@update%</div>
 
-				<md-card-content>
-					<div>%i18n:@version% <i>{{ version }}</i></div>
-					<template v-if="latestVersion !== undefined">
-						<div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div>
-					</template>
-					<md-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate">
-						<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
-						<template v-else>%i18n:@check-for-updates%</template>
-					</md-button>
-				</md-card-content>
-			</md-card>
+				<div>%i18n:@version% <i>{{ version }}</i></div>
+				<template v-if="latestVersion !== undefined">
+					<div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div>
+				</template>
+				<md-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate">
+					<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
+					<template v-else>%i18n:@check-for-updates%</template>
+				</md-button>
+			</ui-group>
 		</div>
 		<p><small>ver {{ version }} ({{ codename }})</small></p>
 	</main>
diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue
index f3444eb1f0..73d876d14e 100644
--- a/src/client/app/mobile/views/pages/settings/settings.profile.vue
+++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue
@@ -1,62 +1,47 @@
 <template>
-	<md-card>
-		<md-card-header>
-			<div class="md-title">%fa:pencil-alt% %i18n:@title%</div>
-		</md-card-header>
+<ui-group>
+	<div slot="title">%fa:pencil-alt% %i18n:@title%</div>
 
-		<md-card-content>
-			<md-field>
-				<label>%i18n:@name%</label>
-				<md-input v-model="name" :disabled="saving" md-counter="30"/>
-			</md-field>
+	<ui-form :disabled="saving">
+		<ui-input v-model="name" :max="30">
+			<span>%i18n:@name%</span>
+		</ui-input>
 
-			<md-field>
-				<label>%i18n:@account%</label>
-				<span class="md-prefix">@</span>
-				<md-input v-model="username" readonly></md-input>
-				<span class="md-suffix">@{{ host }}</span>
-			</md-field>
+		<ui-input v-model="username" readonly>
+			<span>%i18n:@account%</span>
+			<span slot="prefix">@</span>
+			<span slot="suffix">@{{ host }}</span>
+		</ui-input>
 
-			<md-field>
-				<md-icon>%fa:map-marker-alt%</md-icon>
-				<label>%i18n:@location%</label>
-				<md-input v-model="location" :disabled="saving"/>
-			</md-field>
+		<ui-input v-model="location">
+			<span>%i18n:@location%</span>
+			<span slot="prefix">%fa:map-marker-alt%</span>
+		</ui-input>
 
-			<md-field>
-				<md-icon>%fa:birthday-cake%</md-icon>
-				<label>%i18n:@birthday%</label>
-				<md-input type="date" v-model="birthday" :disabled="saving"/>
-			</md-field>
+		<ui-input v-model="birthday" type="date">
+			<span>%i18n:@birthday%</span>
+			<span slot="prefix">%fa:birthday-cake%</span>
+		</ui-input>
 
-			<md-field>
-				<label>%i18n:@description%</label>
-				<md-textarea v-model="description" :disabled="saving" md-counter="500"/>
-			</md-field>
+		<ui-textarea v-model="description" :max="500">
+			<span>%i18n:@description%</span>
+		</ui-textarea>
 
-			<md-field>
-				<label>%i18n:@avatar%</label>
-				<md-file @md-change="onAvatarChange"/>
-			</md-field>
+		<ui-input type="file" @change="onAvatarChange">
+			<span>%i18n:@avatar%</span>
+			<span slot="prefix">%fa:picture-o%</span>
+		</ui-input>
 
-			<md-field>
-				<label>%i18n:@banner%</label>
-				<md-file @md-change="onBannerChange"/>
-			</md-field>
+		<ui-input type="file" @change="onBannerChange">
+			<span>%i18n:@banner%</span>
+			<span slot="prefix">%fa:picture-o%</span>
+		</ui-input>
 
-			<md-dialog-alert
-					:md-active.sync="uploading"
-					md-content="%18n:!@uploading%"/>
+		<ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch>
 
-			<div>
-				<md-switch v-model="isCat">%i18n:@is-cat%</md-switch>
-			</div>
-		</md-card-content>
-
-		<md-card-actions>
-			<md-button class="md-primary" :disabled="saving" @click="save">%i18n:@save%</md-button>
-		</md-card-actions>
-	</md-card>
+		<ui-button @click="save">%i18n:@save%</ui-button>
+	</ui-form>
+</ui-group>
 </template>
 
 <script lang="ts">
diff --git a/src/client/app/mobile/views/pages/signup.vue b/src/client/app/mobile/views/pages/signup.vue
index f2b29bca60..47384e2b3c 100644
--- a/src/client/app/mobile/views/pages/signup.vue
+++ b/src/client/app/mobile/views/pages/signup.vue
@@ -18,7 +18,7 @@ export default Vue.extend({});
 
 	h1
 		margin 0
-		padding 8px
+		padding 8px 0 0 0
 		font-size 1.5em
 		font-weight bold
 		color #444
diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue
index 01b20aa472..3b37a185bd 100644
--- a/src/client/app/mobile/views/pages/welcome.vue
+++ b/src/client/app/mobile/views/pages/welcome.vue
@@ -10,16 +10,16 @@
 		</div>
 		<div class="login">
 			<form @submit.prevent="onSubmit">
-				<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange">
+				<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange">
 					<span>ユーザー名</span>
 					<span slot="prefix">@</span>
 					<span slot="suffix">@{{ host }}</span>
 				</ui-input>
-				<ui-input v-model="password" type="password" placeholder="パスワード" required>
+				<ui-input v-model="password" type="password" required>
 					<span>パスワード</span>
 					<span slot="prefix">%fa:lock%</span>
 				</ui-input>
-				<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/>
+				<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
 				<ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button>
 			</form>
 			<div>
@@ -113,7 +113,7 @@ export default Vue.extend({
 		> .about
 			margin-top 16px
 			padding 16px
-			color #444
+			color #555
 			background #fff
 			border-radius 6px
 

From 120c11b1817429c762d54df865b8cf1a35bf4e08 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 16:48:49 +0900
Subject: [PATCH 303/369] wip

---
 .../app/common/views/components/index.ts      |  4 +-
 .../components/ui/{group.vue => card.vue}     | 11 ++-
 .../app/common/views/components/ui/form.vue   |  2 +
 .../app/common/views/components/ui/switch.vue | 80 +++++--------------
 .../app/mobile/views/pages/settings.vue       | 31 ++++---
 .../views/pages/settings/settings.profile.vue |  6 +-
 6 files changed, 51 insertions(+), 83 deletions(-)
 rename src/client/app/common/views/components/ui/{group.vue => card.vue} (56%)

diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index 060af388b3..0e20e66f5a 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -31,7 +31,7 @@ import Othello from './othello.vue';
 import welcomeTimeline from './welcome-timeline.vue';
 import uiInput from './ui/input.vue';
 import uiButton from './ui/button.vue';
-import uiGroup from './ui/group.vue';
+import uiCard from './ui/card.vue';
 import uiForm from './ui/form.vue';
 import uiTextarea from './ui/textarea.vue';
 import uiSwitch from './ui/switch.vue';
@@ -67,7 +67,7 @@ Vue.component('mk-othello', Othello);
 Vue.component('mk-welcome-timeline', welcomeTimeline);
 Vue.component('ui-input', uiInput);
 Vue.component('ui-button', uiButton);
-Vue.component('ui-group', uiGroup);
+Vue.component('ui-card', uiCard);
 Vue.component('ui-form', uiForm);
 Vue.component('ui-textarea', uiTextarea);
 Vue.component('ui-switch', uiSwitch);
diff --git a/src/client/app/common/views/components/ui/group.vue b/src/client/app/common/views/components/ui/card.vue
similarity index 56%
rename from src/client/app/common/views/components/ui/group.vue
rename to src/client/app/common/views/components/ui/card.vue
index fb29458ce8..5ba15dad7d 100644
--- a/src/client/app/common/views/components/ui/group.vue
+++ b/src/client/app/common/views/components/ui/card.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="ui-group">
+<div class="ui-card">
 	<header>
 		<slot name="title"></slot>
 	</header>
@@ -16,8 +16,15 @@ export default Vue.extend({});
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-.ui-group
+.ui-card
+	margin 16px 0
+	padding 32px
+	background #fff
+	//box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
+
 	> header
 		font-weight bold
+		font-size 28px
+		color #444
 
 </style>
diff --git a/src/client/app/common/views/components/ui/form.vue b/src/client/app/common/views/components/ui/form.vue
index 0893af1bce..b6b4a76d2a 100644
--- a/src/client/app/common/views/components/ui/form.vue
+++ b/src/client/app/common/views/components/ui/form.vue
@@ -23,6 +23,8 @@ export default Vue.extend({
 
 .ui-form
 	> fieldset
+		margin 0
+		padding 0
 		border none
 
 </style>
diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue
index 2cac6262f1..e78951a352 100644
--- a/src/client/app/common/views/components/ui/switch.vue
+++ b/src/client/app/common/views/components/ui/switch.vue
@@ -16,7 +16,7 @@
 		@keydown.enter="switchValue"
 	>
 	<span class="button">
-		<span :style="{ transform }"></span>
+		<span></span>
 	</span>
 	<span class="label">
 		<span :aria-hidden="!checked"><slot></slot></span>
@@ -48,9 +48,6 @@ export default Vue.extend({
 	computed: {
 		checked(): boolean {
 			return this.value;
-		},
-		transform(): string {
-			return this.checked ? 'translate3d(14px, 0, 0)' : '';
 		}
 	},
 	watch: {
@@ -88,7 +85,7 @@ export default Vue.extend({
 
 root(isDark)
 	display flex
-	margin 16px 0
+	margin 32px 0
 	cursor pointer
 	transition all 0.3s
 
@@ -101,31 +98,12 @@ root(isDark)
 
 	&.checked
 		> .button
-			background-color $theme-color
-			border-color $theme-color
+			background-color rgba($theme-color, 0.4)
+			border-color rgba($theme-color, 0.4)
 
-		> .label
-			> span
-				color $theme-color
-
-		&:hover
-			> .label
-				> span
-					color darken($theme-color, 10%)
-
-			> .button
-				background darken($theme-color, 10%)
-				border-color darken($theme-color, 10%)
-
-	&:hover
-		> .label
-			> span
-				color isDark ? #fff : #2e3338
-
-		> .button
-			$color = isDark ? #15181d : #ced2da
-			background $color
-			border-color $color
+			> *
+				background-color $theme-color
+				transform translateX(14px)
 
 	> input
 		position absolute
@@ -134,42 +112,26 @@ root(isDark)
 		opacity 0
 		margin 0
 
-		&:focus + .button
-			&:after
-				content ""
-				pointer-events none
-				position absolute
-				top -5px
-				right -5px
-				bottom -5px
-				left -5px
-				border 2px solid rgba($theme-color, 0.3)
-				border-radius 14px
-
 	> .button
-		$color = isDark ? #1c1f25 : #dcdfe6
-
 		display inline-block
-		margin 0
-		width 46px
-		min-width 46px
-		height 32px
-		min-height 32px
-		background $color
-		border 1px solid $color
+		margin 3px 0 0 0
+		width 34px
+		height 14px
+		background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.05)
 		outline none
-		border-radius 6px
+		border-radius 14px
 		transition inherit
 
 		> *
 			position absolute
-			top 1px
-			left 1px
-			border-radius 6px
-			transition transform 0.3s
-			width 28px
-			height 28px
+			top -3px
+			left 0
+			border-radius 100%
+			transition background-color 0.3s, transform 0.3s
+			width 20px
+			height 20px
 			background-color #fff
+			box-shadow 0 2px 1px -1px rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), 0 1px 3px 0 rgba(#000, 0.12)
 
 	> .label
 		margin-left 8px
@@ -180,9 +142,9 @@ root(isDark)
 
 		> span
 			display block
-			line-height 32px
+			line-height 20px
 			font-weight bold
-			color isDark ? #c4ccd2 : #4a535a
+			color isDark ? #c4ccd2 : rgba(#000, 0.75)
 			transition inherit
 
 		> p
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index 716f7afc0c..25cfbf732b 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -6,7 +6,7 @@
 		<div>
 			<x-profile/>
 
-			<ui-group>
+			<ui-card>
 				<div slot="title">%fa:palette% %i18n:@design%</div>
 
 				<div>
@@ -39,9 +39,9 @@
 					<md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio>
 					<md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio>
 				</div>
-			</ui-group>
+			</ui-card>
 
-			<ui-group>
+			<ui-card>
 				<div slot="title">%fa:cog% %i18n:@behavior%</div>
 
 				<div>
@@ -63,9 +63,9 @@
 				<div>
 					<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
 				</div>
-			</ui-group>
+			</ui-card>
 
-			<ui-group>
+			<ui-card>
 				<div slot="title">%fa:language% %i18n:@lang%</div>
 
 				<md-field>
@@ -80,9 +80,9 @@
 					</md-select>
 				</md-field>
 				<span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span>
-			</ui-group>
+			</ui-card>
 
-			<ui-group>
+			<ui-card>
 				<div slot="title">%fa:B twitter% %i18n:@twitter%</div>
 
 				<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
@@ -91,9 +91,9 @@
 					<span v-if="$store.state.i.twitter"> or </span>
 					<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a>
 				</p>
-			</ui-group>
+			</ui-card>
 
-			<ui-group>
+			<ui-card>
 				<div slot="title">%fa:sync-alt% %i18n:@update%</div>
 
 				<div>%i18n:@version% <i>{{ version }}</i></div>
@@ -104,7 +104,7 @@
 					<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
 					<template v-else>%i18n:@check-for-updates%</template>
 				</md-button>
-			</ui-group>
+			</ui-card>
 		</div>
 		<p><small>ver {{ version }} ({{ codename }})</small></p>
 	</main>
@@ -247,20 +247,17 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 root(isDark)
-	padding 0 16px
 	margin 0 auto
 	max-width 500px
 	width 100%
 
-	> div
-		> *
-			margin-bottom 16px
-
 	> p
 		display block
-		margin 24px
+		margin 16px 0
+		padding 16px
 		text-align center
-		color isDark ? #cad2da : #a2a9b1
+		color isDark ? #cad2da : #2c662d
+		background #fcfff5
 
 main[data-darkmode]
 	root(true)
diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue
index 73d876d14e..de891b5736 100644
--- a/src/client/app/mobile/views/pages/settings/settings.profile.vue
+++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue
@@ -1,6 +1,6 @@
 <template>
-<ui-group>
-	<div slot="title">%fa:pencil-alt% %i18n:@title%</div>
+<ui-card>
+	<div slot="title">%fa:user% %i18n:@title%</div>
 
 	<ui-form :disabled="saving">
 		<ui-input v-model="name" :max="30">
@@ -41,7 +41,7 @@
 
 		<ui-button @click="save">%i18n:@save%</ui-button>
 	</ui-form>
-</ui-group>
+</ui-card>
 </template>
 
 <script lang="ts">

From c5e9b69eb3b235e9828371affe0d8d88a780d096 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 18:53:02 +0900
Subject: [PATCH 304/369] wip

---
 .../app/common/views/components/ui/card.vue   |  14 +-
 .../app/common/views/components/ui/input.vue  | 147 +++++++++++++++---
 .../app/common/views/components/ui/switch.vue |   1 -
 .../common/views/components/ui/textarea.vue   |  56 ++++++-
 .../views/pages/settings/settings.profile.vue |   4 +-
 5 files changed, 188 insertions(+), 34 deletions(-)

diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue
index 5ba15dad7d..97f06ca655 100644
--- a/src/client/app/common/views/components/ui/card.vue
+++ b/src/client/app/common/views/components/ui/card.vue
@@ -10,17 +10,23 @@
 
 <script lang="ts">
 import Vue from 'vue';
-export default Vue.extend({});
+export default Vue.extend({
+	provide() {
+		return {
+			isCardChild: true
+		};
+	}
+});
 </script>
 
 <style lang="stylus" scoped>
 @import '~const.styl'
 
 .ui-card
-	margin 16px 0
-	padding 32px
+	margin 16px
+	padding 16px
 	background #fff
-	//box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
+	box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
 
 	> header
 		font-weight bold
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index 7461aac7fe..3a474f0243 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -1,21 +1,35 @@
 <template>
-<div class="ui-input" :class="{ focused, filled }">
+<div class="ui-input" :class="[{ focused, filled }, styl]">
+	<div class="icon" ref="icon"><slot name="icon"></slot></div>
 	<div class="input" @click="focus">
 		<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
 			<div class="value" ref="passwordMetar"></div>
 		</div>
 		<span class="label" ref="label"><slot></slot></span>
 		<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
-		<input ref="input"
-				:type="type"
-				:value="value"
-				:required="required"
-				:readonly="readonly"
-				:pattern="pattern"
-				:autocomplete="autocomplete"
-				@input="$emit('input', $event.target.value)"
-				@focus="focused = true"
-				@blur="focused = false">
+		<template v-if="type != 'file'">
+			<input ref="input"
+					:type="type"
+					:value="v"
+					:required="required"
+					:readonly="readonly"
+					:pattern="pattern"
+					:autocomplete="autocomplete"
+					@input="$emit('input', $event.target.value)"
+					@focus="focused = true"
+					@blur="focused = false">
+		</template>
+		<template v-else>
+			<input ref="input"
+					type="text"
+					:value="placeholder"
+					readonly
+					@click="chooseFile">
+			<input ref="file"
+					type="file"
+					:value="value"
+					@change="onChangeFile">
+		</template>
 		<div class="suffix"><slot name="suffix"></slot></div>
 	</div>
 	<div class="text"><slot name="text"></slot></div>
@@ -59,17 +73,34 @@ export default Vue.extend({
 	},
 	data() {
 		return {
+			v: this.value,
 			focused: false,
-			passwordStrength: ''
-		}
+			passwordStrength: '',
+			styl: 'fill'
+		};
 	},
 	computed: {
 		filled(): boolean {
-			return this.value != '' && this.value != null;
+			return this.v != '' && this.v != null;
+		},
+		placeholder(): string {
+			if (this.type != 'file') return null;
+			if (this.v == null) return null;
+
+			if (typeof this.v == 'string') return this.v;
+
+			if (Array.isArray(this.v)) {
+				return this.v.map(file => file.name).join(', ');
+			} else {
+				return this.v.name;
+			}
 		}
 	},
 	watch: {
 		value(v) {
+			this.v = v;
+		},
+		v(v) {
 			if (this.withPasswordMeter) {
 				if (v == '') {
 					this.passwordStrength = '';
@@ -82,6 +113,12 @@ export default Vue.extend({
 			}
 		}
 	},
+	inject: ['isCardChild'],
+	created() {
+		if (this.isCardChild) {
+			this.styl = 'line';
+		}
+	},
 	mounted() {
 		if (this.$refs.prefix) {
 			this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
@@ -90,6 +127,14 @@ export default Vue.extend({
 	methods: {
 		focus() {
 			this.$refs.input.focus();
+		},
+		chooseFile() {
+			this.$refs.file.click();
+		},
+		onChangeFile() {
+			this.v = Array.from((this.$refs.file as any).files);
+			this.$emit('input', this.v);
+			this.$emit('change', this.v);
 		}
 	}
 });
@@ -98,14 +143,52 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-.ui-input
+root(isDark, fill)
 	margin 32px 0
 
+	> .icon
+		position absolute
+		top 0
+		left 0
+		width 24px
+		text-align center
+		line-height 32px
+		color rgba(#000, 0.54)
+
+		&:not(:empty) + .input
+			margin-left 28px
+
 	> .input
 		display flex
-		padding 6px 12px
-		background rgba(#000, 0.035)
-		border-radius 6px
+
+		if fill
+			padding 6px 12px
+			background rgba(#000, 0.035)
+			border-radius 6px
+		else
+			&:before
+				content ''
+				display block
+				position absolute
+				bottom 0
+				left 0
+				right 0
+				height 1px
+				background rgba(#000, 0.42)
+
+			&:after
+				content ''
+				display block
+				position absolute
+				bottom 0
+				left 0
+				right 0
+				height 2px
+				background $theme-color
+				opacity 0
+				transform scaleX(0.12)
+				transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)
+				will-change border opacity transform
 
 		> .password-meter
 			position absolute
@@ -142,7 +225,7 @@ export default Vue.extend({
 
 		> .label
 			position absolute
-			top 6px
+			top fill ? 6px : 0
 			left 0
 			pointer-events none
 			transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
@@ -161,7 +244,7 @@ export default Vue.extend({
 			width 100%
 			padding 0
 			font inherit
-			font-weight bold
+			font-weight fill ? bold : normal
 			font-size 16px
 			line-height 32px
 			background transparent
@@ -170,6 +253,9 @@ export default Vue.extend({
 			outline none
 			box-shadow none
 
+			&[type='file']
+				display none
+
 		> .prefix
 		> .suffix
 			display block
@@ -199,7 +285,12 @@ export default Vue.extend({
 
 	&.focused
 		> .input
-			background rgba(#000, 0.05)
+			if fill
+				background rgba(#000, 0.05)
+			else
+				&:after
+					opacity 1
+					transform scaleX(1)
 
 			> .label
 				color $theme-color
@@ -208,8 +299,20 @@ export default Vue.extend({
 	&.filled
 		> .input
 			> .label
-				top -24px
+				top fill ? -24px : -16px
 				left 0 !important
 				transform scale(0.8)
 
+.ui-input[data-darkmode]
+	&.fill
+		root(true, true)
+	&:not(.fill)
+		root(true, false)
+
+.ui-input:not([data-darkmode])
+	&.fill
+		root(false, true)
+	&:not(.fill)
+		root(false, false)
+
 </style>
diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue
index e78951a352..f860309867 100644
--- a/src/client/app/common/views/components/ui/switch.vue
+++ b/src/client/app/common/views/components/ui/switch.vue
@@ -143,7 +143,6 @@ root(isDark)
 		> span
 			display block
 			line-height 20px
-			font-weight bold
 			color isDark ? #c4ccd2 : rgba(#000, 0.75)
 			transition inherit
 
diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue
index 0a9f60f1bc..d5e2b15628 100644
--- a/src/client/app/common/views/components/ui/textarea.vue
+++ b/src/client/app/common/views/components/ui/textarea.vue
@@ -65,13 +65,43 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-.ui-textarea
+root(isDark, fill)
 	margin 32px 0
 
 	> .input
 		padding 12px
-		background rgba(#000, 0.035)
-		border-radius 6px
+
+		if fill
+			background rgba(#000, 0.035)
+			border-radius 6px
+		else
+			&:before
+				content ''
+				display block
+				position absolute
+				top 0
+				bottom 0
+				left 0
+				right 0
+				background none
+				border solid 1px rgba(#000, 0.42)
+				border-radius 3px
+				pointer-events none
+
+			&:after
+				content ''
+				display block
+				position absolute
+				top 0
+				bottom 0
+				left 0
+				right 0
+				background none
+				border solid 2px $theme-color
+				border-radius 3px
+				opacity 0
+				transition opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1)
+				pointer-events none
 
 		> .label
 			position absolute
@@ -94,7 +124,7 @@ export default Vue.extend({
 			min-height 100px
 			padding 0
 			font inherit
-			font-weight bold
+			font-weight fill ? bold : normal
 			font-size 16px
 			background transparent
 			border none
@@ -111,7 +141,11 @@ export default Vue.extend({
 
 	&.focused
 		> .input
-			background rgba(#000, 0.05)
+			if fill
+				background rgba(#000, 0.05)
+			else
+				&:after
+					opacity 1
 
 			> .label
 				color $theme-color
@@ -124,4 +158,16 @@ export default Vue.extend({
 				left 0 !important
 				transform scale(0.8)
 
+.ui-textarea[data-darkmode]
+	&.fill
+		root(true, true)
+	&:not(.fill)
+		root(true, false)
+
+.ui-textarea:not([data-darkmode])
+	&.fill
+		root(false, true)
+	&:not(.fill)
+		root(false, false)
+
 </style>
diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue
index de891b5736..64adac01e6 100644
--- a/src/client/app/mobile/views/pages/settings/settings.profile.vue
+++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue
@@ -29,12 +29,12 @@
 
 		<ui-input type="file" @change="onAvatarChange">
 			<span>%i18n:@avatar%</span>
-			<span slot="prefix">%fa:picture-o%</span>
+			<span slot="icon">%fa:image%</span>
 		</ui-input>
 
 		<ui-input type="file" @change="onBannerChange">
 			<span>%i18n:@banner%</span>
-			<span slot="prefix">%fa:picture-o%</span>
+			<span slot="icon">%fa:image%</span>
 		</ui-input>
 
 		<ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch>

From 11e95ea092e2c1e5d8ee3defba3a8a211cc65864 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 18:57:54 +0900
Subject: [PATCH 305/369] wip

---
 .../app/common/views/components/ui/button.vue | 48 ++++++++++++++++---
 1 file changed, 41 insertions(+), 7 deletions(-)

diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue
index 57747fd469..7723c83f57 100644
--- a/src/client/app/common/views/components/ui/button.vue
+++ b/src/client/app/common/views/components/ui/button.vue
@@ -14,6 +14,17 @@ export default Vue.extend({
 			type: String,
 			required: false
 		}
+	},
+	data() {
+		return {
+			styl: 'fill'
+		};
+	},
+	inject: ['isCardChild'],
+	created() {
+		if (this.isCardChild) {
+			this.styl = 'line';
+		}
 	}
 });
 </script>
@@ -21,26 +32,49 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-.ui-button
+root(isDark, fill)
 	> button
 		display block
 		width 100%
 		margin 0
 		padding 0
-		color $theme-color-foreground
 		font-weight bold
 		font-size 16px
 		line-height 44px
-		background $theme-color
 		border none
 		border-radius 6px
 		outline none
 		box-shadow none
 
-		&:hover
-			background lighten($theme-color, 5%)
+		if fill
+			color $theme-color-foreground
+			background $theme-color
 
-		&:active
-			background darken($theme-color, 5%)
+			&:hover
+				background lighten($theme-color, 5%)
+
+			&:active
+				background darken($theme-color, 5%)
+		else
+			color $theme-color
+			background none
+
+			&:hover
+				color darken($theme-color, 5%)
+
+			&:active
+				background rgba($theme-color, 0.3)
+
+.ui-button[data-darkmode]
+	&.fill
+		root(true, true)
+	&:not(.fill)
+		root(true, false)
+
+.ui-button:not([data-darkmode])
+	&.fill
+		root(false, true)
+	&:not(.fill)
+		root(false, false)
 
 </style>

From dec7d537dca22f60ddc595c7fc34eabaca2c13f1 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 20:23:50 +0900
Subject: [PATCH 306/369] wip

---
 .../app/common/views/components/index.ts      |   4 +
 .../app/common/views/components/ui/radio.vue  | 120 ++++++++++
 .../app/common/views/components/ui/select.vue | 212 ++++++++++++++++++
 .../app/common/views/components/ui/switch.vue |   2 +-
 .../app/mobile/views/pages/settings.vue       |  22 +-
 5 files changed, 347 insertions(+), 13 deletions(-)
 create mode 100644 src/client/app/common/views/components/ui/radio.vue
 create mode 100644 src/client/app/common/views/components/ui/select.vue

diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index 0e20e66f5a..b91008f718 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -35,6 +35,8 @@ import uiCard from './ui/card.vue';
 import uiForm from './ui/form.vue';
 import uiTextarea from './ui/textarea.vue';
 import uiSwitch from './ui/switch.vue';
+import uiRadio from './ui/radio.vue';
+import uiSelect from './ui/select.vue';
 
 Vue.component('mk-analog-clock', analogClock);
 Vue.component('mk-menu', menu);
@@ -71,3 +73,5 @@ Vue.component('ui-card', uiCard);
 Vue.component('ui-form', uiForm);
 Vue.component('ui-textarea', uiTextarea);
 Vue.component('ui-switch', uiSwitch);
+Vue.component('ui-radio', uiRadio);
+Vue.component('ui-select', uiSelect);
diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue
new file mode 100644
index 0000000000..2b7f1d9dd4
--- /dev/null
+++ b/src/client/app/common/views/components/ui/radio.vue
@@ -0,0 +1,120 @@
+<template>
+<div
+	class="ui-radio"
+	:class="{ disabled, checked }"
+	:aria-checked="checked"
+	:aria-disabled="disabled"
+	@click="toggle"
+>
+	<input type="radio"
+		:disabled="disabled"
+	>
+	<span class="button">
+		<span></span>
+	</span>
+	<span class="label"><slot></slot></span>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+	model: {
+		prop: 'model',
+		event: 'change'
+	},
+	props: {
+		model: {
+			type: String,
+			required: false
+		},
+		value: {
+			type: String,
+			required: false
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		}
+	},
+	computed: {
+		checked(): boolean {
+			return this.model === this.value;
+		}
+	},
+	methods: {
+		toggle() {
+			this.$emit('change', this.value);
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark)
+	display inline-block
+	margin 32px 32px 32px 0
+	cursor pointer
+	transition all 0.3s
+
+	> *
+		user-select none
+
+	&.disabled
+		opacity 0.6
+		cursor not-allowed
+
+	&.checked
+		> .button
+			border-color $theme-color
+
+			&:after
+				background-color $theme-color
+				transform scale(1)
+				opacity 1
+
+	> input
+		position absolute
+		width 0
+		height 0
+		opacity 0
+		margin 0
+
+	> .button
+		position absolute
+		width 20px
+		height 20px
+		background none
+		border solid 2px rgba(#000, 0.54)
+		border-radius 100%
+		transition inherit
+
+		&:after
+			content ''
+			display block
+			position absolute
+			top 3px
+			right 3px
+			bottom 3px
+			left 3px
+			border-radius 100%
+			opacity 0
+			transform scale(0)
+			transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
+
+	> .label
+		margin-left 28px
+		display block
+		font-size 16px
+		line-height 20px
+		cursor pointer
+
+.ui-radio[data-darkmode]
+	root(true)
+
+.ui-radio:not([data-darkmode])
+	root(false)
+
+</style>
diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue
new file mode 100644
index 0000000000..c56ae86159
--- /dev/null
+++ b/src/client/app/common/views/components/ui/select.vue
@@ -0,0 +1,212 @@
+<template>
+<div class="ui-select" :class="[{ focused, filled }, styl]">
+	<div class="icon" ref="icon"><slot name="icon"></slot></div>
+	<div class="input" @click="focus">
+		<span class="label" ref="label"><slot name="label"></slot></span>
+		<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
+		<select ref="input"
+				:value="v"
+				:required="required"
+				@input="$emit('input', $event.target.value)"
+				@focus="focused = true"
+				@blur="focused = false">
+			<slot></slot>
+		</select>
+		<div class="suffix"><slot name="suffix"></slot></div>
+	</div>
+	<div class="text"><slot name="text"></slot></div>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+
+export default Vue.extend({
+	props: {
+		value: {
+			required: false
+		},
+		required: {
+			type: Boolean,
+			required: false
+		}
+	},
+	data() {
+		return {
+			v: this.value,
+			focused: false,
+			styl: 'fill'
+		};
+	},
+	computed: {
+		filled(): boolean {
+			return this.v != '' && this.v != null;
+		}
+	},
+	watch: {
+		value(v) {
+			this.v = v;
+		}
+	},
+	inject: ['isCardChild'],
+	created() {
+		if (this.isCardChild) {
+			this.styl = 'line';
+		}
+	},
+	mounted() {
+		if (this.$refs.prefix) {
+			this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
+		}
+	},
+	methods: {
+		focus() {
+			this.$refs.input.focus();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+root(isDark, fill)
+	margin 32px 0
+
+	> .icon
+		position absolute
+		top 0
+		left 0
+		width 24px
+		text-align center
+		line-height 32px
+		color rgba(#000, 0.54)
+
+		&:not(:empty) + .input
+			margin-left 28px
+
+	> .input
+		display flex
+
+		if fill
+			padding 6px 12px
+			background rgba(#000, 0.035)
+			border-radius 6px
+		else
+			&:before
+				content ''
+				display block
+				position absolute
+				bottom 0
+				left 0
+				right 0
+				height 1px
+				background rgba(#000, 0.42)
+
+			&:after
+				content ''
+				display block
+				position absolute
+				bottom 0
+				left 0
+				right 0
+				height 2px
+				background $theme-color
+				opacity 0
+				transform scaleX(0.12)
+				transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)
+				will-change border opacity transform
+
+		> .label
+			position absolute
+			top fill ? 6px : 0
+			left 0
+			pointer-events none
+			transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
+			transition-duration 0.3s
+			font-size 16px
+			line-height 32px
+			color rgba(#000, 0.54)
+			pointer-events none
+			//will-change transform
+			transform-origin top left
+			transform scale(1)
+
+		> select
+			display block
+			flex 1
+			width 100%
+			padding 0
+			font inherit
+			font-weight fill ? bold : normal
+			font-size 16px
+			height 32px
+			background transparent
+			border none
+			border-radius 0
+			outline none
+			box-shadow none
+
+			&[type='file']
+				display none
+
+		> .prefix
+		> .suffix
+			display block
+			align-self center
+			justify-self center
+			font-size 16px
+			line-height 32px
+			color rgba(#000, 0.54)
+			pointer-events none
+
+			> *
+				display block
+				min-width 16px
+
+		> .prefix
+			padding-right 4px
+
+		> .suffix
+			padding-left 4px
+
+	> .text
+		margin 6px 0
+		font-size 13px
+
+		*
+			margin 0
+
+	&.focused
+		> .input
+			if fill
+				background rgba(#000, 0.05)
+			else
+				&:after
+					opacity 1
+					transform scaleX(1)
+
+			> .label
+				color $theme-color
+
+	&.focused
+	&.filled
+		> .input
+			> .label
+				top fill ? -24px : -16px
+				left 0 !important
+				transform scale(0.8)
+
+.ui-select[data-darkmode]
+	&.fill
+		root(true, true)
+	&:not(.fill)
+		root(true, false)
+
+.ui-select:not([data-darkmode])
+	&.fill
+		root(false, true)
+	&:not(.fill)
+		root(false, false)
+
+</style>
diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue
index f860309867..2431a76528 100644
--- a/src/client/app/common/views/components/ui/switch.vue
+++ b/src/client/app/common/views/components/ui/switch.vue
@@ -117,7 +117,7 @@ root(isDark)
 		margin 3px 0 0 0
 		width 34px
 		height 14px
-		background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.05)
+		background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.07)
 		outline none
 		border-radius 14px
 		transition inherit
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index 25cfbf732b..beac788482 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -36,8 +36,8 @@
 				<div>
 					<div class="md-body-2">%i18n:@post-style%</div>
 
-					<md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio>
-					<md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio>
+					<ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio>
+					<ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio>
 				</div>
 			</ui-card>
 
@@ -68,17 +68,15 @@
 			<ui-card>
 				<div slot="title">%fa:language% %i18n:@lang%</div>
 
-				<md-field>
-					<md-select v-model="lang" placeholder="%i18n:@auto%">
-						<md-optgroup label="%i18n:@recommended%">
-							<md-option value="">%i18n:@auto%</md-option>
-						</md-optgroup>
+				<ui-select v-model="lang" placeholder="%i18n:@auto%">
+					<optgroup label="%i18n:@recommended%">
+						<option value="">%i18n:@auto%</option>
+					</optgroup>
 
-						<md-optgroup label="%i18n:@specify-language%">
-							<md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option>
-						</md-optgroup>
-					</md-select>
-				</md-field>
+					<optgroup label="%i18n:@specify-language%">
+						<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
+					</optgroup>
+				</ui-select>
 				<span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span>
 			</ui-card>
 

From d90f75425f0449bcb04e462250a4495b63be39a0 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 14 Jun 2018 21:38:39 +0900
Subject: [PATCH 307/369] wip

---
 .../app/common/views/components/ui/card.vue   | 16 ++++---
 .../app/common/views/components/ui/input.vue  | 13 +++---
 .../app/common/views/components/ui/select.vue |  4 +-
 .../app/common/views/components/ui/switch.vue | 43 ++++---------------
 .../common/views/components/ui/textarea.vue   |  7 +--
 5 files changed, 33 insertions(+), 50 deletions(-)

diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue
index 97f06ca655..e2b15240e4 100644
--- a/src/client/app/common/views/components/ui/card.vue
+++ b/src/client/app/common/views/components/ui/card.vue
@@ -22,15 +22,21 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-.ui-card
+root(isDark)
 	margin 16px
 	padding 16px
-	background #fff
+	background isDark ? #282C37 : #fff
 	box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
 
 	> header
-		font-weight bold
-		font-size 28px
-		color #444
+		font-weight normal
+		font-size 24px
+		color isDark ? #fff : #444
+
+.ui-card[data-darkmode]
+	root(true)
+
+.ui-card:not([data-darkmode])
+	root(false)
 
 </style>
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index 3a474f0243..167dd4e2a9 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -153,7 +153,7 @@ root(isDark, fill)
 		width 24px
 		text-align center
 		line-height 32px
-		color rgba(#000, 0.54)
+		color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
 
 		&:not(:empty) + .input
 			margin-left 28px
@@ -174,7 +174,7 @@ root(isDark, fill)
 				left 0
 				right 0
 				height 1px
-				background rgba(#000, 0.42)
+				background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42)
 
 			&:after
 				content ''
@@ -232,7 +232,7 @@ root(isDark, fill)
 			transition-duration 0.3s
 			font-size 16px
 			line-height 32px
-			color rgba(#000, 0.54)
+			color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
 			pointer-events none
 			//will-change transform
 			transform-origin top left
@@ -247,6 +247,7 @@ root(isDark, fill)
 			font-weight fill ? bold : normal
 			font-size 16px
 			line-height 32px
+			color isDark ? #fff : #000
 			background transparent
 			border none
 			border-radius 0
@@ -263,7 +264,7 @@ root(isDark, fill)
 			justify-self center
 			font-size 16px
 			line-height 32px
-			color rgba(#000, 0.54)
+			color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
 			pointer-events none
 
 			> *
@@ -299,9 +300,9 @@ root(isDark, fill)
 	&.filled
 		> .input
 			> .label
-				top fill ? -24px : -16px
+				top fill ? -24px : -17px
 				left 0 !important
-				transform scale(0.8)
+				transform scale(0.75)
 
 .ui-input[data-darkmode]
 	&.fill
diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue
index c56ae86159..4577a15f68 100644
--- a/src/client/app/common/views/components/ui/select.vue
+++ b/src/client/app/common/views/components/ui/select.vue
@@ -193,9 +193,9 @@ root(isDark, fill)
 	&.filled
 		> .input
 			> .label
-				top fill ? -24px : -16px
+				top fill ? -24px : -17px
 				left 0 !important
-				transform scale(0.8)
+				transform scale(0.75)
 
 .ui-select[data-darkmode]
 	&.fill
diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue
index 2431a76528..24611b9aa0 100644
--- a/src/client/app/common/views/components/ui/switch.vue
+++ b/src/client/app/common/views/components/ui/switch.vue
@@ -5,15 +5,13 @@
 	role="switch"
 	:aria-checked="checked"
 	:aria-disabled="disabled"
-	@click="switchValue"
-	@mouseover="mouseenter"
+	@click="toggle"
 >
 	<input
 		type="checkbox"
-		@change="handleChange"
 		ref="input"
 		:disabled="disabled"
-		@keydown.enter="switchValue"
+		@keydown.enter="toggle"
 	>
 	<span class="button">
 		<span></span>
@@ -30,6 +28,10 @@
 <script lang="ts">
 import Vue from 'vue';
 export default Vue.extend({
+	model: {
+		prop: 'value',
+		event: 'change'
+	},
 	props: {
 		value: {
 			type: Boolean,
@@ -39,42 +41,15 @@ export default Vue.extend({
 			type: Boolean,
 			default: false
 		}
-	},/*
-	created() {
-		if (!~[true, false].indexOf(this.value)) {
-			this.$emit('input', false);
-		}
-	},*/
+	},
 	computed: {
 		checked(): boolean {
 			return this.value;
 		}
 	},
-	watch: {
-		value() {
-			(this.$el).style.transition = 'all 0.3s';
-			(this.$refs.input as any).checked = this.checked;
-		}
-	},
-	mounted() {
-		(this.$refs.input as any).checked = this.checked;
-	},
 	methods: {
-		mouseenter() {
-			(this.$el).style.transition = 'all 0s';
-		},
-		handleChange() {
-			(this.$el).style.transition = 'all 0.3s';
-			this.$emit('input', !this.checked);
+		toggle() {
 			this.$emit('change', !this.checked);
-			this.$nextTick(() => {
-				// set input's checked property
-				// in case parent refuses to change component's value
-				(this.$refs.input as any).checked = this.checked;
-			});
-		},
-		switchValue() {
-			!this.disabled && this.handleChange();
 		}
 	}
 });
@@ -117,7 +92,7 @@ root(isDark)
 		margin 3px 0 0 0
 		width 34px
 		height 14px
-		background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.07)
+		background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.25)
 		outline none
 		border-radius 14px
 		transition inherit
diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue
index d5e2b15628..cc6b376ead 100644
--- a/src/client/app/common/views/components/ui/textarea.vue
+++ b/src/client/app/common/views/components/ui/textarea.vue
@@ -84,7 +84,7 @@ root(isDark, fill)
 				left 0
 				right 0
 				background none
-				border solid 1px rgba(#000, 0.42)
+				border solid 1px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42)
 				border-radius 3px
 				pointer-events none
 
@@ -112,7 +112,7 @@ root(isDark, fill)
 			transition-duration 0.3s
 			font-size 16px
 			line-height 32px
-			color rgba(#000, 0.54)
+			color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
 			pointer-events none
 			//will-change transform
 			transform-origin top left
@@ -126,6 +126,7 @@ root(isDark, fill)
 			font inherit
 			font-weight fill ? bold : normal
 			font-size 16px
+			color isDark ? #fff : #000
 			background transparent
 			border none
 			border-radius 0
@@ -156,7 +157,7 @@ root(isDark, fill)
 			> .label
 				top -24px
 				left 0 !important
-				transform scale(0.8)
+				transform scale(0.75)
 
 .ui-textarea[data-darkmode]
 	&.fill

From 0ac9120064b295a363b74a2c2afc487db2b50908 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 07:56:56 +0900
Subject: [PATCH 308/369] wip

---
 .../app/common/views/components/signup.vue    | 10 +--
 .../app/common/views/components/ui/button.vue |  8 +-
 .../app/common/views/components/ui/card.vue   |  4 +
 .../app/common/views/components/ui/form.vue   |  2 +-
 .../app/common/views/components/ui/input.vue  |  8 +-
 .../app/common/views/components/ui/radio.vue  |  2 +-
 .../app/common/views/components/ui/select.vue | 11 ++-
 .../app/common/views/components/ui/switch.vue |  2 +-
 src/client/app/config.ts                      |  4 +
 .../app/mobile/views/pages/settings.vue       | 79 +++++++------------
 .../views/pages/settings/settings.profile.vue | 17 ++--
 src/client/app/mobile/views/pages/welcome.vue |  6 +-
 src/config/types.ts                           |  2 +
 webpack.config.ts                             |  2 +
 14 files changed, 80 insertions(+), 77 deletions(-)

diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue
index d1621a4848..987cc7e52d 100644
--- a/src/client/app/common/views/components/signup.vue
+++ b/src/client/app/common/views/components/signup.vue
@@ -1,6 +1,6 @@
 <template>
-<form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off">
-	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername">
+<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
+	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" required @input="onChangeUsername">
 		<span>%i18n:@username%</span>
 		<span slot="prefix">@</span>
 		<span slot="suffix">@{{ host }}</span>
@@ -12,7 +12,7 @@
 		<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p>
 		<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p>
 	</ui-input>
-	<ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword" :with-password-meter="true">
+	<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true">
 		<span>%i18n:@password%</span>
 		<span slot="prefix">%fa:lock%</span>
 		<div slot="text">
@@ -21,7 +21,7 @@
 			<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p>
 		</div>
 	</ui-input>
-	<ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype">
+	<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype">
 		<span>%i18n:@password% (%i18n:@retype%)</span>
 		<span slot="prefix">%fa:lock%</span>
 		<div slot="text">
@@ -31,7 +31,7 @@
 	</ui-input>
 	<div class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
 	<label class="agree-tou" style="display: block; margin: 16px 0;">
-		<input name="agree-tou" type="checkbox" autocomplete="off" required/>
+		<input name="agree-tou" type="checkbox" required/>
 		<p><a :href="touUrl" target="_blank">利用規約</a>に同意する</p>
 	</label>
 	<ui-button type="submit">%i18n:@create%</ui-button>
diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue
index 7723c83f57..e778750354 100644
--- a/src/client/app/common/views/components/ui/button.vue
+++ b/src/client/app/common/views/components/ui/button.vue
@@ -1,6 +1,6 @@
 <template>
-<div class="ui-button">
-	<button :type="type">
+<div class="ui-button" :class="[styl]">
+	<button :type="type" @click="$emit('click')">
 		<slot></slot>
 	</button>
 </div>
@@ -20,7 +20,9 @@ export default Vue.extend({
 			styl: 'fill'
 		};
 	},
-	inject: ['isCardChild'],
+	inject: {
+		isCardChild: { default: false }
+	},
 	created() {
 		if (this.isCardChild) {
 			this.styl = 'line';
diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue
index e2b15240e4..05c51bca6b 100644
--- a/src/client/app/common/views/components/ui/card.vue
+++ b/src/client/app/common/views/components/ui/card.vue
@@ -25,9 +25,13 @@ export default Vue.extend({
 root(isDark)
 	margin 16px
 	padding 16px
+	color isDark ? #fff : #000
 	background isDark ? #282C37 : #fff
 	box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
 
+	@media (min-width 500px)
+		padding 32px
+
 	> header
 		font-weight normal
 		font-size 24px
diff --git a/src/client/app/common/views/components/ui/form.vue b/src/client/app/common/views/components/ui/form.vue
index b6b4a76d2a..fc8fdad9c4 100644
--- a/src/client/app/common/views/components/ui/form.vue
+++ b/src/client/app/common/views/components/ui/form.vue
@@ -11,7 +11,7 @@ import Vue from 'vue';
 export default Vue.extend({
 	props: {
 		disabled: {
-			type: String,
+			type: Boolean,
 			required: false
 		}
 	}
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index 167dd4e2a9..ec91ca364c 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="ui-input" :class="[{ focused, filled }, styl]">
 	<div class="icon" ref="icon"><slot name="icon"></slot></div>
-	<div class="input" @click="focus">
+	<div class="input" @click="focus" @mousedown="focus">
 		<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
 			<div class="value" ref="passwordMetar"></div>
 		</div>
@@ -62,7 +62,6 @@ export default Vue.extend({
 			required: false
 		},
 		autocomplete: {
-			type: String,
 			required: false
 		},
 		withPasswordMeter: {
@@ -113,7 +112,9 @@ export default Vue.extend({
 			}
 		}
 	},
-	inject: ['isCardChild'],
+	inject: {
+		isCardChild: { default: false }
+	},
 	created() {
 		if (this.isCardChild) {
 			this.styl = 'line';
@@ -160,6 +161,7 @@ root(isDark, fill)
 
 	> .input
 		display flex
+		cursor text
 
 		if fill
 			padding 6px 12px
diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue
index 2b7f1d9dd4..04a46c5a96 100644
--- a/src/client/app/common/views/components/ui/radio.vue
+++ b/src/client/app/common/views/components/ui/radio.vue
@@ -87,7 +87,7 @@ root(isDark)
 		width 20px
 		height 20px
 		background none
-		border solid 2px rgba(#000, 0.54)
+		border solid 2px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
 		border-radius 100%
 		transition inherit
 
diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue
index 4577a15f68..4273a4a0de 100644
--- a/src/client/app/common/views/components/ui/select.vue
+++ b/src/client/app/common/views/components/ui/select.vue
@@ -48,7 +48,9 @@ export default Vue.extend({
 			this.v = v;
 		}
 	},
-	inject: ['isCardChild'],
+	inject: {
+		isCardChild: { default: false }
+	},
 	created() {
 		if (this.isCardChild) {
 			this.styl = 'line';
@@ -101,7 +103,7 @@ root(isDark, fill)
 				left 0
 				right 0
 				height 1px
-				background rgba(#000, 0.42)
+				background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42)
 
 			&:after
 				content ''
@@ -141,14 +143,15 @@ root(isDark, fill)
 			font-weight fill ? bold : normal
 			font-size 16px
 			height 32px
+			color isDark ? #fff : #000
 			background transparent
 			border none
 			border-radius 0
 			outline none
 			box-shadow none
 
-			&[type='file']
-				display none
+			*
+				color #000
 
 		> .prefix
 		> .suffix
diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue
index 24611b9aa0..a9e00d73d2 100644
--- a/src/client/app/common/views/components/ui/switch.vue
+++ b/src/client/app/common/views/components/ui/switch.vue
@@ -92,7 +92,7 @@ root(isDark)
 		margin 3px 0 0 0
 		width 34px
 		height 14px
-		background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.25)
+		background isDark ? rgba(#fff, 0.15) : rgba(#000, 0.25)
 		outline none
 		border-radius 14px
 		transition inherit
diff --git a/src/client/app/config.ts b/src/client/app/config.ts
index 70c085de1c..e4a7ff6d38 100644
--- a/src/client/app/config.ts
+++ b/src/client/app/config.ts
@@ -1,6 +1,8 @@
 declare const _HOST_: string;
 declare const _HOSTNAME_: string;
 declare const _URL_: string;
+declare const _NAME_: string;
+declare const _DESCRIPTION_: string;
 declare const _API_URL_: string;
 declare const _WS_URL_: string;
 declare const _DOCS_URL_: string;
@@ -21,6 +23,8 @@ declare const _GOOGLE_MAPS_API_KEY_: string;
 export const host = _HOST_;
 export const hostname = _HOSTNAME_;
 export const url = _URL_;
+export const name = _NAME_;
+export const description = _DESCRIPTION_;
 export const apiUrl = _API_URL_;
 export const wsUrl = _WS_URL_;
 export const docsUrl = _DOCS_URL_;
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index beac788482..2a32e982ba 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -1,41 +1,27 @@
 <template>
 <mk-ui>
 	<span slot="header">%fa:cog%%i18n:@settings%</span>
-	<main>
-		<p v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p>
+	<main :data-darkmode="$store.state.device.darkmode">
+		<div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></div>
+
 		<div>
 			<x-profile/>
 
 			<ui-card>
 				<div slot="title">%fa:palette% %i18n:@design%</div>
 
-				<div>
-					<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
-				</div>
-
-				<div>
-					<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
-				</div>
+				<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
+				<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
 
 				<div>
 					<div class="md-body-2">%i18n:@timeline%</div>
-
-					<div>
-						<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
-					</div>
-
-					<div>
-						<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
-					</div>
-
-					<div>
-						<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
-					</div>
+					<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
+					<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
+					<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
 				</div>
 
 				<div>
 					<div class="md-body-2">%i18n:@post-style%</div>
-
 					<ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio>
 					<ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio>
 				</div>
@@ -43,26 +29,11 @@
 
 			<ui-card>
 				<div slot="title">%fa:cog% %i18n:@behavior%</div>
-
-				<div>
-					<ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch>
-				</div>
-
-				<div>
-					<ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch>
-				</div>
-
-				<div>
-					<ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch>
-				</div>
-
-				<div>
-					<ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch>
-				</div>
-
-				<div>
-					<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
-				</div>
+				<ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch>
+				<ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch>
+				<ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch>
+				<ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch>
+				<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
 			</ui-card>
 
 			<ui-card>
@@ -98,13 +69,16 @@
 				<template v-if="latestVersion !== undefined">
 					<div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div>
 				</template>
-				<md-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate">
+				<ui-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate">
 					<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
 					<template v-else>%i18n:@check-for-updates%</template>
-				</md-button>
+				</ui-button>
 			</ui-card>
 		</div>
-		<p><small>ver {{ version }} ({{ codename }})</small></p>
+
+		<footer>
+			<small>ver {{ version }} ({{ codename }})</small>
+		</footer>
 	</main>
 </mk-ui>
 </template>
@@ -249,13 +223,18 @@ root(isDark)
 	max-width 500px
 	width 100%
 
-	> p
-		display block
-		margin 16px 0
+	> .signin-as
+		margin 16px
 		padding 16px
 		text-align center
-		color isDark ? #cad2da : #2c662d
-		background #fcfff5
+		color isDark ? #49ab63 : #2c662d
+		background isDark ? #273c34 : #fcfff5
+		box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
+
+	> footer
+		margin 16px
+		text-align center
+		color isDark ? #c9d2e0 : #888
 
 main[data-darkmode]
 	root(true)
diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue
index 64adac01e6..da97cbebd7 100644
--- a/src/client/app/mobile/views/pages/settings/settings.profile.vue
+++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue
@@ -30,11 +30,13 @@
 		<ui-input type="file" @change="onAvatarChange">
 			<span>%i18n:@avatar%</span>
 			<span slot="icon">%fa:image%</span>
+			<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
 		</ui-input>
 
 		<ui-input type="file" @change="onBannerChange">
 			<span>%i18n:@banner%</span>
 			<span slot="icon">%fa:image%</span>
+			<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
 		</ui-input>
 
 		<ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch>
@@ -62,7 +64,8 @@ export default Vue.extend({
 			isBot: false,
 			isCat: false,
 			saving: false,
-			uploading: false
+			avatarUploading: false,
+			bannerUploading: false
 		};
 	},
 
@@ -80,7 +83,7 @@ export default Vue.extend({
 
 	methods: {
 		onAvatarChange([file]) {
-			this.uploading = true;
+			this.avatarUploading = true;
 
 			const data = new FormData();
 			data.append('file', file);
@@ -93,16 +96,16 @@ export default Vue.extend({
 			.then(response => response.json())
 			.then(f => {
 				this.avatarId = f.id;
-				this.uploading = false;
+				this.avatarUploading = false;
 			})
 			.catch(e => {
-				this.uploading = false;
+				this.avatarUploading = false;
 				alert('%18n:!@upload-failed%');
 			});
 		},
 
 		onBannerChange([file]) {
-			this.uploading = true;
+			this.bannerUploading = true;
 
 			const data = new FormData();
 			data.append('file', file);
@@ -115,10 +118,10 @@ export default Vue.extend({
 			.then(response => response.json())
 			.then(f => {
 				this.bannerId = f.id;
-				this.uploading = false;
+				this.bannerUploading = false;
 			})
 			.catch(e => {
-				this.uploading = false;
+				this.bannerUploading = false;
 				alert('%18n:!@upload-failed%');
 			});
 		},
diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue
index 3b37a185bd..3bf2a0af9f 100644
--- a/src/client/app/mobile/views/pages/welcome.vue
+++ b/src/client/app/mobile/views/pages/welcome.vue
@@ -35,7 +35,7 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import { apiUrl, copyright, host } from '../../../config';
+import { apiUrl, copyright, host, name, description } from '../../../config';
 
 export default Vue.extend({
 	data() {
@@ -48,7 +48,9 @@ export default Vue.extend({
 			apiUrl,
 			copyright,
 			users: [],
-			host
+			host,
+			name,
+			description
 		};
 	},
 	mounted() {
diff --git a/src/config/types.ts b/src/config/types.ts
index 910c03c2c1..d557f2afde 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -15,6 +15,8 @@ export type Source = {
 		 */
 		url: string;
 	};
+	name?: string;
+	description?: string;
 	url: string;
 	port: number;
 	https?: { [x: string]: string };
diff --git a/webpack.config.ts b/webpack.config.ts
index 67fb929449..8376cd9c40 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -79,6 +79,8 @@ const consts = {
 	_DEV_URL_: config.dev_url,
 	_LANG_: '%lang%',
 	_LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]),
+	_NAME_: config.name,
+	_DESCRIPTION_: config.description,
 	_HOST_: config.host,
 	_HOSTNAME_: config.hostname,
 	_URL_: config.url,

From bddff17e5e22104a799d0147301570239a895fbc Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 07:58:27 +0900
Subject: [PATCH 309/369] wip

---
 src/client/app/mobile/views/pages/settings.vue | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index 2a32e982ba..1c5a43ede4 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -14,14 +14,14 @@
 				<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
 
 				<div>
-					<div class="md-body-2">%i18n:@timeline%</div>
+					<div>%i18n:@timeline%</div>
 					<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
 					<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
 					<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
 				</div>
 
 				<div>
-					<div class="md-body-2">%i18n:@post-style%</div>
+					<div>%i18n:@post-style%</div>
 					<ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio>
 					<ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio>
 				</div>
@@ -48,7 +48,7 @@
 						<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
 					</optgroup>
 				</ui-select>
-				<span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span>
+				<span>%fa:info-circle% %i18n:@lang-tip%</span>
 			</ui-card>
 
 			<ui-card>
@@ -69,7 +69,7 @@
 				<template v-if="latestVersion !== undefined">
 					<div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div>
 				</template>
-				<ui-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate">
+				<ui-button @click="checkForUpdate" :disabled="checkingForUpdate">
 					<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
 					<template v-else>%i18n:@check-for-updates%</template>
 				</ui-button>

From 3ebaf83ce08e1e9ce4fa016c3ff47a63247c18f8 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 08:00:14 +0900
Subject: [PATCH 310/369] 2.39.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index b1b8888b5c..525c6171ce 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.38.3",
-	"clientVersion": "1.0.6486",
+	"version": "2.39.0",
+	"clientVersion": "1.0.6501",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From ad8aa1c1797c5d740fb6d17ba8e0586472cd25e2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 09:33:25 +0900
Subject: [PATCH 311/369] Fix

---
 src/client/app/common/views/components/ui/input.vue | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index ec91ca364c..a5e47afd53 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -244,6 +244,7 @@ root(isDark, fill)
 			display block
 			flex 1
 			width 100%
+			margin 0
 			padding 0
 			font inherit
 			font-weight fill ? bold : normal

From bd827f946a94061f9f720cafe26323ccb605ee92 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 09:53:30 +0900
Subject: [PATCH 312/369] =?UTF-8?q?=E3=83=89=E3=83=A9=E3=82=A4=E3=83=96?=
 =?UTF-8?q?=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E5=89=8A?=
 =?UTF-8?q?=E9=99=A4=E3=82=92=E5=AE=9F=E8=A3=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../desktop/views/components/drive.file.vue   |  6 ++--
 .../app/desktop/views/components/drive.vue    |  6 ++++
 .../views/components/drive.file-detail.vue    | 20 ++++++------
 .../app/mobile/views/components/drive.vue     |  6 ++++
 src/server/api/endpoints/drive/files.ts       |  6 +++-
 .../api/endpoints/drive/files/delete.ts       | 32 +++++++++++++++++++
 src/services/drive/add-file.ts                | 31 +++---------------
 src/services/drive/delete-file.ts             | 30 +++++++++++++++++
 8 files changed, 98 insertions(+), 39 deletions(-)
 create mode 100644 src/server/api/endpoints/drive/files/delete.ts
 create mode 100644 src/services/drive/delete-file.ts

diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue
index a4531e221f..86addb1318 100644
--- a/src/client/app/desktop/views/components/drive.file.vue
+++ b/src/client/app/desktop/views/components/drive.file.vue
@@ -145,7 +145,7 @@ export default Vue.extend({
 				(this as any).api('drive/files/update', {
 					fileId: this.file.id,
 					name: name
-				})
+				});
 			});
 		},
 
@@ -173,7 +173,9 @@ export default Vue.extend({
 		},
 
 		deleteFile() {
-			alert('not implemented yet');
+			(this as any).api('drive/files/delete', {
+				fileId: this.file.id
+			});
 		}
 	}
 });
diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue
index b69c884089..df141b6d6c 100644
--- a/src/client/app/desktop/views/components/drive.vue
+++ b/src/client/app/desktop/views/components/drive.vue
@@ -118,6 +118,7 @@ export default Vue.extend({
 
 		this.connection.on('file_created', this.onStreamDriveFileCreated);
 		this.connection.on('file_updated', this.onStreamDriveFileUpdated);
+		this.connection.on('file_deleted', this.onStreamDriveFileDeleted);
 		this.connection.on('folder_created', this.onStreamDriveFolderCreated);
 		this.connection.on('folder_updated', this.onStreamDriveFolderUpdated);
 
@@ -130,6 +131,7 @@ export default Vue.extend({
 	beforeDestroy() {
 		this.connection.off('file_created', this.onStreamDriveFileCreated);
 		this.connection.off('file_updated', this.onStreamDriveFileUpdated);
+		this.connection.off('file_deleted', this.onStreamDriveFileDeleted);
 		this.connection.off('folder_created', this.onStreamDriveFolderCreated);
 		this.connection.off('folder_updated', this.onStreamDriveFolderUpdated);
 		(this as any).os.streams.driveStream.dispose(this.connectionId);
@@ -167,6 +169,10 @@ export default Vue.extend({
 			}
 		},
 
+		onStreamDriveFileDeleted(fileId) {
+			this.removeFile(fileId);
+		},
+
 		onStreamDriveFolderCreated(folder) {
 			this.addFolder(folder, true);
 		},
diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue
index ad29135268..f6a22f95f0 100644
--- a/src/client/app/mobile/views/components/drive.file-detail.vue
+++ b/src/client/app/mobile/views/components/drive.file-detail.vue
@@ -34,15 +34,10 @@
 	</div>
 	<div class="menu">
 		<div>
-			<a :href="`${file.url}?download`" :download="file.name">
-				%fa:download%%i18n:@download%
-			</a>
-			<button @click="rename">
-				%fa:pencil-alt%%i18n:@rename%
-			</button>
-			<button @click="move">
-				%fa:R folder-open%%i18n:@move%
-			</button>
+			<a :href="`${file.url}?download`" :download="file.name">%fa:download%%i18n:@download%</a>
+			<button @click="rename">%fa:pencil-alt%%i18n:@rename%</button>
+			<button @click="move">%fa:R folder-open%%i18n:@move%</button>
+			<button @click="del">%fa:trash-alt R%%i18n:@delete%</button>
 		</div>
 	</div>
 	<div class="exif" v-show="exif">
@@ -112,6 +107,13 @@ export default Vue.extend({
 				});
 			});
 		},
+		del() {
+			(this as any).api('drive/files/delete', {
+				fileId: this.file.id
+			}).then(() => {
+				this.browser.cd(this.file.folderId, true);
+			});
+		},
 		showCreatedAt() {
 			alert(new Date(this.file.createdAt).toLocaleString());
 		},
diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue
index 8adf6d8543..c313d225e4 100644
--- a/src/client/app/mobile/views/components/drive.vue
+++ b/src/client/app/mobile/views/components/drive.vue
@@ -100,6 +100,7 @@ export default Vue.extend({
 
 		this.connection.on('file_created', this.onStreamDriveFileCreated);
 		this.connection.on('file_updated', this.onStreamDriveFileUpdated);
+		this.connection.on('file_deleted', this.onStreamDriveFileDeleted);
 		this.connection.on('folder_created', this.onStreamDriveFolderCreated);
 		this.connection.on('folder_updated', this.onStreamDriveFolderUpdated);
 
@@ -118,6 +119,7 @@ export default Vue.extend({
 	beforeDestroy() {
 		this.connection.off('file_created', this.onStreamDriveFileCreated);
 		this.connection.off('file_updated', this.onStreamDriveFileUpdated);
+		this.connection.off('file_deleted', this.onStreamDriveFileDeleted);
 		this.connection.off('folder_created', this.onStreamDriveFolderCreated);
 		this.connection.off('folder_updated', this.onStreamDriveFolderUpdated);
 		(this as any).os.streams.driveStream.dispose(this.connectionId);
@@ -136,6 +138,10 @@ export default Vue.extend({
 			}
 		},
 
+		onStreamDriveFileDeleted(fileId) {
+			this.removeFile(fileId);
+		},
+
 		onStreamDriveFolderCreated(folder) {
 			this.addFolder(folder, true);
 		},
diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts
index ab4b18cef4..0f0e3d65a8 100644
--- a/src/server/api/endpoints/drive/files.ts
+++ b/src/server/api/endpoints/drive/files.ts
@@ -37,10 +37,13 @@ module.exports = async (params, user, app) => {
 	const sort = {
 		_id: -1
 	};
+
 	const query = {
 		'metadata.userId': user._id,
-		'metadata.folderId': folderId
+		'metadata.folderId': folderId,
+		'metadata.deletedAt': { $exists: false }
 	} as any;
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {
@@ -51,6 +54,7 @@ module.exports = async (params, user, app) => {
 			$lt: untilId
 		};
 	}
+
 	if (type) {
 		query.contentType = new RegExp(`^${type.replace(/\*/g, '.+?')}$`);
 	}
diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts
new file mode 100644
index 0000000000..a722b4e825
--- /dev/null
+++ b/src/server/api/endpoints/drive/files/delete.ts
@@ -0,0 +1,32 @@
+import $ from 'cafy'; import ID from '../../../../../cafy-id';
+import DriveFile from '../../../../../models/drive-file';
+import del from '../../../../../services/drive/delete-file';
+import { publishDriveStream } from '../../../../../publishers/stream';
+
+/**
+ * Delete a file
+ */
+module.exports = async (params, user) => {
+	// Get 'fileId' parameter
+	const [fileId, fileIdErr] = $.type(ID).get(params.fileId);
+	if (fileIdErr) throw 'invalid fileId param';
+
+	// Fetch file
+	const file = await DriveFile
+		.findOne({
+			_id: fileId,
+			'metadata.userId': user._id
+		});
+
+	if (file === null) {
+		throw 'file-not-found';
+	}
+
+	// Delete
+	await del(file);
+
+	// Publish file_deleted event
+	publishDriveStream(user._id, 'file_deleted', file._id);
+
+	return;
+};
diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index ace1a6d623..d7f71e8665 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -9,13 +9,14 @@ import * as debug from 'debug';
 import fileType = require('file-type');
 import prominence = require('prominence');
 
-import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile, DriveFileChunk } from '../../models/drive-file';
+import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file';
 import DriveFolder from '../../models/drive-folder';
 import { pack } from '../../models/drive-file';
 import event, { publishDriveStream } from '../../publishers/stream';
 import { isLocalUser, IUser, IRemoteUser } from '../../models/user';
-import DriveFileThumbnail, { getDriveFileThumbnailBucket, DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail';
+import { getDriveFileThumbnailBucket } from '../../models/drive-file-thumbnail';
 import genThumbnail from '../../drive/gen-thumbnail';
+import delFile from './delete-file';
 
 const gm = _gm.subClass({
 	imageMagick: true
@@ -58,31 +59,7 @@ async function deleteOldFile(user: IRemoteUser) {
 	});
 
 	if (oldFile) {
-		// チャンクをすべて削除
-		DriveFileChunk.remove({
-			files_id: oldFile._id
-		});
-
-		DriveFile.update({ _id: oldFile._id }, {
-			$set: {
-				'metadata.deletedAt': new Date(),
-				'metadata.isExpired': true
-			}
-		});
-
-		//#region サムネイルもあれば削除
-		const thumbnail = await DriveFileThumbnail.findOne({
-			'metadata.originalId': oldFile._id
-		});
-
-		if (thumbnail) {
-			DriveFileThumbnailChunk.remove({
-				files_id: thumbnail._id
-			});
-
-			DriveFileThumbnail.remove({ _id: thumbnail._id });
-		}
-		//#endregion
+		delFile(oldFile, true);
 	}
 }
 
diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts
new file mode 100644
index 0000000000..a8ed13bd77
--- /dev/null
+++ b/src/services/drive/delete-file.ts
@@ -0,0 +1,30 @@
+import DriveFile, { DriveFileChunk, IDriveFile } from "../../models/drive-file";
+import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail';
+
+export default async function(file: IDriveFile, isExpired = false) {
+	// チャンクをすべて削除
+	await DriveFileChunk.remove({
+		files_id: file._id
+	});
+
+	await DriveFile.update({ _id: file._id }, {
+		$set: {
+			'metadata.deletedAt': new Date(),
+			'metadata.isExpired': isExpired
+		}
+	});
+
+	//#region サムネイルもあれば削除
+	const thumbnail = await DriveFileThumbnail.findOne({
+		'metadata.originalId': file._id
+	});
+
+	if (thumbnail) {
+		await DriveFileThumbnailChunk.remove({
+			files_id: thumbnail._id
+		});
+
+		await DriveFileThumbnail.remove({ _id: thumbnail._id });
+	}
+	//#endregion
+}

From 7f7d7edc7f38bc7b2d4c075f4f342c882c3c34f5 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 09:53:53 +0900
Subject: [PATCH 313/369] 2.40.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 525c6171ce..af53cb0ab0 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.39.0",
-	"clientVersion": "1.0.6501",
+	"version": "2.40.0",
+	"clientVersion": "1.0.6504",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From fcd437c89fd429a61e774a59b97c28f16676419d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 09:56:59 +0900
Subject: [PATCH 314/369] Fix bug

---
 src/server/api/endpoints/drive.ts | 44 +++++++++++++++----------------
 1 file changed, 21 insertions(+), 23 deletions(-)

diff --git a/src/server/api/endpoints/drive.ts b/src/server/api/endpoints/drive.ts
index d77ab2bbb0..26944dbc15 100644
--- a/src/server/api/endpoints/drive.ts
+++ b/src/server/api/endpoints/drive.ts
@@ -1,34 +1,32 @@
-/**
- * Module dependencies
- */
 import DriveFile from '../../../models/drive-file';
 
 /**
  * Get drive information
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Calculate drive usage
-	const usage = ((await DriveFile
-		.aggregate([
-			{ $match: { 'metadata.userId': user._id } },
-			{
-				$project: {
-					length: true
-				}
-			},
-			{
-				$group: {
-					_id: null,
-					usage: { $sum: '$length' }
-				}
+	const usage = await DriveFile
+		.aggregate([{
+			$match: {
+				'metadata.userId': user._id,
+				'metadata.deletedAt': { $exists: false }
 			}
-		]))[0] || {
-			usage: 0
-		}).usage;
+		}, {
+			$project: {
+				length: true
+			}
+		}, {
+			$group: {
+				_id: null,
+				usage: { $sum: '$length' }
+			}
+		}])
+		.then((aggregates: any[]) => {
+			if (aggregates.length > 0) {
+				return aggregates[0].usage;
+			}
+			return 0;
+		});
 
 	res({
 		capacity: user.driveCapacity,

From ca668898f4f6449ceeb15a655501a004752fd60c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 09:57:06 +0900
Subject: [PATCH 315/369] 2.40.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index af53cb0ab0..5643a8fb18 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.40.0",
+	"version": "2.40.1",
 	"clientVersion": "1.0.6504",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From b1b1b7592b8a3b9df3db58e03806bf3340320eb8 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 13:08:56 +0900
Subject: [PATCH 316/369] :v:

---
 src/client/app/common/views/components/signup.vue    |  2 +-
 src/client/app/common/views/components/ui/input.vue  |  4 ++++
 .../app/common/views/components/ui/textarea.vue      |  2 +-
 .../app/common/views/components/welcome-timeline.vue |  3 +++
 src/client/app/mobile/views/pages/signup.vue         |  2 +-
 src/client/app/mobile/views/pages/welcome.vue        | 12 +++++++++++-
 6 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue
index 987cc7e52d..62373a59ec 100644
--- a/src/client/app/common/views/components/signup.vue
+++ b/src/client/app/common/views/components/signup.vue
@@ -1,6 +1,6 @@
 <template>
 <form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
-	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" required @input="onChangeUsername">
+	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
 		<span>%i18n:@username%</span>
 		<span slot="prefix">@</span>
 		<span slot="suffix">@{{ host }}</span>
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index a5e47afd53..504f1e32d3 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -15,6 +15,7 @@
 					:readonly="readonly"
 					:pattern="pattern"
 					:autocomplete="autocomplete"
+					:spellcheck="spellcheck"
 					@input="$emit('input', $event.target.value)"
 					@focus="focused = true"
 					@blur="focused = false">
@@ -64,6 +65,9 @@ export default Vue.extend({
 		autocomplete: {
 			required: false
 		},
+		spellcheck: {
+			required: false
+		},
 		withPasswordMeter: {
 			type: Boolean,
 			required: false,
diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue
index cc6b376ead..60fe1cdd82 100644
--- a/src/client/app/common/views/components/ui/textarea.vue
+++ b/src/client/app/common/views/components/ui/textarea.vue
@@ -66,7 +66,7 @@ export default Vue.extend({
 @import '~const.styl'
 
 root(isDark, fill)
-	margin 32px 0
+	margin 42px 0 32px 0
 
 	> .input
 		padding 12px
diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue
index a9d558df66..f3372bf062 100644
--- a/src/client/app/common/views/components/welcome-timeline.vue
+++ b/src/client/app/common/views/components/welcome-timeline.vue
@@ -109,6 +109,9 @@ root(isDark)
 					> .created-at
 						color isDark ? #606984 : #c0c0c0
 
+			> .text
+				text-align left
+
 .mk-welcome-timeline[data-darkmode]
 	root(true)
 
diff --git a/src/client/app/mobile/views/pages/signup.vue b/src/client/app/mobile/views/pages/signup.vue
index 47384e2b3c..238d386efc 100644
--- a/src/client/app/mobile/views/pages/signup.vue
+++ b/src/client/app/mobile/views/pages/signup.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="signup">
-	<h1>Misskeyをはじめる</h1>
+	<h1>📦 始めましょう</h1>
 	<mk-signup/>
 </div>
 </template>
diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue
index 3bf2a0af9f..79648ac425 100644
--- a/src/client/app/mobile/views/pages/welcome.vue
+++ b/src/client/app/mobile/views/pages/welcome.vue
@@ -22,10 +22,13 @@
 				<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
 				<ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button>
 			</form>
-			<div>
+			<div style="margin: 8px 0;">
 				<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
 			</div>
 		</div>
+		<div class="tl">
+			<mk-welcome-timeline/>
+		</div>
 		<footer>
 			<small>{{ copyright }}</small>
 		</footer>
@@ -154,6 +157,13 @@ export default Vue.extend({
 						border-color #444
 						box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2)
 
+		> .tl
+			> *
+				max-height 300px
+				border-radius 6px
+				overflow auto
+				-webkit-overflow-scrolling touch
+
 		> footer
 			text-align center
 			color #444

From a44387f250ce8de6261d39d0287655344a7c8c46 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 13:58:09 +0900
Subject: [PATCH 317/369] :v:

---
 .config/example.yml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/.config/example.yml b/.config/example.yml
index 955acfabf6..427377a694 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -1,3 +1,9 @@
+# インスタンス名
+name:
+
+# インスタンスの紹介
+description:
+
 # サーバーのメンテナ情報
 maintainer:
   # メンテナの名前

From e6f33e997fbbcdee7b661f4a78b01767b5d6b2f8 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 19:56:18 +0900
Subject: [PATCH 318/369] :art:

---
 locales/ja.yml                                |   2 +-
 .../app/common/views/components/forkit.vue    |   3 -
 .../app/common/views/components/signin.vue    |  26 +-
 .../app/common/views/components/ui/input.vue  |   5 +-
 src/client/app/config.ts                      |   2 +
 .../app/desktop/views/pages/welcome.vue       | 293 +++++++++---------
 src/client/assets/pointer.png                 | Bin 0 -> 252860 bytes
 src/config/types.ts                           |   1 +
 webpack.config.ts                             |   3 +-
 9 files changed, 169 insertions(+), 166 deletions(-)
 create mode 100644 src/client/assets/pointer.png

diff --git a/locales/ja.yml b/locales/ja.yml
index ed0691ea50..86b16adaad 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -3,7 +3,7 @@ meta:
   divider: ""
 
 common:
-  misskey: "A planet of fediverse"
+  misskey: "A ⭐ of fediverse"
   about-title: "A ⭐ of fediverse."
   about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
 
diff --git a/src/client/app/common/views/components/forkit.vue b/src/client/app/common/views/components/forkit.vue
index bb71db19db..de627181ef 100644
--- a/src/client/app/common/views/components/forkit.vue
+++ b/src/client/app/common/views/components/forkit.vue
@@ -13,9 +13,6 @@
 
 .a
 	display block
-	position fixed
-	top 0
-	right 0
 
 	> svg
 		display block
diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue
index 6b9d58e0a8..66e0c68e30 100644
--- a/src/client/app/common/views/components/signin.vue
+++ b/src/client/app/common/views/components/signin.vue
@@ -1,22 +1,23 @@
 <template>
 <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit">
-	<label class="user-name">
-		<input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="%i18n:@username%" autofocus required @change="onUsernameChange"/>%fa:at%
-	</label>
-	<label class="password">
-		<input v-model="password" type="password" placeholder="%i18n:@password%" required/>%fa:lock%
-	</label>
-	<label class="token" v-if="user && user.twoFactorEnabled">
-		<input v-model="token" type="number" placeholder="%i18n:@token%" required/>%fa:lock%
-	</label>
-	<button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</button>
-	もしくは <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
+	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange">
+		<span>%i18n:@username%</span>
+		<span slot="prefix">@</span>
+		<span slot="suffix">@{{ host }}</span>
+	</ui-input>
+	<ui-input v-model="password" type="password" required>
+		<span>%i18n:@password%</span>
+		<span slot="prefix">%fa:lock%</span>
+	</ui-input>
+	<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
+	<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
+	<p style="margin: 8px 0;">または<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a></p>
 </form>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
-import { apiUrl } from '../../../config';
+import { apiUrl, host } from '../../../config';
 
 export default Vue.extend({
 	data() {
@@ -27,6 +28,7 @@ export default Vue.extend({
 			password: '',
 			token: '',
 			apiUrl,
+			host
 		};
 	},
 	methods: {
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index 504f1e32d3..525ff71c08 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -10,13 +10,12 @@
 		<template v-if="type != 'file'">
 			<input ref="input"
 					:type="type"
-					:value="v"
+					v-model="v"
 					:required="required"
 					:readonly="readonly"
 					:pattern="pattern"
 					:autocomplete="autocomplete"
 					:spellcheck="spellcheck"
-					@input="$emit('input', $event.target.value)"
 					@focus="focused = true"
 					@blur="focused = false">
 		</template>
@@ -104,6 +103,8 @@ export default Vue.extend({
 			this.v = v;
 		},
 		v(v) {
+			this.$emit('input', v);
+
 			if (this.withPasswordMeter) {
 				if (v == '') {
 					this.passwordStrength = '';
diff --git a/src/client/app/config.ts b/src/client/app/config.ts
index e4a7ff6d38..c6efe26cd5 100644
--- a/src/client/app/config.ts
+++ b/src/client/app/config.ts
@@ -19,6 +19,7 @@ declare const _VERSION_: string;
 declare const _CODENAME_: string;
 declare const _LICENSE_: string;
 declare const _GOOGLE_MAPS_API_KEY_: string;
+declare const _WELCOME_BG_URL_: string;
 
 export const host = _HOST_;
 export const hostname = _HOSTNAME_;
@@ -41,3 +42,4 @@ export const version = _VERSION_;
 export const codename = _CODENAME_;
 export const license = _LICENSE_;
 export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
+export const welcomeBgUrl = _WELCOME_BG_URL_;
diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index 688d3e21cb..a3ca98eb6f 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -1,36 +1,39 @@
 <template>
 <div class="mk-welcome">
+	<img ref="pointer" class="pointer" src="/assets/pointer.png" alt="">
 	<button @click="dark">
 		<template v-if="$store.state.device.darkmode">%fa:moon%</template>
 		<template v-else>%fa:R moon%</template>
 	</button>
-	<main v-if="about" class="about">
-		<article>
-			<h1>%i18n:common.about-title%</h1>
-			<p v-html="'%i18n:common.about%'"></p>
-			<span class="gotit" @click="about = false">%i18n:@gotit%</span>
-		</article>
-	</main>
-	<main v-else class="index">
-		<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey">
-		<p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p>
-		<p class="account">
-			<button class="signup" @click="signup">%i18n:@signup-button%</button>
-			<button class="signin" @click="signin">%i18n:@signin-button%</button>
-		</p>
-
-		<div class="tl">
-			<header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header>
-			<mk-welcome-timeline/>
+	<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
+		<div class="container">
+			<div class="info">
+				<span>%i18n:common.misskey% <b>{{ host }}</b></span>
+				<span class="stats" v-if="stats">
+					<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
+					<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
+				</span>
+			</div>
+			<main>
+				<div class="about">
+					<h1 v-if="name">{{ name }}</h1>
+					<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"></h1>
+					<p class="powerd-by" v-if="name">powerd by <b>Misskey</b></p>
+					<p class="desc" v-html="description || '%i18n:common.about%'"></p>
+					<a ref="signup" @click="signup">%i18n:@signup%</a>
+				</div>
+				<div class="login">
+					<mk-signin/>
+				</div>
+			</main>
+			<mk-nav class="nav"/>
 		</div>
-	</main>
-	<mk-forkit/>
-	<footer>
-		<div>
-			<mk-nav :class="$style.nav"/>
-			<p class="c">{{ copyright }}</p>
-		</div>
-	</footer>
+		<mk-forkit class="forkit"/>
+		<img src="assets/title.dark.svg" alt="Misskey">
+	</div>
+	<div class="tl">
+		<mk-welcome-timeline/>
+	</div>
 	<modal name="signup" width="500px" height="auto" scrollable>
 		<header :class="$style.signupFormHeader">%i18n:@signup%</header>
 		<mk-signup :class="$style.signupForm"/>
@@ -44,15 +47,27 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import { copyright } from '../../../config';
+import { host, copyright, welcomeBgUrl } from '../../../config';
 
 export default Vue.extend({
 	data() {
 		return {
-			about: false,
-			copyright
+			stats: null,
+			copyright,
+			welcomeBgUrl,
+			host
 		};
 	},
+	created() {
+		(this as any).api('stats').then(stats => {
+			this.stats = stats;
+		});
+	},
+	mounted() {
+		const x = this.$refs.signup.getBoundingClientRect();
+		this.$refs.pointer.style.top = x.top + x.height + 'px';
+		this.$refs.pointer.style.left = x.left + 'px';
+	},
 	methods: {
 		signup() {
 			this.$modal.show('signup');
@@ -80,13 +95,20 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-@import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css);
-
 root(isDark)
+	display flex
 	min-height 100vh
-	background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg')
-	background-size cover
-	background-position center
+
+	> .pointer
+		display block
+		position absolute
+		z-index 1
+		top 0
+		right 0
+		width 180px
+		margin 0 0 0 -180px
+		transform rotateY(180deg) translateX(-10px) translateY(-25px)
+		pointer-events none
 
 	> button
 		position fixed
@@ -95,140 +117,117 @@ root(isDark)
 		left 0
 		padding 16px
 		font-size 18px
-		color isDark ? #fff : #555
+		color #fff
 
-	> main
+		display none // TODO
+
+	> .body
 		flex 1
 		padding 64px 0 0 0
 		text-align center
+		background #578394
+		background-position center
+		background-size cover
 
-		&.about
-			font-family 'Noto Sans JP'
-			color isDark ? #fff : #627574
+		&:before
+			content ''
+			display block
+			position absolute
+			top 0
+			left 0
+			right 0
+			bottom 0
+			background rgba(#000, 0.5)
 
-			> article
-				max-width 700px
-				margin 42px auto 0 auto
-				padding 64px 82px
-				background isDark ? #282C37 : #fff
-				box-shadow 0 8px 32px rgba(#000, 0.15)
+		> .forkit
+			position absolute
+			top 0
+			right 0
 
-				> h1
-					margin 0
-					font-weight 900
+		> img
+			position absolute
+			bottom 16px
+			right 16px
+			width 150px
 
-				> p
-					margin 20px 0
-					line-height 2em
+		> .container
+			$aboutWidth = 380px
+			$loginWidth = 340px
+			$width = $aboutWidth + $loginWidth
 
-				> .gotit
-					color $theme-color
-					cursor pointer
-
-					&:hover
-						text-decoration underline
-
-		&.index
-			color isDark ? #9aa4b3 : #555
-
-			> img
-				width 350px
-
-			> .desc
-				margin -12px 0 24px 0
-				color isDark ? #fff : #555
-
-				> span
-					color $theme-color
-					cursor pointer
-
-					&:hover
-						text-decoration underline
-
-			> .account
-				margin 8px 0
-				line-height 2em
-
-				button
-					padding 8px 16px
-					font-size inherit
-
-				.signup
-					color $theme-color
-					border solid 2px $theme-color
-					border-radius 4px
-
-					&:focus
-						box-shadow 0 0 0 3px rgba($theme-color, 0.2)
-
-					&:hover
-						color $theme-color-foreground
-						background $theme-color
-
-					&:active
-						color $theme-color-foreground
-						background darken($theme-color, 10%)
-						border-color darken($theme-color, 10%)
-
-				.signin
-					&:hover
-						color isDark ? #fff : #000
-
-			> .tl
-				margin 32px auto 0 auto
-				width 410px
-				text-align left
-				background isDark ? #313543 : #fff
+			> .info
+				margin 0 auto 16px auto
+				padding 12px
+				width $width
+				font-size 14px
+				color #fff
+				background rgba(#000, 0.2)
+				border-radius 8px
+
+				> .stats
+					margin-left 16px
+					padding-left 16px
+					border-left solid 1px #fff
+
+					> *
+						margin-right 16px
+
+			> main
+				display flex
+				margin auto
+				width $width
 				border-radius 8px
-				box-shadow 0 8px 32px rgba(#000, 0.15)
 				overflow hidden
+				box-shadow 0 2px 8px rgba(#000, 0.3)
 
-				> header
-					z-index 1
-					padding 12px 16px
-					color isDark ? #e3e5e8 : #888d94
-					box-shadow 0 1px 0px rgba(#000, 0.1)
+				> .about
+					width $aboutWidth
+					color #444
+					background #fff
 
-					> div
-						position absolute
-						top 0
-						right 0
-						padding inherit
+					> h1
+						margin 0 0 16px 0
+						padding 32px 32px 0 32px
+						color #444
 
-						> span
-							display inline-block
-							height 11px
-							width 11px
-							margin-left 6px
-							border-radius 100%
-							vertical-align middle
+						> img
+							width 170px
+							vertical-align bottom
 
-							&:nth-child(1)
-								background #5BCC8B
+					> .powerd-by
+						margin 16px
+						opacity 0.7
 
-							&:nth-child(2)
-								background #E6BB46
+					> .desc
+						margin 0
+						padding 0 32px 16px 32px
 
-							&:nth-child(3)
-								background #DF7065
+					> a
+						display inline-block
+						margin 0 0 32px 0
+						font-weight bold
 
-				> .mk-welcome-timeline
-					max-height 350px
-					overflow auto
+				> .login
+					width $loginWidth
+					padding 16px 32px 32px 32px
+					background #f5f5f5
 
-	> footer
-		font-size 12px
-		color isDark ? #949ea5 : #737c82
+			> .nav
+				display block
+				margin 16px 0
+				font-size 14px
+				color #fff
 
-		> div
-			margin 0 auto
-			padding 64px
-			text-align center
+	> .tl
+		margin 0
+		width 410px
+		height 100vh
+		text-align left
+		background isDark ? #313543 : #fff
 
-			> .c
-				margin 16px 0 0 0
-				font-size 10px
-				opacity 0.7
+		> *
+			max-height 100%
+			overflow auto
 
 .mk-welcome[data-darkmode]
 	root(true)
diff --git a/src/client/assets/pointer.png b/src/client/assets/pointer.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8bd07a3ae30be502a71df97758c47bdc5af5420
GIT binary patch
literal 252860
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

literal 0
HcmV?d00001

diff --git a/src/config/types.ts b/src/config/types.ts
index d557f2afde..62f63d4a3c 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -17,6 +17,7 @@ export type Source = {
 	};
 	name?: string;
 	description?: string;
+	welcome_bg_url?: string;
 	url: string;
 	port: number;
 	https?: { [x: string]: string };
diff --git a/webpack.config.ts b/webpack.config.ts
index 8376cd9c40..480f5d4a7a 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -85,7 +85,8 @@ const consts = {
 	_HOSTNAME_: config.hostname,
 	_URL_: config.url,
 	_LICENSE_: licenseHtml,
-	_GOOGLE_MAPS_API_KEY_: config.google_maps_api_key
+	_GOOGLE_MAPS_API_KEY_: config.google_maps_api_key,
+	_WELCOME_BG_URL_: config.welcome_bg_url
 };
 
 const _consts = {};

From 392cb1ba893a66f7912e6b3738239d0fe7a41f90 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 19:57:13 +0900
Subject: [PATCH 319/369] 2.41.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 5643a8fb18..12e4cf870c 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.40.1",
-	"clientVersion": "1.0.6504",
+	"version": "2.41.0",
+	"clientVersion": "1.0.6510",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 07265f594ba857a6829b62cb37a06781970bb901 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 19:58:04 +0900
Subject: [PATCH 320/369] :v:

---
 src/client/app/desktop/views/pages/welcome.vue | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index a3ca98eb6f..9687eea2ec 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -47,7 +47,7 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import { host, copyright, welcomeBgUrl } from '../../../config';
+import { host, name, description, copyright, welcomeBgUrl } from '../../../config';
 
 export default Vue.extend({
 	data() {
@@ -55,7 +55,9 @@ export default Vue.extend({
 			stats: null,
 			copyright,
 			welcomeBgUrl,
-			host
+			host,
+			name,
+			description
 		};
 	},
 	created() {

From 7c596be6383b1fd8d29ad0d58f3c27add25df0bd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 15 Jun 2018 19:58:15 +0900
Subject: [PATCH 321/369] 2.41.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 12e4cf870c..64ba6d70f2 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.41.0",
-	"clientVersion": "1.0.6510",
+	"version": "2.41.1",
+	"clientVersion": "1.0.6512",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From fa5a82c9ab43b38f8d33a849924220b5ee1d2083 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 07:06:58 +0900
Subject: [PATCH 322/369] :v:

---
 .../app/common/views/components/signin.vue    |  2 +-
 .../app/common/views/components/ui/input.vue  | 45 +++++++++++++------
 2 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue
index 66e0c68e30..d876fc7a0c 100644
--- a/src/client/app/common/views/components/signin.vue
+++ b/src/client/app/common/views/components/signin.vue
@@ -1,6 +1,6 @@
 <template>
 <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit">
-	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange">
+	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @change="onUsernameChange">
 		<span>%i18n:@username%</span>
 		<span slot="prefix">@</span>
 		<span slot="suffix">@{{ host }}</span>
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index 525ff71c08..0d11c14131 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="ui-input" :class="[{ focused, filled }, styl]">
 	<div class="icon" ref="icon"><slot name="icon"></slot></div>
-	<div class="input" @click="focus" @mousedown="focus">
+	<div class="input">
 		<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
 			<div class="value" ref="passwordMetar"></div>
 		</div>
@@ -30,7 +30,7 @@
 					:value="value"
 					@change="onChangeFile">
 		</template>
-		<div class="suffix"><slot name="suffix"></slot></div>
+		<div class="suffix" ref="suffix"><slot name="suffix"></slot></div>
 	</div>
 	<div class="text"><slot name="text"></slot></div>
 </div>
@@ -128,6 +128,14 @@ export default Vue.extend({
 	mounted() {
 		if (this.$refs.prefix) {
 			this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
+			if (this.$refs.prefix.offsetWidth) {
+				this.$refs.input.style.paddingLeft = this.$refs.prefix.offsetWidth + 'px';
+			}
+		}
+		if (this.$refs.suffix) {
+			if (this.$refs.suffix.offsetWidth) {
+				this.$refs.input.style.paddingRight = this.$refs.suffix.offsetWidth + 'px';
+			}
 		}
 	},
 	methods: {
@@ -165,14 +173,8 @@ root(isDark, fill)
 			margin-left 28px
 
 	> .input
-		display flex
-		cursor text
 
-		if fill
-			padding 6px 12px
-			background rgba(#000, 0.035)
-			border-radius 6px
-		else
+		if !fill
 			&:before
 				content ''
 				display block
@@ -232,6 +234,7 @@ root(isDark, fill)
 
 		> .label
 			position absolute
+			z-index 1
 			top fill ? 6px : 0
 			left 0
 			pointer-events none
@@ -247,7 +250,6 @@ root(isDark, fill)
 
 		> input
 			display block
-			flex 1
 			width 100%
 			margin 0
 			padding 0
@@ -262,29 +264,46 @@ root(isDark, fill)
 			outline none
 			box-shadow none
 
+			if fill
+				padding 6px 12px
+				background rgba(#000, 0.035)
+				border-radius 6px
+
 			&[type='file']
 				display none
 
 		> .prefix
 		> .suffix
 			display block
-			align-self center
-			justify-self center
+			position absolute
+			z-index 1
+			top 0
 			font-size 16px
-			line-height 32px
+			line-height fill ? 44px : 32px
 			color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
 			pointer-events none
 
+			&:empty
+				display none
+
 			> *
 				display block
 				min-width 16px
 
 		> .prefix
+			left 0
 			padding-right 4px
 
+			if fill
+				padding-left 12px
+
 		> .suffix
+			right 0
 			padding-left 4px
 
+			if fill
+				padding-right 12px
+
 	> .text
 		margin 6px 0
 		font-size 13px

From b600d462c11c08d42d017aa64ee6a9ed9aa95d03 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 07:13:45 +0900
Subject: [PATCH 323/369] :v:

---
 src/client/app/desktop/views/pages/welcome.vue | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index 9687eea2ec..6f6a1b8665 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -57,7 +57,8 @@ export default Vue.extend({
 			welcomeBgUrl,
 			host,
 			name,
-			description
+			description,
+			pointerInterval: null
 		};
 	},
 	created() {
@@ -66,11 +67,18 @@ export default Vue.extend({
 		});
 	},
 	mounted() {
-		const x = this.$refs.signup.getBoundingClientRect();
-		this.$refs.pointer.style.top = x.top + x.height + 'px';
-		this.$refs.pointer.style.left = x.left + 'px';
+		this.point();
+		this.pointerInterval = setInterval(this.point, 100);
+	},
+	beforeDestroy() {
+		clearInterval(this.pointerInterval);
 	},
 	methods: {
+		point() {
+			const x = this.$refs.signup.getBoundingClientRect();
+			this.$refs.pointer.style.top = x.top + x.height + 'px';
+			this.$refs.pointer.style.left = x.left + 'px';
+		},
 		signup() {
 			this.$modal.show('signup');
 		},
@@ -109,7 +117,7 @@ root(isDark)
 		right 0
 		width 180px
 		margin 0 0 0 -180px
-		transform rotateY(180deg) translateX(-10px) translateY(-25px)
+		transform rotateY(180deg) translateX(-10px) translateY(-48px)
 		pointer-events none
 
 	> button

From 65f35dc9f418c430d1a3cd42b6d53d128fe4e498 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 07:31:35 +0900
Subject: [PATCH 324/369] :v:

---
 .../app/common/views/components/signin.vue    | 90 +++----------------
 .../app/desktop/views/pages/welcome.vue       | 48 +++++-----
 2 files changed, 38 insertions(+), 100 deletions(-)

diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue
index d876fc7a0c..3473d313c8 100644
--- a/src/client/app/common/views/components/signin.vue
+++ b/src/client/app/common/views/components/signin.vue
@@ -1,6 +1,7 @@
 <template>
 <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit">
-	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @change="onUsernameChange">
+	<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }"></div>
+	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange">
 		<span>%i18n:@username%</span>
 		<span slot="prefix">@</span>
 		<span slot="suffix">@{{ host }}</span>
@@ -37,6 +38,8 @@ export default Vue.extend({
 				username: this.username
 			}).then(user => {
 				this.user = user;
+			}, () => {
+				this.user = null;
 			});
 		},
 		onSubmit() {
@@ -61,84 +64,19 @@ export default Vue.extend({
 @import '~const.styl'
 
 .mk-signin
+	color #555
+
 	&.signing
 		&, *
 			cursor wait !important
 
-	label
-		display block
-		margin 12px 0
-
-		[data-fa]
-			display block
-			pointer-events none
-			position absolute
-			bottom 0
-			top 0
-			left 0
-			z-index 1
-			margin auto
-			padding 0 16px
-			height 1em
-			color #898786
-
-		input[type=text]
-		input[type=password]
-		input[type=number]
-			user-select text
-			display inline-block
-			cursor auto
-			padding 0 0 0 38px
-			margin 0
-			width 100%
-			line-height 44px
-			font-size 1em
-			color rgba(#000, 0.7)
-			background #fff
-			outline none
-			border solid 1px #eee
-			border-radius 4px
-
-			&:hover
-				background rgba(255, 255, 255, 0.7)
-				border-color #ddd
-
-				& + i
-					color #797776
-
-			&:focus
-				background #fff
-				border-color #ccc
-
-				& + i
-					color #797776
-
-	[type=submit]
-		cursor pointer
-		padding 16px
-		margin -6px 0 0 0
-		width 100%
-		font-size 1.2em
-		color rgba(#000, 0.5)
-		outline none
-		border none
-		border-radius 0
-		background transparent
-		transition all .5s ease
-
-		&:hover
-			color $theme-color
-			transition all .2s ease
-
-		&:focus
-			color $theme-color
-			transition all .2s ease
-
-		&:active
-			color darken($theme-color, 30%)
-			transition all .2s ease
-
-		&:disabled
-			opacity 0.7
+	> .avatar
+		margin 16px auto 0 auto
+		width 64px
+		height 64px
+		background #ddd
+		background-position center
+		background-size cover
+		border-radius 100%
 
 </style>
diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index 6f6a1b8665..e7b09331be 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -7,13 +7,6 @@
 	</button>
 	<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
 		<div class="container">
-			<div class="info">
-				<span>%i18n:common.misskey% <b>{{ host }}</b></span>
-				<span class="stats" v-if="stats">
-					<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
-					<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
-				</span>
-			</div>
 			<main>
 				<div class="about">
 					<h1 v-if="name">{{ name }}</h1>
@@ -26,6 +19,13 @@
 					<mk-signin/>
 				</div>
 			</main>
+			<div class="info">
+				<span>%i18n:common.misskey% <b>{{ host }}</b></span>
+				<span class="stats" v-if="stats">
+					<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
+					<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
+				</span>
+			</div>
 			<mk-nav class="nav"/>
 		</div>
 		<mk-forkit class="forkit"/>
@@ -165,23 +165,6 @@ root(isDark)
 			$loginWidth = 340px
 			$width = $aboutWidth + $loginWidth
 
-			> .info
-				margin 0 auto 16px auto
-				padding 12px
-				width $width
-				font-size 14px
-				color #fff
-				background rgba(#000, 0.2)
-				border-radius 8px
-
-				> .stats
-					margin-left 16px
-					padding-left 16px
-					border-left solid 1px #fff
-
-					> *
-						margin-right 16px
-
 			> main
 				display flex
 				margin auto
@@ -222,6 +205,23 @@ root(isDark)
 					padding 16px 32px 32px 32px
 					background #f5f5f5
 
+			> .info
+				margin 16px auto
+				padding 12px
+				width $width
+				font-size 14px
+				color #fff
+				background rgba(#000, 0.2)
+				border-radius 8px
+
+				> .stats
+					margin-left 16px
+					padding-left 16px
+					border-left solid 1px #fff
+
+					> *
+						margin-right 16px
+
 			> .nav
 				display block
 				margin 16px 0

From c9d993b83849cab7599fac3948f76c8f5f196899 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 07:40:07 +0900
Subject: [PATCH 325/369] :v:

---
 .../app/common/views/components/signin.vue    |  9 ++-
 .../app/desktop/views/pages/welcome.vue       |  4 --
 src/client/app/mobile/views/pages/welcome.vue | 71 ++++++-------------
 3 files changed, 28 insertions(+), 56 deletions(-)

diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue
index 3473d313c8..58241cef09 100644
--- a/src/client/app/common/views/components/signin.vue
+++ b/src/client/app/common/views/components/signin.vue
@@ -1,6 +1,6 @@
 <template>
 <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit">
-	<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }"></div>
+	<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
 	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange">
 		<span>%i18n:@username%</span>
 		<span slot="prefix">@</span>
@@ -21,6 +21,13 @@ import Vue from 'vue';
 import { apiUrl, host } from '../../../config';
 
 export default Vue.extend({
+	props: {
+		withAvatar: {
+			type: Boolean,
+			required: false,
+			default: true
+		}
+	},
 	data() {
 		return {
 			signing: false,
diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue
index e7b09331be..70fa0123af 100644
--- a/src/client/app/desktop/views/pages/welcome.vue
+++ b/src/client/app/desktop/views/pages/welcome.vue
@@ -38,10 +38,6 @@
 		<header :class="$style.signupFormHeader">%i18n:@signup%</header>
 		<mk-signup :class="$style.signupForm"/>
 	</modal>
-	<modal name="signin" width="500px" height="auto" scrollable>
-		<header :class="$style.signinFormHeader">%i18n:@signin%</header>
-		<mk-signin :class="$style.signinForm"/>
-	</modal>
 </div>
 </template>
 
diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue
index 79648ac425..cd8f5841e7 100644
--- a/src/client/app/mobile/views/pages/welcome.vue
+++ b/src/client/app/mobile/views/pages/welcome.vue
@@ -9,26 +9,15 @@
 			<router-link class="signup" to="/signup">新規登録</router-link>
 		</div>
 		<div class="login">
-			<form @submit.prevent="onSubmit">
-				<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange">
-					<span>ユーザー名</span>
-					<span slot="prefix">@</span>
-					<span slot="suffix">@{{ host }}</span>
-				</ui-input>
-				<ui-input v-model="password" type="password" required>
-					<span>パスワード</span>
-					<span slot="prefix">%fa:lock%</span>
-				</ui-input>
-				<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
-				<ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button>
-			</form>
-			<div style="margin: 8px 0;">
-				<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
-			</div>
+			<mk-signin :with-avatar="false"/>
 		</div>
 		<div class="tl">
 			<mk-welcome-timeline/>
 		</div>
+		<div class="stats" v-if="stats">
+			<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
+			<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
+		</div>
 		<footer>
 			<small>{{ copyright }}</small>
 		</footer>
@@ -43,49 +32,18 @@ import { apiUrl, copyright, host, name, description } from '../../../config';
 export default Vue.extend({
 	data() {
 		return {
-			signing: false,
-			user: null,
-			username: '',
-			password: '',
-			token: '',
 			apiUrl,
 			copyright,
-			users: [],
+			stats: null,
 			host,
 			name,
 			description
 		};
 	},
-	mounted() {
-		(this as any).api('users', {
-			sort: '+follower',
-			limit: 20
-		}).then(users => {
-			this.users = users;
+	created() {
+		(this as any).api('stats').then(stats => {
+			this.stats = stats;
 		});
-	},
-	methods: {
-		onUsernameChange() {
-			(this as any).api('users/show', {
-				username: this.username
-			}).then(user => {
-				this.user = user;
-			});
-		},
-		onSubmit() {
-			this.signing = true;
-
-			(this as any).api('signin', {
-				username: this.username,
-				password: this.password,
-				token: this.user && this.user.twoFactorEnabled ? this.token : undefined
-			}).then(() => {
-				location.reload();
-			}).catch(() => {
-				alert('something happened');
-				this.signing = false;
-			});
-		}
 	}
 });
 </script>
@@ -164,6 +122,17 @@ export default Vue.extend({
 				overflow auto
 				-webkit-overflow-scrolling touch
 
+		> .stats
+			margin 16px 0
+			padding 8px
+			font-size 14px
+			color #444
+			background rgba(#000, 0.1)
+			border-radius 6px
+
+			> *
+				margin 0 8px
+
 		> footer
 			text-align center
 			color #444

From f164661ef246b62dfbc87feb0a37b8396ffabdb9 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 07:40:39 +0900
Subject: [PATCH 326/369] 2.42.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 64ba6d70f2..6aea76fc37 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.41.1",
-	"clientVersion": "1.0.6512",
+	"version": "2.42.0",
+	"clientVersion": "1.0.6517",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From e11f547308af19c5ae54a906cec795e65f407b8c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 10:40:53 +0900
Subject: [PATCH 327/369] #1715

---
 CHANGELOG.md                            | 11 +++++++
 cli/recount-stats.js                    | 42 +++++++++++++++++++++++++
 package.json                            |  2 +-
 src/models/meta.ts                      |  6 ++++
 src/remote/activitypub/models/person.ts |  9 ++++++
 src/server/api/endpoints/stats.ts       | 24 +++-----------
 src/server/api/private/signup.ts        | 10 ++++++
 src/services/note/create.ts             | 20 +++++++++++-
 8 files changed, 102 insertions(+), 22 deletions(-)
 create mode 100644 CHANGELOG.md
 create mode 100644 cli/recount-stats.js

diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000..614d50d0ff
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,11 @@
+ChangeLog
+=========
+
+3.0.0
+-----
+
+### Migration
+
+起動する前に、`node cli/recount-stats`してください。
+
+Please run `node cli/recount-stats` before launch.
diff --git a/cli/recount-stats.js b/cli/recount-stats.js
new file mode 100644
index 0000000000..84cb5d0f57
--- /dev/null
+++ b/cli/recount-stats.js
@@ -0,0 +1,42 @@
+const { default: Note } = require('../built/models/note');
+const { default: Meta } = require('../built/models/meta');
+const { default: User } = require('../built/models/user');
+
+async function main() {
+	const meta = await Meta.findOne({});
+
+	const notesCount = await Note.count();
+
+	const usersCount = await User.count();
+
+	const originalNotesCount = await Note.count({
+		'_user.host': null
+	});
+
+	const originalUsersCount = await User.count({
+		host: null
+	});
+
+	const stats = {
+		notesCount,
+		usersCount,
+		originalNotesCount,
+		originalUsersCount
+	};
+
+	if (meta) {
+		await Meta.update({}, {
+			$set: {
+				stats
+			}
+		});
+	} else {
+		await Meta.insert({
+			stats
+		});
+	}
+}
+
+main().then(() => {
+	console.log('done');
+}).catch(console.error);
diff --git a/package.json b/package.json
index 6aea76fc37..72cbc7356b 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "2.42.0",
+	"version": "3.0.0",
 	"clientVersion": "1.0.6517",
 	"codename": "nighthike",
 	"main": "./built/index.js",
diff --git a/src/models/meta.ts b/src/models/meta.ts
index 710bb23382..11b9b186ce 100644
--- a/src/models/meta.ts
+++ b/src/models/meta.ts
@@ -5,4 +5,10 @@ export default Meta;
 
 export type IMeta = {
 	broadcasts: any[];
+	stats: {
+		notesCount: number;
+		originalNotesCount: number;
+		usersCount: number;
+		originalUsersCount: number;
+	};
 };
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index 96e73406b2..42ee5a27df 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -10,6 +10,7 @@ import Resolver from '../resolver';
 import { resolveImage } from './image';
 import { isCollectionOrOrderedCollection, IObject, IPerson } from '../type';
 import { IDriveFile } from '../../../models/drive-file';
+import Meta from '../../../models/meta';
 
 const log = debug('misskey:activitypub');
 
@@ -117,6 +118,14 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
 		throw e;
 	}
 
+	//#region Increment users count
+	Meta.update({}, {
+		$inc: {
+			'stats.usersCount': 1
+		}
+	}, { upsert: true });
+	//#endregion
+
 	//#region アイコンとヘッダー画像をフェッチ
 	const [avatar, banner] = (await Promise.all<IDriveFile>([
 		person.icon,
diff --git a/src/server/api/endpoints/stats.ts b/src/server/api/endpoints/stats.ts
index d1e17651f2..74ab6ba945 100644
--- a/src/server/api/endpoints/stats.ts
+++ b/src/server/api/endpoints/stats.ts
@@ -1,26 +1,10 @@
-import Note from '../../../models/note';
-import User from '../../../models/user';
+import Meta from '../../../models/meta';
 
 /**
  * Get the misskey's statistics
  */
-module.exports = params => new Promise(async (res, rej) => {
-	const notesCount = await Note.count();
+module.exports = () => new Promise(async (res, rej) => {
+	const meta = await Meta.findOne();
 
-	const usersCount = await User.count();
-
-	const originalNotesCount = await Note.count({
-		'_user.host': null
-	});
-
-	const originalUsersCount = await User.count({
-		host: null
-	});
-
-	res({
-		notesCount,
-		usersCount,
-		originalNotesCount,
-		originalUsersCount
-	});
+	res(meta.stats);
 });
diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts
index 14d4b8a3fc..fee899b374 100644
--- a/src/server/api/private/signup.ts
+++ b/src/server/api/private/signup.ts
@@ -5,6 +5,7 @@ import recaptcha = require('recaptcha-promise');
 import User, { IUser, validateUsername, validatePassword, pack } from '../../../models/user';
 import generateUserToken from '../common/generate-native-user-token';
 import config from '../../../config';
+import Meta from '../../../models/meta';
 
 recaptcha.init({
 	secret_key: config.recaptcha.secret_key
@@ -93,6 +94,15 @@ export default async (ctx: Koa.Context) => {
 		}
 	});
 
+	//#region Increment users count
+	Meta.update({}, {
+		$inc: {
+			'stats.usersCount': 1,
+			'stats.originalUsersCount': 1
+		}
+	}, { upsert: true });
+	//#endregion
+
 	// Response
 	ctx.body = await pack(account);
 };
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index f74d04ae62..b21bfa316e 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -18,6 +18,7 @@ import parse from '../../text/parse';
 import { IApp } from '../../models/app';
 import UserList from '../../models/user-list';
 import resolveUser from '../../remote/resolve-user';
+import Meta from '../../models/meta';
 
 type Reason = 'reply' | 'quote' | 'mention';
 
@@ -167,7 +168,24 @@ export default async (user: IUser, data: {
 
 	res(note);
 
-	// Increment notes count
+	//#region Increment notes count
+	if (isLocalUser(user)) {
+		Meta.update({}, {
+			$inc: {
+				'stats.notesCount': 1,
+				'stats.originalNotesCount': 1
+			}
+		}, { upsert: true });
+	} else {
+		Meta.update({}, {
+			$inc: {
+				'stats.notesCount': 1
+			}
+		}, { upsert: true });
+	}
+	//#endregion
+
+	// Increment notes count (user)
 	User.update({ _id: user._id }, {
 		$inc: {
 			notesCount: 1

From 2864a9027f8baee64f972a91e36cb7a83cef8647 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 12:02:38 +0900
Subject: [PATCH 328/369] save-exact=true

---
 .npmrc | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.npmrc b/.npmrc
index c1ca392fea..2fcf1d76c2 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1 +1,2 @@
 package-lock = false
+save-exact=true

From cc2947063adaf13fb6d34910be17c636c3bf2272 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 12:42:59 +0900
Subject: [PATCH 329/369] add lock file

---
 yarn.lock | 11915 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 11915 insertions(+)
 create mode 100644 yarn.lock

diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000..014a443d0d
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,11915 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@fortawesome/fontawesome-free-brands@5.0.2":
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3"
+
+"@fortawesome/fontawesome-free-regular@5.0.2":
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017"
+
+"@fortawesome/fontawesome-free-solid@5.0.2":
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5"
+
+"@fortawesome/fontawesome@1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d"
+
+"@gulp-sourcemaps/identity-map@1.X":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1"
+  dependencies:
+    acorn "^5.0.3"
+    css "^2.2.1"
+    normalize-path "^2.1.1"
+    source-map "^0.5.6"
+    through2 "^2.0.3"
+
+"@gulp-sourcemaps/map-sources@1.X":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
+  dependencies:
+    normalize-path "^2.0.1"
+    through2 "^2.0.3"
+
+"@koa/cors@2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+  dependencies:
+    call-me-maybe "^1.0.1"
+    glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.stat@^1.0.1":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a"
+
+"@prezzemolo/rap@0.1.2":
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/@prezzemolo/rap/-/rap-0.1.2.tgz#01f8a60bb61de33822fc632563fb8b23e574854e"
+
+"@prezzemolo/zip@0.0.3":
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/@prezzemolo/zip/-/zip-0.0.3.tgz#6532d4bcd77c6a95e3a90ca5388a09b532a1f8e4"
+
+"@samverschueren/stream-to-observable@^0.3.0":
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
+  dependencies:
+    any-observable "^0.3.0"
+
+"@sindresorhus/is@^0.7.0":
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+
+"@types/accepts@*":
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
+  dependencies:
+    "@types/node" "*"
+
+"@types/babel-types@*", "@types/babel-types@^7.0.0":
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.3.tgz#9dc5316090ad99cd2679051ab21a5676c90a2bcc"
+
+"@types/babylon@^6.16.2":
+  version "6.16.3"
+  resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb"
+  dependencies:
+    "@types/babel-types" "*"
+
+"@types/bcryptjs@2.4.1":
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.1.tgz#7fb63922b5b106edacdcfe084cd38850f78aacfc"
+
+"@types/body-parser@*":
+  version "1.17.0"
+  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
+  dependencies:
+    "@types/connect" "*"
+    "@types/node" "*"
+
+"@types/bson@*":
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.8.tgz#6ad272b3f049e9598ec33aed09cf56d8946b75f1"
+  dependencies:
+    "@types/node" "*"
+
+"@types/caseless@*":
+  version "0.12.1"
+  resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a"
+
+"@types/cheerio@^0.22.5":
+  version "0.22.7"
+  resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce"
+
+"@types/clean-css@*":
+  version "3.4.30"
+  resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-3.4.30.tgz#0052c136f5248002428e3638b37de4a39818641d"
+
+"@types/connect@*":
+  version "3.4.32"
+  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28"
+  dependencies:
+    "@types/node" "*"
+
+"@types/cookies@*":
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540"
+  dependencies:
+    "@types/connect" "*"
+    "@types/express" "*"
+    "@types/keygrip" "*"
+    "@types/node" "*"
+
+"@types/debug@0.0.30":
+  version "0.0.30"
+  resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df"
+
+"@types/deep-equal@1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03"
+
+"@types/elasticsearch@5.0.23":
+  version "5.0.23"
+  resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.23.tgz#235622772a7c7f3ccedd0dc9769dfcfe20eed1ec"
+
+"@types/events@*":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
+
+"@types/express-serve-static-core@*":
+  version "4.16.0"
+  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+    "@types/range-parser" "*"
+
+"@types/express@*":
+  version "4.16.0"
+  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19"
+  dependencies:
+    "@types/body-parser" "*"
+    "@types/express-serve-static-core" "*"
+    "@types/serve-static" "*"
+
+"@types/fancy-log@1.3.0":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0"
+
+"@types/form-data@*":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e"
+  dependencies:
+    "@types/node" "*"
+
+"@types/glob@*":
+  version "5.0.35"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
+  dependencies:
+    "@types/events" "*"
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/gm@1.18.0":
+  version "1.18.0"
+  resolved "https://registry.yarnpkg.com/@types/gm/-/gm-1.18.0.tgz#49be90ff74286fcdc23b00f13d3699e6dfaceef2"
+  dependencies:
+    "@types/node" "*"
+
+"@types/gulp-htmlmin@1.3.32":
+  version "1.3.32"
+  resolved "https://registry.yarnpkg.com/@types/gulp-htmlmin/-/gulp-htmlmin-1.3.32.tgz#342baec649f285c7cbd78dfcf54dd17c388bde2b"
+  dependencies:
+    "@types/html-minifier" "*"
+    "@types/node" "*"
+
+"@types/gulp-mocha@0.0.32":
+  version "0.0.32"
+  resolved "https://registry.yarnpkg.com/@types/gulp-mocha/-/gulp-mocha-0.0.32.tgz#dbc425e804a8354236c31ab23406222a8ab9bdaf"
+  dependencies:
+    "@types/mocha" "*"
+    "@types/node" "*"
+
+"@types/gulp-rename@0.0.33":
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/@types/gulp-rename/-/gulp-rename-0.0.33.tgz#38d146e97786569f74f5391a1b1f9b5198674b6c"
+  dependencies:
+    "@types/node" "*"
+
+"@types/gulp-replace@0.0.31":
+  version "0.0.31"
+  resolved "https://registry.yarnpkg.com/@types/gulp-replace/-/gulp-replace-0.0.31.tgz#87c3ac90b437694c58d68d1da677fcaff38b25ff"
+  dependencies:
+    "@types/node" "*"
+
+"@types/gulp-uglify@3.0.5":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135"
+  dependencies:
+    "@types/node" "*"
+    "@types/uglify-js" "^2"
+
+"@types/gulp-util@3.0.34":
+  version "3.0.34"
+  resolved "https://registry.yarnpkg.com/@types/gulp-util/-/gulp-util-3.0.34.tgz#d1291ebf706d93f46eb8df11344bbfd96247697e"
+  dependencies:
+    "@types/node" "*"
+    "@types/through2" "*"
+    "@types/vinyl" "*"
+    chalk "^2.2.0"
+
+"@types/gulp@3.8.36":
+  version "3.8.36"
+  resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-3.8.36.tgz#11eaf583bf0534669b4ffa9bfed51557faa00a4c"
+  dependencies:
+    "@types/node" "*"
+    "@types/orchestrator" "*"
+    "@types/vinyl" "*"
+
+"@types/html-minifier@*":
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-3.5.2.tgz#f897a13d847a774e9b6fd91497e9b0e0ead71c35"
+  dependencies:
+    "@types/clean-css" "*"
+    "@types/relateurl" "*"
+    "@types/uglify-js" "*"
+
+"@types/http-assert@*":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd"
+
+"@types/inquirer@0.0.41":
+  version "0.0.41"
+  resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.41.tgz#0c33027dcd0b0dde234e22afa454f2c75d8b30d2"
+  dependencies:
+    "@types/rx" "*"
+    "@types/through" "*"
+
+"@types/is-root@1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@types/is-root/-/is-root-1.0.0.tgz#1cf41787243a8f030eb737a9aaf08b071e4f2453"
+
+"@types/is-url@1.2.28":
+  version "1.2.28"
+  resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787"
+
+"@types/js-yaml@3.11.1":
+  version "3.11.1"
+  resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40"
+
+"@types/keygrip@*":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878"
+
+"@types/koa-bodyparser@4.2.0":
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.2.0.tgz#04febc567f3d3dd40e3d1a0e095cdf7b07c4d7ce"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-compose@*":
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847"
+
+"@types/koa-compress@2.0.8":
+  version "2.0.8"
+  resolved "https://registry.yarnpkg.com/@types/koa-compress/-/koa-compress-2.0.8.tgz#426a2fac419aff7d1a7d87fd78203bf0d26a94fb"
+  dependencies:
+    "@types/koa" "*"
+    "@types/node" "*"
+
+"@types/koa-favicon@2.0.19":
+  version "2.0.19"
+  resolved "https://registry.yarnpkg.com/@types/koa-favicon/-/koa-favicon-2.0.19.tgz#a1b584fd64c99f16710633272292bf7d4b0ca1fa"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-logger@3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@types/koa-logger/-/koa-logger-3.1.0.tgz#133acdbc56d87b5a559cab25528b087381a8fc0d"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-mount@3.0.1":
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/@types/koa-mount/-/koa-mount-3.0.1.tgz#2c068d1696b173c62c316158210c4316c4401f57"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-multer@1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@types/koa-multer/-/koa-multer-1.0.0.tgz#f449f399ac3f80c05753452f000e8694ceec4249"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-router@7.0.28":
+  version "7.0.28"
+  resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.0.28.tgz#67487c862a831099aed8864a8996bfa7e989edc0"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-send@4.1.1":
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.1.tgz#88f57cbe0343c8204903f9096d8ff6b98ec3296f"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-views@2.0.3":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@types/koa-views/-/koa-views-2.0.3.tgz#38fc1f3027503acba73a93fe06678813f306779b"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa@*":
+  version "2.0.46"
+  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.46.tgz#24bc3cd405d10fcde81f876cd8285b44d4ddc3e9"
+  dependencies:
+    "@types/accepts" "*"
+    "@types/cookies" "*"
+    "@types/events" "*"
+    "@types/http-assert" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
+"@types/koa@2.0.45":
+  version "2.0.45"
+  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.45.tgz#133cbda6cc8d12b73434b5d9663898c833f80aa2"
+  dependencies:
+    "@types/accepts" "*"
+    "@types/cookies" "*"
+    "@types/events" "*"
+    "@types/http-assert" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
+"@types/koa__cors@2.2.2":
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-2.2.2.tgz#03d7cf3b076d5dfab8a5444ac6c5df5173147de8"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/kue@0.11.8":
+  version "0.11.8"
+  resolved "https://registry.yarnpkg.com/@types/kue/-/kue-0.11.8.tgz#820f5e3db6025f0411e0942cd3ccab461a060c90"
+  dependencies:
+    "@types/express" "*"
+    "@types/node" "*"
+    "@types/redis" "*"
+
+"@types/license-checker@15.0.0":
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/@types/license-checker/-/license-checker-15.0.0.tgz#685d69e2cf61ffd862320434601f51c85e28bba1"
+
+"@types/mime@*":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
+
+"@types/minimatch@*":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+
+"@types/mkdirp@0.5.2":
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
+  dependencies:
+    "@types/node" "*"
+
+"@types/mocha@*":
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.2.tgz#202d2b8fe1364c5b617b439b26a54f0e75eac0a7"
+
+"@types/mocha@5.2.0":
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.0.tgz#b3c8e69f038835db1a7fdc0b3d879fc50506e29e"
+
+"@types/mongodb@3.0.18":
+  version "3.0.18"
+  resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.0.18.tgz#e5775ba9c15bf1601e57ada52d9fcbc6d6095d18"
+  dependencies:
+    "@types/bson" "*"
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@types/ms@0.7.30":
+  version "0.7.30"
+  resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.30.tgz#f6c38b7ecbbf698b0bbd138315a0f0f18954f85f"
+
+"@types/node@*":
+  version "10.3.3"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3"
+
+"@types/node@10.1.2":
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6"
+
+"@types/node@^8.0.47":
+  version "8.10.20"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac"
+
+"@types/nopt@3.0.29":
+  version "3.0.29"
+  resolved "https://registry.yarnpkg.com/@types/nopt/-/nopt-3.0.29.tgz#f19df3db4c97ee1459a2740028320a71d70964ce"
+
+"@types/orchestrator@*":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.3.2.tgz#cd15c6cea978a32b98e5054239cbcc78e55671f1"
+  dependencies:
+    "@types/node" "*"
+    "@types/q" "*"
+
+"@types/parse5@3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-3.0.0.tgz#b63305718d82af42a9e5da79c56ecfc1f32e32c0"
+  dependencies:
+    parse5 "*"
+
+"@types/pug@2.0.4", "@types/pug@^2.0.4":
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2"
+
+"@types/q@*":
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.0.tgz#87567ea1206935405e51c03635b6cbf3a01f7bc4"
+
+"@types/qrcode@0.8.1":
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-0.8.1.tgz#5776cb5da299cfa7cee2610f59997acad90ad38d"
+  dependencies:
+    "@types/node" "*"
+
+"@types/range-parser@*":
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d"
+
+"@types/ratelimiter@2.1.28":
+  version "2.1.28"
+  resolved "https://registry.yarnpkg.com/@types/ratelimiter/-/ratelimiter-2.1.28.tgz#cf6371e6d9b1d236e3f0b25889a6d52aed2e0e22"
+  dependencies:
+    "@types/redis" "*"
+
+"@types/redis@*", "@types/redis@2.8.6":
+  version "2.8.6"
+  resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.6.tgz#3674d07a13ad76bccda4c37dc3909e4e95757e7e"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@types/relateurl@*":
+  version "0.2.28"
+  resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6"
+
+"@types/request-promise-native@1.0.14":
+  version "1.0.14"
+  resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.14.tgz#20f2ba136e6f29c2ea745c60767738d434793d31"
+  dependencies:
+    "@types/request" "*"
+
+"@types/request@*":
+  version "2.47.1"
+  resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.1.tgz#25410d3afbdac04c91a94ad9efc9824100735824"
+  dependencies:
+    "@types/caseless" "*"
+    "@types/form-data" "*"
+    "@types/node" "*"
+    "@types/tough-cookie" "*"
+
+"@types/request@2.47.0":
+  version "2.47.0"
+  resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.0.tgz#76a666cee4cb85dcffea6cd4645227926d9e114e"
+  dependencies:
+    "@types/caseless" "*"
+    "@types/form-data" "*"
+    "@types/node" "*"
+    "@types/tough-cookie" "*"
+
+"@types/rimraf@2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e"
+  dependencies:
+    "@types/glob" "*"
+    "@types/node" "*"
+
+"@types/rx-core-binding@*":
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3"
+  dependencies:
+    "@types/rx-core" "*"
+
+"@types/rx-core@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60"
+
+"@types/rx-lite-aggregates@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-async@*":
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-backpressure@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-coincidence@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-experimental@*":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-joinpatterns@*":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-testing@*":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9"
+  dependencies:
+    "@types/rx-lite-virtualtime" "*"
+
+"@types/rx-lite-time@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-virtualtime@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite@*":
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.5.tgz#b3581525dff69423798daa9a0d33c1e66a5e8c4c"
+  dependencies:
+    "@types/rx-core" "*"
+    "@types/rx-core-binding" "*"
+
+"@types/rx@*":
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48"
+  dependencies:
+    "@types/rx-core" "*"
+    "@types/rx-core-binding" "*"
+    "@types/rx-lite" "*"
+    "@types/rx-lite-aggregates" "*"
+    "@types/rx-lite-async" "*"
+    "@types/rx-lite-backpressure" "*"
+    "@types/rx-lite-coincidence" "*"
+    "@types/rx-lite-experimental" "*"
+    "@types/rx-lite-joinpatterns" "*"
+    "@types/rx-lite-testing" "*"
+    "@types/rx-lite-time" "*"
+    "@types/rx-lite-virtualtime" "*"
+
+"@types/seedrandom@2.4.27":
+  version "2.4.27"
+  resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41"
+
+"@types/serve-static@*":
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48"
+  dependencies:
+    "@types/express-serve-static-core" "*"
+    "@types/mime" "*"
+
+"@types/single-line-log@1.1.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@types/single-line-log/-/single-line-log-1.1.0.tgz#7e6fc4e8e785f5f5ab11157418df2684a21ed971"
+
+"@types/speakeasy@2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@types/speakeasy/-/speakeasy-2.0.2.tgz#153ec3636eea0562209b0a2f1fdf8b479286919b"
+
+"@types/tapable@*":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd"
+
+"@types/through2@*":
+  version "2.0.33"
+  resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.33.tgz#1ff2e88a100dfb5b140e7bb98791f1194400d131"
+  dependencies:
+    "@types/node" "*"
+
+"@types/through@*":
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93"
+  dependencies:
+    "@types/node" "*"
+
+"@types/tmp@0.0.33":
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
+
+"@types/tough-cookie@*":
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.3.tgz#7f226d67d654ec9070e755f46daebf014628e9d9"
+
+"@types/uglify-js@*":
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.2.tgz#f30c75458d18e8ee885c792c04adcb78a13bc286"
+  dependencies:
+    source-map "^0.6.1"
+
+"@types/uglify-js@^2":
+  version "2.6.31"
+  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b"
+  dependencies:
+    source-map "^0.6.1"
+
+"@types/uuid@3.4.3":
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.3.tgz#121ace265f5569ce40f4f6d0ff78a338c732a754"
+  dependencies:
+    "@types/node" "*"
+
+"@types/vinyl@*":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.2.tgz#4f3b8dae8f5828d3800ef709b0cff488ee852de3"
+  dependencies:
+    "@types/node" "*"
+
+"@types/webpack-stream@3.2.10":
+  version "3.2.10"
+  resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.10.tgz#eed8389a60d9928b357aa6d13599428d2c4889e7"
+  dependencies:
+    "@types/node" "*"
+    "@types/webpack" "*"
+
+"@types/webpack@*", "@types/webpack@4.4.0":
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.0.tgz#c0551b772be241d786c0548812dd75a932f8efb4"
+  dependencies:
+    "@types/node" "*"
+    "@types/tapable" "*"
+    "@types/uglify-js" "*"
+    source-map "^0.6.0"
+
+"@types/websocket@0.0.39":
+  version "0.0.39"
+  resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.39.tgz#aa971e24f9c1455fe2a57ee3e69c7d395016b12a"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@types/ws@5.1.1":
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.1.tgz#4adc1f1a5e92e7e0e95658fb35c7eab1bc52f4ac"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@vue/component-compiler-utils@^1.2.1":
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-1.3.1.tgz#686f0b913d59590ae327b2a1cb4b6d9b931bbe0e"
+  dependencies:
+    consolidate "^0.15.1"
+    hash-sum "^1.0.2"
+    lru-cache "^4.1.2"
+    merge-source-map "^1.1.0"
+    postcss "^6.0.20"
+    postcss-selector-parser "^3.1.1"
+    prettier "^1.13.0"
+    source-map "^0.5.6"
+    vue-template-es2015-compiler "^1.6.0"
+
+"@webassemblyjs/ast@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.4.3.tgz#3b3f6fced944d8660273347533e6d4d315b5934a"
+  dependencies:
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/wast-parser" "1.4.3"
+    debug "^3.1.0"
+    webassemblyjs "1.4.3"
+
+"@webassemblyjs/floating-point-hex-parser@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz#f5aee4c376a717c74264d7bacada981e7e44faad"
+
+"@webassemblyjs/helper-buffer@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz#0434b55958519bf503697d3824857b1dea80b729"
+  dependencies:
+    debug "^3.1.0"
+
+"@webassemblyjs/helper-code-frame@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz#f1349ca3e01a8e29ee2098c770773ef97af43641"
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.4.3"
+
+"@webassemblyjs/helper-fsm@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz#65a921db48fb43e868f17b27497870bdcae22b79"
+
+"@webassemblyjs/helper-wasm-bytecode@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz#0e5b4b5418e33f8a26e940b7809862828c3721a5"
+
+"@webassemblyjs/helper-wasm-section@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz#9ceedd53a3f152c3412e072887ade668d0b1acbf"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-buffer" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/wasm-gen" "1.4.3"
+    debug "^3.1.0"
+
+"@webassemblyjs/leb128@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.4.3.tgz#5a5e5949dbb5adfe3ae95664d0439927ac557fb8"
+  dependencies:
+    leb "^0.3.0"
+
+"@webassemblyjs/validation@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/validation/-/validation-1.4.3.tgz#9e66c9b3079d7bbcf2070c1bf52a54af2a09aac9"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+
+"@webassemblyjs/wasm-edit@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz#87febd565e0ffb5ae25f6495bb3958d17aa0a779"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-buffer" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/helper-wasm-section" "1.4.3"
+    "@webassemblyjs/wasm-gen" "1.4.3"
+    "@webassemblyjs/wasm-opt" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    "@webassemblyjs/wast-printer" "1.4.3"
+    debug "^3.1.0"
+
+"@webassemblyjs/wasm-gen@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz#8553164d0154a6be8f74d653d7ab355f73240aa4"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/leb128" "1.4.3"
+
+"@webassemblyjs/wasm-opt@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz#26c7a23bfb136aa405b1d3410e63408ec60894b8"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-buffer" "1.4.3"
+    "@webassemblyjs/wasm-gen" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    debug "^3.1.0"
+
+"@webassemblyjs/wasm-parser@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz#7ddd3e408f8542647ed612019cfb780830993698"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/leb128" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    webassemblyjs "1.4.3"
+
+"@webassemblyjs/wast-parser@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz#3250402e2c5ed53dbe2233c9de1fe1f9f0d51745"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/floating-point-hex-parser" "1.4.3"
+    "@webassemblyjs/helper-code-frame" "1.4.3"
+    "@webassemblyjs/helper-fsm" "1.4.3"
+    long "^3.2.0"
+    webassemblyjs "1.4.3"
+
+"@webassemblyjs/wast-printer@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz#3d59aa8d0252d6814a3ef4e6d2a34c9ded3904e0"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/wast-parser" "1.4.3"
+    long "^3.2.0"
+
+abab@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+accepts@^1.2.2, accepts@~1.3.5:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+  dependencies:
+    mime-types "~2.1.18"
+    negotiator "0.6.1"
+
+accord@^0.26.3:
+  version "0.26.4"
+  resolved "https://registry.yarnpkg.com/accord/-/accord-0.26.4.tgz#fc4c8d3ebab406a07cb28819b859651c44a92e80"
+  dependencies:
+    convert-source-map "^1.2.0"
+    glob "^7.0.5"
+    indx "^0.2.3"
+    lodash.clone "^4.3.2"
+    lodash.defaults "^4.0.1"
+    lodash.flatten "^4.2.0"
+    lodash.merge "^4.4.0"
+    lodash.partialright "^4.1.4"
+    lodash.pick "^4.2.1"
+    lodash.uniq "^4.3.0"
+    resolve "^1.1.7"
+    semver "^5.3.0"
+    uglify-js "^2.7.0"
+    when "^3.7.7"
+
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-globals@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+  dependencies:
+    acorn "^4.0.4"
+
+acorn-globals@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  dependencies:
+    acorn "^3.0.4"
+
+acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+acorn@^3.0.4, acorn@^3.1.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.4, acorn@~4.0.2:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+agent-base@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce"
+  dependencies:
+    es6-promisify "^5.0.0"
+
+agentkeepalive@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c"
+  dependencies:
+    humanize-ms "^1.2.1"
+
+ajv-keywords@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
+ajv-keywords@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d"
+  dependencies:
+    fast-deep-equal "^2.0.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+animejs@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/animejs/-/animejs-2.2.0.tgz#35eefdfc535b81949c9cb06f0b3e60c02e6fdc80"
+
+ansi-colors@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
+  dependencies:
+    ansi-wrap "^0.1.0"
+
+ansi-cyan@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
+  dependencies:
+    ansi-wrap "0.1.0"
+
+ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-escapes@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
+
+ansi-gray@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
+  dependencies:
+    ansi-wrap "0.1.0"
+
+ansi-red@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
+  dependencies:
+    ansi-wrap "0.1.0"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
+
+ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+
+any-observable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
+
+any-promise@^1.0.0, any-promise@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+
+anymatch@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+  dependencies:
+    micromatch "^2.1.5"
+    normalize-path "^2.0.0"
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+"apparatus@>= 0.0.9":
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e"
+  dependencies:
+    sylvester ">= 0.0.8"
+
+append-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
+  dependencies:
+    buffer-equal "^1.0.0"
+
+append-field@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a"
+
+aproba@^1.0.3, aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+archive-type@^3.0.0, archive-type@^3.0.1:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6"
+  dependencies:
+    file-type "^3.1.0"
+
+archy@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
+  dependencies:
+    arr-flatten "^1.0.1"
+    array-slice "^0.2.3"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d"
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-differ@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+
+array-each@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
+
+array-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-find-index@^1.0.1, array-find-index@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-parallel@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d"
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-series@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f"
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-slice@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arrify@^1.0.0, arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@^2.0.0, asap@~2.0.3:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1.js@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.0.1.tgz#7668b56416953f0ce3421adbb3893ace59c96f59"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+ast-types@0.10.1:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd"
+
+ast-types@0.11.5:
+  version "0.11.5"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28"
+
+async-each-series@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-foreach@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+
+async-limiter@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+
+async-validator@~1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.2.tgz#b77597226e96242f8d531c0d46ae295f62422ba4"
+  dependencies:
+    babel-runtime "6.x"
+
+async@^1.5.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.5.0, async@^2.6.0:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+  dependencies:
+    lodash "^4.17.10"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+autoprefixer@^6.3.1:
+  version "6.7.7"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+  dependencies:
+    browserslist "^1.7.6"
+    caniuse-db "^1.0.30000634"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^5.2.16"
+    postcss-value-parser "^3.2.3"
+
+autosize@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9"
+
+autwh@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/autwh/-/autwh-0.1.0.tgz#24a5300923309d105133401a2568f9c8ab7d7e03"
+  dependencies:
+    oauth "0.9.15"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+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.7.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.26.0:
+  version "6.26.3"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+  dependencies:
+    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"
+
+babel-generator@^6.26.0:
+  version "6.26.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+  dependencies:
+    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"
+
+babel-helper-bindify-decorators@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+  dependencies:
+    babel-helper-explode-assignable-expression "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+  dependencies:
+    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@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-explode-class@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
+  dependencies:
+    babel-helper-bindify-decorators "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+  dependencies:
+    babel-helper-function-name "^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-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+  dependencies:
+    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-helper-vue-jsx-merge-props@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-async-generators@^6.5.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
+
+babel-plugin-syntax-class-constructor-call@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
+
+babel-plugin-syntax-class-properties@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-decorators@^6.13.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
+
+babel-plugin-syntax-dynamic-import@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-export-extensions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
+
+babel-plugin-syntax-flow@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-generator-functions@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-generators "^6.5.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-functions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-class-constructor-call@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9"
+  dependencies:
+    babel-plugin-syntax-class-constructor-call "^6.18.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-class-properties@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-plugin-syntax-class-properties "^6.8.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-decorators@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
+  dependencies:
+    babel-helper-explode-class "^6.24.1"
+    babel-plugin-syntax-decorators "^6.13.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+  dependencies:
+    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@^6.24.1:
+  version "6.26.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+  dependencies:
+    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+    babel-plugin-syntax-exponentiation-operator "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-export-extensions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
+  dependencies:
+    babel-plugin-syntax-export-extensions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.8.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+  dependencies:
+    babel-plugin-syntax-flow "^6.18.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.22.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
+  dependencies:
+    babel-plugin-syntax-object-rest-spread "^6.8.0"
+    babel-runtime "^6.26.0"
+
+babel-plugin-transform-regenerator@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+  dependencies:
+    regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-polyfill@6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-preset-es2015@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+  dependencies:
+    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-preset-stage-1@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
+  dependencies:
+    babel-plugin-transform-class-constructor-call "^6.24.1"
+    babel-plugin-transform-export-extensions "^6.22.0"
+    babel-preset-stage-2 "^6.24.1"
+
+babel-preset-stage-2@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
+  dependencies:
+    babel-plugin-syntax-dynamic-import "^6.18.0"
+    babel-plugin-transform-class-properties "^6.24.1"
+    babel-plugin-transform-decorators "^6.24.1"
+    babel-preset-stage-3 "^6.24.1"
+
+babel-preset-stage-3@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
+  dependencies:
+    babel-plugin-syntax-trailing-function-commas "^6.22.0"
+    babel-plugin-transform-async-generator-functions "^6.24.1"
+    babel-plugin-transform-async-to-generator "^6.24.1"
+    babel-plugin-transform-exponentiation-operator "^6.24.1"
+    babel-plugin-transform-object-rest-spread "^6.22.0"
+
+babel-register@^6.26.0, babel-register@^6.9.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  dependencies:
+    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@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  dependencies:
+    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@^6.24.1, babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  dependencies:
+    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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babylon@^6.17.3, babylon@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+babylon@^7.0.0-beta.47:
+  version "7.0.0-beta.47"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80"
+
+balanced-match@^0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base32.js@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba"
+
+base64-js@^1.0.2:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+bcryptjs@2.4.3:
+  version "2.4.3"
+  resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
+
+beeper@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+bin-build@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc"
+  dependencies:
+    archive-type "^3.0.1"
+    decompress "^3.0.0"
+    download "^4.1.2"
+    exec-series "^1.0.0"
+    rimraf "^2.2.6"
+    tempfile "^1.0.0"
+    url-regex "^3.0.0"
+
+bin-check@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930"
+  dependencies:
+    executable "^1.0.0"
+
+bin-version-check@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0"
+  dependencies:
+    bin-version "^1.0.0"
+    minimist "^1.1.0"
+    semver "^4.0.3"
+    semver-truncate "^1.0.0"
+
+bin-version@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e"
+  dependencies:
+    find-versions "^1.0.0"
+
+bin-wrapper@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb"
+  dependencies:
+    bin-check "^2.0.0"
+    bin-version-check "^2.1.0"
+    download "^4.0.0"
+    each-async "^1.1.1"
+    lazy-req "^1.0.0"
+    os-filter-obj "^1.0.0"
+
+binary-extensions@^1.0.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+binaryextensions@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935"
+
+bl@^1.0.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
+  dependencies:
+    readable-stream "^2.3.5"
+    safe-buffer "^5.1.1"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.0.5, bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@1.18.2:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+  dependencies:
+    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"
+
+body-parser@^1.12.2:
+  version "1.18.3"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
+  dependencies:
+    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"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    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-vue@2.0.0-rc.6:
+  version "2.0.0-rc.6"
+  resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.6.tgz#12d0a241414f1efd647e8b14a88c51707c920c86"
+  dependencies:
+    bootstrap "^4.0.0"
+    lodash.get "^4.4.2"
+    lodash.startcase "^4.4.0"
+    opencollective "^1.0.3"
+    popper.js "^1.12.9"
+    vue-functional-data-merge "^2.0.5"
+
+bootstrap@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.1.tgz#3aec85000fa619085da8d2e4983dfd67cf2114cb"
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+braces@^2.3.0, braces@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-process-hrtime@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
+browser-stdout@1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  dependencies:
+    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@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    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@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  dependencies:
+    pako "~1.0.5"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+  version "1.7.7"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+  dependencies:
+    caniuse-db "^1.0.30000639"
+    electron-to-chromium "^1.2.7"
+
+bson@~1.0.4:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57"
+
+buffer-alloc-unsafe@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+
+buffer-alloc@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+  version "0.2.13"
+  resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+
+buffer-equal-constant-time@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+
+buffer-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+
+buffer-from@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0"
+
+buffer-from@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+
+buffer-shims@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+buffer-to-vinyl@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262"
+  dependencies:
+    file-type "^3.1.0"
+    readable-stream "^2.0.2"
+    uuid "^2.0.1"
+    vinyl "^1.0.0"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+bufferstreams@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72"
+  dependencies:
+    readable-stream "^2.0.2"
+
+builtin-modules@^1.0.0, builtin-modules@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+busboy@^0.2.11:
+  version "0.2.14"
+  resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+  dependencies:
+    dicer "0.2.5"
+    readable-stream "1.1.x"
+
+bytes@3.0.0, bytes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+bytes@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a"
+
+cacache@^10.0.4:
+  version "10.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^2.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^5.2.4"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+cacheable-request@^2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+  dependencies:
+    clone-response "1.0.2"
+    get-stream "3.0.0"
+    http-cache-semantics "3.8.1"
+    keyv "3.0.0"
+    lowercase-keys "1.0.0"
+    normalize-url "2.0.1"
+    responselike "1.0.2"
+
+cafy@8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/cafy/-/cafy-8.0.0.tgz#8f6ce8556d64ee145c5cdc79b5b68f7fc57ee46f"
+
+call-me-maybe@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  dependencies:
+    callsites "^0.2.0"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+camel-case@3.0.x:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+  dependencies:
+    no-case "^2.2.0"
+    upper-case "^1.1.1"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+can-promise@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3"
+  dependencies:
+    window-or-global "^1.0.1"
+
+caniuse-api@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+  dependencies:
+    browserslist "^1.3.6"
+    caniuse-db "^1.0.30000529"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+  version "1.0.30000856"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f"
+
+capture-stack-trace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+caw@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034"
+  dependencies:
+    get-proxy "^1.0.1"
+    is-obj "^1.0.0"
+    object-assign "^3.0.0"
+    tunnel-agent "^0.4.0"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    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"
+
+chalk@2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796"
+  dependencies:
+    ansi-styles "^3.2.0"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.2.0"
+
+chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.2.0, chalk@^2.3.0, chalk@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chalk@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
+  dependencies:
+    ansi-styles "~1.0.0"
+    has-color "~0.1.0"
+    strip-ansi "~0.1.0"
+
+character-parser@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+  dependencies:
+    is-regex "^1.0.3"
+
+chardet@^0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+
+cheerio-httpcli@0.7.2:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/cheerio-httpcli/-/cheerio-httpcli-0.7.2.tgz#346d41b0f00f01aaa2da8d5e7efb3f806fb277a3"
+  dependencies:
+    "@types/cheerio" "^0.22.5"
+    "@types/node" "^8.0.47"
+    async "^2.5.0"
+    cheerio "^0.22.0"
+    colors "^1.1.2"
+    foreach "^2.0.5"
+    he "^1.1.1"
+    iconv-lite "^0.4.19"
+    jschardet "^1.6.0"
+    object-assign "^4.1.1"
+    os-locale "^2.1.0"
+    prettyjson "^1.2.1"
+    request "^2.83.0"
+    require-uncached "^1.0.3"
+    rsvp "^4.7.0"
+    spawn-sync "^1.0.15"
+    tough-cookie "^2.3.3"
+    type-of "^2.0.1"
+    valid-url "^1.0.9"
+    yargs "^10.0.3"
+
+cheerio@^0.22.0:
+  version "0.22.0"
+  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
+  dependencies:
+    css-select "~1.2.0"
+    dom-serializer "~0.1.0"
+    entities "~1.1.1"
+    htmlparser2 "^3.9.1"
+    lodash.assignin "^4.0.9"
+    lodash.bind "^4.1.4"
+    lodash.defaults "^4.0.1"
+    lodash.filter "^4.4.0"
+    lodash.flatten "^4.2.0"
+    lodash.foreach "^4.3.0"
+    lodash.map "^4.4.0"
+    lodash.merge "^4.4.0"
+    lodash.pick "^4.2.1"
+    lodash.reduce "^4.4.0"
+    lodash.reject "^4.4.0"
+    lodash.some "^4.4.0"
+
+chokidar@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^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"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chokidar@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.0"
+    braces "^2.3.0"
+    glob-parent "^3.1.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^2.1.1"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+    upath "^1.0.0"
+  optionalDependencies:
+    fsevents "^1.1.2"
+
+chownr@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chrome-trace-event@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
+clap@^1.0.9:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
+  dependencies:
+    chalk "^1.1.3"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+clean-css@4.1.x, clean-css@^4.1.11:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a"
+  dependencies:
+    source-map "0.5.x"
+
+cli-cursor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  dependencies:
+    restore-cursor "^1.0.1"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-spinners@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
+
+cli-table@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
+  dependencies:
+    colors "1.0.3"
+
+cli-truncate@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
+  dependencies:
+    slice-ansi "0.0.4"
+    string-width "^1.0.1"
+
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+cliui@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+  dependencies:
+    string-width "^2.1.1"
+    strip-ansi "^4.0.0"
+    wrap-ansi "^2.0.0"
+
+clone-buffer@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+
+clone-deep@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
+  dependencies:
+    for-own "^1.0.0"
+    is-plain-object "^2.0.4"
+    kind-of "^6.0.0"
+    shallow-clone "^1.0.0"
+
+clone-response@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+  dependencies:
+    mimic-response "^1.0.0"
+
+clone-stats@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+
+clone-stats@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+
+clone@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
+
+clone@^1.0.0, clone@^1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+
+clone@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+
+cloneable-readable@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65"
+  dependencies:
+    inherits "^2.0.1"
+    process-nextick-args "^2.0.0"
+    readable-stream "^2.3.5"
+
+co-body@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124"
+  dependencies:
+    inflation "^2.0.0"
+    qs "^6.4.0"
+    raw-body "^2.2.0"
+    type-is "^1.6.14"
+
+co-body@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3"
+  dependencies:
+    inflation "^2.0.0"
+    qs "^6.5.2"
+    raw-body "^2.3.3"
+    type-is "^1.6.16"
+
+co@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+  dependencies:
+    q "^1.1.2"
+
+coa@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af"
+  dependencies:
+    q "^1.1.2"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.3.0, color-convert@^1.9.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+  dependencies:
+    color-name "1.1.1"
+
+color-name@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+color-name@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+color-string@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+  dependencies:
+    color-name "^1.0.0"
+
+color-support@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+
+color@^0.11.0:
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+  dependencies:
+    clone "^1.0.2"
+    color-convert "^1.3.0"
+    color-string "^0.3.0"
+
+colormin@^1.0.5:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+  dependencies:
+    color "^0.11.0"
+    css-color-names "0.0.4"
+    has "^1.0.1"
+
+colors@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+
+colors@^1.1.2:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e"
+
+colors@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@2.15.1, commander@2.15.x, commander@^2.11.0, commander@^2.12.1, commander@^2.7.1, commander@^2.9.0, commander@~2.15.0:
+  version "2.15.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+
+commander@~2.13.0:
+  version "2.13.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commander@~2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
+  dependencies:
+    graceful-readlink ">= 1.0.0"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+compressible@^2.0.0:
+  version "2.0.14"
+  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7"
+  dependencies:
+    mime-db ">= 1.34.0 < 2"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+condense-newlines@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-whitespace "^0.3.0"
+    kind-of "^3.0.2"
+
+config-chain@~1.1.5:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
+  dependencies:
+    ini "^1.3.4"
+    proto-list "~1.2.1"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+console-stream@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
+
+consolidate@^0.15.0, consolidate@^0.15.1:
+  version "0.15.1"
+  resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
+  dependencies:
+    bluebird "^3.1.1"
+
+constantinople@^3.0.1:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
+  dependencies:
+    "@types/babel-types" "^7.0.0"
+    "@types/babylon" "^6.16.2"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2, content-disposition@~0.5.0:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type@^1.0.0, content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@1.X, convert-source-map@^1.1.1, convert-source-map@^1.2.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+cookies@~0.7.0:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b"
+  dependencies:
+    depd "~1.1.1"
+    keygrip "~1.0.2"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+copy-to@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5"
+
+core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
+  version "2.5.7"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+crc-32@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
+  dependencies:
+    exit-on-epipe "~1.0.1"
+    printj "~1.1.0"
+
+create-ecdh@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-error-class@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+  dependencies:
+    capture-stack-trace "^1.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  dependencies:
+    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@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  dependencies:
+    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"
+
+cropperjs@^1.1.3:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.4.0.tgz#e9851559c590d148a10c17c36cdc8126acf01a2e"
+
+cross-spawn@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cross-spawn@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+  version "6.0.5"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    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@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    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"
+
+css-color-names@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-loader@0.28.11:
+  version "0.28.11"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    css-selector-tokenizer "^0.7.0"
+    cssnano "^3.10.0"
+    icss-utils "^2.1.0"
+    loader-utils "^1.0.2"
+    lodash.camelcase "^4.3.0"
+    object-assign "^4.1.1"
+    postcss "^5.0.6"
+    postcss-modules-extract-imports "^1.2.0"
+    postcss-modules-local-by-default "^1.2.0"
+    postcss-modules-scope "^1.1.0"
+    postcss-modules-values "^1.3.0"
+    postcss-value-parser "^3.3.0"
+    source-list-map "^2.0.0"
+
+css-parse@1.7.x:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
+
+css-select-base-adapter@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990"
+
+css-select@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+  dependencies:
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
+css-select@~1.3.0-rc0:
+  version "1.3.0-rc0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231"
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "^1.0.1"
+
+css-selector-tokenizer@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+  dependencies:
+    cssesc "^0.1.0"
+    fastparse "^1.1.1"
+    regexpu-core "^1.0.0"
+
+css-tree@1.0.0-alpha.29:
+  version "1.0.0-alpha.29"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
+  dependencies:
+    mdn-data "~1.1.0"
+    source-map "^0.5.3"
+
+css-tree@1.0.0-alpha25:
+  version "1.0.0-alpha25"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597"
+  dependencies:
+    mdn-data "^1.0.0"
+    source-map "^0.5.3"
+
+css-url-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec"
+
+css-what@2.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+css@2.X, css@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be"
+  dependencies:
+    inherits "^2.0.1"
+    source-map "^0.1.38"
+    source-map-resolve "^0.5.1"
+    urix "^0.1.0"
+
+cssesc@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+cssnano@^3.0.0, cssnano@^3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+  dependencies:
+    autoprefixer "^6.3.1"
+    decamelize "^1.1.2"
+    defined "^1.0.0"
+    has "^1.0.1"
+    object-assign "^4.0.1"
+    postcss "^5.0.14"
+    postcss-calc "^5.2.0"
+    postcss-colormin "^2.1.8"
+    postcss-convert-values "^2.3.4"
+    postcss-discard-comments "^2.0.4"
+    postcss-discard-duplicates "^2.0.1"
+    postcss-discard-empty "^2.0.1"
+    postcss-discard-overridden "^0.1.1"
+    postcss-discard-unused "^2.2.1"
+    postcss-filter-plugins "^2.0.0"
+    postcss-merge-idents "^2.1.5"
+    postcss-merge-longhand "^2.0.1"
+    postcss-merge-rules "^2.0.3"
+    postcss-minify-font-values "^1.0.2"
+    postcss-minify-gradients "^1.0.1"
+    postcss-minify-params "^1.0.4"
+    postcss-minify-selectors "^2.0.4"
+    postcss-normalize-charset "^1.1.0"
+    postcss-normalize-url "^3.0.7"
+    postcss-ordered-values "^2.1.0"
+    postcss-reduce-idents "^2.2.2"
+    postcss-reduce-initial "^1.0.0"
+    postcss-reduce-transforms "^1.0.3"
+    postcss-svgo "^2.1.1"
+    postcss-unique-selectors "^2.0.2"
+    postcss-value-parser "^3.2.3"
+    postcss-zindex "^2.0.1"
+
+csso@^3.5.0:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
+  dependencies:
+    css-tree "1.0.0-alpha.29"
+
+csso@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+  dependencies:
+    clap "^1.0.9"
+    source-map "^0.5.3"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.3.1 < 0.4.0":
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf"
+  dependencies:
+    cssom "0.3.x"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+cyclist@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dargs@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+data-urls@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f"
+  dependencies:
+    abab "^1.0.4"
+    whatwg-mimetype "^2.0.0"
+    whatwg-url "^6.4.0"
+
+date-fns@^1.27.2:
+  version "1.29.0"
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+dateformat@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
+
+dateformat@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
+
+de-indent@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+
+debug-fabulous@1.X:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e"
+  dependencies:
+    debug "3.X"
+    memoizee "0.4.X"
+    object-assign "4.X"
+
+debug@*, debug@3.1.0, debug@3.X, debug@^3.0.0, debug@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+debug@0.7.4:
+  version "0.7.4"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
+
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.1, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debuglog@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  dependencies:
+    mimic-response "^1.0.0"
+
+decompress-tar@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466"
+  dependencies:
+    is-tar "^1.0.0"
+    object-assign "^2.0.0"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-tarbz2@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d"
+  dependencies:
+    is-bzip2 "^1.0.0"
+    object-assign "^2.0.0"
+    seek-bzip "^1.0.3"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-targz@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0"
+  dependencies:
+    is-gzip "^1.0.0"
+    object-assign "^2.0.0"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-unzip@^3.0.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb"
+  dependencies:
+    is-zip "^1.0.0"
+    read-all-stream "^3.0.0"
+    stat-mode "^0.2.0"
+    strip-dirs "^1.0.0"
+    through2 "^2.0.0"
+    vinyl "^1.0.0"
+    yauzl "^2.2.1"
+
+decompress@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed"
+  dependencies:
+    buffer-to-vinyl "^1.0.0"
+    concat-stream "^1.4.6"
+    decompress-tar "^3.0.0"
+    decompress-tarbz2 "^3.0.0"
+    decompress-targz "^3.0.0"
+    decompress-unzip "^3.0.0"
+    stream-combiner2 "^1.1.1"
+    vinyl-assign "^1.0.1"
+    vinyl-fs "^2.2.0"
+
+deep-equal@1.0.1, deep-equal@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+deep-extend@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
+
+deep-extend@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+deep-is@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.2.tgz#9ced65ea0bc0b09f42a6d79c1b1903f9d913cc18"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+deepcopy@0.6.3:
+  version "0.6.3"
+  resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0"
+
+deepmerge@^1.2.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
+
+deepmerge@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768"
+
+defaults@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+  dependencies:
+    clone "^1.0.2"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+depd@^1.1.0, depd@~1.1.1, depd@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+deprecated@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+destroy@^1.0.3, destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-conflict@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e"
+
+detect-file@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-indent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+
+detect-libc@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detect-newline@2.X:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+
+dezalgo@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
+  dependencies:
+    asap "^2.0.0"
+    wrappy "1"
+
+dicer@0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
+  dependencies:
+    readable-stream "1.1.x"
+    streamsearch "0.1.2"
+
+diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+
+diffie-hellman@^5.0.0:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+dijkstrajs@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
+
+dir-glob@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
+  dependencies:
+    arrify "^1.0.1"
+    path-type "^3.0.0"
+
+diskusage@0.2.4:
+  version "0.2.4"
+  resolved "https://registry.yarnpkg.com/diskusage/-/diskusage-0.2.4.tgz#e956f7a1051e0c6a1af706154efe620a2ee432ec"
+  dependencies:
+    nan "^2.5.0"
+
+doctrine@^2.0.0, doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  dependencies:
+    esutils "^2.0.2"
+
+doctypes@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
+
+dom-serializer@0, dom-serializer@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+  dependencies:
+    domelementtype "~1.1.1"
+    entities "~1.1.1"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+domelementtype@1, domelementtype@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domexception@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+  dependencies:
+    webidl-conversions "^4.0.2"
+
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  dependencies:
+    domelementtype "1"
+
+dompurify@1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-1.0.4.tgz#b0655d07856c1ef76fd27ae18e8ab1174ed18819"
+
+domutils@1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+dot-prop@^4.1.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+  dependencies:
+    is-obj "^1.0.0"
+
+double-ended-queue@^2.1.0-0:
+  version "2.1.0-0"
+  resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+
+download@^4.0.0, download@^4.1.2:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac"
+  dependencies:
+    caw "^1.0.1"
+    concat-stream "^1.4.7"
+    each-async "^1.0.0"
+    filenamify "^1.0.1"
+    got "^5.0.0"
+    gulp-decompress "^1.2.0"
+    gulp-rename "^1.2.0"
+    is-url "^1.2.0"
+    object-assign "^4.0.1"
+    read-all-stream "^3.0.0"
+    readable-stream "^2.0.2"
+    stream-combiner2 "^1.1.1"
+    vinyl "^1.0.0"
+    vinyl-fs "^2.2.0"
+    ware "^1.2.0"
+
+duplexer2@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+  dependencies:
+    readable-stream "~1.1.9"
+
+duplexer2@^0.1.4, duplexer2@~0.1.0:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+  dependencies:
+    readable-stream "^2.0.2"
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+each-async@^1.0.0, each-async@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473"
+  dependencies:
+    onetime "^1.0.0"
+    set-immediate-shim "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ecdsa-sig-formatter@1.0.10:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+editions@^1.3.3:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b"
+
+editorconfig@^0.13.2:
+  version "0.13.3"
+  resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34"
+  dependencies:
+    bluebird "^3.0.5"
+    commander "^2.9.0"
+    lru-cache "^3.2.0"
+    semver "^5.1.0"
+    sigmund "^1.0.1"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+ejs@^2.5.9:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
+
+elasticsearch@15.0.0:
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.0.0.tgz#d888ceb858bba30221b68698d72c54bdcfdf2fba"
+  dependencies:
+    agentkeepalive "^3.4.1"
+    chalk "^1.0.0"
+    lodash "^4.17.10"
+
+electron-to-chromium@^1.2.7:
+  version "1.3.48"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900"
+
+elegant-spinner@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
+
+element-ui@2.3.9:
+  version "2.3.9"
+  resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.3.9.tgz#0c5996e74b375f2665d703c68bdb3269ae9269e0"
+  dependencies:
+    async-validator "~1.8.1"
+    babel-helper-vue-jsx-merge-props "^2.0.0"
+    deepmerge "^1.2.0"
+    normalize-wheel "^1.0.1"
+    resize-observer-polyfill "^1.5.0"
+    throttle-debounce "^1.0.1"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    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"
+
+emojilib@2.2.12:
+  version "2.2.12"
+  resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.2.12.tgz#29481fa5521ac5ed97a5cc0503901c3435d523fa"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  dependencies:
+    once "^1.4.0"
+
+end-of-stream@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
+  dependencies:
+    once "~1.3.0"
+
+enhanced-resolve@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    tapable "^1.0.0"
+
+entities@^1.1.1, entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+envinfo@^5.7.0:
+  version "5.10.0"
+  resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df"
+
+errno@^0.1.3, errno@~0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+error-inject@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37"
+
+error@^7.0.2:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02"
+  dependencies:
+    string-template "~0.2.1"
+    xtend "~4.0.0"
+
+es-abstract@^1.5.1, es-abstract@^1.6.1:
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2:
+  version "0.10.45"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.1"
+    next-tick "1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-promise@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4"
+
+es6-promise@^3.0.2:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
+
+es6-promise@^4.0.3, es6-promise@^4.1.1:
+  version "4.2.4"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
+
+es6-promisify@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+  dependencies:
+    es6-promise "^4.0.3"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.1, escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-regexp@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/escape-regexp/-/escape-regexp-0.0.1.tgz#f44bda12d45bbdf9cb7f862ee7e4827b3dd32254"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.9.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e"
+  dependencies:
+    esprima "^3.1.3"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+eslint-plugin-vue@4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.5.0.tgz#09d6597f4849e31a3846c2c395fccf17685b69c3"
+  dependencies:
+    vue-eslint-parser "^2.0.3"
+
+eslint-scope@^3.7.1:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+
+eslint@4.19.1:
+  version "4.19.1"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
+  dependencies:
+    ajv "^5.3.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.1.0"
+    doctrine "^2.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.4"
+    esquery "^1.0.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.0.1"
+    ignore "^3.3.3"
+    imurmurhash "^0.1.4"
+    inquirer "^3.0.6"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    regexpp "^1.0.1"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
+    strip-json-comments "~2.0.1"
+    table "4.0.2"
+    text-table "~0.2.0"
+
+espree@^3.5.2, espree@^3.5.4:
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+  dependencies:
+    acorn "^5.5.0"
+    acorn-jsx "^3.0.0"
+
+esprima@^2.6.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0, esprima@~4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esquery@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+eventemitter3@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
+
+events@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+exec-buffer@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
+  dependencies:
+    execa "^0.7.0"
+    p-finally "^1.0.0"
+    pify "^3.0.0"
+    rimraf "^2.5.4"
+    tempfile "^2.0.0"
+
+exec-series@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a"
+  dependencies:
+    async-each-series "^1.1.0"
+    object-assign "^4.1.0"
+
+execa@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+  dependencies:
+    cross-spawn "^6.0.0"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+executable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9"
+  dependencies:
+    meow "^3.1.0"
+
+exif-js@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814"
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+exit-on-epipe@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+  dependencies:
+    homedir-polyfill "^1.0.1"
+
+express@^4.12.2:
+  version "4.16.3"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
+  dependencies:
+    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"
+
+extend-shallow@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071"
+  dependencies:
+    kind-of "^1.1.0"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8"
+
+extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.1, external-editor@^2.0.4, external-editor@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+  dependencies:
+    chardet "^0.4.0"
+    iconv-lite "^0.4.17"
+    tmp "^0.0.33"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1"
+  dependencies:
+    ansi-gray "^0.1.1"
+    color-support "^1.1.3"
+    time-stamp "^1.0.0"
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-deep-equal@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-glob@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf"
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.0.1"
+    glob-parent "^3.1.0"
+    is-glob "^4.0.0"
+    merge2 "^1.2.1"
+    micromatch "^3.1.10"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fastparse@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
+fd-slicer@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+  dependencies:
+    pend "~1.2.0"
+
+figures@^1.3.5, figures@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-loader@1.1.11:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8"
+  dependencies:
+    loader-utils "^1.0.2"
+    schema-utils "^0.4.5"
+
+file-type@8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.0.0.tgz#6e4bccc741187f4113334a4e4a4ef84d54d7cc1e"
+
+file-type@^3.1.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+
+file-type@^4.1.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+filename-reserved-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4"
+
+filenamify@^1.0.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5"
+  dependencies:
+    filename-reserved-regex "^1.0.0"
+    strip-outer "^1.0.0"
+    trim-repeated "^1.0.0"
+
+fill-range@^2.1.0:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^3.0.0"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+finalhandler@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
+  dependencies:
+    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"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-index@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+find-versions@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62"
+  dependencies:
+    array-uniq "^1.0.0"
+    get-stdin "^4.0.1"
+    meow "^3.5.0"
+    semver-regex "^1.0.0"
+
+findup-sync@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
+  dependencies:
+    detect-file "^1.0.0"
+    is-glob "^3.1.0"
+    micromatch "^3.0.4"
+    resolve-dir "^1.0.1"
+
+fined@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476"
+  dependencies:
+    expand-tilde "^2.0.2"
+    is-plain-object "^2.0.3"
+    object.defaults "^1.1.0"
+    object.pick "^1.2.0"
+    parse-filepath "^1.0.1"
+
+first-chunk-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
+
+first-chunk-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70"
+  dependencies:
+    readable-stream "^2.0.2"
+
+flagged-respawn@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7"
+
+flat-cache@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+flatten@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+flow-parser@^0.*:
+  version "0.74.0"
+  resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.74.0.tgz#4acc8f55bdce5fa4da43c72c28ef8a9600ace87c"
+
+flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.4"
+
+for-in@^0.1.3:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
+
+for-in@^1.0.1, for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+for-own@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+form-data@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "1.0.6"
+    mime-types "^2.1.12"
+
+format-util@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95"
+
+forwarded@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
+fresh@0.5.2, fresh@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+
+from2@^2.1.0, from2@^2.1.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-constants@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+
+fs-extra@^4.0.2:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+  dependencies:
+    minipass "^2.2.1"
+
+fs-mkdirp-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
+  dependencies:
+    graceful-fs "^4.1.11"
+    through2 "^2.0.3"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0, fsevents@^1.1.2:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+  dependencies:
+    nan "^2.9.2"
+    node-pre-gyp "^0.10.0"
+
+fstream@^1.0.0, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+fuckadblock@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/fuckadblock/-/fuckadblock-3.2.1.tgz#17fa3237a5e15c86613406b911e608191a3e62e2"
+
+function-bind@^1.1.0, function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    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"
+
+gaze@^0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
+  dependencies:
+    globule "~0.1.0"
+
+gaze@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+  dependencies:
+    globule "^1.0.0"
+
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+  dependencies:
+    is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-paths@^0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.2.tgz#a9c27b1a8d006c931a4f26fcf7d1546e3ad71bea"
+  dependencies:
+    fs-extra "^4.0.2"
+
+get-proxy@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb"
+  dependencies:
+    rc "^1.1.2"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@3.0.0, get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+gh-got@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0"
+  dependencies:
+    got "^7.0.0"
+    is-plain-obj "^1.1.0"
+
+gifsicle@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+github-username@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417"
+  dependencies:
+    gh-got "^6.0.0"
+
+glob-all@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab"
+  dependencies:
+    glob "^7.0.5"
+    yargs "~1.2.6"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob-parent@^3.0.0, glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob-stream@^3.1.5:
+  version "3.1.18"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
+  dependencies:
+    glob "^4.3.1"
+    glob2base "^0.0.12"
+    minimatch "^2.0.1"
+    ordered-read-streams "^0.1.0"
+    through2 "^0.6.1"
+    unique-stream "^1.0.0"
+
+glob-stream@^5.3.2:
+  version "5.3.5"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22"
+  dependencies:
+    extend "^3.0.0"
+    glob "^5.0.3"
+    glob-parent "^3.0.0"
+    micromatch "^2.3.7"
+    ordered-read-streams "^0.3.0"
+    through2 "^0.6.0"
+    to-absolute-glob "^0.1.1"
+    unique-stream "^2.0.2"
+
+glob-stream@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
+  dependencies:
+    extend "^3.0.0"
+    glob "^7.1.1"
+    glob-parent "^3.1.0"
+    is-negated-glob "^1.0.0"
+    ordered-read-streams "^1.0.0"
+    pumpify "^1.3.5"
+    readable-stream "^2.1.5"
+    remove-trailing-separator "^1.0.1"
+    to-absolute-glob "^2.0.0"
+    unique-stream "^2.0.2"
+
+glob-to-regexp@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+
+glob-watcher@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
+  dependencies:
+    gaze "^0.5.1"
+
+glob2base@^0.0.12:
+  version "0.0.12"
+  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
+  dependencies:
+    find-index "^0.1.1"
+
+glob@7.0.x:
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.2"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    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@^4.3.1:
+  version "4.5.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^2.0.1"
+    once "^1.3.0"
+
+glob@^5.0.3:
+  version "5.0.15"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^6.0.4:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@~3.1.21:
+  version "3.1.21"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
+  dependencies:
+    graceful-fs "~1.2.0"
+    inherits "1"
+    minimatch "~0.2.11"
+
+global-modules@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+  dependencies:
+    global-prefix "^1.0.1"
+    is-windows "^1.0.1"
+    resolve-dir "^1.0.0"
+
+global-prefix@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+  dependencies:
+    expand-tilde "^2.0.2"
+    homedir-polyfill "^1.0.1"
+    ini "^1.3.4"
+    is-windows "^1.0.1"
+    which "^1.2.14"
+
+globals@^11.0.1:
+  version "11.5.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642"
+
+globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globby@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  dependencies:
+    array-union "^1.0.1"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globby@^8.0.0, globby@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50"
+  dependencies:
+    array-union "^1.0.1"
+    dir-glob "^2.0.0"
+    fast-glob "^2.0.2"
+    glob "^7.1.2"
+    ignore "^3.3.5"
+    pify "^3.0.0"
+    slash "^1.0.0"
+
+globule@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
+  dependencies:
+    glob "~7.1.1"
+    lodash "~4.17.10"
+    minimatch "~3.0.2"
+
+globule@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
+  dependencies:
+    glob "~3.1.21"
+    lodash "~1.0.1"
+    minimatch "~0.2.11"
+
+glogg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810"
+  dependencies:
+    sparkles "^1.0.0"
+
+gm@1.23.1:
+  version "1.23.1"
+  resolved "https://registry.yarnpkg.com/gm/-/gm-1.23.1.tgz#2edeeb958084d0f8ea7988e5d995b1c7dfc14777"
+  dependencies:
+    array-parallel "~0.1.3"
+    array-series "~0.1.5"
+    cross-spawn "^4.0.0"
+    debug "^3.1.0"
+
+got@^5.0.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35"
+  dependencies:
+    create-error-class "^3.0.1"
+    duplexer2 "^0.1.4"
+    is-redirect "^1.0.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    lowercase-keys "^1.0.0"
+    node-status-codes "^1.0.0"
+    object-assign "^4.0.1"
+    parse-json "^2.1.0"
+    pinkie-promise "^2.0.0"
+    read-all-stream "^3.0.0"
+    readable-stream "^2.0.5"
+    timed-out "^3.0.0"
+    unzip-response "^1.0.2"
+    url-parse-lax "^1.0.0"
+
+got@^7.0.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+  dependencies:
+    decompress-response "^3.2.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    is-plain-obj "^1.1.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    p-cancelable "^0.3.0"
+    p-timeout "^1.1.1"
+    safe-buffer "^5.0.1"
+    timed-out "^4.0.0"
+    url-parse-lax "^1.0.0"
+    url-to-options "^1.0.1"
+
+got@^8.3.1:
+  version "8.3.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed"
+  dependencies:
+    "@sindresorhus/is" "^0.7.0"
+    cacheable-request "^2.1.1"
+    decompress-response "^3.3.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    into-stream "^3.1.0"
+    is-retry-allowed "^1.1.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    mimic-response "^1.0.0"
+    p-cancelable "^0.4.0"
+    p-timeout "^2.0.1"
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+    timed-out "^4.0.1"
+    url-parse-lax "^3.0.0"
+    url-to-options "^1.0.1"
+
+graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+graceful-fs@^3.0.0:
+  version "3.0.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
+  dependencies:
+    natives "^1.1.0"
+
+graceful-fs@~1.2.0:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
+
+"graceful-readlink@>= 1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+grouped-queue@^0.3.3:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c"
+  dependencies:
+    lodash "^4.17.2"
+
+growl@1.10.5:
+  version "1.10.5"
+  resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+
+gulp-cssnano@2.1.3:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz#02007e2817af09b3688482b430ad7db807aebf72"
+  dependencies:
+    buffer-from "^1.0.0"
+    cssnano "^3.0.0"
+    object-assign "^4.0.1"
+    plugin-error "^1.0.1"
+    vinyl-sourcemaps-apply "^0.2.1"
+
+gulp-decompress@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7"
+  dependencies:
+    archive-type "^3.0.0"
+    decompress "^3.0.0"
+    gulp-util "^3.0.1"
+    readable-stream "^2.0.2"
+
+gulp-htmlmin@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz#266feaed83588838aedda3666f67d057ec120313"
+  dependencies:
+    bufferstreams "^1.1.0"
+    html-minifier "^3.0.3"
+    plugin-error "^0.1.2"
+    readable-stream "^2.0.2"
+    tryit "^1.0.1"
+
+gulp-imagemin@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz#5ce347f1d1706fed3cc8f1777ca9094a583b50b7"
+  dependencies:
+    chalk "^2.1.0"
+    fancy-log "^1.3.2"
+    imagemin "^5.3.1"
+    plugin-error "^0.1.2"
+    plur "^2.1.2"
+    pretty-bytes "^4.0.2"
+    through2-concurrent "^1.1.1"
+  optionalDependencies:
+    imagemin-gifsicle "^5.2.0"
+    imagemin-jpegtran "^5.0.2"
+    imagemin-optipng "^5.2.1"
+    imagemin-svgo "^6.0.0"
+
+gulp-mocha@6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-6.0.0.tgz#80f32bc705ce30747f355ddb8ccd96a1c73bef13"
+  dependencies:
+    dargs "^5.1.0"
+    execa "^0.10.0"
+    mocha "^5.2.0"
+    npm-run-path "^2.0.2"
+    plugin-error "^1.0.1"
+    supports-color "^5.4.0"
+    through2 "^2.0.3"
+
+gulp-pug@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/gulp-pug/-/gulp-pug-4.0.1.tgz#5c5bb38303a5a565add8b200e292b4a076cf2efa"
+  dependencies:
+    "@types/pug" "^2.0.4"
+    fancy-log "^1.3.2"
+    plugin-error "^1.0.1"
+    pug "^2.0.3"
+    replace-ext "^1.0.0"
+    through2 "^2.0.3"
+
+gulp-rename@1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz#37b75298e9d3e6c0fe9ac4eac13ce3be5434646b"
+
+gulp-rename@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826"
+
+gulp-replace@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143"
+  dependencies:
+    istextorbinary "2.2.1"
+    readable-stream "^2.0.1"
+    replacestream "^4.0.0"
+
+gulp-sourcemaps@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c"
+  dependencies:
+    convert-source-map "^1.1.1"
+    graceful-fs "^4.1.2"
+    strip-bom "^2.0.0"
+    through2 "^2.0.0"
+    vinyl "^1.0.0"
+
+gulp-sourcemaps@2.6.4:
+  version "2.6.4"
+  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz#cbb2008450b1bcce6cd23bf98337be751bf6e30a"
+  dependencies:
+    "@gulp-sourcemaps/identity-map" "1.X"
+    "@gulp-sourcemaps/map-sources" "1.X"
+    acorn "5.X"
+    convert-source-map "1.X"
+    css "2.X"
+    debug-fabulous "1.X"
+    detect-newline "2.X"
+    graceful-fs "4.X"
+    source-map "~0.6.0"
+    strip-bom-string "1.X"
+    through2 "2.X"
+
+gulp-stylus@2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/gulp-stylus/-/gulp-stylus-2.7.0.tgz#f3e932626004927b75ea27ff5c1d3b0ba0b7cbb1"
+  dependencies:
+    accord "^0.26.3"
+    lodash.assign "^3.2.0"
+    plugin-error "^0.1.2"
+    replace-ext "0.0.1"
+    stylus "^0.54.0"
+    through2 "^2.0.0"
+    vinyl-sourcemaps-apply "^0.2.0"
+
+gulp-tslint@8.1.3:
+  version "8.1.3"
+  resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.3.tgz#a89ed144038ae861ee7bfea9528272d126a93da1"
+  dependencies:
+    "@types/fancy-log" "1.3.0"
+    chalk "2.3.1"
+    fancy-log "1.3.2"
+    map-stream "~0.0.7"
+    plugin-error "1.0.1"
+    through "~2.3.8"
+
+gulp-typescript@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-4.0.2.tgz#80bb9e376e7aa87b763a6ad5fe054a5d078da1e6"
+  dependencies:
+    ansi-colors "^1.0.1"
+    plugin-error "^0.1.2"
+    source-map "^0.6.1"
+    through2 "^2.0.3"
+    vinyl "^2.1.0"
+    vinyl-fs "^3.0.0"
+
+gulp-uglify@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca"
+  dependencies:
+    gulplog "^1.0.0"
+    has-gulplog "^0.1.0"
+    lodash "^4.13.1"
+    make-error-cause "^1.1.1"
+    through2 "^2.0.0"
+    uglify-js "^3.0.5"
+    vinyl-sourcemaps-apply "^0.2.0"
+
+gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.1:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
+  dependencies:
+    array-differ "^1.0.0"
+    array-uniq "^1.0.2"
+    beeper "^1.0.0"
+    chalk "^1.0.0"
+    dateformat "^2.0.0"
+    fancy-log "^1.1.0"
+    gulplog "^1.0.0"
+    has-gulplog "^0.1.0"
+    lodash._reescape "^3.0.0"
+    lodash._reevaluate "^3.0.0"
+    lodash._reinterpolate "^3.0.0"
+    lodash.template "^3.0.0"
+    minimist "^1.1.0"
+    multipipe "^0.1.2"
+    object-assign "^3.0.0"
+    replace-ext "0.0.1"
+    through2 "^2.0.0"
+    vinyl "^0.5.0"
+
+gulp@3.9.1:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
+  dependencies:
+    archy "^1.0.0"
+    chalk "^1.0.0"
+    deprecated "^0.0.1"
+    gulp-util "^3.0.0"
+    interpret "^1.0.0"
+    liftoff "^2.1.0"
+    minimist "^1.1.0"
+    orchestrator "^0.3.0"
+    pretty-hrtime "^1.0.0"
+    semver "^4.1.0"
+    tildify "^1.0.0"
+    v8flags "^2.0.2"
+    vinyl-fs "^0.3.0"
+
+gulplog@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+  dependencies:
+    glogg "^1.0.0"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  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:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    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"
+
+hard-source-webpack-plugin@0.6.10:
+  version "0.6.10"
+  resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.6.10.tgz#bae18a97c12150d31fa9d5e40625c65b0b10034d"
+  dependencies:
+    lodash "^4.15.0"
+    mkdirp "^0.5.1"
+    node-object-hash "^1.2.0"
+    rimraf "^2.6.2"
+    tapable "^1.0.0-beta.5"
+    webpack-core "~0.6.0"
+    webpack-sources "^1.0.1"
+    write-json-file "^2.3.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-color@~0.1.0:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-gulplog@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+  dependencies:
+    sparkles "^1.0.0"
+
+has-symbol-support-x@^1.4.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+
+has-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
+
+has-to-string-tag-x@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+  dependencies:
+    has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  dependencies:
+    function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash-sum@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.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.x, he@^1.1.0, he@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+highlight.js@9.12.0:
+  version "9.12.0"
+  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoek@4.x.x:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+homedir-polyfill@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
+  dependencies:
+    parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
+
+html-comment-regex@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+html-encoding-sniffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+  dependencies:
+    whatwg-encoding "^1.0.1"
+
+html-entities@1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+html-minifier@3.5.16, html-minifier@^3.0.3:
+  version "3.5.16"
+  resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175"
+  dependencies:
+    camel-case "3.0.x"
+    clean-css "4.1.x"
+    commander "2.15.x"
+    he "1.1.x"
+    param-case "2.1.x"
+    relateurl "0.2.x"
+    uglify-js "3.3.x"
+
+htmlparser2@^3.9.1:
+  version "3.9.2"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+  dependencies:
+    domelementtype "^1.3.0"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+http-assert@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a"
+  dependencies:
+    deep-equal "~1.0.1"
+    http-errors "~1.6.1"
+
+http-cache-semantics@3.8.1:
+  version "3.8.1"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+
+http-errors@1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+  dependencies:
+    depd "1.1.1"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3:
+  version "1.6.3"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.3"
+    setprototypeof "1.1.0"
+    statuses ">= 1.4.0 < 2"
+
+http-signature@1.2.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"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+http_ece@1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.0.5.tgz#b60660faaf14215102d1493ea720dcd92b53372f"
+  dependencies:
+    urlsafe-base64 "~1.0.0"
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+https-proxy-agent@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
+  dependencies:
+    agent-base "^4.1.0"
+    debug "^3.1.0"
+
+humanize-ms@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+  dependencies:
+    ms "^2.0.0"
+
+humanize-number@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18"
+
+iconv-lite@0.4.19:
+  version "0.4.19"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
+  version "0.4.23"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+icss-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+  dependencies:
+    postcss "^6.0.1"
+
+ieee754@^1.1.4:
+  version "1.1.12"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore-walk@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+  dependencies:
+    minimatch "^3.0.4"
+
+ignore@^3.3.3, ignore@^3.3.5:
+  version "3.3.8"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
+
+imagemin-gifsicle@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz#3781524c457612ef04916af34241a2b42bfcb40a"
+  dependencies:
+    exec-buffer "^3.0.0"
+    gifsicle "^3.0.0"
+    is-gif "^1.0.0"
+
+imagemin-jpegtran@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz#e6882263b8f7916fddb800640cf75d2e970d2ad6"
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-jpg "^1.0.0"
+    jpegtran-bin "^3.0.0"
+
+imagemin-optipng@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#d22da412c09f5ff00a4339960b98a88b1dbe8695"
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-png "^1.0.0"
+    optipng-bin "^3.0.0"
+
+imagemin-svgo@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz#2dd8c82946be42a8e2cbcae3c5bf007bc2b8b9e8"
+  dependencies:
+    buffer-from "^0.1.1"
+    is-svg "^2.0.0"
+    svgo "^1.0.0"
+
+imagemin@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-5.3.1.tgz#f19c2eee1e71ba6c6558c515f9fc96680189a6d4"
+  dependencies:
+    file-type "^4.1.0"
+    globby "^6.1.0"
+    make-dir "^1.0.0"
+    p-pipe "^1.1.0"
+    pify "^2.3.0"
+    replace-ext "^1.0.0"
+
+import-local@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+  dependencies:
+    pkg-dir "^2.0.0"
+    resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+in-publish@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+indent-string@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
+
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+indx@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50"
+
+inflation@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.4, ini@~1.3.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+inquirer@3.0.6:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.1"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx "^4.1.0"
+    string-width "^2.0.0"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+inquirer@5.2.0, inquirer@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.1.0"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rxjs "^5.5.2"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+inquirer@^3.0.6:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+interpret@^1.0.0, interpret@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+into-stream@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+  dependencies:
+    from2 "^2.1.1"
+    p-is-promise "^1.1.0"
+
+invariant@^2.2.2:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ip-regex@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
+
+ipaddr.js@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
+
+irregular-plurals@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766"
+
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-absolute@^0.1.5:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f"
+  dependencies:
+    is-relative "^0.1.0"
+
+is-absolute@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
+  dependencies:
+    is-relative "^1.0.0"
+    is-windows "^1.0.1"
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-bzip2@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-expression@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
+  dependencies:
+    acorn "~4.0.2"
+    object-assign "^4.0.1"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-generator-function@^1.0.3:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
+
+is-gif@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-gzip@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83"
+
+is-jpg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975"
+
+is-my-ip-valid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
+
+is-my-json-valid@^2.12.4:
+  version "2.17.2"
+  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c"
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    is-my-ip-valid "^1.0.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
+
+is-natural-number@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7"
+
+is-negated-glob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+
+is-observable@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
+  dependencies:
+    symbol-observable "^1.1.0"
+
+is-odd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
+  dependencies:
+    is-number "^4.0.0"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
+
+is-png@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.0.0, is-promise@^2.1, is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-redirect@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-regex@^1.0.3, is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-relative@^0.1.0:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82"
+
+is-relative@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
+  dependencies:
+    is-unc-path "^1.0.0"
+
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
+is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-root@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019"
+
+is-scoped@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30"
+  dependencies:
+    scoped-regex "^1.0.0"
+
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-svg@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+  dependencies:
+    html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-tar@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d"
+
+is-there@^4.0.0:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.4.3.tgz#a2c49366c6a487f719dbcad80cbde21248d2c18d"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-unc-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
+  dependencies:
+    unc-path-regex "^0.1.2"
+
+is-url@1.2.4, is-url@^1.2.0:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+
+is-utf8@^0.2.0, is-utf8@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-valid-glob@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe"
+
+is-valid-glob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
+
+is-whitespace@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
+
+is-windows@^1.0.1, is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+is-zip@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325"
+
+is2@0.0.9:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629"
+  dependencies:
+    deep-is "0.1.2"
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isarray@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
+
+isbinaryfile@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istextorbinary@2.2.1, istextorbinary@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53"
+  dependencies:
+    binaryextensions "2"
+    editions "^1.3.3"
+    textextensions "2"
+
+isurl@^1.0.0-alpha5:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+  dependencies:
+    has-to-string-tag-x "^1.2.0"
+    is-object "^1.0.1"
+
+jpegtran-bin@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz#f60ecf4ae999c0bdad2e9fbcdf2b6f0981e7a29b"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+js-base64@^2.1.8, js-base64@^2.1.9:
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92"
+
+js-beautify@^1.6.12:
+  version "1.7.5"
+  resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919"
+  dependencies:
+    config-chain "~1.1.5"
+    editorconfig "^0.13.2"
+    mkdirp "~0.5.0"
+    nopt "~3.0.1"
+
+js-stringify@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@^3.4.6, js-yaml@^3.7.0, js-yaml@^3.8.4, js-yaml@^3.9.1:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@~3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^2.6.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jschardet@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678"
+
+jscodeshift@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.4.1.tgz#da91a1c2eccfa03a3387a21d39948e251ced444a"
+  dependencies:
+    async "^1.5.0"
+    babel-plugin-transform-flow-strip-types "^6.8.0"
+    babel-preset-es2015 "^6.9.0"
+    babel-preset-stage-1 "^6.5.0"
+    babel-register "^6.9.0"
+    babylon "^6.17.3"
+    colors "^1.1.2"
+    flow-parser "^0.*"
+    lodash "^4.13.1"
+    micromatch "^2.3.7"
+    node-dir "0.1.8"
+    nomnom "^1.8.1"
+    recast "^0.12.5"
+    temp "^0.8.1"
+    write-file-atomic "^1.2.0"
+
+jscodeshift@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.5.1.tgz#4af6a721648be8638ae1464a190342da52960c33"
+  dependencies:
+    babel-plugin-transform-flow-strip-types "^6.8.0"
+    babel-preset-es2015 "^6.9.0"
+    babel-preset-stage-1 "^6.5.0"
+    babel-register "^6.9.0"
+    babylon "^7.0.0-beta.47"
+    colors "^1.1.2"
+    flow-parser "^0.*"
+    lodash "^4.13.1"
+    micromatch "^2.3.7"
+    neo-async "^2.5.0"
+    node-dir "0.1.8"
+    nomnom "^1.8.1"
+    recast "^0.15.0"
+    temp "^0.8.1"
+    write-file-atomic "^1.2.0"
+
+jsdom@11.11.0:
+  version "11.11.0"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e"
+  dependencies:
+    abab "^1.0.4"
+    acorn "^5.3.0"
+    acorn-globals "^4.1.0"
+    array-equal "^1.0.0"
+    cssom ">= 0.3.2 < 0.4.0"
+    cssstyle ">= 0.3.1 < 0.4.0"
+    data-urls "^1.0.0"
+    domexception "^1.0.0"
+    escodegen "^1.9.0"
+    html-encoding-sniffer "^1.0.2"
+    left-pad "^1.2.0"
+    nwsapi "^2.0.0"
+    parse5 "4.0.0"
+    pn "^1.1.0"
+    request "^2.83.0"
+    request-promise-native "^1.0.5"
+    sax "^1.2.4"
+    symbol-tree "^3.2.2"
+    tough-cookie "^2.3.3"
+    w3c-hr-time "^1.0.1"
+    webidl-conversions "^4.0.2"
+    whatwg-encoding "^1.0.3"
+    whatwg-mimetype "^2.1.0"
+    whatwg-url "^6.4.1"
+    ws "^4.0.0"
+    xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-buffer@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-schema-ref-parser@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-1.4.1.tgz#c0c2e438bf0796723b02451bae8bc7dd0b37fed0"
+  dependencies:
+    call-me-maybe "^1.0.1"
+    debug "^2.2.0"
+    es6-promise "^3.0.2"
+    js-yaml "^3.4.6"
+    ono "^2.0.1"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@0.5.1, json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+jstransformer@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
+  dependencies:
+    is-promise "^2.0.0"
+    promise "^7.0.1"
+
+jwa@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6"
+  dependencies:
+    buffer-equal-constant-time "1.0.1"
+    ecdsa-sig-formatter "1.0.10"
+    safe-buffer "^5.0.1"
+
+jws@^3.1.3:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f"
+  dependencies:
+    jwa "^1.1.5"
+    safe-buffer "^5.0.1"
+
+keygrip@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91"
+
+keyv@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+  dependencies:
+    json-buffer "3.0.0"
+
+kind-of@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+koa-bodyparser@4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29"
+  dependencies:
+    co-body "^6.0.0"
+    copy-to "^2.0.1"
+
+koa-compose@^3.0.0, koa-compose@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7"
+  dependencies:
+    any-promise "^1.1.0"
+
+koa-compose@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+
+koa-compress@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-3.0.0.tgz#3194059c215cbc24e59bbc84c2c7453a4c88564f"
+  dependencies:
+    bytes "^3.0.0"
+    compressible "^2.0.0"
+    koa-is-json "^1.0.0"
+    statuses "^1.0.0"
+
+koa-convert@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0"
+  dependencies:
+    co "^4.6.0"
+    koa-compose "^3.0.0"
+
+koa-favicon@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/koa-favicon/-/koa-favicon-2.0.1.tgz#cfae363e5fd00bd5dd67c1150fbef31e0b5d6f4d"
+  dependencies:
+    mz "^2.7.0"
+
+koa-is-json@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14"
+
+koa-json-body@5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/koa-json-body/-/koa-json-body-5.3.0.tgz#64aad3f400adfb81df54b63f7a5eb38bad62d980"
+  dependencies:
+    co-body "^5.0.0"
+
+koa-logger@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.0.tgz#8aef64d8b848fb6253a9b31aa708d0e05141f0e6"
+  dependencies:
+    bytes "^2.5.0"
+    chalk "^1.1.3"
+    humanize-number "0.0.2"
+    passthrough-counter "^1.0.0"
+
+koa-mount@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-3.0.0.tgz#08cab3b83d31442ed8b7e75c54b1abeb922ec197"
+  dependencies:
+    debug "^2.6.1"
+    koa-compose "^3.2.1"
+
+koa-multer@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/koa-multer/-/koa-multer-1.0.2.tgz#d38f7ffd1db97b1aad33e7774732f000ebd67259"
+  dependencies:
+    multer "1.3.0"
+
+koa-router@7.4.0:
+  version "7.4.0"
+  resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0"
+  dependencies:
+    debug "^3.1.0"
+    http-errors "^1.3.1"
+    koa-compose "^3.0.0"
+    methods "^1.0.1"
+    path-to-regexp "^1.1.1"
+    urijs "^1.19.0"
+
+koa-send@4.1.3, koa-send@^4.0.0:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6"
+  dependencies:
+    debug "^2.6.3"
+    http-errors "^1.6.1"
+    mz "^2.6.0"
+    resolve-path "^1.4.0"
+
+koa-slow@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/koa-slow/-/koa-slow-2.1.0.tgz#39007ca628c620f2b307b90dbf423d7a0c9be971"
+  dependencies:
+    lodash.isregexp "3.0.5"
+    q "1.4.1"
+
+koa-views@6.1.4:
+  version "6.1.4"
+  resolved "https://registry.yarnpkg.com/koa-views/-/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d"
+  dependencies:
+    consolidate "^0.15.0"
+    debug "^3.1.0"
+    get-paths "^0.0.2"
+    koa-send "^4.0.0"
+    mz "^2.4.0"
+    pretty "^2.0.0"
+
+koa@2.5.1:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.1.tgz#79f8b95f8d72d04fe9a58a8da5ebd6d341103f9c"
+  dependencies:
+    accepts "^1.2.2"
+    content-disposition "~0.5.0"
+    content-type "^1.0.0"
+    cookies "~0.7.0"
+    debug "*"
+    delegates "^1.0.0"
+    depd "^1.1.0"
+    destroy "^1.0.3"
+    error-inject "~1.0.0"
+    escape-html "~1.0.1"
+    fresh "^0.5.2"
+    http-assert "^1.1.0"
+    http-errors "^1.2.8"
+    is-generator-function "^1.0.3"
+    koa-compose "^4.0.0"
+    koa-convert "^1.2.0"
+    koa-is-json "^1.0.0"
+    mime-types "^2.0.7"
+    on-finished "^2.1.0"
+    only "0.0.2"
+    parseurl "^1.3.0"
+    statuses "^1.2.0"
+    type-is "^1.5.5"
+    vary "^1.0.0"
+
+kue@0.11.6:
+  version "0.11.6"
+  resolved "https://registry.yarnpkg.com/kue/-/kue-0.11.6.tgz#5b76916bcedd56636a107861471c63c94611860a"
+  dependencies:
+    body-parser "^1.12.2"
+    express "^4.12.2"
+    lodash "^4.0.0"
+    nib "~1.1.2"
+    node-redis-warlock "~0.2.0"
+    pug "^2.0.0-beta3"
+    redis "~2.6.0-2"
+    stylus "~0.54.5"
+    yargs "^4.0.0"
+  optionalDependencies:
+    reds "^0.2.5"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazy-req@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
+
+lazystream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+  dependencies:
+    readable-stream "^2.0.5"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+lead@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
+  dependencies:
+    flush-write-stream "^1.0.2"
+
+leb@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3"
+
+left-pad@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+license-checker@20.0.0:
+  version "20.0.0"
+  resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-20.0.0.tgz#29b338ba7f4e841b850cc59ddd393dbc8927f375"
+  dependencies:
+    chalk "^2.4.1"
+    debug "^3.1.0"
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    read-installed "~4.0.3"
+    semver "^5.5.0"
+    spdx "^0.5.1"
+    spdx-correct "^3.0.0"
+    spdx-satisfies "^4.0.0"
+    strip-ansi "^4.0.0"
+    treeify "^1.1.0"
+
+liftoff@^2.1.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
+  dependencies:
+    extend "^3.0.0"
+    findup-sync "^2.0.0"
+    fined "^1.0.1"
+    flagged-respawn "^1.0.0"
+    is-plain-object "^2.0.4"
+    object.map "^1.0.0"
+    rechoir "^0.6.2"
+    resolve "^1.1.7"
+
+listr-silent-renderer@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
+
+listr-update-renderer@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
+  dependencies:
+    chalk "^1.1.3"
+    cli-truncate "^0.2.1"
+    elegant-spinner "^1.0.1"
+    figures "^1.7.0"
+    indent-string "^3.0.0"
+    log-symbols "^1.0.2"
+    log-update "^1.0.2"
+    strip-ansi "^3.0.1"
+
+listr-verbose-renderer@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
+  dependencies:
+    chalk "^1.1.3"
+    cli-cursor "^1.0.2"
+    date-fns "^1.27.2"
+    figures "^1.7.0"
+
+listr@^0.14.1:
+  version "0.14.1"
+  resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d"
+  dependencies:
+    "@samverschueren/stream-to-observable" "^0.3.0"
+    cli-truncate "^0.2.1"
+    figures "^1.7.0"
+    indent-string "^2.1.0"
+    is-observable "^1.1.0"
+    is-promise "^2.1.0"
+    is-stream "^1.1.0"
+    listr-silent-renderer "^1.1.1"
+    listr-update-renderer "^0.4.0"
+    listr-verbose-renderer "^0.4.0"
+    log-symbols "^1.0.2"
+    log-update "^1.0.2"
+    ora "^0.2.3"
+    p-map "^1.1.1"
+    rxjs "^6.1.0"
+    strip-ansi "^3.0.1"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+load-json-file@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^4.0.0"
+    pify "^3.0.0"
+    strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash._baseassign@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+  dependencies:
+    lodash._basecopy "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basetostring@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+
+lodash._basevalues@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+
+lodash._bindcallback@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+
+lodash._createassigner@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"
+  dependencies:
+    lodash._bindcallback "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+    lodash.restparam "^3.0.0"
+
+lodash._getnative@^3.0.0:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._reescape@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+
+lodash._reevaluate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+
+lodash._reinterpolate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash._root@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+
+lodash.assign@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"
+  dependencies:
+    lodash._baseassign "^3.0.0"
+    lodash._createassigner "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+
+lodash.assignin@^4.0.9:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
+
+lodash.bind@^4.1.4:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
+
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+
+lodash.clone@^4.3.2:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
+
+lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+
+lodash.defaults@^4.0.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.escape@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+  dependencies:
+    lodash._root "^3.0.0"
+
+lodash.filter@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
+
+lodash.flatten@^4.2.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+
+lodash.foreach@^4.3.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+
+lodash.get@^4.0.0, lodash.get@^4.4.2:
+  version "4.4.2"
+  resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+
+lodash.isarguments@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isequal@^4.0.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+
+lodash.isregexp@3.0.5:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/lodash.isregexp/-/lodash.isregexp-3.0.5.tgz#e0f596242f2fa228a840086b6c8ad82e4b71fd2d"
+
+lodash.keys@^3.0.0:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+  dependencies:
+    lodash._getnative "^3.0.0"
+    lodash.isarguments "^3.0.0"
+    lodash.isarray "^3.0.0"
+
+lodash.map@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
+
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
+lodash.merge@^4.4.0:
+  version "4.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
+
+lodash.mergewith@^4.6.0:
+  version "4.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
+
+lodash.partialright@^4.1.4:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b"
+
+lodash.pick@^4.2.1:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+
+lodash.reduce@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
+
+lodash.reject@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
+
+lodash.restparam@^3.0.0:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
+lodash.some@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash.startcase@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8"
+
+lodash.tail@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
+
+lodash.template@^3.0.0:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+  dependencies:
+    lodash._basecopy "^3.0.0"
+    lodash._basetostring "^3.0.0"
+    lodash._basevalues "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+    lodash._reinterpolate "^3.0.0"
+    lodash.escape "^3.0.0"
+    lodash.keys "^3.0.0"
+    lodash.restparam "^3.0.0"
+    lodash.templatesettings "^3.0.0"
+
+lodash.templatesettings@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+  dependencies:
+    lodash._reinterpolate "^3.0.0"
+    lodash.escape "^3.0.0"
+
+lodash.unescape@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
+
+lodash.uniq@^4.3.0, lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+lodash@^3.10.1:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10:
+  version "4.17.10"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+lodash@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
+
+log-symbols@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
+  dependencies:
+    chalk "^1.0.0"
+
+log-symbols@^2.1.0, log-symbols@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+  dependencies:
+    chalk "^2.0.1"
+
+log-update@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
+  dependencies:
+    ansi-escapes "^1.0.0"
+    cli-cursor "^1.0.2"
+
+logalot@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
+  dependencies:
+    figures "^1.3.5"
+    squeak "^1.0.0"
+
+long@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
+
+longest@^1.0.0, longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+lower-case@^1.1.1:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+
+lowercase-keys@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lowercase-keys@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+
+lpad-align@^1.0.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
+  dependencies:
+    get-stdin "^4.0.1"
+    indent-string "^2.1.0"
+    longest "^1.0.0"
+    meow "^3.3.0"
+
+lru-cache@2, lru-cache@^2.5.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+
+lru-cache@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+  dependencies:
+    pseudomap "^1.0.1"
+
+lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-queue@0.1:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+  dependencies:
+    es5-ext "~0.10.2"
+
+make-dir@^1.0.0, make-dir@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  dependencies:
+    pify "^3.0.0"
+
+make-error-cause@^1.1.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d"
+  dependencies:
+    make-error "^1.2.0"
+
+make-error@^1.1.1, make-error@^1.2.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535"
+
+make-iterator@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
+  dependencies:
+    kind-of "^6.0.2"
+
+map-cache@^0.2.0, map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+map-stream@~0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
+
+math-expression-evaluator@^1.2.14:
+  version "1.2.17"
+  resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+
+math-random@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+mdn-data@^1.0.0, mdn-data@~1.1.0:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
+
+mecab-async@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/mecab-async/-/mecab-async-0.1.2.tgz#69efb838729216709597a57da2df03922f9b593a"
+  dependencies:
+    shell-quote "*"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem-fs-editor@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz#55a79b1e824da631254c4c95ba6366602c77af90"
+  dependencies:
+    commondir "^1.0.1"
+    deep-extend "^0.5.1"
+    ejs "^2.5.9"
+    glob "^7.0.3"
+    globby "^8.0.0"
+    isbinaryfile "^3.0.2"
+    mkdirp "^0.5.0"
+    multimatch "^2.0.0"
+    rimraf "^2.2.8"
+    through2 "^2.0.0"
+    vinyl "^2.0.1"
+
+mem-fs@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc"
+  dependencies:
+    through2 "^2.0.0"
+    vinyl "^1.1.0"
+    vinyl-file "^2.0.0"
+
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+memoizee@0.4.X:
+  version "0.4.12"
+  resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.30"
+    es6-weak-map "^2.0.2"
+    event-emitter "^0.3.5"
+    is-promise "^2.1"
+    lru-queue "0.1"
+    next-tick "1"
+    timers-ext "^0.1.2"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, meow@^3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+merge-source-map@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+  dependencies:
+    source-map "^0.6.1"
+
+merge-stream@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+  dependencies:
+    readable-stream "^2.0.1"
+
+merge2@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34"
+
+methods@^1.0.1, methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.7:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    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"
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+"mime-db@>= 1.34.0 < 2":
+  version "1.34.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a"
+
+mime-db@~1.33.0:
+  version "1.33.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+
+mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
+  version "2.1.18"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+  dependencies:
+    mime-db "~1.33.0"
+
+mime@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+
+mime@^2.0.3:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369"
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+mimic-response@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimatch@^2.0.1:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+  dependencies:
+    brace-expansion "^1.0.0"
+
+minimatch@~0.2.11:
+  version "0.2.14"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
+  dependencies:
+    lru-cache "2"
+    sigmund "~1.0.0"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de"
+
+minipass@^2.2.1, minipass@^2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+  dependencies:
+    safe-buffer "^5.1.2"
+    yallist "^3.0.0"
+
+minizlib@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+  dependencies:
+    minipass "^2.2.1"
+
+mississippi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^2.0.1"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+mixin-object@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
+  dependencies:
+    for-in "^0.1.3"
+    is-extendable "^0.1.1"
+
+mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+mocha@5.2.0, mocha@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
+  dependencies:
+    browser-stdout "1.3.1"
+    commander "2.15.1"
+    debug "3.1.0"
+    diff "3.5.0"
+    escape-string-regexp "1.0.5"
+    glob "7.1.2"
+    growl "1.10.5"
+    he "1.1.1"
+    minimatch "3.0.4"
+    mkdirp "0.5.1"
+    supports-color "5.4.0"
+
+moji@0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/moji/-/moji-0.5.1.tgz#088eecd1c22c8f31a240adcf9c95e54f33eb54fb"
+  dependencies:
+    object-assign "^3.0.0"
+
+mongodb-core@2.1.19:
+  version "2.1.19"
+  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b"
+  dependencies:
+    bson "~1.0.4"
+    require_optional "~1.0.0"
+
+mongodb-core@3.0.9:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.9.tgz#8327410c88811013fb3e4ac7c4c670f324349be1"
+  dependencies:
+    bson "~1.0.4"
+    require_optional "^1.0.1"
+
+mongodb@3.0.10:
+  version "3.0.10"
+  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.10.tgz#f948cb9595adcbfcad7444f6b24a040b653b23e8"
+  dependencies:
+    mongodb-core "3.0.9"
+
+mongodb@^2.1.18:
+  version "2.2.35"
+  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.35.tgz#cd1b5af8a9463e3f9a787fa5b3d05565579730f9"
+  dependencies:
+    es6-promise "3.2.1"
+    mongodb-core "2.1.19"
+    readable-stream "2.2.7"
+
+monk-middleware-cast-ids@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz#40c40e5a6cb33ccedc289220943275ee8861c529"
+
+monk-middleware-fields@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz#ff637af35f5948879ccb2be15a91360911bea6c1"
+
+monk-middleware-handle-callback@^0.2.0:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz#47de6cc1248726c72a2be0c81bc4e68310c32146"
+
+monk-middleware-options@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz#58dae1c518d46636ebdff506fadfc773bb442886"
+
+monk-middleware-query@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz#a926c677d4a5620c62151b0a56d0c0c151675874"
+
+monk-middleware-wait-for-connection@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz#312958d30e588b57d09754dd7c97b4843316835a"
+
+monk@6.0.6:
+  version "6.0.6"
+  resolved "https://registry.yarnpkg.com/monk/-/monk-6.0.6.tgz#2ff1cd57f001bba0fea73d1eea3952a7d35450c5"
+  dependencies:
+    debug "*"
+    mongodb "^2.1.18"
+    monk-middleware-cast-ids "^0.2.1"
+    monk-middleware-fields "^0.2.0"
+    monk-middleware-handle-callback "^0.2.0"
+    monk-middleware-options "^0.2.1"
+    monk-middleware-query "^0.2.0"
+    monk-middleware-wait-for-connection "^0.2.0"
+    object-assign "^4.1.1"
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+ms@2.1.1, ms@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+
+multer@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2"
+  dependencies:
+    append-field "^0.1.0"
+    busboy "^0.2.11"
+    concat-stream "^1.5.0"
+    mkdirp "^0.5.1"
+    object-assign "^3.0.0"
+    on-finished "^2.3.0"
+    type-is "^1.6.4"
+    xtend "^4.0.0"
+
+multimatch@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
+  dependencies:
+    array-differ "^1.0.0"
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    minimatch "^3.0.0"
+
+multipipe@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+  dependencies:
+    duplexer2 "0.0.2"
+
+mute-stream@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+mz@^2.4.0, mz@^2.6.0, mz@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+  dependencies:
+    any-promise "^1.0.0"
+    object-assign "^4.0.1"
+    thenify-all "^1.0.0"
+
+nan@2.10.0, nan@^2.10.0, nan@^2.3.3, nan@^2.5.0, nan@^2.9.2:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-odd "^2.0.0"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+natives@^1.1.0:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+natural@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/natural/-/natural-0.2.1.tgz#1eb5156a9d90b4591949e20e94ebc77bb2339eda"
+  dependencies:
+    apparatus ">= 0.0.9"
+    sylvester ">= 0.0.12"
+    underscore ">=1.3.1"
+
+needle@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+  dependencies:
+    debug "^2.1.2"
+    iconv-lite "^0.4.4"
+    sax "^1.2.4"
+
+negotiator@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+neo-async@^2.5.0:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+next-tick@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
+nib@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/nib/-/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7"
+  dependencies:
+    stylus "0.54.5"
+
+nice-try@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
+
+no-case@^2.2.0:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+  dependencies:
+    lower-case "^1.1.1"
+
+node-dir@0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
+
+node-fetch@1.6.3:
+  version "1.6.3"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
+  dependencies:
+    encoding "^0.1.11"
+    is-stream "^1.0.1"
+
+node-gyp@^3.3.1:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203"
+  dependencies:
+    fstream "^1.0.0"
+    glob "^7.0.3"
+    graceful-fs "^4.1.2"
+    mkdirp "^0.5.0"
+    nopt "2 || 3"
+    npmlog "0 || 1 || 2 || 3 || 4"
+    osenv "0"
+    request ">=2.9.0 <2.82.0"
+    rimraf "2"
+    semver "~5.3.0"
+    tar "^2.0.0"
+    which "1"
+
+node-libs-browser@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.0"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-object-hash@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.1.tgz#de968492e20c493b8bbc25ad2ee828265fd60934"
+
+node-pre-gyp@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46"
+  dependencies:
+    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"
+
+node-redis-scripty@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625"
+  dependencies:
+    extend "^1.2.1"
+    lru-cache "^2.5.0"
+
+node-redis-warlock@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/node-redis-warlock/-/node-redis-warlock-0.2.0.tgz#56395b994c828e8e32f6aae53b93b6edfcd97990"
+  dependencies:
+    node-redis-scripty "0.0.5"
+    uuid "^2.0.1"
+
+node-sass-json-importer@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/node-sass-json-importer/-/node-sass-json-importer-3.2.0.tgz#9cfe2355035d5437b7c2ecb535450bf6acde8195"
+  dependencies:
+    is-there "^4.0.0"
+    json5 "0.5.1"
+    lodash "^3.10.1"
+
+node-sass@4.9.0:
+  version "4.9.0"
+  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.0.tgz#d1b8aa855d98ed684d6848db929a20771cc2ae52"
+  dependencies:
+    async-foreach "^0.1.3"
+    chalk "^1.1.1"
+    cross-spawn "^3.0.0"
+    gaze "^1.0.0"
+    get-stdin "^4.0.1"
+    glob "^7.0.3"
+    in-publish "^2.0.0"
+    lodash.assign "^4.2.0"
+    lodash.clonedeep "^4.3.2"
+    lodash.mergewith "^4.6.0"
+    meow "^3.7.0"
+    mkdirp "^0.5.1"
+    nan "^2.10.0"
+    node-gyp "^3.3.1"
+    npmlog "^4.0.0"
+    request "~2.79.0"
+    sass-graph "^2.2.4"
+    stdout-stream "^1.4.0"
+    "true-case-path" "^1.0.2"
+
+node-status-codes@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
+
+nomnom@^1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
+  dependencies:
+    chalk "~0.4.0"
+    underscore "~1.6.0"
+
+"nopt@2 || 3", nopt@~3.0.1:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+nopt@4.0.1, nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+
+normalize-url@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+  dependencies:
+    prepend-http "^2.0.0"
+    query-string "^5.0.1"
+    sort-keys "^2.0.0"
+
+normalize-url@^1.4.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+  dependencies:
+    object-assign "^4.0.1"
+    prepend-http "^1.0.0"
+    query-string "^4.1.0"
+    sort-keys "^1.0.0"
+
+normalize-wheel@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
+
+now-and-later@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee"
+  dependencies:
+    once "^1.3.2"
+
+npm-bundled@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+  version "1.1.10"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
+  dependencies:
+    ignore-walk "^3.0.1"
+    npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0, npm-run-path@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+nprogress@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
+
+nth-check@^1.0.1, nth-check@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+  dependencies:
+    boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+nwsapi@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959"
+
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+oauth@0.9.15:
+  version "0.9.15"
+  resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
+
+object-assign-deep@0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/object-assign-deep/-/object-assign-deep-0.4.0.tgz#43505d3679abb9686ab359b97ac14cc837a9d143"
+
+object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-assign@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
+
+object-assign@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-keys@^1.0.11, object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  dependencies:
+    isobject "^3.0.0"
+
+object.assign@^4.0.1, object.assign@^4.0.4:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.1"
+    has-symbols "^1.0.0"
+    object-keys "^1.0.11"
+
+object.defaults@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
+  dependencies:
+    array-each "^1.0.1"
+    array-slice "^1.0.0"
+    for-own "^1.0.0"
+    isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.5.1"
+
+object.map@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
+  dependencies:
+    for-own "^1.0.0"
+    make-iterator "^1.0.0"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.pick@^1.2.0, object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  dependencies:
+    isobject "^3.0.1"
+
+object.values@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
+on-build-webpack@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/on-build-webpack/-/on-build-webpack-0.1.0.tgz#a287c0e17766e6141926e5f2cbb0d8bb53b76814"
+
+on-finished@^2.1.0, on-finished@^2.3.0, on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+once@~1.3.0:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
+  dependencies:
+    wrappy "1"
+
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+only@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
+
+ono@^2.0.1:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/ono/-/ono-2.2.5.tgz#daf09488b51174da7a7e4275dfab31b438ffa0e3"
+
+ono@^4.0.2:
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.5.tgz#bc62740493a5c1c08b2c21e60cbb0e5c56ab7de2"
+  dependencies:
+    format-util "^1.0.3"
+
+opencollective@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1"
+  dependencies:
+    babel-polyfill "6.23.0"
+    chalk "1.1.3"
+    inquirer "3.0.6"
+    minimist "1.2.0"
+    node-fetch "1.6.3"
+    opn "4.0.2"
+
+opn@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
+  dependencies:
+    object-assign "^4.0.1"
+    pinkie-promise "^2.0.0"
+
+optionator@^0.8.1, optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    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"
+
+optipng-bin@^3.0.0:
+  version "3.1.4"
+  resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-3.1.4.tgz#95d34f2c488704f6fd70606bfea0c659f1d95d84"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+ora@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
+  dependencies:
+    chalk "^1.1.1"
+    cli-cursor "^1.0.2"
+    cli-spinners "^0.1.2"
+    object-assign "^4.0.1"
+
+orchestrator@^0.3.0:
+  version "0.3.8"
+  resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
+  dependencies:
+    end-of-stream "~0.1.5"
+    sequencify "~0.0.7"
+    stream-consume "~0.1.0"
+
+ordered-read-streams@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
+
+ordered-read-streams@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b"
+  dependencies:
+    is-stream "^1.0.1"
+    readable-stream "^2.0.1"
+
+ordered-read-streams@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
+  dependencies:
+    readable-stream "^2.0.1"
+
+os-browserify@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-filter-obj@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad"
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+  dependencies:
+    lcid "^1.0.0"
+
+os-locale@^2.0.0, os-locale@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
+os-shim@^0.1.2:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+os-utils@0.0.14:
+  version "0.0.14"
+  resolved "https://registry.yarnpkg.com/os-utils/-/os-utils-0.0.14.tgz#29e511697b1982b8c627722175fe39797ef64156"
+
+osenv@0, osenv@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-cancelable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+
+p-cancelable@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+
+p-each-series@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71"
+  dependencies:
+    p-reduce "^1.0.0"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-is-promise@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+
+p-lazy@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-lazy/-/p-lazy-1.0.0.tgz#ec53c802f2ee3ac28f166cc82d0b2b02de27a835"
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-map@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+p-pipe@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9"
+
+p-reduce@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+
+p-timeout@^1.1.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+  dependencies:
+    p-finally "^1.0.0"
+
+p-timeout@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+  dependencies:
+    p-finally "^1.0.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+  dependencies:
+    cyclist "~0.2.2"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+param-case@2.1.x:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+  dependencies:
+    no-case "^2.2.0"
+
+parse-asn1@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+  dependencies:
+    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-filepath@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
+  dependencies:
+    is-absolute "^1.0.0"
+    map-cache "^0.2.0"
+    path-root "^0.1.1"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.1.0, parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
+parse-passwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+
+parse5@*, parse5@5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a"
+
+parse5@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
+
+parseurl@^1.3.0, parseurl@~1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+passthrough-counter@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa"
+
+path-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0, path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-root-regex@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
+
+path-root@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
+  dependencies:
+    path-root-regex "^0.1.0"
+
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+path-to-regexp@^1.1.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
+  dependencies:
+    isarray "0.0.1"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  dependencies:
+    pify "^3.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.16"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  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:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+plugin-error@1.0.1, plugin-error@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
+  dependencies:
+    ansi-colors "^1.0.1"
+    arr-diff "^4.0.0"
+    arr-union "^3.1.0"
+    extend-shallow "^3.0.2"
+
+plugin-error@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace"
+  dependencies:
+    ansi-cyan "^0.1.1"
+    ansi-red "^0.1.1"
+    arr-diff "^1.0.1"
+    arr-union "^2.0.1"
+    extend-shallow "^1.1.2"
+
+plur@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a"
+  dependencies:
+    irregular-plurals "^1.0.0"
+
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+pn@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+
+pngjs@^3.3.0:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b"
+
+popper.js@^1.12.9:
+  version "1.14.3"
+  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+postcss-calc@^5.2.0:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+  dependencies:
+    postcss "^5.0.2"
+    postcss-message-helpers "^2.0.0"
+    reduce-css-calc "^1.2.6"
+
+postcss-colormin@^2.1.8:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+  dependencies:
+    colormin "^1.0.5"
+    postcss "^5.0.13"
+    postcss-value-parser "^3.2.3"
+
+postcss-convert-values@^2.3.4:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+  dependencies:
+    postcss "^5.0.11"
+    postcss-value-parser "^3.1.2"
+
+postcss-discard-comments@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-duplicates@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-discard-empty@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-overridden@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+  dependencies:
+    postcss "^5.0.16"
+
+postcss-discard-unused@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+  dependencies:
+    postcss "^5.0.14"
+    uniqs "^2.0.0"
+
+postcss-filter-plugins@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-merge-idents@^2.1.5:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.10"
+    postcss-value-parser "^3.1.1"
+
+postcss-merge-longhand@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-merge-rules@^2.0.3:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+  dependencies:
+    browserslist "^1.5.2"
+    caniuse-api "^1.5.2"
+    postcss "^5.0.4"
+    postcss-selector-parser "^2.2.2"
+    vendors "^1.0.0"
+
+postcss-message-helpers@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+
+postcss-minify-font-values@^1.0.2:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+  dependencies:
+    object-assign "^4.0.1"
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-minify-gradients@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+  dependencies:
+    postcss "^5.0.12"
+    postcss-value-parser "^3.3.0"
+
+postcss-minify-params@^1.0.4:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.2"
+    postcss-value-parser "^3.0.2"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^2.0.4:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+  dependencies:
+    alphanum-sort "^1.0.2"
+    has "^1.0.1"
+    postcss "^5.0.14"
+    postcss-selector-parser "^2.0.0"
+
+postcss-modules-extract-imports@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
+  dependencies:
+    postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-scope@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-values@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+  dependencies:
+    icss-replace-symbols "^1.1.0"
+    postcss "^6.0.1"
+
+postcss-normalize-charset@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+  dependencies:
+    postcss "^5.0.5"
+
+postcss-normalize-url@^3.0.7:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+  dependencies:
+    is-absolute-url "^2.0.0"
+    normalize-url "^1.4.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+
+postcss-ordered-values@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.1"
+
+postcss-reduce-idents@^2.2.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-reduce-initial@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-reduce-transforms@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.8"
+    postcss-value-parser "^3.0.1"
+
+postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+  dependencies:
+    flatten "^1.0.2"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-selector-parser@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+  dependencies:
+    dot-prop "^4.1.1"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-svgo@^2.1.1:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+  dependencies:
+    is-svg "^2.0.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+    svgo "^0.7.0"
+
+postcss-unique-selectors@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+
+postcss-zindex@^2.0.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
+  version "5.2.18"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+  dependencies:
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
+postcss@^6.0.1, postcss@^6.0.20:
+  version "6.0.22"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3"
+  dependencies:
+    chalk "^2.4.1"
+    source-map "^0.6.1"
+    supports-color "^5.4.0"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.0, prepend-http@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+prepend-http@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+prettier@^1.12.1, prettier@^1.13.0:
+  version "1.13.5"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0"
+
+pretty-bytes@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
+
+pretty-hrtime@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
+
+pretty@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5"
+  dependencies:
+    condense-newlines "^0.2.1"
+    extend-shallow "^2.0.1"
+    js-beautify "^1.6.12"
+
+prettyjson@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289"
+  dependencies:
+    colors "^1.1.2"
+    minimist "^1.2.0"
+
+printj@~1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+
+private@^0.1.6, private@^0.1.8, private@~0.1.5:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@^0.11.10:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress-bar-webpack-plugin@1.11.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.11.0.tgz#4f801288443c55ec029b20cbfdcbf3e1dc17f852"
+  dependencies:
+    chalk "^1.1.1"
+    object.assign "^4.0.1"
+    progress "^1.1.8"
+
+progress@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+
+progress@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+prominence@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/prominence/-/prominence-0.2.0.tgz#38704264981ddf65e5b00b0b5cfce6e53348f2b2"
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+promise-sequential@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/promise-sequential/-/promise-sequential-1.1.1.tgz#f79e8950ef86e7a7a85bf320452643592f6d2fb2"
+
+promise@^7.0.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+  dependencies:
+    asap "~2.0.3"
+
+proto-list@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+
+proxy-addr@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
+  dependencies:
+    forwarded "~0.1.2"
+    ipaddr.js "1.6.0"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.1, pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+psl@^1.1.24:
+  version "1.1.28"
+  resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b"
+
+public-encrypt@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+pug-attrs@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15"
+  dependencies:
+    constantinople "^3.0.1"
+    js-stringify "^1.0.1"
+    pug-runtime "^2.0.4"
+
+pug-code-gen@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c"
+  dependencies:
+    constantinople "^3.0.1"
+    doctypes "^1.1.0"
+    js-stringify "^1.0.1"
+    pug-attrs "^2.0.3"
+    pug-error "^1.3.2"
+    pug-runtime "^2.0.4"
+    void-elements "^2.0.1"
+    with "^5.0.0"
+
+pug-error@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26"
+
+pug-filters@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e"
+  dependencies:
+    clean-css "^4.1.11"
+    constantinople "^3.0.1"
+    jstransformer "1.0.0"
+    pug-error "^1.3.2"
+    pug-walk "^1.1.7"
+    resolve "^1.1.6"
+    uglify-js "^2.6.1"
+
+pug-lexer@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278"
+  dependencies:
+    character-parser "^2.1.1"
+    is-expression "^3.0.0"
+    pug-error "^1.3.2"
+
+pug-linker@^3.0.5:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f"
+  dependencies:
+    pug-error "^1.3.2"
+    pug-walk "^1.1.7"
+
+pug-load@^2.0.11:
+  version "2.0.11"
+  resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527"
+  dependencies:
+    object-assign "^4.1.0"
+    pug-walk "^1.1.7"
+
+pug-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4"
+  dependencies:
+    pug-error "^1.3.2"
+    token-stream "0.0.1"
+
+pug-runtime@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58"
+
+pug-strip-comments@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f"
+  dependencies:
+    pug-error "^1.3.2"
+
+pug-walk@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3"
+
+pug@2.0.3, pug@^2.0.0-beta3, pug@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e"
+  dependencies:
+    pug-code-gen "^2.0.1"
+    pug-filters "^3.1.0"
+    pug-lexer "^4.0.0"
+    pug-linker "^3.0.5"
+    pug-load "^2.0.11"
+    pug-parser "^5.0.0"
+    pug-runtime "^2.0.4"
+    pug-strip-comments "^1.0.3"
+
+pump@^2.0.0, pump@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3, pumpify@^1.3.5:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  dependencies:
+    duplexify "^3.6.0"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@2.1.1, punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+punycode@^1.2.4, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@0.9.7:
+  version "0.9.7"
+  resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
+
+q@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+
+q@^1.1.2:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qrcode@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a"
+  dependencies:
+    can-promise "^0.0.1"
+    dijkstrajs "^1.0.1"
+    isarray "^2.0.1"
+    pngjs "^3.3.0"
+    yargs "^8.0.2"
+
+qs@6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@6.5.2, qs@^6.4.0, qs@^6.5.2, qs@~6.5.1:
+  version "6.5.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+
+qs@~6.3.0:
+  version "6.3.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+
+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:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  dependencies:
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+query-string@^5.0.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+  dependencies:
+    decode-uri-component "^0.2.0"
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randomatic@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
+  dependencies:
+    is-number "^4.0.0"
+    kind-of "^6.0.0"
+    math-random "^1.0.1"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+range-parser@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+rangestr@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/rangestr/-/rangestr-0.0.1.tgz#f72ff9246f10f2a7d7c16e14616f617be2c2635a"
+
+ratelimiter@3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/ratelimiter/-/ratelimiter-3.0.3.tgz#6dbca58b05422f2a08e224d4ba3a0cfb86c30966"
+
+raw-body@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.2"
+    iconv-lite "0.4.19"
+    unpipe "1.0.0"
+
+raw-body@2.3.3, raw-body@^2.2.0, raw-body@^2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.3"
+    iconv-lite "0.4.23"
+    unpipe "1.0.0"
+
+rc@^1.1.2, rc@^1.1.7:
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+  dependencies:
+    deep-extend "^0.6.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-all-stream@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
+  dependencies:
+    pinkie-promise "^2.0.0"
+    readable-stream "^2.0.0"
+
+read-chunk@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655"
+  dependencies:
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+
+read-installed@~4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
+  dependencies:
+    debuglog "^1.0.1"
+    read-package-json "^2.0.0"
+    readdir-scoped-modules "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    slide "~1.1.3"
+    util-extend "^1.0.1"
+  optionalDependencies:
+    graceful-fs "^4.1.2"
+
+read-package-json@^2.0.0:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
+  dependencies:
+    glob "^7.1.1"
+    json-parse-better-errors "^1.0.1"
+    normalize-package-data "^2.0.0"
+    slash "^1.0.0"
+  optionalDependencies:
+    graceful-fs "^4.1.2"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^3.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+read-pkg@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+  dependencies:
+    load-json-file "^4.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^3.0.0"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6:
+  version "2.3.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+readable-stream@1.1.x, readable-stream@~1.1.9:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@2.2.7:
+  version "2.2.7"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1"
+  dependencies:
+    buffer-shims "~1.0.0"
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~1.0.0"
+    util-deprecate "~1.0.1"
+
+"readable-stream@>=1.0.33-1 <1.1.0-0":
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readdir-scoped-modules@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
+  dependencies:
+    debuglog "^1.0.1"
+    dezalgo "^1.0.0"
+    graceful-fs "^4.1.2"
+    once "^1.3.0"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+recaptcha-promise@0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/recaptcha-promise/-/recaptcha-promise-0.1.3.tgz#7d3d66d045a53674054ebdfa1684e0609ef5d912"
+  dependencies:
+    bluebird "^3.4.1"
+    request "^2.73.0"
+
+recast@^0.12.5:
+  version "0.12.9"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1"
+  dependencies:
+    ast-types "0.10.1"
+    core-js "^2.4.1"
+    esprima "~4.0.0"
+    private "~0.1.5"
+    source-map "~0.6.1"
+
+recast@^0.15.0:
+  version "0.15.0"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.0.tgz#b8c8bfdda245e1580c0a4d9fc25d4e820bf57208"
+  dependencies:
+    ast-types "0.11.5"
+    esprima "~4.0.0"
+    private "~0.1.5"
+    source-map "~0.6.1"
+
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+  dependencies:
+    resolve "^1.1.6"
+
+reconnecting-websocket@3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-3.2.2.tgz#8097514e926e9855e03c39e76efa2e3d1f371bee"
+
+recursive-iterator@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/recursive-iterator/-/recursive-iterator-2.0.3.tgz#d0e0d2c7e7a83109d73091cf043fc509e5a76dc3"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+redis-commands@^1.2.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
+
+redis-parser@^2.0.0, redis-parser@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
+
+redis@2.8.0:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
+  dependencies:
+    double-ended-queue "^2.1.0-0"
+    redis-commands "^1.2.0"
+    redis-parser "^2.6.0"
+
+redis@^0.12.1:
+  version "0.12.1"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-0.12.1.tgz#64df76ad0fc8acebaebd2a0645e8a48fac49185e"
+
+redis@~2.6.0-2:
+  version "2.6.5"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-2.6.5.tgz#87c1eff4a489f94b70871f3d08b6988f23a95687"
+  dependencies:
+    double-ended-queue "^2.1.0-0"
+    redis-commands "^1.2.0"
+    redis-parser "^2.0.0"
+
+reds@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/reds/-/reds-0.2.5.tgz#38a767f7663cd749036848697d82c74fd29bc01f"
+  dependencies:
+    natural "^0.2.0"
+    redis "^0.12.1"
+
+reduce-css-calc@^1.2.6:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+  dependencies:
+    balanced-match "^0.4.2"
+    math-expression-evaluator "^1.2.14"
+    reduce-function-call "^1.0.1"
+
+reduce-function-call@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+  dependencies:
+    balanced-match "^0.4.2"
+
+regenerate@^1.2.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-runtime@^0.10.0:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+regexpp@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
+
+regexpu-core@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  dependencies:
+    jsesc "~0.5.0"
+
+relateurl@0.2.x:
+  version "0.2.7"
+  resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+
+remove-bom-buffer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
+  dependencies:
+    is-buffer "^1.1.5"
+    is-utf8 "^0.2.1"
+
+remove-bom-stream@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
+  dependencies:
+    remove-bom-buffer "^3.0.0"
+    safe-buffer "^5.1.0"
+    through2 "^2.0.3"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+replace-ext@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+
+replace-ext@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+
+replacestream@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36"
+  dependencies:
+    escape-string-regexp "^1.0.3"
+    object-assign "^4.0.1"
+    readable-stream "^2.0.2"
+
+request-promise-core@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+  dependencies:
+    lodash "^4.13.1"
+
+request-promise-native@1.0.5, request-promise-native@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+  dependencies:
+    request-promise-core "1.1.1"
+    stealthy-require "^1.1.0"
+    tough-cookie ">=2.3.3"
+
+request@2.85.0:
+  version "2.85.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
+  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"
+
+request@2.87.0, request@^2.73.0, request@^2.83.0:
+  version "2.87.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
+  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"
+    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"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
+"request@>=2.9.0 <2.82.0":
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+request@~2.79.0:
+  version "2.79.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    qs "~6.3.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+    uuid "^3.0.0"
+
+require-all@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/require-all/-/require-all-2.2.0.tgz#b4420c233ac0282d0ff49b277fb880a8b5de0894"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+require_optional@^1.0.1, require_optional@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
+  dependencies:
+    resolve-from "^2.0.0"
+    semver "^5.1.0"
+
+resize-observer-polyfill@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69"
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+  dependencies:
+    expand-tilde "^2.0.0"
+    global-modules "^1.0.0"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-from@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-options@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
+  dependencies:
+    value-or-function "^3.0.0"
+
+resolve-path@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
+  dependencies:
+    http-errors "~1.6.2"
+    path-is-absolute "1.0.1"
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e"
+  dependencies:
+    path-parse "^1.0.5"
+
+responselike@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+  dependencies:
+    lowercase-keys "^1.0.0"
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@2.6.2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+rimraf@~2.2.6:
+  version "2.2.8"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+rndstr@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rndstr/-/rndstr-1.0.0.tgz#77e66fa8f9b4836853fdd91e50719591bb67d349"
+  dependencies:
+    rangestr "0.0.1"
+    seedrandom "2.4.2"
+
+rsvp@^4.7.0:
+  version "4.8.2"
+  resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.2.tgz#9d5647108735784eb13418cdddb56f75b919d722"
+
+run-async@^2.0.0, run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  dependencies:
+    aproba "^1.1.1"
+
+rx-lite-aggregates@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+  dependencies:
+    rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+rx@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
+rxjs@^5.5.2:
+  version "5.5.11"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87"
+  dependencies:
+    symbol-observable "1.0.1"
+
+rxjs@^6.1.0:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1"
+  dependencies:
+    tslib "^1.9.0"
+
+s-age@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/s-age/-/s-age-1.1.2.tgz#c0cf15233ccc93f41de92ea42c36d957977d1ea2"
+
+safe-buffer@5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  dependencies:
+    ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sass-graph@^2.2.4:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
+  dependencies:
+    glob "^7.0.0"
+    lodash "^4.0.0"
+    scss-tokenizer "^0.2.3"
+    yargs "^7.0.0"
+
+sass-loader@7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.1.tgz#fd937259ccba3a9cfe0d5f8a98746d48adfcc261"
+  dependencies:
+    clone-deep "^2.0.1"
+    loader-utils "^1.0.1"
+    lodash.tail "^4.1.1"
+    neo-async "^2.5.0"
+    pify "^3.0.0"
+
+sax@0.5.x:
+  version "0.5.8"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
+
+sax@^1.2.4, sax@~1.2.1, sax@~1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
+scoped-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8"
+
+scss-tokenizer@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
+  dependencies:
+    js-base64 "^2.1.8"
+    source-map "^0.4.2"
+
+seedrandom@2.4.2:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.2.tgz#18d78c41287d13aff8eadb29e235938b248aa9ff"
+
+seedrandom@2.4.3:
+  version "2.4.3"
+  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc"
+
+seek-bzip@^1.0.3:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
+  dependencies:
+    commander "~2.8.1"
+
+semver-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9"
+
+semver-truncate@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
+  dependencies:
+    semver "^5.3.0"
+
+"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+semver@^4.0.3, semver@^4.1.0:
+  version "4.3.6"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+
+semver@~5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+send@0.16.2:
+  version "0.16.2"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+  dependencies:
+    debug "2.6.9"
+    depd "~1.1.2"
+    destroy "~1.0.4"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    fresh "0.5.2"
+    http-errors "~1.6.2"
+    mime "1.4.1"
+    ms "2.0.0"
+    on-finished "~2.3.0"
+    range-parser "~1.2.0"
+    statuses "~1.4.0"
+
+sequencify@~0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
+
+serialize-javascript@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
+
+serve-static@1.13.2:
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+  dependencies:
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    parseurl "~1.3.2"
+    send "0.16.2"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+setprototypeof@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+  version "2.4.11"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shallow-clone@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
+  dependencies:
+    is-extendable "^0.1.1"
+    kind-of "^5.0.0"
+    mixin-object "^2.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@*:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shelljs@^0.8.0:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35"
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
+shvl@^1.3.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/shvl/-/shvl-1.3.1.tgz#6c20a17b4a20b08e9f8cab60c50a92229fcc176e"
+
+sigmund@^1.0.1, sigmund@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+single-line-log@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364"
+  dependencies:
+    string-width "^1.0.1"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
+slice-ansi@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+
+slide@^1.1.5, slide@~1.1.3:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+sntp@2.x.x:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+  dependencies:
+    hoek "4.x.x"
+
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+sort-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+sortablejs@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28"
+
+source-list-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-list-map@~0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
+
+source-map-resolve@^0.5.0, source-map-resolve@^0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+  dependencies:
+    atob "^2.1.1"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map-support@^0.5.3:
+  version "0.5.6"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@0.1.x, source-map@^0.1.38:
+  version "0.1.43"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.4.2, source-map@~0.4.1:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+sparkles@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
+
+spawn-sync@^1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
+  dependencies:
+    concat-stream "^1.4.7"
+    os-shim "^0.1.2"
+
+spdx-compare@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7"
+  dependencies:
+    array-find-index "^1.0.2"
+    spdx-expression-parse "^3.0.0"
+    spdx-ranges "^2.0.0"
+
+spdx-correct@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz#9d21ac4da4bdb71d060fb74e5a67531d032cbba6"
+
+spdx-exceptions@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^1.0.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+spdx-ranges@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.0.0.tgz#257686798e5edb41d45c1aba3d3f1bb47af8d5ec"
+
+spdx-satisfies@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz#ebc79eec88b68ac75618e2e5ee94fbc347587552"
+  dependencies:
+    spdx-compare "^1.0.0"
+    spdx-expression-parse "^3.0.0"
+    spdx-ranges "^2.0.0"
+
+spdx@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.1.tgz#d36c275088b48d75a9046cd44a838ce4b5339998"
+  dependencies:
+    spdx-exceptions "^1.0.0"
+    spdx-license-ids "^1.0.0"
+
+speakeasy@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a"
+  dependencies:
+    base32.js "0.0.1"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  dependencies:
+    extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+squeak@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
+  dependencies:
+    chalk "^1.0.0"
+    console-stream "^0.1.1"
+    lpad-align "^1.0.1"
+
+sshpk@^1.7.0:
+  version "1.14.2"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+    safer-buffer "^2.0.2"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+ssri@^5.2.4:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+  dependencies:
+    safe-buffer "^5.1.1"
+
+stable@~0.1.6:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+
+stat-mode@^0.2.0:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502"
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", statuses@^1.0.0, statuses@^1.2.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+
+statuses@~1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+stdout-stream@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b"
+  dependencies:
+    readable-stream "^2.0.1"
+
+stealthy-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
+stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+  dependencies:
+    duplexer2 "~0.1.0"
+    readable-stream "^2.0.2"
+
+stream-consume@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
+
+stream-each@^1.1.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  dependencies:
+    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-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+streamsearch@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-template@~0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+stringstream@~0.0.4, stringstream@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-ansi@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
+
+strip-bom-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
+  dependencies:
+    first-chunk-stream "^1.0.0"
+    strip-bom "^2.0.0"
+
+strip-bom-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca"
+  dependencies:
+    first-chunk-stream "^2.0.0"
+    strip-bom "^2.0.0"
+
+strip-bom-string@1.X:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
+
+strip-bom@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
+  dependencies:
+    first-chunk-stream "^1.0.0"
+    is-utf8 "^0.2.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-dirs@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0"
+  dependencies:
+    chalk "^1.0.0"
+    get-stdin "^4.0.1"
+    is-absolute "^0.1.5"
+    is-natural-number "^2.0.0"
+    minimist "^1.1.0"
+    sum-up "^1.0.1"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+strip-outer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
+style-loader@0.21.0:
+  version "0.21.0"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852"
+  dependencies:
+    loader-utils "^1.1.0"
+    schema-utils "^0.4.5"
+
+stylus-loader@3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6"
+  dependencies:
+    loader-utils "^1.0.2"
+    lodash.clonedeep "^4.5.0"
+    when "~3.6.x"
+
+stylus@0.54.5, stylus@^0.54.0, stylus@~0.54.5:
+  version "0.54.5"
+  resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
+  dependencies:
+    css-parse "1.7.x"
+    debug "*"
+    glob "7.0.x"
+    mkdirp "0.5.x"
+    sax "0.5.x"
+    source-map "0.1.x"
+
+sum-up@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e"
+  dependencies:
+    chalk "^1.0.0"
+
+summaly@2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.0.6.tgz#559561e05c267f01e7199a296dd650a994b19053"
+  dependencies:
+    cheerio-httpcli "0.7.2"
+    debug "3.1.0"
+    escape-regexp "0.0.1"
+    html-entities "1.2.1"
+    request "2.85.0"
+    request-promise-native "1.0.5"
+    require-all "2.2.0"
+    trace-redirect "1.0.6"
+
+supports-color@5.4.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+svgo@^0.7.0:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+  dependencies:
+    coa "~1.0.1"
+    colors "~1.1.2"
+    csso "~2.3.1"
+    js-yaml "~3.7.0"
+    mkdirp "~0.5.1"
+    sax "~1.2.1"
+    whet.extend "~0.9.9"
+
+svgo@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a"
+  dependencies:
+    coa "~2.0.1"
+    colors "~1.1.2"
+    css-select "~1.3.0-rc0"
+    css-select-base-adapter "~0.1.0"
+    css-tree "1.0.0-alpha25"
+    css-url-regex "^1.1.0"
+    csso "^3.5.0"
+    js-yaml "~3.10.0"
+    mkdirp "~0.5.1"
+    object.values "^1.0.4"
+    sax "~1.2.4"
+    stable "~0.1.6"
+    unquote "~1.1.1"
+    util.promisify "~1.0.0"
+
+swagger-jsdoc@1.9.7:
+  version "1.9.7"
+  resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-1.9.7.tgz#7a761d4d7ef4a54bf457cea5c67ec316bb82f8b9"
+  dependencies:
+    chokidar "^1.7.0"
+    commander "^2.11.0"
+    doctrine "^2.0.0"
+    glob "^7.1.2"
+    js-yaml "^3.8.4"
+    recursive-iterator "^2.0.3"
+    swagger-parser "^3.4.1"
+
+swagger-methods@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.4.tgz#2c5b844f4a22ab2f5e773f98193c28e386b1c37e"
+
+swagger-parser@^3.4.1:
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-3.4.2.tgz#244d67d6eeed08c00acb5d95950d5aefbd6185a3"
+  dependencies:
+    call-me-maybe "^1.0.1"
+    debug "^3.0.0"
+    es6-promise "^4.1.1"
+    json-schema-ref-parser "^1.4.1"
+    ono "^4.0.2"
+    swagger-methods "^1.0.0"
+    swagger-schema-official "2.0.0-bab6bed"
+    z-schema "^3.16.1"
+
+swagger-schema-official@2.0.0-bab6bed:
+  version "2.0.0-bab6bed"
+  resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd"
+
+"sylvester@>= 0.0.12", "sylvester@>= 0.0.8":
+  version "0.0.21"
+  resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7"
+
+symbol-observable@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
+
+symbol-observable@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
+
+symbol-tree@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+syuilo-password-strength@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/syuilo-password-strength/-/syuilo-password-strength-0.0.1.tgz#08f71a8f0ecb77db649f3d9a6424510d9d945f52"
+
+table@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+  dependencies:
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
+    chalk "^2.1.0"
+    lodash "^4.17.4"
+    slice-ansi "1.0.0"
+    string-width "^2.1.1"
+
+tapable@^1.0.0, tapable@^1.0.0-beta.5:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
+
+tar-stream@^1.1.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395"
+  dependencies:
+    bl "^1.0.0"
+    buffer-alloc "^1.1.0"
+    end-of-stream "^1.0.0"
+    fs-constants "^1.0.0"
+    readable-stream "^2.3.0"
+    to-buffer "^1.1.0"
+    xtend "^4.0.0"
+
+tar@^2.0.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+tar@^4:
+  version "4.4.4"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+  dependencies:
+    chownr "^1.0.1"
+    fs-minipass "^1.2.5"
+    minipass "^2.3.3"
+    minizlib "^1.1.0"
+    mkdirp "^0.5.0"
+    safe-buffer "^5.1.2"
+    yallist "^3.0.2"
+
+tcp-port-used@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-0.1.2.tgz#9450e8768c83b416fd4d1a6a9449eeccbf496c29"
+  dependencies:
+    debug "0.7.4"
+    is2 "0.0.9"
+    q "0.9.7"
+
+temp-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+
+temp@^0.8.1:
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    rimraf "~2.2.6"
+
+tempfile@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    uuid "^2.0.1"
+
+tempfile@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
+  dependencies:
+    temp-dir "^1.0.0"
+    uuid "^3.0.1"
+
+text-table@^0.2.0, text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+textarea-caret@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f"
+
+textextensions@2:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286"
+
+thenify-all@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+  dependencies:
+    thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
+  dependencies:
+    any-promise "^1.0.0"
+
+throttle-debounce@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd"
+
+through2-concurrent@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-1.1.1.tgz#11cb4ea4c9e31bca6e4c1e6dba48d1c728c3524b"
+  dependencies:
+    through2 "^2.0.0"
+
+through2-filter@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
+  dependencies:
+    through2 "~2.0.0"
+    xtend "~4.0.0"
+
+through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+through2@^0.6.0, through2@^0.6.1:
+  version "0.6.5"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
+  dependencies:
+    readable-stream ">=1.0.33-1 <1.1.0-0"
+    xtend ">=4.0.0 <4.1.0-0"
+
+through@^2.3.6, through@~2.3.8:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+tildify@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
+  dependencies:
+    os-homedir "^1.0.0"
+
+time-stamp@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+
+timed-out@^3.0.0:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+timers-browserify@^2.0.4:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+  dependencies:
+    setimmediate "^1.0.4"
+
+timers-ext@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922"
+  dependencies:
+    es5-ext "~0.10.14"
+    next-tick "1"
+
+tmp@0.0.33, tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+to-absolute-glob@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
+  dependencies:
+    extend-shallow "^2.0.1"
+
+to-absolute-glob@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
+  dependencies:
+    is-absolute "^1.0.0"
+    is-negated-glob "^1.0.0"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-buffer@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+to-through@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
+  dependencies:
+    through2 "^2.0.3"
+
+token-stream@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
+
+tough-cookie@>=2.3.3, tough-cookie@^2.3.3:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c"
+  dependencies:
+    psl "^1.1.24"
+    punycode "^1.4.1"
+
+tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+  dependencies:
+    punycode "^1.4.1"
+
+tr46@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  dependencies:
+    punycode "^2.1.0"
+
+trace-redirect@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504"
+
+treeify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-repeated@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+"true-case-path@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62"
+  dependencies:
+    glob "^6.0.4"
+
+tryit@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
+ts-loader@4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.3.0.tgz#4e3ba172783d1256d3a23bdfadde011a795fae9e"
+  dependencies:
+    chalk "^2.3.0"
+    enhanced-resolve "^4.0.0"
+    loader-utils "^1.0.2"
+    micromatch "^3.1.4"
+    semver "^5.0.1"
+
+ts-node@6.0.4:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.4.tgz#245af3a8cdf3baa1121893fe12b9a54ee297c4c5"
+  dependencies:
+    arrify "^1.0.0"
+    chalk "^2.3.0"
+    diff "^3.1.0"
+    make-error "^1.1.1"
+    minimist "^1.2.0"
+    mkdirp "^0.5.1"
+    source-map-support "^0.5.3"
+    yn "^2.0.0"
+
+tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e"
+
+tslint@5.10.0:
+  version "5.10.0"
+  resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3"
+  dependencies:
+    babel-code-frame "^6.22.0"
+    builtin-modules "^1.1.1"
+    chalk "^2.3.0"
+    commander "^2.12.1"
+    diff "^3.2.0"
+    glob "^7.1.1"
+    js-yaml "^3.7.0"
+    minimatch "^3.0.4"
+    resolve "^1.3.2"
+    semver "^5.3.0"
+    tslib "^1.8.0"
+    tsutils "^2.12.1"
+
+tsutils@^2.12.1:
+  version "2.27.1"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.1.tgz#ab0276ac23664f36ce8fd4414daec4aebf4373ee"
+  dependencies:
+    tslib "^1.8.1"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@^0.4.0, tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@^1.5.5, type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16:
+  version "1.6.16"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.18"
+
+type-of@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972"
+
+typedarray-to-buffer@^3.1.2:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+  dependencies:
+    is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+typescript-eslint-parser@15.0.0:
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f"
+  dependencies:
+    lodash.unescape "4.0.1"
+    semver "5.5.0"
+
+typescript@2.8.3:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
+
+uglify-es@3.3.9, uglify-es@^3.3.4:
+  version "3.3.9"
+  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+  dependencies:
+    commander "~2.13.0"
+    source-map "~0.6.1"
+
+uglify-js@3.3.x:
+  version "3.3.28"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06"
+  dependencies:
+    commander "~2.15.0"
+    source-map "~0.6.1"
+
+uglify-js@^2.6.1, uglify-js@^2.7.0:
+  version "2.8.29"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-js@^3.0.5:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d"
+  dependencies:
+    commander "~2.15.0"
+    source-map "~0.6.1"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^1.2.4:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641"
+  dependencies:
+    cacache "^10.0.4"
+    find-cache-dir "^1.0.0"
+    schema-utils "^0.4.5"
+    serialize-javascript "^1.4.0"
+    source-map "^0.6.1"
+    uglify-es "^3.3.4"
+    webpack-sources "^1.1.0"
+    worker-farm "^1.5.2"
+
+unc-path-regex@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+
+underscore@>=1.3.1:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+
+underscore@~1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
+
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+
+unique-filename@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+  dependencies:
+    imurmurhash "^0.1.4"
+
+unique-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
+
+unique-stream@^2.0.2:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369"
+  dependencies:
+    json-stable-stringify "^1.0.0"
+    through2-filter "^2.0.0"
+
+universalify@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unquote@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+untildify@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9"
+
+unzip-response@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
+
+upath@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+upper-case@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+
+uri-js@^4.2.1:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+  dependencies:
+    punycode "^2.1.0"
+
+urijs@^1.19.0:
+  version "1.19.1"
+  resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url-loader@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee"
+  dependencies:
+    loader-utils "^1.1.0"
+    mime "^2.0.3"
+    schema-utils "^0.4.3"
+
+url-parse-lax@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+  dependencies:
+    prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+  dependencies:
+    prepend-http "^2.0.0"
+
+url-regex@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
+  dependencies:
+    ip-regex "^1.0.1"
+
+url-to-options@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+
+url@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6"
+
+use@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
+  dependencies:
+    kind-of "^6.0.2"
+
+user-home@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util-extend@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
+
+util.promisify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+  dependencies:
+    define-properties "^1.1.2"
+    object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+util@^0.10.3:
+  version "0.10.4"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+  dependencies:
+    inherits "2.0.3"
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+
+uuid@^2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+
+v-animate-css@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/v-animate-css/-/v-animate-css-0.0.2.tgz#61f233b641de5ab544ab50bc5450c747030e3bde"
+
+v8-compile-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a"
+
+v8flags@^2.0.2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
+  dependencies:
+    user-home "^1.1.1"
+
+vali-date@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6"
+
+valid-url@^1.0.9:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+validator@^10.0.0:
+  version "10.3.0"
+  resolved "https://registry.yarnpkg.com/validator/-/validator-10.3.0.tgz#157a8c0981858cff381f59aabcdb8f83b57317cc"
+
+value-or-function@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
+
+vary@^1.0.0, vary@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+
+vendors@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vinyl-assign@^1.0.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45"
+  dependencies:
+    object-assign "^4.0.1"
+    readable-stream "^2.0.0"
+
+vinyl-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.3.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+    strip-bom-stream "^2.0.0"
+    vinyl "^1.1.0"
+
+vinyl-fs@^0.3.0:
+  version "0.3.14"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
+  dependencies:
+    defaults "^1.0.0"
+    glob-stream "^3.1.5"
+    glob-watcher "^0.0.6"
+    graceful-fs "^3.0.0"
+    mkdirp "^0.5.0"
+    strip-bom "^1.0.0"
+    through2 "^0.6.1"
+    vinyl "^0.4.0"
+
+vinyl-fs@^2.2.0:
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239"
+  dependencies:
+    duplexify "^3.2.0"
+    glob-stream "^5.3.2"
+    graceful-fs "^4.0.0"
+    gulp-sourcemaps "1.6.0"
+    is-valid-glob "^0.3.0"
+    lazystream "^1.0.0"
+    lodash.isequal "^4.0.0"
+    merge-stream "^1.0.0"
+    mkdirp "^0.5.0"
+    object-assign "^4.0.0"
+    readable-stream "^2.0.4"
+    strip-bom "^2.0.0"
+    strip-bom-stream "^1.0.0"
+    through2 "^2.0.0"
+    through2-filter "^2.0.0"
+    vali-date "^1.0.0"
+    vinyl "^1.0.0"
+
+vinyl-fs@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
+  dependencies:
+    fs-mkdirp-stream "^1.0.0"
+    glob-stream "^6.1.0"
+    graceful-fs "^4.0.0"
+    is-valid-glob "^1.0.0"
+    lazystream "^1.0.0"
+    lead "^1.0.0"
+    object.assign "^4.0.4"
+    pumpify "^1.3.5"
+    readable-stream "^2.3.3"
+    remove-bom-buffer "^3.0.0"
+    remove-bom-stream "^1.2.0"
+    resolve-options "^1.1.0"
+    through2 "^2.0.0"
+    to-through "^2.0.0"
+    value-or-function "^3.0.0"
+    vinyl "^2.0.0"
+    vinyl-sourcemap "^1.1.0"
+
+vinyl-sourcemap@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
+  dependencies:
+    append-buffer "^1.0.2"
+    convert-source-map "^1.5.0"
+    graceful-fs "^4.1.6"
+    normalize-path "^2.1.1"
+    now-and-later "^2.0.0"
+    remove-bom-buffer "^3.0.0"
+    vinyl "^2.0.0"
+
+vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
+  dependencies:
+    source-map "^0.5.1"
+
+vinyl@^0.4.0, vinyl@^0.4.3:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
+  dependencies:
+    clone "^0.2.0"
+    clone-stats "^0.0.1"
+
+vinyl@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+  dependencies:
+    clone "^1.0.0"
+    clone-stats "^0.0.1"
+    replace-ext "0.0.1"
+
+vinyl@^1.0.0, vinyl@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
+  dependencies:
+    clone "^1.0.0"
+    clone-stats "^0.0.1"
+    replace-ext "0.0.1"
+
+vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c"
+  dependencies:
+    clone "^2.1.1"
+    clone-buffer "^1.0.0"
+    clone-stats "^1.0.0"
+    cloneable-readable "^1.0.0"
+    remove-trailing-separator "^1.0.1"
+    replace-ext "^1.0.0"
+
+vm-browserify@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+void-elements@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+
+vue-cropperjs@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/vue-cropperjs/-/vue-cropperjs-2.2.0.tgz#cd8f00ee01914e86f114ee8aa3f7354e3c76a8fc"
+  dependencies:
+    cropperjs "^1.1.3"
+
+vue-eslint-parser@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
+  dependencies:
+    debug "^3.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.2"
+    esquery "^1.0.0"
+    lodash "^4.17.4"
+
+vue-functional-data-merge@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.6.tgz#f08055adfb92458debcf2ad10c3aa712277f7fc2"
+
+vue-hot-reload-api@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
+
+vue-js-modal@1.3.13:
+  version "1.3.13"
+  resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-1.3.13.tgz#1718c3182a94a03e03422db50c60229bbbd53f18"
+
+vue-json-tree-view@2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.4.tgz#b6f8ae2ba2eec4eec5b6f53b90fa187054cad79b"
+  dependencies:
+    lodash "^4.17.4"
+    vue "^2.5.16"
+
+vue-loader@15.2.1:
+  version "15.2.1"
+  resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.2.1.tgz#89a13b6b7dec63614729c73b1b46a571a69bb20e"
+  dependencies:
+    "@vue/component-compiler-utils" "^1.2.1"
+    hash-sum "^1.0.2"
+    loader-utils "^1.1.0"
+    vue-hot-reload-api "^2.3.0"
+    vue-style-loader "^4.1.0"
+
+vue-router@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9"
+
+vue-style-loader@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863"
+  dependencies:
+    hash-sum "^1.0.2"
+    loader-utils "^1.0.2"
+
+vue-template-compiler@2.5.16:
+  version "2.5.16"
+  resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb"
+  dependencies:
+    de-indent "^1.0.2"
+    he "^1.1.0"
+
+vue-template-es2015-compiler@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18"
+
+vue@2.5.16, vue@^2.5.16:
+  version "2.5.16"
+  resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.16.tgz#07edb75e8412aaeed871ebafa99f4672584a0085"
+
+vuedraggable@2.16.0:
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.16.0.tgz#52127081a2adb3de5fabd214d404ff3eee63575a"
+  dependencies:
+    sortablejs "^1.7.0"
+
+vuex-persistedstate@^2.5.4:
+  version "2.5.4"
+  resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-2.5.4.tgz#a19710ad7f9a08cea4e65fc585924d9fdac7384a"
+  dependencies:
+    deepmerge "^2.1.0"
+    shvl "^1.3.0"
+
+vuex@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2"
+
+w3c-hr-time@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+  dependencies:
+    browser-process-hrtime "^0.1.2"
+
+ware@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4"
+  dependencies:
+    wrap-fn "^0.1.0"
+
+watchpack@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+  dependencies:
+    chokidar "^2.0.2"
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+
+web-push@3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.3.1.tgz#6d49517b927ffb97241a719d2f7f9014de130f09"
+  dependencies:
+    asn1.js "^5.0.0"
+    http_ece "1.0.5"
+    https-proxy-agent "^2.2.1"
+    jws "^3.1.3"
+    minimist "^1.2.0"
+    urlsafe-base64 "^1.0.0"
+
+webassemblyjs@1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.4.3.tgz#0591893efb8fbde74498251cbe4b2d83df9239cb"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/validation" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    "@webassemblyjs/wast-parser" "1.4.3"
+    long "^3.2.0"
+
+webfinger.js@2.6.6:
+  version "2.6.6"
+  resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae"
+  dependencies:
+    xhr2 "^0.1.4"
+
+webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+webpack-addons@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/webpack-addons/-/webpack-addons-1.1.5.tgz#2b178dfe873fb6e75e40a819fa5c26e4a9bc837a"
+  dependencies:
+    jscodeshift "^0.4.0"
+
+webpack-cli@2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.4.tgz#cab81e79249127384fb69b2fdfe2055f9c771b76"
+  dependencies:
+    chalk "^2.4.1"
+    cross-spawn "^6.0.5"
+    diff "^3.5.0"
+    enhanced-resolve "^4.0.0"
+    envinfo "^5.7.0"
+    glob-all "^3.1.0"
+    global-modules "^1.0.0"
+    got "^8.3.1"
+    import-local "^1.0.0"
+    inquirer "^5.2.0"
+    interpret "^1.1.0"
+    jscodeshift "^0.5.0"
+    listr "^0.14.1"
+    loader-utils "^1.1.0"
+    lodash "^4.17.10"
+    log-symbols "^2.2.0"
+    mkdirp "^0.5.1"
+    p-each-series "^1.0.0"
+    p-lazy "^1.0.0"
+    prettier "^1.12.1"
+    supports-color "^5.4.0"
+    v8-compile-cache "^2.0.0"
+    webpack-addons "^1.1.5"
+    yargs "^11.1.0"
+    yeoman-environment "^2.1.1"
+    yeoman-generator "^2.0.5"
+
+webpack-core@~0.6.0:
+  version "0.6.9"
+  resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
+  dependencies:
+    source-list-map "~0.1.7"
+    source-map "~0.4.1"
+
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@4.9.1:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.9.1.tgz#fa7bd738b17fd7f09f37da461b2f5c16c6565f34"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/wasm-edit" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    acorn "^5.0.0"
+    acorn-dynamic-import "^3.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    chrome-trace-event "^0.1.1"
+    enhanced-resolve "^4.0.0"
+    eslint-scope "^3.7.1"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    micromatch "^3.1.8"
+    mkdirp "~0.5.0"
+    neo-async "^2.5.0"
+    node-libs-browser "^2.0.0"
+    schema-utils "^0.4.4"
+    tapable "^1.0.0"
+    uglifyjs-webpack-plugin "^1.2.4"
+    watchpack "^1.5.0"
+    webpack-sources "^1.0.1"
+
+websocket@1.0.26:
+  version "1.0.26"
+  resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194"
+  dependencies:
+    debug "^2.2.0"
+    nan "^2.3.3"
+    typedarray-to-buffer "^3.1.2"
+    yaeti "^0.0.6"
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+  dependencies:
+    iconv-lite "0.4.19"
+
+whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4"
+
+whatwg-url@^6.4.0, whatwg-url@^6.4.1:
+  version "6.5.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.1"
+    webidl-conversions "^4.0.2"
+
+when@^3.7.7:
+  version "3.7.8"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
+
+when@~3.6.x:
+  version "3.6.4"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e"
+
+whet.extend@~0.9.9:
+  version "0.9.9"
+  resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
+which-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@1, which@^1.2.14, which@^1.2.9:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+  dependencies:
+    string-width "^1.0.2 || 2"
+
+window-or-global@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+window-size@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+
+with@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
+  dependencies:
+    acorn "^3.1.0"
+    acorn-globals "^3.0.0"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+worker-farm@^1.5.2:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+  dependencies:
+    errno "~0.1.7"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrap-fn@^0.1.0:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845"
+  dependencies:
+    co "3.1.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^1.2.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    slide "^1.1.5"
+
+write-file-atomic@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    signal-exit "^3.0.2"
+
+write-json-file@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
+  dependencies:
+    detect-indent "^5.0.0"
+    graceful-fs "^4.1.2"
+    make-dir "^1.0.0"
+    pify "^3.0.0"
+    sort-keys "^2.0.0"
+    write-file-atomic "^2.0.0"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  dependencies:
+    mkdirp "^0.5.1"
+
+ws@5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.0.tgz#9fd95e3ac7c76f6ae8bcc868a0e3f11f1290c33e"
+  dependencies:
+    async-limiter "~1.0.0"
+
+ws@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+
+xev@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7"
+
+xhr2@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f"
+
+xml-name-validator@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yaeti@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+  dependencies:
+    camelcase "^3.0.0"
+    lodash.assign "^4.0.6"
+
+yargs-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
+  dependencies:
+    camelcase "^3.0.0"
+
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^9.0.2:
+  version "9.0.2"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^10.0.3:
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.1.0"
+
+yargs@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^9.0.2"
+
+yargs@^4.0.0:
+  version "4.8.1"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+  dependencies:
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    lodash.assign "^4.0.3"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.1"
+    which-module "^1.0.0"
+    window-size "^0.2.0"
+    y18n "^3.2.1"
+    yargs-parser "^2.4.1"
+
+yargs@^7.0.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
+  dependencies:
+    camelcase "^3.0.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.2"
+    which-module "^1.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^5.0.0"
+
+yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
+
+yargs@~1.2.6:
+  version "1.2.6"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b"
+  dependencies:
+    minimist "^0.1.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+
+yauzl@^2.2.1:
+  version "2.9.2"
+  resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.2.tgz#4fb1bc7ae1fc2f57037b54af6acc8fe1031c5b77"
+  dependencies:
+    buffer-crc32 "~0.2.3"
+    fd-slicer "~1.1.0"
+
+yeoman-environment@^2.0.5, yeoman-environment@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.2.0.tgz#6c0ee93a8d962a9f6dbc5ad4e90ae7ab34875393"
+  dependencies:
+    chalk "^2.1.0"
+    cross-spawn "^6.0.5"
+    debug "^3.1.0"
+    diff "^3.3.1"
+    escape-string-regexp "^1.0.2"
+    globby "^8.0.1"
+    grouped-queue "^0.3.3"
+    inquirer "^5.2.0"
+    is-scoped "^1.0.0"
+    lodash "^4.17.10"
+    log-symbols "^2.1.0"
+    mem-fs "^1.1.0"
+    strip-ansi "^4.0.0"
+    text-table "^0.2.0"
+    untildify "^3.0.2"
+
+yeoman-generator@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81"
+  dependencies:
+    async "^2.6.0"
+    chalk "^2.3.0"
+    cli-table "^0.3.1"
+    cross-spawn "^6.0.5"
+    dargs "^5.1.0"
+    dateformat "^3.0.3"
+    debug "^3.1.0"
+    detect-conflict "^1.0.0"
+    error "^7.0.2"
+    find-up "^2.1.0"
+    github-username "^4.0.0"
+    istextorbinary "^2.2.1"
+    lodash "^4.17.10"
+    make-dir "^1.1.0"
+    mem-fs-editor "^4.0.0"
+    minimist "^1.2.0"
+    pretty-bytes "^4.0.2"
+    read-chunk "^2.1.0"
+    read-pkg-up "^3.0.0"
+    rimraf "^2.6.2"
+    run-async "^2.0.0"
+    shelljs "^0.8.0"
+    text-table "^0.2.0"
+    through2 "^2.0.0"
+    yeoman-environment "^2.0.5"
+
+yn@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+
+z-schema@^3.16.1:
+  version "3.22.0"
+  resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.22.0.tgz#e1326063cb438f348c648350770258ff5e20a22b"
+  dependencies:
+    lodash.get "^4.0.0"
+    lodash.isequal "^4.0.0"
+    validator "^10.0.0"
+  optionalDependencies:
+    commander "^2.7.1"

From b5b437b8784eb32531e0965d722ddb691775df08 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 12:43:58 +0900
Subject: [PATCH 330/369] :v:

---
 .gitattributes |     1 +
 yarn.lock      | 23830 +++++++++++++++++++++++------------------------
 2 files changed, 11916 insertions(+), 11915 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index 952d6cd0e9..9ea77a4b0e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,3 +1,4 @@
 *.svg -diff -text
 *.psd -diff -text
 *.ai -diff -text
+yarn.lock -diff -text
diff --git a/yarn.lock b/yarn.lock
index 014a443d0d..a99e498628 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1,11915 +1,11915 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@fortawesome/fontawesome-free-brands@5.0.2":
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3"
-
-"@fortawesome/fontawesome-free-regular@5.0.2":
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017"
-
-"@fortawesome/fontawesome-free-solid@5.0.2":
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5"
-
-"@fortawesome/fontawesome@1.0.1":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d"
-
-"@gulp-sourcemaps/identity-map@1.X":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1"
-  dependencies:
-    acorn "^5.0.3"
-    css "^2.2.1"
-    normalize-path "^2.1.1"
-    source-map "^0.5.6"
-    through2 "^2.0.3"
-
-"@gulp-sourcemaps/map-sources@1.X":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
-  dependencies:
-    normalize-path "^2.0.1"
-    through2 "^2.0.3"
-
-"@koa/cors@2.2.1":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5"
-
-"@mrmlnc/readdir-enhanced@^2.2.1":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
-  dependencies:
-    call-me-maybe "^1.0.1"
-    glob-to-regexp "^0.3.0"
-
-"@nodelib/fs.stat@^1.0.1":
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a"
-
-"@prezzemolo/rap@0.1.2":
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/@prezzemolo/rap/-/rap-0.1.2.tgz#01f8a60bb61de33822fc632563fb8b23e574854e"
-
-"@prezzemolo/zip@0.0.3":
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/@prezzemolo/zip/-/zip-0.0.3.tgz#6532d4bcd77c6a95e3a90ca5388a09b532a1f8e4"
-
-"@samverschueren/stream-to-observable@^0.3.0":
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
-  dependencies:
-    any-observable "^0.3.0"
-
-"@sindresorhus/is@^0.7.0":
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
-
-"@types/accepts@*":
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
-  dependencies:
-    "@types/node" "*"
-
-"@types/babel-types@*", "@types/babel-types@^7.0.0":
-  version "7.0.3"
-  resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.3.tgz#9dc5316090ad99cd2679051ab21a5676c90a2bcc"
-
-"@types/babylon@^6.16.2":
-  version "6.16.3"
-  resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb"
-  dependencies:
-    "@types/babel-types" "*"
-
-"@types/bcryptjs@2.4.1":
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.1.tgz#7fb63922b5b106edacdcfe084cd38850f78aacfc"
-
-"@types/body-parser@*":
-  version "1.17.0"
-  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
-  dependencies:
-    "@types/connect" "*"
-    "@types/node" "*"
-
-"@types/bson@*":
-  version "1.0.8"
-  resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.8.tgz#6ad272b3f049e9598ec33aed09cf56d8946b75f1"
-  dependencies:
-    "@types/node" "*"
-
-"@types/caseless@*":
-  version "0.12.1"
-  resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a"
-
-"@types/cheerio@^0.22.5":
-  version "0.22.7"
-  resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce"
-
-"@types/clean-css@*":
-  version "3.4.30"
-  resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-3.4.30.tgz#0052c136f5248002428e3638b37de4a39818641d"
-
-"@types/connect@*":
-  version "3.4.32"
-  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28"
-  dependencies:
-    "@types/node" "*"
-
-"@types/cookies@*":
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540"
-  dependencies:
-    "@types/connect" "*"
-    "@types/express" "*"
-    "@types/keygrip" "*"
-    "@types/node" "*"
-
-"@types/debug@0.0.30":
-  version "0.0.30"
-  resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df"
-
-"@types/deep-equal@1.0.1":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03"
-
-"@types/elasticsearch@5.0.23":
-  version "5.0.23"
-  resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.23.tgz#235622772a7c7f3ccedd0dc9769dfcfe20eed1ec"
-
-"@types/events@*":
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
-
-"@types/express-serve-static-core@*":
-  version "4.16.0"
-  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7"
-  dependencies:
-    "@types/events" "*"
-    "@types/node" "*"
-    "@types/range-parser" "*"
-
-"@types/express@*":
-  version "4.16.0"
-  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19"
-  dependencies:
-    "@types/body-parser" "*"
-    "@types/express-serve-static-core" "*"
-    "@types/serve-static" "*"
-
-"@types/fancy-log@1.3.0":
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0"
-
-"@types/form-data@*":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e"
-  dependencies:
-    "@types/node" "*"
-
-"@types/glob@*":
-  version "5.0.35"
-  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
-  dependencies:
-    "@types/events" "*"
-    "@types/minimatch" "*"
-    "@types/node" "*"
-
-"@types/gm@1.18.0":
-  version "1.18.0"
-  resolved "https://registry.yarnpkg.com/@types/gm/-/gm-1.18.0.tgz#49be90ff74286fcdc23b00f13d3699e6dfaceef2"
-  dependencies:
-    "@types/node" "*"
-
-"@types/gulp-htmlmin@1.3.32":
-  version "1.3.32"
-  resolved "https://registry.yarnpkg.com/@types/gulp-htmlmin/-/gulp-htmlmin-1.3.32.tgz#342baec649f285c7cbd78dfcf54dd17c388bde2b"
-  dependencies:
-    "@types/html-minifier" "*"
-    "@types/node" "*"
-
-"@types/gulp-mocha@0.0.32":
-  version "0.0.32"
-  resolved "https://registry.yarnpkg.com/@types/gulp-mocha/-/gulp-mocha-0.0.32.tgz#dbc425e804a8354236c31ab23406222a8ab9bdaf"
-  dependencies:
-    "@types/mocha" "*"
-    "@types/node" "*"
-
-"@types/gulp-rename@0.0.33":
-  version "0.0.33"
-  resolved "https://registry.yarnpkg.com/@types/gulp-rename/-/gulp-rename-0.0.33.tgz#38d146e97786569f74f5391a1b1f9b5198674b6c"
-  dependencies:
-    "@types/node" "*"
-
-"@types/gulp-replace@0.0.31":
-  version "0.0.31"
-  resolved "https://registry.yarnpkg.com/@types/gulp-replace/-/gulp-replace-0.0.31.tgz#87c3ac90b437694c58d68d1da677fcaff38b25ff"
-  dependencies:
-    "@types/node" "*"
-
-"@types/gulp-uglify@3.0.5":
-  version "3.0.5"
-  resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135"
-  dependencies:
-    "@types/node" "*"
-    "@types/uglify-js" "^2"
-
-"@types/gulp-util@3.0.34":
-  version "3.0.34"
-  resolved "https://registry.yarnpkg.com/@types/gulp-util/-/gulp-util-3.0.34.tgz#d1291ebf706d93f46eb8df11344bbfd96247697e"
-  dependencies:
-    "@types/node" "*"
-    "@types/through2" "*"
-    "@types/vinyl" "*"
-    chalk "^2.2.0"
-
-"@types/gulp@3.8.36":
-  version "3.8.36"
-  resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-3.8.36.tgz#11eaf583bf0534669b4ffa9bfed51557faa00a4c"
-  dependencies:
-    "@types/node" "*"
-    "@types/orchestrator" "*"
-    "@types/vinyl" "*"
-
-"@types/html-minifier@*":
-  version "3.5.2"
-  resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-3.5.2.tgz#f897a13d847a774e9b6fd91497e9b0e0ead71c35"
-  dependencies:
-    "@types/clean-css" "*"
-    "@types/relateurl" "*"
-    "@types/uglify-js" "*"
-
-"@types/http-assert@*":
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd"
-
-"@types/inquirer@0.0.41":
-  version "0.0.41"
-  resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.41.tgz#0c33027dcd0b0dde234e22afa454f2c75d8b30d2"
-  dependencies:
-    "@types/rx" "*"
-    "@types/through" "*"
-
-"@types/is-root@1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@types/is-root/-/is-root-1.0.0.tgz#1cf41787243a8f030eb737a9aaf08b071e4f2453"
-
-"@types/is-url@1.2.28":
-  version "1.2.28"
-  resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787"
-
-"@types/js-yaml@3.11.1":
-  version "3.11.1"
-  resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40"
-
-"@types/keygrip@*":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878"
-
-"@types/koa-bodyparser@4.2.0":
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.2.0.tgz#04febc567f3d3dd40e3d1a0e095cdf7b07c4d7ce"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa-compose@*":
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847"
-
-"@types/koa-compress@2.0.8":
-  version "2.0.8"
-  resolved "https://registry.yarnpkg.com/@types/koa-compress/-/koa-compress-2.0.8.tgz#426a2fac419aff7d1a7d87fd78203bf0d26a94fb"
-  dependencies:
-    "@types/koa" "*"
-    "@types/node" "*"
-
-"@types/koa-favicon@2.0.19":
-  version "2.0.19"
-  resolved "https://registry.yarnpkg.com/@types/koa-favicon/-/koa-favicon-2.0.19.tgz#a1b584fd64c99f16710633272292bf7d4b0ca1fa"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa-logger@3.1.0":
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/@types/koa-logger/-/koa-logger-3.1.0.tgz#133acdbc56d87b5a559cab25528b087381a8fc0d"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa-mount@3.0.1":
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/@types/koa-mount/-/koa-mount-3.0.1.tgz#2c068d1696b173c62c316158210c4316c4401f57"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa-multer@1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@types/koa-multer/-/koa-multer-1.0.0.tgz#f449f399ac3f80c05753452f000e8694ceec4249"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa-router@7.0.28":
-  version "7.0.28"
-  resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.0.28.tgz#67487c862a831099aed8864a8996bfa7e989edc0"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa-send@4.1.1":
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.1.tgz#88f57cbe0343c8204903f9096d8ff6b98ec3296f"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa-views@2.0.3":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/koa-views/-/koa-views-2.0.3.tgz#38fc1f3027503acba73a93fe06678813f306779b"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/koa@*":
-  version "2.0.46"
-  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.46.tgz#24bc3cd405d10fcde81f876cd8285b44d4ddc3e9"
-  dependencies:
-    "@types/accepts" "*"
-    "@types/cookies" "*"
-    "@types/events" "*"
-    "@types/http-assert" "*"
-    "@types/keygrip" "*"
-    "@types/koa-compose" "*"
-    "@types/node" "*"
-
-"@types/koa@2.0.45":
-  version "2.0.45"
-  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.45.tgz#133cbda6cc8d12b73434b5d9663898c833f80aa2"
-  dependencies:
-    "@types/accepts" "*"
-    "@types/cookies" "*"
-    "@types/events" "*"
-    "@types/http-assert" "*"
-    "@types/keygrip" "*"
-    "@types/koa-compose" "*"
-    "@types/node" "*"
-
-"@types/koa__cors@2.2.2":
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-2.2.2.tgz#03d7cf3b076d5dfab8a5444ac6c5df5173147de8"
-  dependencies:
-    "@types/koa" "*"
-
-"@types/kue@0.11.8":
-  version "0.11.8"
-  resolved "https://registry.yarnpkg.com/@types/kue/-/kue-0.11.8.tgz#820f5e3db6025f0411e0942cd3ccab461a060c90"
-  dependencies:
-    "@types/express" "*"
-    "@types/node" "*"
-    "@types/redis" "*"
-
-"@types/license-checker@15.0.0":
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/@types/license-checker/-/license-checker-15.0.0.tgz#685d69e2cf61ffd862320434601f51c85e28bba1"
-
-"@types/mime@*":
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
-
-"@types/minimatch@*":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
-
-"@types/mkdirp@0.5.2":
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
-  dependencies:
-    "@types/node" "*"
-
-"@types/mocha@*":
-  version "5.2.2"
-  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.2.tgz#202d2b8fe1364c5b617b439b26a54f0e75eac0a7"
-
-"@types/mocha@5.2.0":
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.0.tgz#b3c8e69f038835db1a7fdc0b3d879fc50506e29e"
-
-"@types/mongodb@3.0.18":
-  version "3.0.18"
-  resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.0.18.tgz#e5775ba9c15bf1601e57ada52d9fcbc6d6095d18"
-  dependencies:
-    "@types/bson" "*"
-    "@types/events" "*"
-    "@types/node" "*"
-
-"@types/ms@0.7.30":
-  version "0.7.30"
-  resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.30.tgz#f6c38b7ecbbf698b0bbd138315a0f0f18954f85f"
-
-"@types/node@*":
-  version "10.3.3"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3"
-
-"@types/node@10.1.2":
-  version "10.1.2"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6"
-
-"@types/node@^8.0.47":
-  version "8.10.20"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac"
-
-"@types/nopt@3.0.29":
-  version "3.0.29"
-  resolved "https://registry.yarnpkg.com/@types/nopt/-/nopt-3.0.29.tgz#f19df3db4c97ee1459a2740028320a71d70964ce"
-
-"@types/orchestrator@*":
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.3.2.tgz#cd15c6cea978a32b98e5054239cbcc78e55671f1"
-  dependencies:
-    "@types/node" "*"
-    "@types/q" "*"
-
-"@types/parse5@3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-3.0.0.tgz#b63305718d82af42a9e5da79c56ecfc1f32e32c0"
-  dependencies:
-    parse5 "*"
-
-"@types/pug@2.0.4", "@types/pug@^2.0.4":
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2"
-
-"@types/q@*":
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.0.tgz#87567ea1206935405e51c03635b6cbf3a01f7bc4"
-
-"@types/qrcode@0.8.1":
-  version "0.8.1"
-  resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-0.8.1.tgz#5776cb5da299cfa7cee2610f59997acad90ad38d"
-  dependencies:
-    "@types/node" "*"
-
-"@types/range-parser@*":
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d"
-
-"@types/ratelimiter@2.1.28":
-  version "2.1.28"
-  resolved "https://registry.yarnpkg.com/@types/ratelimiter/-/ratelimiter-2.1.28.tgz#cf6371e6d9b1d236e3f0b25889a6d52aed2e0e22"
-  dependencies:
-    "@types/redis" "*"
-
-"@types/redis@*", "@types/redis@2.8.6":
-  version "2.8.6"
-  resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.6.tgz#3674d07a13ad76bccda4c37dc3909e4e95757e7e"
-  dependencies:
-    "@types/events" "*"
-    "@types/node" "*"
-
-"@types/relateurl@*":
-  version "0.2.28"
-  resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6"
-
-"@types/request-promise-native@1.0.14":
-  version "1.0.14"
-  resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.14.tgz#20f2ba136e6f29c2ea745c60767738d434793d31"
-  dependencies:
-    "@types/request" "*"
-
-"@types/request@*":
-  version "2.47.1"
-  resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.1.tgz#25410d3afbdac04c91a94ad9efc9824100735824"
-  dependencies:
-    "@types/caseless" "*"
-    "@types/form-data" "*"
-    "@types/node" "*"
-    "@types/tough-cookie" "*"
-
-"@types/request@2.47.0":
-  version "2.47.0"
-  resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.0.tgz#76a666cee4cb85dcffea6cd4645227926d9e114e"
-  dependencies:
-    "@types/caseless" "*"
-    "@types/form-data" "*"
-    "@types/node" "*"
-    "@types/tough-cookie" "*"
-
-"@types/rimraf@2.0.2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e"
-  dependencies:
-    "@types/glob" "*"
-    "@types/node" "*"
-
-"@types/rx-core-binding@*":
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3"
-  dependencies:
-    "@types/rx-core" "*"
-
-"@types/rx-core@*":
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60"
-
-"@types/rx-lite-aggregates@*":
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite-async@*":
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite-backpressure@*":
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite-coincidence@*":
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite-experimental@*":
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite-joinpatterns@*":
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite-testing@*":
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9"
-  dependencies:
-    "@types/rx-lite-virtualtime" "*"
-
-"@types/rx-lite-time@*":
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite-virtualtime@*":
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537"
-  dependencies:
-    "@types/rx-lite" "*"
-
-"@types/rx-lite@*":
-  version "4.0.5"
-  resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.5.tgz#b3581525dff69423798daa9a0d33c1e66a5e8c4c"
-  dependencies:
-    "@types/rx-core" "*"
-    "@types/rx-core-binding" "*"
-
-"@types/rx@*":
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48"
-  dependencies:
-    "@types/rx-core" "*"
-    "@types/rx-core-binding" "*"
-    "@types/rx-lite" "*"
-    "@types/rx-lite-aggregates" "*"
-    "@types/rx-lite-async" "*"
-    "@types/rx-lite-backpressure" "*"
-    "@types/rx-lite-coincidence" "*"
-    "@types/rx-lite-experimental" "*"
-    "@types/rx-lite-joinpatterns" "*"
-    "@types/rx-lite-testing" "*"
-    "@types/rx-lite-time" "*"
-    "@types/rx-lite-virtualtime" "*"
-
-"@types/seedrandom@2.4.27":
-  version "2.4.27"
-  resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41"
-
-"@types/serve-static@*":
-  version "1.13.2"
-  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48"
-  dependencies:
-    "@types/express-serve-static-core" "*"
-    "@types/mime" "*"
-
-"@types/single-line-log@1.1.0":
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/@types/single-line-log/-/single-line-log-1.1.0.tgz#7e6fc4e8e785f5f5ab11157418df2684a21ed971"
-
-"@types/speakeasy@2.0.2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/speakeasy/-/speakeasy-2.0.2.tgz#153ec3636eea0562209b0a2f1fdf8b479286919b"
-
-"@types/tapable@*":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd"
-
-"@types/through2@*":
-  version "2.0.33"
-  resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.33.tgz#1ff2e88a100dfb5b140e7bb98791f1194400d131"
-  dependencies:
-    "@types/node" "*"
-
-"@types/through@*":
-  version "0.0.29"
-  resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93"
-  dependencies:
-    "@types/node" "*"
-
-"@types/tmp@0.0.33":
-  version "0.0.33"
-  resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
-
-"@types/tough-cookie@*":
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.3.tgz#7f226d67d654ec9070e755f46daebf014628e9d9"
-
-"@types/uglify-js@*":
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.2.tgz#f30c75458d18e8ee885c792c04adcb78a13bc286"
-  dependencies:
-    source-map "^0.6.1"
-
-"@types/uglify-js@^2":
-  version "2.6.31"
-  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b"
-  dependencies:
-    source-map "^0.6.1"
-
-"@types/uuid@3.4.3":
-  version "3.4.3"
-  resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.3.tgz#121ace265f5569ce40f4f6d0ff78a338c732a754"
-  dependencies:
-    "@types/node" "*"
-
-"@types/vinyl@*":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.2.tgz#4f3b8dae8f5828d3800ef709b0cff488ee852de3"
-  dependencies:
-    "@types/node" "*"
-
-"@types/webpack-stream@3.2.10":
-  version "3.2.10"
-  resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.10.tgz#eed8389a60d9928b357aa6d13599428d2c4889e7"
-  dependencies:
-    "@types/node" "*"
-    "@types/webpack" "*"
-
-"@types/webpack@*", "@types/webpack@4.4.0":
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.0.tgz#c0551b772be241d786c0548812dd75a932f8efb4"
-  dependencies:
-    "@types/node" "*"
-    "@types/tapable" "*"
-    "@types/uglify-js" "*"
-    source-map "^0.6.0"
-
-"@types/websocket@0.0.39":
-  version "0.0.39"
-  resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.39.tgz#aa971e24f9c1455fe2a57ee3e69c7d395016b12a"
-  dependencies:
-    "@types/events" "*"
-    "@types/node" "*"
-
-"@types/ws@5.1.1":
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.1.tgz#4adc1f1a5e92e7e0e95658fb35c7eab1bc52f4ac"
-  dependencies:
-    "@types/events" "*"
-    "@types/node" "*"
-
-"@vue/component-compiler-utils@^1.2.1":
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-1.3.1.tgz#686f0b913d59590ae327b2a1cb4b6d9b931bbe0e"
-  dependencies:
-    consolidate "^0.15.1"
-    hash-sum "^1.0.2"
-    lru-cache "^4.1.2"
-    merge-source-map "^1.1.0"
-    postcss "^6.0.20"
-    postcss-selector-parser "^3.1.1"
-    prettier "^1.13.0"
-    source-map "^0.5.6"
-    vue-template-es2015-compiler "^1.6.0"
-
-"@webassemblyjs/ast@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.4.3.tgz#3b3f6fced944d8660273347533e6d4d315b5934a"
-  dependencies:
-    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
-    "@webassemblyjs/wast-parser" "1.4.3"
-    debug "^3.1.0"
-    webassemblyjs "1.4.3"
-
-"@webassemblyjs/floating-point-hex-parser@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz#f5aee4c376a717c74264d7bacada981e7e44faad"
-
-"@webassemblyjs/helper-buffer@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz#0434b55958519bf503697d3824857b1dea80b729"
-  dependencies:
-    debug "^3.1.0"
-
-"@webassemblyjs/helper-code-frame@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz#f1349ca3e01a8e29ee2098c770773ef97af43641"
-  dependencies:
-    "@webassemblyjs/wast-printer" "1.4.3"
-
-"@webassemblyjs/helper-fsm@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz#65a921db48fb43e868f17b27497870bdcae22b79"
-
-"@webassemblyjs/helper-wasm-bytecode@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz#0e5b4b5418e33f8a26e940b7809862828c3721a5"
-
-"@webassemblyjs/helper-wasm-section@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz#9ceedd53a3f152c3412e072887ade668d0b1acbf"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/helper-buffer" "1.4.3"
-    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
-    "@webassemblyjs/wasm-gen" "1.4.3"
-    debug "^3.1.0"
-
-"@webassemblyjs/leb128@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.4.3.tgz#5a5e5949dbb5adfe3ae95664d0439927ac557fb8"
-  dependencies:
-    leb "^0.3.0"
-
-"@webassemblyjs/validation@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/validation/-/validation-1.4.3.tgz#9e66c9b3079d7bbcf2070c1bf52a54af2a09aac9"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-
-"@webassemblyjs/wasm-edit@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz#87febd565e0ffb5ae25f6495bb3958d17aa0a779"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/helper-buffer" "1.4.3"
-    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
-    "@webassemblyjs/helper-wasm-section" "1.4.3"
-    "@webassemblyjs/wasm-gen" "1.4.3"
-    "@webassemblyjs/wasm-opt" "1.4.3"
-    "@webassemblyjs/wasm-parser" "1.4.3"
-    "@webassemblyjs/wast-printer" "1.4.3"
-    debug "^3.1.0"
-
-"@webassemblyjs/wasm-gen@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz#8553164d0154a6be8f74d653d7ab355f73240aa4"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
-    "@webassemblyjs/leb128" "1.4.3"
-
-"@webassemblyjs/wasm-opt@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz#26c7a23bfb136aa405b1d3410e63408ec60894b8"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/helper-buffer" "1.4.3"
-    "@webassemblyjs/wasm-gen" "1.4.3"
-    "@webassemblyjs/wasm-parser" "1.4.3"
-    debug "^3.1.0"
-
-"@webassemblyjs/wasm-parser@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz#7ddd3e408f8542647ed612019cfb780830993698"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
-    "@webassemblyjs/leb128" "1.4.3"
-    "@webassemblyjs/wasm-parser" "1.4.3"
-    webassemblyjs "1.4.3"
-
-"@webassemblyjs/wast-parser@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz#3250402e2c5ed53dbe2233c9de1fe1f9f0d51745"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/floating-point-hex-parser" "1.4.3"
-    "@webassemblyjs/helper-code-frame" "1.4.3"
-    "@webassemblyjs/helper-fsm" "1.4.3"
-    long "^3.2.0"
-    webassemblyjs "1.4.3"
-
-"@webassemblyjs/wast-printer@1.4.3":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz#3d59aa8d0252d6814a3ef4e6d2a34c9ded3904e0"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/wast-parser" "1.4.3"
-    long "^3.2.0"
-
-abab@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
-
-abbrev@1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
-
-accepts@^1.2.2, accepts@~1.3.5:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
-  dependencies:
-    mime-types "~2.1.18"
-    negotiator "0.6.1"
-
-accord@^0.26.3:
-  version "0.26.4"
-  resolved "https://registry.yarnpkg.com/accord/-/accord-0.26.4.tgz#fc4c8d3ebab406a07cb28819b859651c44a92e80"
-  dependencies:
-    convert-source-map "^1.2.0"
-    glob "^7.0.5"
-    indx "^0.2.3"
-    lodash.clone "^4.3.2"
-    lodash.defaults "^4.0.1"
-    lodash.flatten "^4.2.0"
-    lodash.merge "^4.4.0"
-    lodash.partialright "^4.1.4"
-    lodash.pick "^4.2.1"
-    lodash.uniq "^4.3.0"
-    resolve "^1.1.7"
-    semver "^5.3.0"
-    uglify-js "^2.7.0"
-    when "^3.7.7"
-
-acorn-dynamic-import@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
-  dependencies:
-    acorn "^5.0.0"
-
-acorn-globals@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
-  dependencies:
-    acorn "^4.0.4"
-
-acorn-globals@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
-  dependencies:
-    acorn "^5.0.0"
-
-acorn-jsx@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
-  dependencies:
-    acorn "^3.0.4"
-
-acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
-
-acorn@^3.0.4, acorn@^3.1.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
-
-acorn@^4.0.4, acorn@~4.0.2:
-  version "4.0.13"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
-
-agent-base@^4.1.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce"
-  dependencies:
-    es6-promisify "^5.0.0"
-
-agentkeepalive@^3.4.1:
-  version "3.4.1"
-  resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c"
-  dependencies:
-    humanize-ms "^1.2.1"
-
-ajv-keywords@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
-
-ajv-keywords@^3.1.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
-
-ajv@^4.9.1:
-  version "4.11.8"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
-  dependencies:
-    co "^4.6.0"
-    json-stable-stringify "^1.0.1"
-
-ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
-  version "5.5.2"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
-  dependencies:
-    co "^4.6.0"
-    fast-deep-equal "^1.0.0"
-    fast-json-stable-stringify "^2.0.0"
-    json-schema-traverse "^0.3.0"
-
-ajv@^6.1.0:
-  version "6.5.1"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d"
-  dependencies:
-    fast-deep-equal "^2.0.1"
-    fast-json-stable-stringify "^2.0.0"
-    json-schema-traverse "^0.4.1"
-    uri-js "^4.2.1"
-
-align-text@^0.1.1, align-text@^0.1.3:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
-  dependencies:
-    kind-of "^3.0.2"
-    longest "^1.0.1"
-    repeat-string "^1.5.2"
-
-alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
-
-amdefine@>=0.0.4:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
-
-animejs@2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/animejs/-/animejs-2.2.0.tgz#35eefdfc535b81949c9cb06f0b3e60c02e6fdc80"
-
-ansi-colors@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
-  dependencies:
-    ansi-wrap "^0.1.0"
-
-ansi-cyan@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
-
-ansi-escapes@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
-
-ansi-gray@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-red@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-regex@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
-
-ansi-regex@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
-
-ansi-styles@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
-
-ansi-styles@^3.2.0, ansi-styles@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
-  dependencies:
-    color-convert "^1.9.0"
-
-ansi-styles@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
-
-ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
-
-any-observable@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
-
-any-promise@^1.0.0, any-promise@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
-
-anymatch@^1.3.0:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
-  dependencies:
-    micromatch "^2.1.5"
-    normalize-path "^2.0.0"
-
-anymatch@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
-  dependencies:
-    micromatch "^3.1.4"
-    normalize-path "^2.1.1"
-
-"apparatus@>= 0.0.9":
-  version "0.0.10"
-  resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e"
-  dependencies:
-    sylvester ">= 0.0.8"
-
-append-buffer@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
-  dependencies:
-    buffer-equal "^1.0.0"
-
-append-field@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a"
-
-aproba@^1.0.3, aproba@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
-
-archive-type@^3.0.0, archive-type@^3.0.1:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6"
-  dependencies:
-    file-type "^3.1.0"
-
-archy@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
-
-are-we-there-yet@~1.1.2:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
-  dependencies:
-    delegates "^1.0.0"
-    readable-stream "^2.0.6"
-
-argparse@^1.0.7:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
-  dependencies:
-    sprintf-js "~1.0.2"
-
-arr-diff@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
-  dependencies:
-    arr-flatten "^1.0.1"
-    array-slice "^0.2.3"
-
-arr-diff@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
-  dependencies:
-    arr-flatten "^1.0.1"
-
-arr-diff@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
-
-arr-flatten@^1.0.1, arr-flatten@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
-
-arr-union@^2.0.1:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d"
-
-arr-union@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
-
-array-differ@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
-
-array-each@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
-
-array-equal@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
-
-array-filter@~0.0.0:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
-
-array-find-index@^1.0.1, array-find-index@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
-
-array-flatten@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
-
-array-map@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
-
-array-parallel@~0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d"
-
-array-reduce@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
-
-array-series@~0.1.5:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f"
-
-array-slice@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
-
-array-slice@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
-
-array-union@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
-  dependencies:
-    array-uniq "^1.0.1"
-
-array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
-
-array-unique@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
-
-array-unique@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
-
-arrify@^1.0.0, arrify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
-
-asap@^2.0.0, asap@~2.0.3:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
-
-asn1.js@^4.0.0:
-  version "4.10.1"
-  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
-  dependencies:
-    bn.js "^4.0.0"
-    inherits "^2.0.1"
-    minimalistic-assert "^1.0.0"
-
-asn1.js@^5.0.0:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.0.1.tgz#7668b56416953f0ce3421adbb3893ace59c96f59"
-  dependencies:
-    bn.js "^4.0.0"
-    inherits "^2.0.1"
-    minimalistic-assert "^1.0.0"
-
-asn1@~0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
-
-assert-plus@1.0.0, assert-plus@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
-
-assert-plus@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
-
-assert@^1.1.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
-  dependencies:
-    util "0.10.3"
-
-assign-symbols@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
-
-ast-types@0.10.1:
-  version "0.10.1"
-  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd"
-
-ast-types@0.11.5:
-  version "0.11.5"
-  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28"
-
-async-each-series@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138"
-
-async-each@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
-
-async-foreach@^0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
-
-async-limiter@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
-
-async-validator@~1.8.1:
-  version "1.8.2"
-  resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.2.tgz#b77597226e96242f8d531c0d46ae295f62422ba4"
-  dependencies:
-    babel-runtime "6.x"
-
-async@^1.5.0:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
-
-async@^2.5.0, async@^2.6.0:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
-  dependencies:
-    lodash "^4.17.10"
-
-asynckit@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
-
-atob@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
-
-autoprefixer@^6.3.1:
-  version "6.7.7"
-  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
-  dependencies:
-    browserslist "^1.7.6"
-    caniuse-db "^1.0.30000634"
-    normalize-range "^0.1.2"
-    num2fraction "^1.2.2"
-    postcss "^5.2.16"
-    postcss-value-parser "^3.2.3"
-
-autosize@4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9"
-
-autwh@0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/autwh/-/autwh-0.1.0.tgz#24a5300923309d105133401a2568f9c8ab7d7e03"
-  dependencies:
-    oauth "0.9.15"
-
-aws-sign2@~0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
-
-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.7.0"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
-
-babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
-  dependencies:
-    chalk "^1.1.3"
-    esutils "^2.0.2"
-    js-tokens "^3.0.2"
-
-babel-core@^6.26.0:
-  version "6.26.3"
-  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
-  dependencies:
-    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"
-
-babel-generator@^6.26.0:
-  version "6.26.1"
-  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
-  dependencies:
-    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"
-
-babel-helper-bindify-decorators@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
-  dependencies:
-    babel-helper-explode-assignable-expression "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-call-delegate@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
-  dependencies:
-    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@^6.24.1:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
-  dependencies:
-    babel-helper-function-name "^6.24.1"
-    babel-runtime "^6.26.0"
-    babel-types "^6.26.0"
-    lodash "^4.17.4"
-
-babel-helper-explode-assignable-expression@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-explode-class@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
-  dependencies:
-    babel-helper-bindify-decorators "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-function-name@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
-  dependencies:
-    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@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-hoist-variables@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-optimise-call-expression@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-regex@^6.24.1:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
-  dependencies:
-    babel-runtime "^6.26.0"
-    babel-types "^6.26.0"
-    lodash "^4.17.4"
-
-babel-helper-remap-async-to-generator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
-  dependencies:
-    babel-helper-function-name "^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-replace-supers@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
-  dependencies:
-    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-helper-vue-jsx-merge-props@^2.0.0:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
-
-babel-helpers@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-messages@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-check-es2015-constants@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-syntax-async-functions@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
-
-babel-plugin-syntax-async-generators@^6.5.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
-
-babel-plugin-syntax-class-constructor-call@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
-
-babel-plugin-syntax-class-properties@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
-
-babel-plugin-syntax-decorators@^6.13.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
-
-babel-plugin-syntax-dynamic-import@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
-
-babel-plugin-syntax-exponentiation-operator@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
-
-babel-plugin-syntax-export-extensions@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
-
-babel-plugin-syntax-flow@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
-
-babel-plugin-syntax-object-rest-spread@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
-
-babel-plugin-syntax-trailing-function-commas@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
-
-babel-plugin-transform-async-generator-functions@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
-  dependencies:
-    babel-helper-remap-async-to-generator "^6.24.1"
-    babel-plugin-syntax-async-generators "^6.5.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-async-to-generator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
-  dependencies:
-    babel-helper-remap-async-to-generator "^6.24.1"
-    babel-plugin-syntax-async-functions "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-class-constructor-call@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9"
-  dependencies:
-    babel-plugin-syntax-class-constructor-call "^6.18.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-class-properties@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
-  dependencies:
-    babel-helper-function-name "^6.24.1"
-    babel-plugin-syntax-class-properties "^6.8.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-decorators@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
-  dependencies:
-    babel-helper-explode-class "^6.24.1"
-    babel-plugin-syntax-decorators "^6.13.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-arrow-functions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoping@^6.24.1:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
-  dependencies:
-    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@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
-  dependencies:
-    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@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-destructuring@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-for-of@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-function-name@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
-  dependencies:
-    babel-helper-function-name "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-literals@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-modules-amd@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
-  dependencies:
-    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@^6.24.1:
-  version "6.26.2"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
-  dependencies:
-    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@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
-  dependencies:
-    babel-helper-hoist-variables "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-modules-umd@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
-  dependencies:
-    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@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
-  dependencies:
-    babel-helper-replace-supers "^6.24.1"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-parameters@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
-  dependencies:
-    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@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-spread@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-sticky-regex@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
-  dependencies:
-    babel-helper-regex "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-template-literals@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-unicode-regex@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
-  dependencies:
-    babel-helper-regex "^6.24.1"
-    babel-runtime "^6.22.0"
-    regexpu-core "^2.0.0"
-
-babel-plugin-transform-exponentiation-operator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
-  dependencies:
-    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
-    babel-plugin-syntax-exponentiation-operator "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-export-extensions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
-  dependencies:
-    babel-plugin-syntax-export-extensions "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-flow-strip-types@^6.8.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
-  dependencies:
-    babel-plugin-syntax-flow "^6.18.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-object-rest-spread@^6.22.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
-  dependencies:
-    babel-plugin-syntax-object-rest-spread "^6.8.0"
-    babel-runtime "^6.26.0"
-
-babel-plugin-transform-regenerator@^6.24.1:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
-  dependencies:
-    regenerator-transform "^0.10.0"
-
-babel-plugin-transform-strict-mode@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-polyfill@6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
-  dependencies:
-    babel-runtime "^6.22.0"
-    core-js "^2.4.0"
-    regenerator-runtime "^0.10.0"
-
-babel-preset-es2015@^6.9.0:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
-  dependencies:
-    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-preset-stage-1@^6.5.0:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
-  dependencies:
-    babel-plugin-transform-class-constructor-call "^6.24.1"
-    babel-plugin-transform-export-extensions "^6.22.0"
-    babel-preset-stage-2 "^6.24.1"
-
-babel-preset-stage-2@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
-  dependencies:
-    babel-plugin-syntax-dynamic-import "^6.18.0"
-    babel-plugin-transform-class-properties "^6.24.1"
-    babel-plugin-transform-decorators "^6.24.1"
-    babel-preset-stage-3 "^6.24.1"
-
-babel-preset-stage-3@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
-  dependencies:
-    babel-plugin-syntax-trailing-function-commas "^6.22.0"
-    babel-plugin-transform-async-generator-functions "^6.24.1"
-    babel-plugin-transform-async-to-generator "^6.24.1"
-    babel-plugin-transform-exponentiation-operator "^6.24.1"
-    babel-plugin-transform-object-rest-spread "^6.22.0"
-
-babel-register@^6.26.0, babel-register@^6.9.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
-  dependencies:
-    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@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
-  dependencies:
-    core-js "^2.4.0"
-    regenerator-runtime "^0.11.0"
-
-babel-template@^6.24.1, babel-template@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
-  dependencies:
-    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@^6.24.1, babel-traverse@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
-  dependencies:
-    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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
-  dependencies:
-    babel-runtime "^6.26.0"
-    esutils "^2.0.2"
-    lodash "^4.17.4"
-    to-fast-properties "^1.0.3"
-
-babylon@^6.17.3, babylon@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
-
-babylon@^7.0.0-beta.47:
-  version "7.0.0-beta.47"
-  resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80"
-
-balanced-match@^0.4.2:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
-
-balanced-match@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
-
-base32.js@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba"
-
-base64-js@^1.0.2:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
-
-base@^0.11.1:
-  version "0.11.2"
-  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
-  dependencies:
-    cache-base "^1.0.1"
-    class-utils "^0.3.5"
-    component-emitter "^1.2.1"
-    define-property "^1.0.0"
-    isobject "^3.0.1"
-    mixin-deep "^1.2.0"
-    pascalcase "^0.1.1"
-
-bcrypt-pbkdf@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
-  dependencies:
-    tweetnacl "^0.14.3"
-
-bcryptjs@2.4.3:
-  version "2.4.3"
-  resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
-
-beeper@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
-
-big.js@^3.1.3:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
-
-bin-build@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc"
-  dependencies:
-    archive-type "^3.0.1"
-    decompress "^3.0.0"
-    download "^4.1.2"
-    exec-series "^1.0.0"
-    rimraf "^2.2.6"
-    tempfile "^1.0.0"
-    url-regex "^3.0.0"
-
-bin-check@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930"
-  dependencies:
-    executable "^1.0.0"
-
-bin-version-check@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0"
-  dependencies:
-    bin-version "^1.0.0"
-    minimist "^1.1.0"
-    semver "^4.0.3"
-    semver-truncate "^1.0.0"
-
-bin-version@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e"
-  dependencies:
-    find-versions "^1.0.0"
-
-bin-wrapper@^3.0.0:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb"
-  dependencies:
-    bin-check "^2.0.0"
-    bin-version-check "^2.1.0"
-    download "^4.0.0"
-    each-async "^1.1.1"
-    lazy-req "^1.0.0"
-    os-filter-obj "^1.0.0"
-
-binary-extensions@^1.0.0:
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
-
-binaryextensions@2:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935"
-
-bl@^1.0.0:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
-  dependencies:
-    readable-stream "^2.3.5"
-    safe-buffer "^5.1.1"
-
-block-stream@*:
-  version "0.0.9"
-  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
-  dependencies:
-    inherits "~2.0.0"
-
-bluebird@^3.0.5, bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
-
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
-  version "4.11.8"
-  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
-
-body-parser@1.18.2:
-  version "1.18.2"
-  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
-  dependencies:
-    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"
-
-body-parser@^1.12.2:
-  version "1.18.3"
-  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
-  dependencies:
-    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"
-
-boolbase@^1.0.0, boolbase@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
-
-boom@2.x.x:
-  version "2.10.1"
-  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
-  dependencies:
-    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-vue@2.0.0-rc.6:
-  version "2.0.0-rc.6"
-  resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.6.tgz#12d0a241414f1efd647e8b14a88c51707c920c86"
-  dependencies:
-    bootstrap "^4.0.0"
-    lodash.get "^4.4.2"
-    lodash.startcase "^4.4.0"
-    opencollective "^1.0.3"
-    popper.js "^1.12.9"
-    vue-functional-data-merge "^2.0.5"
-
-bootstrap@^4.0.0:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.1.tgz#3aec85000fa619085da8d2e4983dfd67cf2114cb"
-
-brace-expansion@^1.0.0, brace-expansion@^1.1.7:
-  version "1.1.11"
-  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
-  dependencies:
-    balanced-match "^1.0.0"
-    concat-map "0.0.1"
-
-braces@^1.8.2:
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
-  dependencies:
-    expand-range "^1.8.1"
-    preserve "^0.2.0"
-    repeat-element "^1.1.2"
-
-braces@^2.3.0, braces@^2.3.1:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
-  dependencies:
-    arr-flatten "^1.1.0"
-    array-unique "^0.3.2"
-    extend-shallow "^2.0.1"
-    fill-range "^4.0.0"
-    isobject "^3.0.1"
-    repeat-element "^1.1.2"
-    snapdragon "^0.8.1"
-    snapdragon-node "^2.0.1"
-    split-string "^3.0.2"
-    to-regex "^3.0.1"
-
-brorand@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
-
-browser-process-hrtime@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
-
-browser-stdout@1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
-
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
-  dependencies:
-    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@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
-  dependencies:
-    browserify-aes "^1.0.4"
-    browserify-des "^1.0.0"
-    evp_bytestokey "^1.0.0"
-
-browserify-des@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c"
-  dependencies:
-    cipher-base "^1.0.1"
-    des.js "^1.0.0"
-    inherits "^2.0.1"
-
-browserify-rsa@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
-  dependencies:
-    bn.js "^4.1.0"
-    randombytes "^2.0.1"
-
-browserify-sign@^4.0.0:
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
-  dependencies:
-    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@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
-  dependencies:
-    pako "~1.0.5"
-
-browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
-  version "1.7.7"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
-  dependencies:
-    caniuse-db "^1.0.30000639"
-    electron-to-chromium "^1.2.7"
-
-bson@~1.0.4:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57"
-
-buffer-alloc-unsafe@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
-
-buffer-alloc@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
-  dependencies:
-    buffer-alloc-unsafe "^1.1.0"
-    buffer-fill "^1.0.0"
-
-buffer-crc32@~0.2.3:
-  version "0.2.13"
-  resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
-
-buffer-equal-constant-time@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
-
-buffer-equal@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
-
-buffer-fill@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
-
-buffer-from@^0.1.1:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0"
-
-buffer-from@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
-
-buffer-shims@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
-
-buffer-to-vinyl@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262"
-  dependencies:
-    file-type "^3.1.0"
-    readable-stream "^2.0.2"
-    uuid "^2.0.1"
-    vinyl "^1.0.0"
-
-buffer-xor@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
-
-buffer@^4.3.0:
-  version "4.9.1"
-  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
-  dependencies:
-    base64-js "^1.0.2"
-    ieee754 "^1.1.4"
-    isarray "^1.0.0"
-
-bufferstreams@^1.1.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72"
-  dependencies:
-    readable-stream "^2.0.2"
-
-builtin-modules@^1.0.0, builtin-modules@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
-
-builtin-status-codes@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
-
-busboy@^0.2.11:
-  version "0.2.14"
-  resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
-  dependencies:
-    dicer "0.2.5"
-    readable-stream "1.1.x"
-
-bytes@3.0.0, bytes@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
-
-bytes@^2.5.0:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a"
-
-cacache@^10.0.4:
-  version "10.0.4"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
-  dependencies:
-    bluebird "^3.5.1"
-    chownr "^1.0.1"
-    glob "^7.1.2"
-    graceful-fs "^4.1.11"
-    lru-cache "^4.1.1"
-    mississippi "^2.0.0"
-    mkdirp "^0.5.1"
-    move-concurrently "^1.0.1"
-    promise-inflight "^1.0.1"
-    rimraf "^2.6.2"
-    ssri "^5.2.4"
-    unique-filename "^1.1.0"
-    y18n "^4.0.0"
-
-cache-base@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
-  dependencies:
-    collection-visit "^1.0.0"
-    component-emitter "^1.2.1"
-    get-value "^2.0.6"
-    has-value "^1.0.0"
-    isobject "^3.0.1"
-    set-value "^2.0.0"
-    to-object-path "^0.3.0"
-    union-value "^1.0.0"
-    unset-value "^1.0.0"
-
-cacheable-request@^2.1.1:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
-  dependencies:
-    clone-response "1.0.2"
-    get-stream "3.0.0"
-    http-cache-semantics "3.8.1"
-    keyv "3.0.0"
-    lowercase-keys "1.0.0"
-    normalize-url "2.0.1"
-    responselike "1.0.2"
-
-cafy@8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/cafy/-/cafy-8.0.0.tgz#8f6ce8556d64ee145c5cdc79b5b68f7fc57ee46f"
-
-call-me-maybe@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
-
-caller-path@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
-  dependencies:
-    callsites "^0.2.0"
-
-callsites@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
-
-camel-case@3.0.x:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
-  dependencies:
-    no-case "^2.2.0"
-    upper-case "^1.1.1"
-
-camelcase-keys@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
-  dependencies:
-    camelcase "^2.0.0"
-    map-obj "^1.0.0"
-
-camelcase@^1.0.2:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
-
-camelcase@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
-
-camelcase@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
-
-camelcase@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
-
-can-promise@^0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3"
-  dependencies:
-    window-or-global "^1.0.1"
-
-caniuse-api@^1.5.2:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
-  dependencies:
-    browserslist "^1.3.6"
-    caniuse-db "^1.0.30000529"
-    lodash.memoize "^4.1.2"
-    lodash.uniq "^4.5.0"
-
-caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
-  version "1.0.30000856"
-  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f"
-
-capture-stack-trace@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
-
-caseless@~0.11.0:
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
-
-caseless@~0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
-
-caw@^1.0.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034"
-  dependencies:
-    get-proxy "^1.0.1"
-    is-obj "^1.0.0"
-    object-assign "^3.0.0"
-    tunnel-agent "^0.4.0"
-
-center-align@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
-  dependencies:
-    align-text "^0.1.3"
-    lazy-cache "^1.0.3"
-
-chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
-  dependencies:
-    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"
-
-chalk@2.3.1:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796"
-  dependencies:
-    ansi-styles "^3.2.0"
-    escape-string-regexp "^1.0.5"
-    supports-color "^5.2.0"
-
-chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.2.0, chalk@^2.3.0, chalk@^2.4.1:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
-  dependencies:
-    ansi-styles "^3.2.1"
-    escape-string-regexp "^1.0.5"
-    supports-color "^5.3.0"
-
-chalk@~0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
-  dependencies:
-    ansi-styles "~1.0.0"
-    has-color "~0.1.0"
-    strip-ansi "~0.1.0"
-
-character-parser@^2.1.1:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
-  dependencies:
-    is-regex "^1.0.3"
-
-chardet@^0.4.0:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
-
-cheerio-httpcli@0.7.2:
-  version "0.7.2"
-  resolved "https://registry.yarnpkg.com/cheerio-httpcli/-/cheerio-httpcli-0.7.2.tgz#346d41b0f00f01aaa2da8d5e7efb3f806fb277a3"
-  dependencies:
-    "@types/cheerio" "^0.22.5"
-    "@types/node" "^8.0.47"
-    async "^2.5.0"
-    cheerio "^0.22.0"
-    colors "^1.1.2"
-    foreach "^2.0.5"
-    he "^1.1.1"
-    iconv-lite "^0.4.19"
-    jschardet "^1.6.0"
-    object-assign "^4.1.1"
-    os-locale "^2.1.0"
-    prettyjson "^1.2.1"
-    request "^2.83.0"
-    require-uncached "^1.0.3"
-    rsvp "^4.7.0"
-    spawn-sync "^1.0.15"
-    tough-cookie "^2.3.3"
-    type-of "^2.0.1"
-    valid-url "^1.0.9"
-    yargs "^10.0.3"
-
-cheerio@^0.22.0:
-  version "0.22.0"
-  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
-  dependencies:
-    css-select "~1.2.0"
-    dom-serializer "~0.1.0"
-    entities "~1.1.1"
-    htmlparser2 "^3.9.1"
-    lodash.assignin "^4.0.9"
-    lodash.bind "^4.1.4"
-    lodash.defaults "^4.0.1"
-    lodash.filter "^4.4.0"
-    lodash.flatten "^4.2.0"
-    lodash.foreach "^4.3.0"
-    lodash.map "^4.4.0"
-    lodash.merge "^4.4.0"
-    lodash.pick "^4.2.1"
-    lodash.reduce "^4.4.0"
-    lodash.reject "^4.4.0"
-    lodash.some "^4.4.0"
-
-chokidar@^1.7.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
-  dependencies:
-    anymatch "^1.3.0"
-    async-each "^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"
-  optionalDependencies:
-    fsevents "^1.0.0"
-
-chokidar@^2.0.2:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
-  dependencies:
-    anymatch "^2.0.0"
-    async-each "^1.0.0"
-    braces "^2.3.0"
-    glob-parent "^3.1.0"
-    inherits "^2.0.1"
-    is-binary-path "^1.0.0"
-    is-glob "^4.0.0"
-    normalize-path "^2.1.1"
-    path-is-absolute "^1.0.0"
-    readdirp "^2.0.0"
-    upath "^1.0.0"
-  optionalDependencies:
-    fsevents "^1.1.2"
-
-chownr@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
-
-chrome-trace-event@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084"
-
-cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
-  dependencies:
-    inherits "^2.0.1"
-    safe-buffer "^5.0.1"
-
-circular-json@^0.3.1:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
-
-clap@^1.0.9:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
-  dependencies:
-    chalk "^1.1.3"
-
-class-utils@^0.3.5:
-  version "0.3.6"
-  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
-  dependencies:
-    arr-union "^3.1.0"
-    define-property "^0.2.5"
-    isobject "^3.0.0"
-    static-extend "^0.1.1"
-
-clean-css@4.1.x, clean-css@^4.1.11:
-  version "4.1.11"
-  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a"
-  dependencies:
-    source-map "0.5.x"
-
-cli-cursor@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
-  dependencies:
-    restore-cursor "^1.0.1"
-
-cli-cursor@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
-  dependencies:
-    restore-cursor "^2.0.0"
-
-cli-spinners@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
-
-cli-table@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
-  dependencies:
-    colors "1.0.3"
-
-cli-truncate@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
-  dependencies:
-    slice-ansi "0.0.4"
-    string-width "^1.0.1"
-
-cli-width@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
-
-cliui@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
-  dependencies:
-    center-align "^0.1.1"
-    right-align "^0.1.1"
-    wordwrap "0.0.2"
-
-cliui@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
-  dependencies:
-    string-width "^1.0.1"
-    strip-ansi "^3.0.1"
-    wrap-ansi "^2.0.0"
-
-cliui@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
-  dependencies:
-    string-width "^2.1.1"
-    strip-ansi "^4.0.0"
-    wrap-ansi "^2.0.0"
-
-clone-buffer@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
-
-clone-deep@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
-  dependencies:
-    for-own "^1.0.0"
-    is-plain-object "^2.0.4"
-    kind-of "^6.0.0"
-    shallow-clone "^1.0.0"
-
-clone-response@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
-  dependencies:
-    mimic-response "^1.0.0"
-
-clone-stats@^0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
-
-clone-stats@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
-
-clone@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
-
-clone@^1.0.0, clone@^1.0.2:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
-
-clone@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
-
-cloneable-readable@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65"
-  dependencies:
-    inherits "^2.0.1"
-    process-nextick-args "^2.0.0"
-    readable-stream "^2.3.5"
-
-co-body@^5.0.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124"
-  dependencies:
-    inflation "^2.0.0"
-    qs "^6.4.0"
-    raw-body "^2.2.0"
-    type-is "^1.6.14"
-
-co-body@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3"
-  dependencies:
-    inflation "^2.0.0"
-    qs "^6.5.2"
-    raw-body "^2.3.3"
-    type-is "^1.6.16"
-
-co@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78"
-
-co@^4.6.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
-
-coa@~1.0.1:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
-  dependencies:
-    q "^1.1.2"
-
-coa@~2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af"
-  dependencies:
-    q "^1.1.2"
-
-code-point-at@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
-
-collection-visit@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
-  dependencies:
-    map-visit "^1.0.0"
-    object-visit "^1.0.0"
-
-color-convert@^1.3.0, color-convert@^1.9.0:
-  version "1.9.2"
-  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
-  dependencies:
-    color-name "1.1.1"
-
-color-name@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
-
-color-name@^1.0.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
-
-color-string@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
-  dependencies:
-    color-name "^1.0.0"
-
-color-support@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
-
-color@^0.11.0:
-  version "0.11.4"
-  resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
-  dependencies:
-    clone "^1.0.2"
-    color-convert "^1.3.0"
-    color-string "^0.3.0"
-
-colormin@^1.0.5:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
-  dependencies:
-    color "^0.11.0"
-    css-color-names "0.0.4"
-    has "^1.0.1"
-
-colors@1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
-
-colors@^1.1.2:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e"
-
-colors@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
-
-combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
-  dependencies:
-    delayed-stream "~1.0.0"
-
-commander@2.15.1, commander@2.15.x, commander@^2.11.0, commander@^2.12.1, commander@^2.7.1, commander@^2.9.0, commander@~2.15.0:
-  version "2.15.1"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
-
-commander@~2.13.0:
-  version "2.13.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
-
-commander@~2.8.1:
-  version "2.8.1"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
-  dependencies:
-    graceful-readlink ">= 1.0.0"
-
-commondir@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
-
-component-emitter@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
-
-compressible@^2.0.0:
-  version "2.0.14"
-  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7"
-  dependencies:
-    mime-db ">= 1.34.0 < 2"
-
-concat-map@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-
-concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0:
-  version "1.6.2"
-  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
-  dependencies:
-    buffer-from "^1.0.0"
-    inherits "^2.0.3"
-    readable-stream "^2.2.2"
-    typedarray "^0.0.6"
-
-condense-newlines@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f"
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-whitespace "^0.3.0"
-    kind-of "^3.0.2"
-
-config-chain@~1.1.5:
-  version "1.1.11"
-  resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
-  dependencies:
-    ini "^1.3.4"
-    proto-list "~1.2.1"
-
-console-browserify@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
-  dependencies:
-    date-now "^0.1.4"
-
-console-control-strings@^1.0.0, console-control-strings@~1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
-
-console-stream@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
-
-consolidate@^0.15.0, consolidate@^0.15.1:
-  version "0.15.1"
-  resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
-  dependencies:
-    bluebird "^3.1.1"
-
-constantinople@^3.0.1:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
-  dependencies:
-    "@types/babel-types" "^7.0.0"
-    "@types/babylon" "^6.16.2"
-    babel-types "^6.26.0"
-    babylon "^6.18.0"
-
-constants-browserify@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
-
-content-disposition@0.5.2, content-disposition@~0.5.0:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
-
-content-type@^1.0.0, content-type@~1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
-
-convert-source-map@1.X, convert-source-map@^1.1.1, convert-source-map@^1.2.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
-
-cookie-signature@1.0.6:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
-
-cookie@0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
-
-cookies@~0.7.0:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b"
-  dependencies:
-    depd "~1.1.1"
-    keygrip "~1.0.2"
-
-copy-concurrently@^1.0.0:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
-  dependencies:
-    aproba "^1.1.1"
-    fs-write-stream-atomic "^1.0.8"
-    iferr "^0.1.5"
-    mkdirp "^0.5.1"
-    rimraf "^2.5.4"
-    run-queue "^1.0.0"
-
-copy-descriptor@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
-
-copy-to@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5"
-
-core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
-  version "2.5.7"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
-
-core-util-is@1.0.2, core-util-is@~1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
-
-crc-32@1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
-  dependencies:
-    exit-on-epipe "~1.0.1"
-    printj "~1.1.0"
-
-create-ecdh@^4.0.0:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
-  dependencies:
-    bn.js "^4.1.0"
-    elliptic "^6.0.0"
-
-create-error-class@^3.0.1:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
-  dependencies:
-    capture-stack-trace "^1.0.0"
-
-create-hash@^1.1.0, create-hash@^1.1.2:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
-  dependencies:
-    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@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
-  dependencies:
-    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"
-
-cropperjs@^1.1.3:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.4.0.tgz#e9851559c590d148a10c17c36cdc8126acf01a2e"
-
-cross-spawn@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
-  dependencies:
-    lru-cache "^4.0.1"
-    which "^1.2.9"
-
-cross-spawn@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
-  dependencies:
-    lru-cache "^4.0.1"
-    which "^1.2.9"
-
-cross-spawn@^5.0.1, cross-spawn@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
-  dependencies:
-    lru-cache "^4.0.1"
-    shebang-command "^1.2.0"
-    which "^1.2.9"
-
-cross-spawn@^6.0.0, cross-spawn@^6.0.5:
-  version "6.0.5"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
-  dependencies:
-    nice-try "^1.0.4"
-    path-key "^2.0.1"
-    semver "^5.5.0"
-    shebang-command "^1.2.0"
-    which "^1.2.9"
-
-cryptiles@2.x.x:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
-  dependencies:
-    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@^3.11.0:
-  version "3.12.0"
-  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
-  dependencies:
-    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"
-
-css-color-names@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
-
-css-loader@0.28.11:
-  version "0.28.11"
-  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7"
-  dependencies:
-    babel-code-frame "^6.26.0"
-    css-selector-tokenizer "^0.7.0"
-    cssnano "^3.10.0"
-    icss-utils "^2.1.0"
-    loader-utils "^1.0.2"
-    lodash.camelcase "^4.3.0"
-    object-assign "^4.1.1"
-    postcss "^5.0.6"
-    postcss-modules-extract-imports "^1.2.0"
-    postcss-modules-local-by-default "^1.2.0"
-    postcss-modules-scope "^1.1.0"
-    postcss-modules-values "^1.3.0"
-    postcss-value-parser "^3.3.0"
-    source-list-map "^2.0.0"
-
-css-parse@1.7.x:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
-
-css-select-base-adapter@~0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990"
-
-css-select@~1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
-  dependencies:
-    boolbase "~1.0.0"
-    css-what "2.1"
-    domutils "1.5.1"
-    nth-check "~1.0.1"
-
-css-select@~1.3.0-rc0:
-  version "1.3.0-rc0"
-  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231"
-  dependencies:
-    boolbase "^1.0.0"
-    css-what "2.1"
-    domutils "1.5.1"
-    nth-check "^1.0.1"
-
-css-selector-tokenizer@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
-  dependencies:
-    cssesc "^0.1.0"
-    fastparse "^1.1.1"
-    regexpu-core "^1.0.0"
-
-css-tree@1.0.0-alpha.29:
-  version "1.0.0-alpha.29"
-  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
-  dependencies:
-    mdn-data "~1.1.0"
-    source-map "^0.5.3"
-
-css-tree@1.0.0-alpha25:
-  version "1.0.0-alpha25"
-  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597"
-  dependencies:
-    mdn-data "^1.0.0"
-    source-map "^0.5.3"
-
-css-url-regex@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec"
-
-css-what@2.1:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
-
-css@2.X, css@^2.2.1:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be"
-  dependencies:
-    inherits "^2.0.1"
-    source-map "^0.1.38"
-    source-map-resolve "^0.5.1"
-    urix "^0.1.0"
-
-cssesc@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
-
-cssnano@^3.0.0, cssnano@^3.10.0:
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
-  dependencies:
-    autoprefixer "^6.3.1"
-    decamelize "^1.1.2"
-    defined "^1.0.0"
-    has "^1.0.1"
-    object-assign "^4.0.1"
-    postcss "^5.0.14"
-    postcss-calc "^5.2.0"
-    postcss-colormin "^2.1.8"
-    postcss-convert-values "^2.3.4"
-    postcss-discard-comments "^2.0.4"
-    postcss-discard-duplicates "^2.0.1"
-    postcss-discard-empty "^2.0.1"
-    postcss-discard-overridden "^0.1.1"
-    postcss-discard-unused "^2.2.1"
-    postcss-filter-plugins "^2.0.0"
-    postcss-merge-idents "^2.1.5"
-    postcss-merge-longhand "^2.0.1"
-    postcss-merge-rules "^2.0.3"
-    postcss-minify-font-values "^1.0.2"
-    postcss-minify-gradients "^1.0.1"
-    postcss-minify-params "^1.0.4"
-    postcss-minify-selectors "^2.0.4"
-    postcss-normalize-charset "^1.1.0"
-    postcss-normalize-url "^3.0.7"
-    postcss-ordered-values "^2.1.0"
-    postcss-reduce-idents "^2.2.2"
-    postcss-reduce-initial "^1.0.0"
-    postcss-reduce-transforms "^1.0.3"
-    postcss-svgo "^2.1.1"
-    postcss-unique-selectors "^2.0.2"
-    postcss-value-parser "^3.2.3"
-    postcss-zindex "^2.0.1"
-
-csso@^3.5.0:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
-  dependencies:
-    css-tree "1.0.0-alpha.29"
-
-csso@~2.3.1:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
-  dependencies:
-    clap "^1.0.9"
-    source-map "^0.5.3"
-
-cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
-
-"cssstyle@>= 0.3.1 < 0.4.0":
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf"
-  dependencies:
-    cssom "0.3.x"
-
-currently-unhandled@^0.4.1:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
-  dependencies:
-    array-find-index "^1.0.1"
-
-cyclist@~0.2.2:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
-
-d@1:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
-  dependencies:
-    es5-ext "^0.10.9"
-
-dargs@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829"
-
-dashdash@^1.12.0:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
-  dependencies:
-    assert-plus "^1.0.0"
-
-data-urls@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f"
-  dependencies:
-    abab "^1.0.4"
-    whatwg-mimetype "^2.0.0"
-    whatwg-url "^6.4.0"
-
-date-fns@^1.27.2:
-  version "1.29.0"
-  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
-
-date-now@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
-
-dateformat@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
-
-dateformat@^3.0.3:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
-
-de-indent@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
-
-debug-fabulous@1.X:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e"
-  dependencies:
-    debug "3.X"
-    memoizee "0.4.X"
-    object-assign "4.X"
-
-debug@*, debug@3.1.0, debug@3.X, debug@^3.0.0, debug@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
-  dependencies:
-    ms "2.0.0"
-
-debug@0.7.4:
-  version "0.7.4"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
-
-debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.1, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9:
-  version "2.6.9"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
-  dependencies:
-    ms "2.0.0"
-
-debuglog@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
-
-decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
-
-decode-uri-component@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
-
-decompress-response@^3.2.0, decompress-response@^3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
-  dependencies:
-    mimic-response "^1.0.0"
-
-decompress-tar@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466"
-  dependencies:
-    is-tar "^1.0.0"
-    object-assign "^2.0.0"
-    strip-dirs "^1.0.0"
-    tar-stream "^1.1.1"
-    through2 "^0.6.1"
-    vinyl "^0.4.3"
-
-decompress-tarbz2@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d"
-  dependencies:
-    is-bzip2 "^1.0.0"
-    object-assign "^2.0.0"
-    seek-bzip "^1.0.3"
-    strip-dirs "^1.0.0"
-    tar-stream "^1.1.1"
-    through2 "^0.6.1"
-    vinyl "^0.4.3"
-
-decompress-targz@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0"
-  dependencies:
-    is-gzip "^1.0.0"
-    object-assign "^2.0.0"
-    strip-dirs "^1.0.0"
-    tar-stream "^1.1.1"
-    through2 "^0.6.1"
-    vinyl "^0.4.3"
-
-decompress-unzip@^3.0.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb"
-  dependencies:
-    is-zip "^1.0.0"
-    read-all-stream "^3.0.0"
-    stat-mode "^0.2.0"
-    strip-dirs "^1.0.0"
-    through2 "^2.0.0"
-    vinyl "^1.0.0"
-    yauzl "^2.2.1"
-
-decompress@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed"
-  dependencies:
-    buffer-to-vinyl "^1.0.0"
-    concat-stream "^1.4.6"
-    decompress-tar "^3.0.0"
-    decompress-tarbz2 "^3.0.0"
-    decompress-targz "^3.0.0"
-    decompress-unzip "^3.0.0"
-    stream-combiner2 "^1.1.1"
-    vinyl-assign "^1.0.1"
-    vinyl-fs "^2.2.0"
-
-deep-equal@1.0.1, deep-equal@~1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
-
-deep-extend@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
-
-deep-extend@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
-
-deep-is@0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.2.tgz#9ced65ea0bc0b09f42a6d79c1b1903f9d913cc18"
-
-deep-is@~0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
-
-deepcopy@0.6.3:
-  version "0.6.3"
-  resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0"
-
-deepmerge@^1.2.0:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
-
-deepmerge@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768"
-
-defaults@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
-  dependencies:
-    clone "^1.0.2"
-
-define-properties@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
-  dependencies:
-    foreach "^2.0.5"
-    object-keys "^1.0.8"
-
-define-property@^0.2.5:
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
-  dependencies:
-    is-descriptor "^0.1.0"
-
-define-property@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
-  dependencies:
-    is-descriptor "^1.0.0"
-
-define-property@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
-  dependencies:
-    is-descriptor "^1.0.2"
-    isobject "^3.0.1"
-
-defined@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
-
-del@^2.0.2:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
-  dependencies:
-    globby "^5.0.0"
-    is-path-cwd "^1.0.0"
-    is-path-in-cwd "^1.0.0"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-    rimraf "^2.2.8"
-
-delayed-stream@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
-
-delegates@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
-
-depd@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
-
-depd@^1.1.0, depd@~1.1.1, depd@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
-
-deprecated@^0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
-
-des.js@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
-  dependencies:
-    inherits "^2.0.1"
-    minimalistic-assert "^1.0.0"
-
-destroy@^1.0.3, destroy@~1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
-
-detect-conflict@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e"
-
-detect-file@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
-
-detect-indent@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
-  dependencies:
-    repeating "^2.0.0"
-
-detect-indent@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
-
-detect-libc@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
-
-detect-newline@2.X:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
-
-dezalgo@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
-  dependencies:
-    asap "^2.0.0"
-    wrappy "1"
-
-dicer@0.2.5:
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
-  dependencies:
-    readable-stream "1.1.x"
-    streamsearch "0.1.2"
-
-diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0:
-  version "3.5.0"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
-
-diffie-hellman@^5.0.0:
-  version "5.0.3"
-  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
-  dependencies:
-    bn.js "^4.1.0"
-    miller-rabin "^4.0.0"
-    randombytes "^2.0.0"
-
-dijkstrajs@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
-
-dir-glob@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
-  dependencies:
-    arrify "^1.0.1"
-    path-type "^3.0.0"
-
-diskusage@0.2.4:
-  version "0.2.4"
-  resolved "https://registry.yarnpkg.com/diskusage/-/diskusage-0.2.4.tgz#e956f7a1051e0c6a1af706154efe620a2ee432ec"
-  dependencies:
-    nan "^2.5.0"
-
-doctrine@^2.0.0, doctrine@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
-  dependencies:
-    esutils "^2.0.2"
-
-doctypes@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
-
-dom-serializer@0, dom-serializer@~0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
-  dependencies:
-    domelementtype "~1.1.1"
-    entities "~1.1.1"
-
-domain-browser@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
-
-domelementtype@1, domelementtype@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
-
-domelementtype@~1.1.1:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
-
-domexception@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
-  dependencies:
-    webidl-conversions "^4.0.2"
-
-domhandler@^2.3.0:
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
-  dependencies:
-    domelementtype "1"
-
-dompurify@1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-1.0.4.tgz#b0655d07856c1ef76fd27ae18e8ab1174ed18819"
-
-domutils@1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
-  dependencies:
-    dom-serializer "0"
-    domelementtype "1"
-
-domutils@^1.5.1:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
-  dependencies:
-    dom-serializer "0"
-    domelementtype "1"
-
-dot-prop@^4.1.1:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
-  dependencies:
-    is-obj "^1.0.0"
-
-double-ended-queue@^2.1.0-0:
-  version "2.1.0-0"
-  resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
-
-download@^4.0.0, download@^4.1.2:
-  version "4.4.3"
-  resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac"
-  dependencies:
-    caw "^1.0.1"
-    concat-stream "^1.4.7"
-    each-async "^1.0.0"
-    filenamify "^1.0.1"
-    got "^5.0.0"
-    gulp-decompress "^1.2.0"
-    gulp-rename "^1.2.0"
-    is-url "^1.2.0"
-    object-assign "^4.0.1"
-    read-all-stream "^3.0.0"
-    readable-stream "^2.0.2"
-    stream-combiner2 "^1.1.1"
-    vinyl "^1.0.0"
-    vinyl-fs "^2.2.0"
-    ware "^1.2.0"
-
-duplexer2@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
-  dependencies:
-    readable-stream "~1.1.9"
-
-duplexer2@^0.1.4, duplexer2@~0.1.0:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
-  dependencies:
-    readable-stream "^2.0.2"
-
-duplexer3@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
-
-duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.6.0:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
-  dependencies:
-    end-of-stream "^1.0.0"
-    inherits "^2.0.1"
-    readable-stream "^2.0.0"
-    stream-shift "^1.0.0"
-
-each-async@^1.0.0, each-async@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473"
-  dependencies:
-    onetime "^1.0.0"
-    set-immediate-shim "^1.0.0"
-
-ecc-jsbn@~0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
-  dependencies:
-    jsbn "~0.1.0"
-
-ecdsa-sig-formatter@1.0.10:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3"
-  dependencies:
-    safe-buffer "^5.0.1"
-
-editions@^1.3.3:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b"
-
-editorconfig@^0.13.2:
-  version "0.13.3"
-  resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34"
-  dependencies:
-    bluebird "^3.0.5"
-    commander "^2.9.0"
-    lru-cache "^3.2.0"
-    semver "^5.1.0"
-    sigmund "^1.0.1"
-
-ee-first@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
-
-ejs@^2.5.9:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
-
-elasticsearch@15.0.0:
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.0.0.tgz#d888ceb858bba30221b68698d72c54bdcfdf2fba"
-  dependencies:
-    agentkeepalive "^3.4.1"
-    chalk "^1.0.0"
-    lodash "^4.17.10"
-
-electron-to-chromium@^1.2.7:
-  version "1.3.48"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900"
-
-elegant-spinner@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
-
-element-ui@2.3.9:
-  version "2.3.9"
-  resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.3.9.tgz#0c5996e74b375f2665d703c68bdb3269ae9269e0"
-  dependencies:
-    async-validator "~1.8.1"
-    babel-helper-vue-jsx-merge-props "^2.0.0"
-    deepmerge "^1.2.0"
-    normalize-wheel "^1.0.1"
-    resize-observer-polyfill "^1.5.0"
-    throttle-debounce "^1.0.1"
-
-elliptic@^6.0.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
-  dependencies:
-    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"
-
-emojilib@2.2.12:
-  version "2.2.12"
-  resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.2.12.tgz#29481fa5521ac5ed97a5cc0503901c3435d523fa"
-
-emojis-list@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
-
-encodeurl@~1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
-
-encoding@^0.1.11:
-  version "0.1.12"
-  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
-  dependencies:
-    iconv-lite "~0.4.13"
-
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
-  dependencies:
-    once "^1.4.0"
-
-end-of-stream@~0.1.5:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
-  dependencies:
-    once "~1.3.0"
-
-enhanced-resolve@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a"
-  dependencies:
-    graceful-fs "^4.1.2"
-    memory-fs "^0.4.0"
-    tapable "^1.0.0"
-
-entities@^1.1.1, entities@~1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
-
-envinfo@^5.7.0:
-  version "5.10.0"
-  resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df"
-
-errno@^0.1.3, errno@~0.1.7:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
-  dependencies:
-    prr "~1.0.1"
-
-error-ex@^1.2.0, error-ex@^1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
-  dependencies:
-    is-arrayish "^0.2.1"
-
-error-inject@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37"
-
-error@^7.0.2:
-  version "7.0.2"
-  resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02"
-  dependencies:
-    string-template "~0.2.1"
-    xtend "~4.0.0"
-
-es-abstract@^1.5.1, es-abstract@^1.6.1:
-  version "1.12.0"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
-  dependencies:
-    es-to-primitive "^1.1.1"
-    function-bind "^1.1.1"
-    has "^1.0.1"
-    is-callable "^1.1.3"
-    is-regex "^1.0.4"
-
-es-to-primitive@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
-  dependencies:
-    is-callable "^1.1.1"
-    is-date-object "^1.0.1"
-    is-symbol "^1.0.1"
-
-es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2:
-  version "0.10.45"
-  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
-  dependencies:
-    es6-iterator "~2.0.3"
-    es6-symbol "~3.1.1"
-    next-tick "1"
-
-es6-iterator@^2.0.1, es6-iterator@~2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
-  dependencies:
-    d "1"
-    es5-ext "^0.10.35"
-    es6-symbol "^3.1.1"
-
-es6-promise@3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4"
-
-es6-promise@^3.0.2:
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
-
-es6-promise@^4.0.3, es6-promise@^4.1.1:
-  version "4.2.4"
-  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
-
-es6-promisify@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
-  dependencies:
-    es6-promise "^4.0.3"
-
-es6-symbol@^3.1.1, es6-symbol@~3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
-  dependencies:
-    d "1"
-    es5-ext "~0.10.14"
-
-es6-weak-map@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
-  dependencies:
-    d "1"
-    es5-ext "^0.10.14"
-    es6-iterator "^2.0.1"
-    es6-symbol "^3.1.1"
-
-escape-html@~1.0.1, escape-html@~1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
-
-escape-regexp@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/escape-regexp/-/escape-regexp-0.0.1.tgz#f44bda12d45bbdf9cb7f862ee7e4827b3dd32254"
-
-escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
-
-escodegen@^1.9.0:
-  version "1.10.0"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e"
-  dependencies:
-    esprima "^3.1.3"
-    estraverse "^4.2.0"
-    esutils "^2.0.2"
-    optionator "^0.8.1"
-  optionalDependencies:
-    source-map "~0.6.1"
-
-eslint-plugin-vue@4.5.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.5.0.tgz#09d6597f4849e31a3846c2c395fccf17685b69c3"
-  dependencies:
-    vue-eslint-parser "^2.0.3"
-
-eslint-scope@^3.7.1:
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
-  dependencies:
-    esrecurse "^4.1.0"
-    estraverse "^4.1.1"
-
-eslint-visitor-keys@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
-
-eslint@4.19.1:
-  version "4.19.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
-  dependencies:
-    ajv "^5.3.0"
-    babel-code-frame "^6.22.0"
-    chalk "^2.1.0"
-    concat-stream "^1.6.0"
-    cross-spawn "^5.1.0"
-    debug "^3.1.0"
-    doctrine "^2.1.0"
-    eslint-scope "^3.7.1"
-    eslint-visitor-keys "^1.0.0"
-    espree "^3.5.4"
-    esquery "^1.0.0"
-    esutils "^2.0.2"
-    file-entry-cache "^2.0.0"
-    functional-red-black-tree "^1.0.1"
-    glob "^7.1.2"
-    globals "^11.0.1"
-    ignore "^3.3.3"
-    imurmurhash "^0.1.4"
-    inquirer "^3.0.6"
-    is-resolvable "^1.0.0"
-    js-yaml "^3.9.1"
-    json-stable-stringify-without-jsonify "^1.0.1"
-    levn "^0.3.0"
-    lodash "^4.17.4"
-    minimatch "^3.0.2"
-    mkdirp "^0.5.1"
-    natural-compare "^1.4.0"
-    optionator "^0.8.2"
-    path-is-inside "^1.0.2"
-    pluralize "^7.0.0"
-    progress "^2.0.0"
-    regexpp "^1.0.1"
-    require-uncached "^1.0.3"
-    semver "^5.3.0"
-    strip-ansi "^4.0.0"
-    strip-json-comments "~2.0.1"
-    table "4.0.2"
-    text-table "~0.2.0"
-
-espree@^3.5.2, espree@^3.5.4:
-  version "3.5.4"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
-  dependencies:
-    acorn "^5.5.0"
-    acorn-jsx "^3.0.0"
-
-esprima@^2.6.0:
-  version "2.7.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
-
-esprima@^3.1.3:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
-
-esprima@^4.0.0, esprima@~4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
-
-esquery@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
-  dependencies:
-    estraverse "^4.0.0"
-
-esrecurse@^4.1.0:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
-  dependencies:
-    estraverse "^4.1.0"
-
-estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
-
-esutils@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
-
-etag@~1.8.1:
-  version "1.8.1"
-  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
-
-event-emitter@^0.3.5:
-  version "0.3.5"
-  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
-  dependencies:
-    d "1"
-    es5-ext "~0.10.14"
-
-eventemitter3@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
-
-events@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
-
-evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
-  dependencies:
-    md5.js "^1.3.4"
-    safe-buffer "^5.1.1"
-
-exec-buffer@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
-  dependencies:
-    execa "^0.7.0"
-    p-finally "^1.0.0"
-    pify "^3.0.0"
-    rimraf "^2.5.4"
-    tempfile "^2.0.0"
-
-exec-series@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a"
-  dependencies:
-    async-each-series "^1.1.0"
-    object-assign "^4.1.0"
-
-execa@^0.10.0:
-  version "0.10.0"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
-  dependencies:
-    cross-spawn "^6.0.0"
-    get-stream "^3.0.0"
-    is-stream "^1.1.0"
-    npm-run-path "^2.0.0"
-    p-finally "^1.0.0"
-    signal-exit "^3.0.0"
-    strip-eof "^1.0.0"
-
-execa@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
-  dependencies:
-    cross-spawn "^5.0.1"
-    get-stream "^3.0.0"
-    is-stream "^1.1.0"
-    npm-run-path "^2.0.0"
-    p-finally "^1.0.0"
-    signal-exit "^3.0.0"
-    strip-eof "^1.0.0"
-
-executable@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9"
-  dependencies:
-    meow "^3.1.0"
-
-exif-js@2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814"
-
-exit-hook@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
-
-exit-on-epipe@~1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
-
-expand-brackets@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
-  dependencies:
-    is-posix-bracket "^0.1.0"
-
-expand-brackets@^2.1.4:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
-  dependencies:
-    debug "^2.3.3"
-    define-property "^0.2.5"
-    extend-shallow "^2.0.1"
-    posix-character-classes "^0.1.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-expand-range@^1.8.1:
-  version "1.8.2"
-  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
-  dependencies:
-    fill-range "^2.1.0"
-
-expand-tilde@^2.0.0, expand-tilde@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
-  dependencies:
-    homedir-polyfill "^1.0.1"
-
-express@^4.12.2:
-  version "4.16.3"
-  resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
-  dependencies:
-    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"
-
-extend-shallow@^1.1.2:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071"
-  dependencies:
-    kind-of "^1.1.0"
-
-extend-shallow@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
-  dependencies:
-    is-extendable "^0.1.0"
-
-extend-shallow@^3.0.0, extend-shallow@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
-  dependencies:
-    assign-symbols "^1.0.0"
-    is-extendable "^1.0.1"
-
-extend@^1.2.1:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8"
-
-extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
-
-external-editor@^2.0.1, external-editor@^2.0.4, external-editor@^2.1.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
-  dependencies:
-    chardet "^0.4.0"
-    iconv-lite "^0.4.17"
-    tmp "^0.0.33"
-
-extglob@^0.3.1:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
-  dependencies:
-    is-extglob "^1.0.0"
-
-extglob@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
-  dependencies:
-    array-unique "^0.3.2"
-    define-property "^1.0.0"
-    expand-brackets "^2.1.4"
-    extend-shallow "^2.0.1"
-    fragment-cache "^0.2.1"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-extsprintf@1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
-
-extsprintf@^1.2.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
-
-fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1"
-  dependencies:
-    ansi-gray "^0.1.1"
-    color-support "^1.1.3"
-    time-stamp "^1.0.0"
-
-fast-deep-equal@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
-
-fast-deep-equal@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
-
-fast-glob@^2.0.2:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf"
-  dependencies:
-    "@mrmlnc/readdir-enhanced" "^2.2.1"
-    "@nodelib/fs.stat" "^1.0.1"
-    glob-parent "^3.1.0"
-    is-glob "^4.0.0"
-    merge2 "^1.2.1"
-    micromatch "^3.1.10"
-
-fast-json-stable-stringify@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
-
-fast-levenshtein@~2.0.4:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
-
-fastparse@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
-
-fd-slicer@~1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
-  dependencies:
-    pend "~1.2.0"
-
-figures@^1.3.5, figures@^1.7.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
-  dependencies:
-    escape-string-regexp "^1.0.5"
-    object-assign "^4.1.0"
-
-figures@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
-  dependencies:
-    escape-string-regexp "^1.0.5"
-
-file-entry-cache@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
-  dependencies:
-    flat-cache "^1.2.1"
-    object-assign "^4.0.1"
-
-file-loader@1.1.11:
-  version "1.1.11"
-  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8"
-  dependencies:
-    loader-utils "^1.0.2"
-    schema-utils "^0.4.5"
-
-file-type@8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.0.0.tgz#6e4bccc741187f4113334a4e4a4ef84d54d7cc1e"
-
-file-type@^3.1.0:
-  version "3.9.0"
-  resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
-
-file-type@^4.1.0:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
-
-filename-regex@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
-
-filename-reserved-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4"
-
-filenamify@^1.0.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5"
-  dependencies:
-    filename-reserved-regex "^1.0.0"
-    strip-outer "^1.0.0"
-    trim-repeated "^1.0.0"
-
-fill-range@^2.1.0:
-  version "2.2.4"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
-  dependencies:
-    is-number "^2.1.0"
-    isobject "^2.0.0"
-    randomatic "^3.0.0"
-    repeat-element "^1.1.2"
-    repeat-string "^1.5.2"
-
-fill-range@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-    to-regex-range "^2.1.0"
-
-finalhandler@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
-  dependencies:
-    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"
-
-find-cache-dir@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
-  dependencies:
-    commondir "^1.0.1"
-    make-dir "^1.0.0"
-    pkg-dir "^2.0.0"
-
-find-index@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
-
-find-up@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
-  dependencies:
-    path-exists "^2.0.0"
-    pinkie-promise "^2.0.0"
-
-find-up@^2.0.0, find-up@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
-  dependencies:
-    locate-path "^2.0.0"
-
-find-versions@^1.0.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62"
-  dependencies:
-    array-uniq "^1.0.0"
-    get-stdin "^4.0.1"
-    meow "^3.5.0"
-    semver-regex "^1.0.0"
-
-findup-sync@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
-  dependencies:
-    detect-file "^1.0.0"
-    is-glob "^3.1.0"
-    micromatch "^3.0.4"
-    resolve-dir "^1.0.1"
-
-fined@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476"
-  dependencies:
-    expand-tilde "^2.0.2"
-    is-plain-object "^2.0.3"
-    object.defaults "^1.1.0"
-    object.pick "^1.2.0"
-    parse-filepath "^1.0.1"
-
-first-chunk-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
-
-first-chunk-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70"
-  dependencies:
-    readable-stream "^2.0.2"
-
-flagged-respawn@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7"
-
-flat-cache@^1.2.1:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
-  dependencies:
-    circular-json "^0.3.1"
-    del "^2.0.2"
-    graceful-fs "^4.1.2"
-    write "^0.2.1"
-
-flatten@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
-
-flow-parser@^0.*:
-  version "0.74.0"
-  resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.74.0.tgz#4acc8f55bdce5fa4da43c72c28ef8a9600ace87c"
-
-flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
-  dependencies:
-    inherits "^2.0.1"
-    readable-stream "^2.0.4"
-
-for-in@^0.1.3:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
-
-for-in@^1.0.1, for-in@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
-
-for-own@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
-  dependencies:
-    for-in "^1.0.1"
-
-for-own@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
-  dependencies:
-    for-in "^1.0.1"
-
-foreach@^2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
-
-forever-agent@~0.6.1:
-  version "0.6.1"
-  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
-
-form-data@~2.1.1:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
-  dependencies:
-    asynckit "^0.4.0"
-    combined-stream "^1.0.5"
-    mime-types "^2.1.12"
-
-form-data@~2.3.1:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
-  dependencies:
-    asynckit "^0.4.0"
-    combined-stream "1.0.6"
-    mime-types "^2.1.12"
-
-format-util@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95"
-
-forwarded@~0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
-
-fragment-cache@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
-  dependencies:
-    map-cache "^0.2.2"
-
-fresh@0.5.2, fresh@^0.5.2:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
-
-from2@^2.1.0, from2@^2.1.1:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
-  dependencies:
-    inherits "^2.0.1"
-    readable-stream "^2.0.0"
-
-fs-constants@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
-
-fs-extra@^4.0.2:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
-  dependencies:
-    graceful-fs "^4.1.2"
-    jsonfile "^4.0.0"
-    universalify "^0.1.0"
-
-fs-minipass@^1.2.5:
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
-  dependencies:
-    minipass "^2.2.1"
-
-fs-mkdirp-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
-  dependencies:
-    graceful-fs "^4.1.11"
-    through2 "^2.0.3"
-
-fs-write-stream-atomic@^1.0.8:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
-  dependencies:
-    graceful-fs "^4.1.2"
-    iferr "^0.1.5"
-    imurmurhash "^0.1.4"
-    readable-stream "1 || 2"
-
-fs.realpath@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
-
-fsevents@^1.0.0, fsevents@^1.1.2:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
-  dependencies:
-    nan "^2.9.2"
-    node-pre-gyp "^0.10.0"
-
-fstream@^1.0.0, fstream@^1.0.2:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
-  dependencies:
-    graceful-fs "^4.1.2"
-    inherits "~2.0.0"
-    mkdirp ">=0.5 0"
-    rimraf "2"
-
-fuckadblock@3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/fuckadblock/-/fuckadblock-3.2.1.tgz#17fa3237a5e15c86613406b911e608191a3e62e2"
-
-function-bind@^1.1.0, function-bind@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
-
-functional-red-black-tree@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
-
-gauge@~2.7.3:
-  version "2.7.4"
-  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
-  dependencies:
-    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"
-
-gaze@^0.5.1:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
-  dependencies:
-    globule "~0.1.0"
-
-gaze@^1.0.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
-  dependencies:
-    globule "^1.0.0"
-
-generate-function@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
-
-generate-object-property@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
-  dependencies:
-    is-property "^1.0.0"
-
-get-caller-file@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
-
-get-paths@^0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.2.tgz#a9c27b1a8d006c931a4f26fcf7d1546e3ad71bea"
-  dependencies:
-    fs-extra "^4.0.2"
-
-get-proxy@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb"
-  dependencies:
-    rc "^1.1.2"
-
-get-stdin@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
-
-get-stream@3.0.0, get-stream@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
-
-get-value@^2.0.3, get-value@^2.0.6:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
-
-getpass@^0.1.1:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
-  dependencies:
-    assert-plus "^1.0.0"
-
-gh-got@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0"
-  dependencies:
-    got "^7.0.0"
-    is-plain-obj "^1.1.0"
-
-gifsicle@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b"
-  dependencies:
-    bin-build "^2.0.0"
-    bin-wrapper "^3.0.0"
-    logalot "^2.0.0"
-
-github-username@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417"
-  dependencies:
-    gh-got "^6.0.0"
-
-glob-all@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab"
-  dependencies:
-    glob "^7.0.5"
-    yargs "~1.2.6"
-
-glob-base@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
-  dependencies:
-    glob-parent "^2.0.0"
-    is-glob "^2.0.0"
-
-glob-parent@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
-  dependencies:
-    is-glob "^2.0.0"
-
-glob-parent@^3.0.0, glob-parent@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
-  dependencies:
-    is-glob "^3.1.0"
-    path-dirname "^1.0.0"
-
-glob-stream@^3.1.5:
-  version "3.1.18"
-  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
-  dependencies:
-    glob "^4.3.1"
-    glob2base "^0.0.12"
-    minimatch "^2.0.1"
-    ordered-read-streams "^0.1.0"
-    through2 "^0.6.1"
-    unique-stream "^1.0.0"
-
-glob-stream@^5.3.2:
-  version "5.3.5"
-  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22"
-  dependencies:
-    extend "^3.0.0"
-    glob "^5.0.3"
-    glob-parent "^3.0.0"
-    micromatch "^2.3.7"
-    ordered-read-streams "^0.3.0"
-    through2 "^0.6.0"
-    to-absolute-glob "^0.1.1"
-    unique-stream "^2.0.2"
-
-glob-stream@^6.1.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
-  dependencies:
-    extend "^3.0.0"
-    glob "^7.1.1"
-    glob-parent "^3.1.0"
-    is-negated-glob "^1.0.0"
-    ordered-read-streams "^1.0.0"
-    pumpify "^1.3.5"
-    readable-stream "^2.1.5"
-    remove-trailing-separator "^1.0.1"
-    to-absolute-glob "^2.0.0"
-    unique-stream "^2.0.2"
-
-glob-to-regexp@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
-
-glob-watcher@^0.0.6:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
-  dependencies:
-    gaze "^0.5.1"
-
-glob2base@^0.0.12:
-  version "0.0.12"
-  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
-  dependencies:
-    find-index "^0.1.1"
-
-glob@7.0.x:
-  version "7.0.6"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.2"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
-  dependencies:
-    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@^4.3.1:
-  version "4.5.3"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
-  dependencies:
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^2.0.1"
-    once "^1.3.0"
-
-glob@^5.0.3:
-  version "5.0.15"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
-  dependencies:
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "2 || 3"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@^6.0.4:
-  version "6.0.4"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
-  dependencies:
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "2 || 3"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@~3.1.21:
-  version "3.1.21"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
-  dependencies:
-    graceful-fs "~1.2.0"
-    inherits "1"
-    minimatch "~0.2.11"
-
-global-modules@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
-  dependencies:
-    global-prefix "^1.0.1"
-    is-windows "^1.0.1"
-    resolve-dir "^1.0.0"
-
-global-prefix@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
-  dependencies:
-    expand-tilde "^2.0.2"
-    homedir-polyfill "^1.0.1"
-    ini "^1.3.4"
-    is-windows "^1.0.1"
-    which "^1.2.14"
-
-globals@^11.0.1:
-  version "11.5.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642"
-
-globals@^9.18.0:
-  version "9.18.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
-
-globby@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
-  dependencies:
-    array-union "^1.0.1"
-    arrify "^1.0.0"
-    glob "^7.0.3"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-
-globby@^6.1.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
-  dependencies:
-    array-union "^1.0.1"
-    glob "^7.0.3"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-
-globby@^8.0.0, globby@^8.0.1:
-  version "8.0.1"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50"
-  dependencies:
-    array-union "^1.0.1"
-    dir-glob "^2.0.0"
-    fast-glob "^2.0.2"
-    glob "^7.1.2"
-    ignore "^3.3.5"
-    pify "^3.0.0"
-    slash "^1.0.0"
-
-globule@^1.0.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
-  dependencies:
-    glob "~7.1.1"
-    lodash "~4.17.10"
-    minimatch "~3.0.2"
-
-globule@~0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
-  dependencies:
-    glob "~3.1.21"
-    lodash "~1.0.1"
-    minimatch "~0.2.11"
-
-glogg@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810"
-  dependencies:
-    sparkles "^1.0.0"
-
-gm@1.23.1:
-  version "1.23.1"
-  resolved "https://registry.yarnpkg.com/gm/-/gm-1.23.1.tgz#2edeeb958084d0f8ea7988e5d995b1c7dfc14777"
-  dependencies:
-    array-parallel "~0.1.3"
-    array-series "~0.1.5"
-    cross-spawn "^4.0.0"
-    debug "^3.1.0"
-
-got@^5.0.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35"
-  dependencies:
-    create-error-class "^3.0.1"
-    duplexer2 "^0.1.4"
-    is-redirect "^1.0.0"
-    is-retry-allowed "^1.0.0"
-    is-stream "^1.0.0"
-    lowercase-keys "^1.0.0"
-    node-status-codes "^1.0.0"
-    object-assign "^4.0.1"
-    parse-json "^2.1.0"
-    pinkie-promise "^2.0.0"
-    read-all-stream "^3.0.0"
-    readable-stream "^2.0.5"
-    timed-out "^3.0.0"
-    unzip-response "^1.0.2"
-    url-parse-lax "^1.0.0"
-
-got@^7.0.0:
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
-  dependencies:
-    decompress-response "^3.2.0"
-    duplexer3 "^0.1.4"
-    get-stream "^3.0.0"
-    is-plain-obj "^1.1.0"
-    is-retry-allowed "^1.0.0"
-    is-stream "^1.0.0"
-    isurl "^1.0.0-alpha5"
-    lowercase-keys "^1.0.0"
-    p-cancelable "^0.3.0"
-    p-timeout "^1.1.1"
-    safe-buffer "^5.0.1"
-    timed-out "^4.0.0"
-    url-parse-lax "^1.0.0"
-    url-to-options "^1.0.1"
-
-got@^8.3.1:
-  version "8.3.1"
-  resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed"
-  dependencies:
-    "@sindresorhus/is" "^0.7.0"
-    cacheable-request "^2.1.1"
-    decompress-response "^3.3.0"
-    duplexer3 "^0.1.4"
-    get-stream "^3.0.0"
-    into-stream "^3.1.0"
-    is-retry-allowed "^1.1.0"
-    isurl "^1.0.0-alpha5"
-    lowercase-keys "^1.0.0"
-    mimic-response "^1.0.0"
-    p-cancelable "^0.4.0"
-    p-timeout "^2.0.1"
-    pify "^3.0.0"
-    safe-buffer "^5.1.1"
-    timed-out "^4.0.1"
-    url-parse-lax "^3.0.0"
-    url-to-options "^1.0.1"
-
-graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
-  version "4.1.11"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
-
-graceful-fs@^3.0.0:
-  version "3.0.11"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
-  dependencies:
-    natives "^1.1.0"
-
-graceful-fs@~1.2.0:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
-
-"graceful-readlink@>= 1.0.0":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
-
-grouped-queue@^0.3.3:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c"
-  dependencies:
-    lodash "^4.17.2"
-
-growl@1.10.5:
-  version "1.10.5"
-  resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
-
-gulp-cssnano@2.1.3:
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz#02007e2817af09b3688482b430ad7db807aebf72"
-  dependencies:
-    buffer-from "^1.0.0"
-    cssnano "^3.0.0"
-    object-assign "^4.0.1"
-    plugin-error "^1.0.1"
-    vinyl-sourcemaps-apply "^0.2.1"
-
-gulp-decompress@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7"
-  dependencies:
-    archive-type "^3.0.0"
-    decompress "^3.0.0"
-    gulp-util "^3.0.1"
-    readable-stream "^2.0.2"
-
-gulp-htmlmin@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz#266feaed83588838aedda3666f67d057ec120313"
-  dependencies:
-    bufferstreams "^1.1.0"
-    html-minifier "^3.0.3"
-    plugin-error "^0.1.2"
-    readable-stream "^2.0.2"
-    tryit "^1.0.1"
-
-gulp-imagemin@4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz#5ce347f1d1706fed3cc8f1777ca9094a583b50b7"
-  dependencies:
-    chalk "^2.1.0"
-    fancy-log "^1.3.2"
-    imagemin "^5.3.1"
-    plugin-error "^0.1.2"
-    plur "^2.1.2"
-    pretty-bytes "^4.0.2"
-    through2-concurrent "^1.1.1"
-  optionalDependencies:
-    imagemin-gifsicle "^5.2.0"
-    imagemin-jpegtran "^5.0.2"
-    imagemin-optipng "^5.2.1"
-    imagemin-svgo "^6.0.0"
-
-gulp-mocha@6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-6.0.0.tgz#80f32bc705ce30747f355ddb8ccd96a1c73bef13"
-  dependencies:
-    dargs "^5.1.0"
-    execa "^0.10.0"
-    mocha "^5.2.0"
-    npm-run-path "^2.0.2"
-    plugin-error "^1.0.1"
-    supports-color "^5.4.0"
-    through2 "^2.0.3"
-
-gulp-pug@4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/gulp-pug/-/gulp-pug-4.0.1.tgz#5c5bb38303a5a565add8b200e292b4a076cf2efa"
-  dependencies:
-    "@types/pug" "^2.0.4"
-    fancy-log "^1.3.2"
-    plugin-error "^1.0.1"
-    pug "^2.0.3"
-    replace-ext "^1.0.0"
-    through2 "^2.0.3"
-
-gulp-rename@1.2.3:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz#37b75298e9d3e6c0fe9ac4eac13ce3be5434646b"
-
-gulp-rename@^1.2.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826"
-
-gulp-replace@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143"
-  dependencies:
-    istextorbinary "2.2.1"
-    readable-stream "^2.0.1"
-    replacestream "^4.0.0"
-
-gulp-sourcemaps@1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c"
-  dependencies:
-    convert-source-map "^1.1.1"
-    graceful-fs "^4.1.2"
-    strip-bom "^2.0.0"
-    through2 "^2.0.0"
-    vinyl "^1.0.0"
-
-gulp-sourcemaps@2.6.4:
-  version "2.6.4"
-  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz#cbb2008450b1bcce6cd23bf98337be751bf6e30a"
-  dependencies:
-    "@gulp-sourcemaps/identity-map" "1.X"
-    "@gulp-sourcemaps/map-sources" "1.X"
-    acorn "5.X"
-    convert-source-map "1.X"
-    css "2.X"
-    debug-fabulous "1.X"
-    detect-newline "2.X"
-    graceful-fs "4.X"
-    source-map "~0.6.0"
-    strip-bom-string "1.X"
-    through2 "2.X"
-
-gulp-stylus@2.7.0:
-  version "2.7.0"
-  resolved "https://registry.yarnpkg.com/gulp-stylus/-/gulp-stylus-2.7.0.tgz#f3e932626004927b75ea27ff5c1d3b0ba0b7cbb1"
-  dependencies:
-    accord "^0.26.3"
-    lodash.assign "^3.2.0"
-    plugin-error "^0.1.2"
-    replace-ext "0.0.1"
-    stylus "^0.54.0"
-    through2 "^2.0.0"
-    vinyl-sourcemaps-apply "^0.2.0"
-
-gulp-tslint@8.1.3:
-  version "8.1.3"
-  resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.3.tgz#a89ed144038ae861ee7bfea9528272d126a93da1"
-  dependencies:
-    "@types/fancy-log" "1.3.0"
-    chalk "2.3.1"
-    fancy-log "1.3.2"
-    map-stream "~0.0.7"
-    plugin-error "1.0.1"
-    through "~2.3.8"
-
-gulp-typescript@4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-4.0.2.tgz#80bb9e376e7aa87b763a6ad5fe054a5d078da1e6"
-  dependencies:
-    ansi-colors "^1.0.1"
-    plugin-error "^0.1.2"
-    source-map "^0.6.1"
-    through2 "^2.0.3"
-    vinyl "^2.1.0"
-    vinyl-fs "^3.0.0"
-
-gulp-uglify@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca"
-  dependencies:
-    gulplog "^1.0.0"
-    has-gulplog "^0.1.0"
-    lodash "^4.13.1"
-    make-error-cause "^1.1.1"
-    through2 "^2.0.0"
-    uglify-js "^3.0.5"
-    vinyl-sourcemaps-apply "^0.2.0"
-
-gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.1:
-  version "3.0.8"
-  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
-  dependencies:
-    array-differ "^1.0.0"
-    array-uniq "^1.0.2"
-    beeper "^1.0.0"
-    chalk "^1.0.0"
-    dateformat "^2.0.0"
-    fancy-log "^1.1.0"
-    gulplog "^1.0.0"
-    has-gulplog "^0.1.0"
-    lodash._reescape "^3.0.0"
-    lodash._reevaluate "^3.0.0"
-    lodash._reinterpolate "^3.0.0"
-    lodash.template "^3.0.0"
-    minimist "^1.1.0"
-    multipipe "^0.1.2"
-    object-assign "^3.0.0"
-    replace-ext "0.0.1"
-    through2 "^2.0.0"
-    vinyl "^0.5.0"
-
-gulp@3.9.1:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
-  dependencies:
-    archy "^1.0.0"
-    chalk "^1.0.0"
-    deprecated "^0.0.1"
-    gulp-util "^3.0.0"
-    interpret "^1.0.0"
-    liftoff "^2.1.0"
-    minimist "^1.1.0"
-    orchestrator "^0.3.0"
-    pretty-hrtime "^1.0.0"
-    semver "^4.1.0"
-    tildify "^1.0.0"
-    v8flags "^2.0.2"
-    vinyl-fs "^0.3.0"
-
-gulplog@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
-  dependencies:
-    glogg "^1.0.0"
-
-har-schema@^1.0.5:
-  version "1.0.5"
-  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:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
-  dependencies:
-    chalk "^1.1.1"
-    commander "^2.9.0"
-    is-my-json-valid "^2.12.4"
-    pinkie-promise "^2.0.0"
-
-har-validator@~4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
-  dependencies:
-    ajv "^4.9.1"
-    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"
-
-hard-source-webpack-plugin@0.6.10:
-  version "0.6.10"
-  resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.6.10.tgz#bae18a97c12150d31fa9d5e40625c65b0b10034d"
-  dependencies:
-    lodash "^4.15.0"
-    mkdirp "^0.5.1"
-    node-object-hash "^1.2.0"
-    rimraf "^2.6.2"
-    tapable "^1.0.0-beta.5"
-    webpack-core "~0.6.0"
-    webpack-sources "^1.0.1"
-    write-json-file "^2.3.0"
-
-has-ansi@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
-  dependencies:
-    ansi-regex "^2.0.0"
-
-has-color@~0.1.0:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
-
-has-flag@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
-
-has-flag@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
-
-has-gulplog@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
-  dependencies:
-    sparkles "^1.0.0"
-
-has-symbol-support-x@^1.4.1:
-  version "1.4.2"
-  resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
-
-has-symbols@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
-
-has-to-string-tag-x@^1.2.0:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
-  dependencies:
-    has-symbol-support-x "^1.4.1"
-
-has-unicode@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
-
-has-value@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
-  dependencies:
-    get-value "^2.0.3"
-    has-values "^0.1.4"
-    isobject "^2.0.0"
-
-has-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
-  dependencies:
-    get-value "^2.0.6"
-    has-values "^1.0.0"
-    isobject "^3.0.0"
-
-has-values@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
-
-has-values@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
-  dependencies:
-    is-number "^3.0.0"
-    kind-of "^4.0.0"
-
-has@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
-  dependencies:
-    function-bind "^1.1.1"
-
-hash-base@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
-  dependencies:
-    inherits "^2.0.1"
-    safe-buffer "^5.0.1"
-
-hash-sum@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
-
-hash.js@^1.0.0, hash.js@^1.0.3:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c"
-  dependencies:
-    inherits "^2.0.3"
-    minimalistic-assert "^1.0.0"
-
-hawk@~3.1.3:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
-  dependencies:
-    boom "2.x.x"
-    cryptiles "2.x.x"
-    hoek "2.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.x, he@^1.1.0, he@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
-
-highlight.js@9.12.0:
-  version "9.12.0"
-  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
-
-hmac-drbg@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
-  dependencies:
-    hash.js "^1.0.3"
-    minimalistic-assert "^1.0.0"
-    minimalistic-crypto-utils "^1.0.1"
-
-hoek@2.x.x:
-  version "2.16.3"
-  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
-
-hoek@4.x.x:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
-
-home-or-tmp@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
-  dependencies:
-    os-homedir "^1.0.0"
-    os-tmpdir "^1.0.1"
-
-homedir-polyfill@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
-  dependencies:
-    parse-passwd "^1.0.0"
-
-hosted-git-info@^2.1.4:
-  version "2.6.0"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
-
-html-comment-regex@^1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
-
-html-encoding-sniffer@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
-  dependencies:
-    whatwg-encoding "^1.0.1"
-
-html-entities@1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
-
-html-minifier@3.5.16, html-minifier@^3.0.3:
-  version "3.5.16"
-  resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175"
-  dependencies:
-    camel-case "3.0.x"
-    clean-css "4.1.x"
-    commander "2.15.x"
-    he "1.1.x"
-    param-case "2.1.x"
-    relateurl "0.2.x"
-    uglify-js "3.3.x"
-
-htmlparser2@^3.9.1:
-  version "3.9.2"
-  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
-  dependencies:
-    domelementtype "^1.3.0"
-    domhandler "^2.3.0"
-    domutils "^1.5.1"
-    entities "^1.1.1"
-    inherits "^2.0.1"
-    readable-stream "^2.0.2"
-
-http-assert@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a"
-  dependencies:
-    deep-equal "~1.0.1"
-    http-errors "~1.6.1"
-
-http-cache-semantics@3.8.1:
-  version "3.8.1"
-  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
-
-http-errors@1.6.2:
-  version "1.6.2"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
-  dependencies:
-    depd "1.1.1"
-    inherits "2.0.3"
-    setprototypeof "1.0.3"
-    statuses ">= 1.3.1 < 2"
-
-http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3:
-  version "1.6.3"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
-  dependencies:
-    depd "~1.1.2"
-    inherits "2.0.3"
-    setprototypeof "1.1.0"
-    statuses ">= 1.4.0 < 2"
-
-http-signature@1.2.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"
-
-http-signature@~1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
-  dependencies:
-    assert-plus "^0.2.0"
-    jsprim "^1.2.2"
-    sshpk "^1.7.0"
-
-http_ece@1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.0.5.tgz#b60660faaf14215102d1493ea720dcd92b53372f"
-  dependencies:
-    urlsafe-base64 "~1.0.0"
-
-https-browserify@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
-
-https-proxy-agent@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
-  dependencies:
-    agent-base "^4.1.0"
-    debug "^3.1.0"
-
-humanize-ms@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
-  dependencies:
-    ms "^2.0.0"
-
-humanize-number@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18"
-
-iconv-lite@0.4.19:
-  version "0.4.19"
-  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
-
-iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
-  version "0.4.23"
-  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
-  dependencies:
-    safer-buffer ">= 2.1.2 < 3"
-
-icss-replace-symbols@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
-
-icss-utils@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
-  dependencies:
-    postcss "^6.0.1"
-
-ieee754@^1.1.4:
-  version "1.1.12"
-  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
-
-iferr@^0.1.5:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
-
-ignore-walk@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
-  dependencies:
-    minimatch "^3.0.4"
-
-ignore@^3.3.3, ignore@^3.3.5:
-  version "3.3.8"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
-
-imagemin-gifsicle@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz#3781524c457612ef04916af34241a2b42bfcb40a"
-  dependencies:
-    exec-buffer "^3.0.0"
-    gifsicle "^3.0.0"
-    is-gif "^1.0.0"
-
-imagemin-jpegtran@^5.0.2:
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz#e6882263b8f7916fddb800640cf75d2e970d2ad6"
-  dependencies:
-    exec-buffer "^3.0.0"
-    is-jpg "^1.0.0"
-    jpegtran-bin "^3.0.0"
-
-imagemin-optipng@^5.2.1:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#d22da412c09f5ff00a4339960b98a88b1dbe8695"
-  dependencies:
-    exec-buffer "^3.0.0"
-    is-png "^1.0.0"
-    optipng-bin "^3.0.0"
-
-imagemin-svgo@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz#2dd8c82946be42a8e2cbcae3c5bf007bc2b8b9e8"
-  dependencies:
-    buffer-from "^0.1.1"
-    is-svg "^2.0.0"
-    svgo "^1.0.0"
-
-imagemin@^5.3.1:
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-5.3.1.tgz#f19c2eee1e71ba6c6558c515f9fc96680189a6d4"
-  dependencies:
-    file-type "^4.1.0"
-    globby "^6.1.0"
-    make-dir "^1.0.0"
-    p-pipe "^1.1.0"
-    pify "^2.3.0"
-    replace-ext "^1.0.0"
-
-import-local@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
-  dependencies:
-    pkg-dir "^2.0.0"
-    resolve-cwd "^2.0.0"
-
-imurmurhash@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
-
-in-publish@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
-
-indent-string@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
-  dependencies:
-    repeating "^2.0.0"
-
-indent-string@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
-
-indexes-of@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
-
-indexof@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
-
-indx@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50"
-
-inflation@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f"
-
-inflight@^1.0.4:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
-  dependencies:
-    once "^1.3.0"
-    wrappy "1"
-
-inherits@1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
-
-inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-
-inherits@2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
-
-ini@^1.3.4, ini@~1.3.0:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
-
-inquirer@3.0.6:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
-  dependencies:
-    ansi-escapes "^1.1.0"
-    chalk "^1.0.0"
-    cli-cursor "^2.1.0"
-    cli-width "^2.0.0"
-    external-editor "^2.0.1"
-    figures "^2.0.0"
-    lodash "^4.3.0"
-    mute-stream "0.0.7"
-    run-async "^2.2.0"
-    rx "^4.1.0"
-    string-width "^2.0.0"
-    strip-ansi "^3.0.0"
-    through "^2.3.6"
-
-inquirer@5.2.0, inquirer@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726"
-  dependencies:
-    ansi-escapes "^3.0.0"
-    chalk "^2.0.0"
-    cli-cursor "^2.1.0"
-    cli-width "^2.0.0"
-    external-editor "^2.1.0"
-    figures "^2.0.0"
-    lodash "^4.3.0"
-    mute-stream "0.0.7"
-    run-async "^2.2.0"
-    rxjs "^5.5.2"
-    string-width "^2.1.0"
-    strip-ansi "^4.0.0"
-    through "^2.3.6"
-
-inquirer@^3.0.6:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
-  dependencies:
-    ansi-escapes "^3.0.0"
-    chalk "^2.0.0"
-    cli-cursor "^2.1.0"
-    cli-width "^2.0.0"
-    external-editor "^2.0.4"
-    figures "^2.0.0"
-    lodash "^4.3.0"
-    mute-stream "0.0.7"
-    run-async "^2.2.0"
-    rx-lite "^4.0.8"
-    rx-lite-aggregates "^4.0.8"
-    string-width "^2.1.0"
-    strip-ansi "^4.0.0"
-    through "^2.3.6"
-
-interpret@^1.0.0, interpret@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
-
-into-stream@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
-  dependencies:
-    from2 "^2.1.1"
-    p-is-promise "^1.1.0"
-
-invariant@^2.2.2:
-  version "2.2.4"
-  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
-  dependencies:
-    loose-envify "^1.0.0"
-
-invert-kv@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
-
-ip-regex@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
-
-ipaddr.js@1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
-
-irregular-plurals@^1.0.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766"
-
-is-absolute-url@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
-
-is-absolute@^0.1.5:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f"
-  dependencies:
-    is-relative "^0.1.0"
-
-is-absolute@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
-  dependencies:
-    is-relative "^1.0.0"
-    is-windows "^1.0.1"
-
-is-accessor-descriptor@^0.1.6:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
-  dependencies:
-    kind-of "^3.0.2"
-
-is-accessor-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
-  dependencies:
-    kind-of "^6.0.0"
-
-is-arrayish@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
-
-is-binary-path@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
-  dependencies:
-    binary-extensions "^1.0.0"
-
-is-buffer@^1.1.5:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
-
-is-builtin-module@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
-  dependencies:
-    builtin-modules "^1.0.0"
-
-is-bzip2@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc"
-
-is-callable@^1.1.1, is-callable@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
-
-is-data-descriptor@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
-  dependencies:
-    kind-of "^3.0.2"
-
-is-data-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
-  dependencies:
-    kind-of "^6.0.0"
-
-is-date-object@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
-
-is-descriptor@^0.1.0:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
-  dependencies:
-    is-accessor-descriptor "^0.1.6"
-    is-data-descriptor "^0.1.4"
-    kind-of "^5.0.0"
-
-is-descriptor@^1.0.0, is-descriptor@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
-  dependencies:
-    is-accessor-descriptor "^1.0.0"
-    is-data-descriptor "^1.0.0"
-    kind-of "^6.0.2"
-
-is-dotfile@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
-
-is-equal-shallow@^0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
-  dependencies:
-    is-primitive "^2.0.0"
-
-is-expression@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
-  dependencies:
-    acorn "~4.0.2"
-    object-assign "^4.0.1"
-
-is-extendable@^0.1.0, is-extendable@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-
-is-extendable@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
-  dependencies:
-    is-plain-object "^2.0.4"
-
-is-extglob@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
-
-is-extglob@^2.1.0, is-extglob@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
-
-is-finite@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
-  dependencies:
-    number-is-nan "^1.0.0"
-
-is-fullwidth-code-point@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
-  dependencies:
-    number-is-nan "^1.0.0"
-
-is-fullwidth-code-point@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
-
-is-generator-function@^1.0.3:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
-
-is-gif@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e"
-
-is-glob@^2.0.0, is-glob@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
-  dependencies:
-    is-extglob "^1.0.0"
-
-is-glob@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
-  dependencies:
-    is-extglob "^2.1.0"
-
-is-glob@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
-  dependencies:
-    is-extglob "^2.1.1"
-
-is-gzip@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83"
-
-is-jpg@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975"
-
-is-my-ip-valid@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
-
-is-my-json-valid@^2.12.4:
-  version "2.17.2"
-  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c"
-  dependencies:
-    generate-function "^2.0.0"
-    generate-object-property "^1.1.0"
-    is-my-ip-valid "^1.0.0"
-    jsonpointer "^4.0.0"
-    xtend "^4.0.0"
-
-is-natural-number@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7"
-
-is-negated-glob@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
-
-is-number@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
-  dependencies:
-    kind-of "^3.0.2"
-
-is-number@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
-  dependencies:
-    kind-of "^3.0.2"
-
-is-number@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
-
-is-obj@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
-
-is-object@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
-
-is-observable@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
-  dependencies:
-    symbol-observable "^1.1.0"
-
-is-odd@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
-  dependencies:
-    is-number "^4.0.0"
-
-is-path-cwd@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
-
-is-path-in-cwd@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
-  dependencies:
-    is-path-inside "^1.0.0"
-
-is-path-inside@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
-  dependencies:
-    path-is-inside "^1.0.1"
-
-is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
-
-is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
-  dependencies:
-    isobject "^3.0.1"
-
-is-png@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce"
-
-is-posix-bracket@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
-
-is-primitive@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
-
-is-promise@^2.0.0, is-promise@^2.1, is-promise@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
-
-is-property@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
-
-is-redirect@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
-
-is-regex@^1.0.3, is-regex@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
-  dependencies:
-    has "^1.0.1"
-
-is-relative@^0.1.0:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82"
-
-is-relative@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
-  dependencies:
-    is-unc-path "^1.0.0"
-
-is-resolvable@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
-
-is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
-
-is-root@2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019"
-
-is-scoped@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30"
-  dependencies:
-    scoped-regex "^1.0.0"
-
-is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
-
-is-svg@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
-  dependencies:
-    html-comment-regex "^1.1.0"
-
-is-symbol@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
-
-is-tar@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d"
-
-is-there@^4.0.0:
-  version "4.4.3"
-  resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.4.3.tgz#a2c49366c6a487f719dbcad80cbde21248d2c18d"
-
-is-typedarray@^1.0.0, is-typedarray@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
-
-is-unc-path@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
-  dependencies:
-    unc-path-regex "^0.1.2"
-
-is-url@1.2.4, is-url@^1.2.0:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
-
-is-utf8@^0.2.0, is-utf8@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
-
-is-valid-glob@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe"
-
-is-valid-glob@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
-
-is-whitespace@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
-
-is-windows@^1.0.1, is-windows@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
-
-is-zip@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325"
-
-is2@0.0.9:
-  version "0.0.9"
-  resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629"
-  dependencies:
-    deep-is "0.1.2"
-
-isarray@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
-
-isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
-
-isarray@^2.0.1:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
-
-isbinaryfile@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
-
-isexe@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
-
-isobject@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
-  dependencies:
-    isarray "1.0.0"
-
-isobject@^3.0.0, isobject@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
-
-isstream@~0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
-
-istextorbinary@2.2.1, istextorbinary@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53"
-  dependencies:
-    binaryextensions "2"
-    editions "^1.3.3"
-    textextensions "2"
-
-isurl@^1.0.0-alpha5:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
-  dependencies:
-    has-to-string-tag-x "^1.2.0"
-    is-object "^1.0.1"
-
-jpegtran-bin@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz#f60ecf4ae999c0bdad2e9fbcdf2b6f0981e7a29b"
-  dependencies:
-    bin-build "^2.0.0"
-    bin-wrapper "^3.0.0"
-    logalot "^2.0.0"
-
-js-base64@^2.1.8, js-base64@^2.1.9:
-  version "2.4.5"
-  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92"
-
-js-beautify@^1.6.12:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919"
-  dependencies:
-    config-chain "~1.1.5"
-    editorconfig "^0.13.2"
-    mkdirp "~0.5.0"
-    nopt "~3.0.1"
-
-js-stringify@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
-
-js-tokens@^3.0.0, js-tokens@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
-
-js-yaml@3.11.0:
-  version "3.11.0"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
-
-js-yaml@^3.4.6, js-yaml@^3.7.0, js-yaml@^3.8.4, js-yaml@^3.9.1:
-  version "3.12.0"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
-
-js-yaml@~3.10.0:
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
-
-js-yaml@~3.7.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^2.6.0"
-
-jsbn@~0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
-
-jschardet@^1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678"
-
-jscodeshift@^0.4.0:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.4.1.tgz#da91a1c2eccfa03a3387a21d39948e251ced444a"
-  dependencies:
-    async "^1.5.0"
-    babel-plugin-transform-flow-strip-types "^6.8.0"
-    babel-preset-es2015 "^6.9.0"
-    babel-preset-stage-1 "^6.5.0"
-    babel-register "^6.9.0"
-    babylon "^6.17.3"
-    colors "^1.1.2"
-    flow-parser "^0.*"
-    lodash "^4.13.1"
-    micromatch "^2.3.7"
-    node-dir "0.1.8"
-    nomnom "^1.8.1"
-    recast "^0.12.5"
-    temp "^0.8.1"
-    write-file-atomic "^1.2.0"
-
-jscodeshift@^0.5.0:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.5.1.tgz#4af6a721648be8638ae1464a190342da52960c33"
-  dependencies:
-    babel-plugin-transform-flow-strip-types "^6.8.0"
-    babel-preset-es2015 "^6.9.0"
-    babel-preset-stage-1 "^6.5.0"
-    babel-register "^6.9.0"
-    babylon "^7.0.0-beta.47"
-    colors "^1.1.2"
-    flow-parser "^0.*"
-    lodash "^4.13.1"
-    micromatch "^2.3.7"
-    neo-async "^2.5.0"
-    node-dir "0.1.8"
-    nomnom "^1.8.1"
-    recast "^0.15.0"
-    temp "^0.8.1"
-    write-file-atomic "^1.2.0"
-
-jsdom@11.11.0:
-  version "11.11.0"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e"
-  dependencies:
-    abab "^1.0.4"
-    acorn "^5.3.0"
-    acorn-globals "^4.1.0"
-    array-equal "^1.0.0"
-    cssom ">= 0.3.2 < 0.4.0"
-    cssstyle ">= 0.3.1 < 0.4.0"
-    data-urls "^1.0.0"
-    domexception "^1.0.0"
-    escodegen "^1.9.0"
-    html-encoding-sniffer "^1.0.2"
-    left-pad "^1.2.0"
-    nwsapi "^2.0.0"
-    parse5 "4.0.0"
-    pn "^1.1.0"
-    request "^2.83.0"
-    request-promise-native "^1.0.5"
-    sax "^1.2.4"
-    symbol-tree "^3.2.2"
-    tough-cookie "^2.3.3"
-    w3c-hr-time "^1.0.1"
-    webidl-conversions "^4.0.2"
-    whatwg-encoding "^1.0.3"
-    whatwg-mimetype "^2.1.0"
-    whatwg-url "^6.4.1"
-    ws "^4.0.0"
-    xml-name-validator "^3.0.0"
-
-jsesc@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
-
-jsesc@~0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
-
-json-buffer@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
-
-json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
-
-json-schema-ref-parser@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-1.4.1.tgz#c0c2e438bf0796723b02451bae8bc7dd0b37fed0"
-  dependencies:
-    call-me-maybe "^1.0.1"
-    debug "^2.2.0"
-    es6-promise "^3.0.2"
-    js-yaml "^3.4.6"
-    ono "^2.0.1"
-
-json-schema-traverse@^0.3.0:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
-
-json-schema-traverse@^0.4.1:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
-
-json-schema@0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
-
-json-stable-stringify-without-jsonify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
-
-json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
-  dependencies:
-    jsonify "~0.0.0"
-
-json-stringify-safe@~5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
-
-json5@0.5.1, json5@^0.5.0, json5@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
-
-jsonfile@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
-  optionalDependencies:
-    graceful-fs "^4.1.6"
-
-jsonify@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
-
-jsonpointer@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
-
-jsprim@^1.2.2:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
-  dependencies:
-    assert-plus "1.0.0"
-    extsprintf "1.3.0"
-    json-schema "0.2.3"
-    verror "1.10.0"
-
-jstransformer@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
-  dependencies:
-    is-promise "^2.0.0"
-    promise "^7.0.1"
-
-jwa@^1.1.5:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6"
-  dependencies:
-    buffer-equal-constant-time "1.0.1"
-    ecdsa-sig-formatter "1.0.10"
-    safe-buffer "^5.0.1"
-
-jws@^3.1.3:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f"
-  dependencies:
-    jwa "^1.1.5"
-    safe-buffer "^5.0.1"
-
-keygrip@~1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91"
-
-keyv@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
-  dependencies:
-    json-buffer "3.0.0"
-
-kind-of@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
-
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
-
-kind-of@^6.0.0, kind-of@^6.0.2:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
-
-koa-bodyparser@4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29"
-  dependencies:
-    co-body "^6.0.0"
-    copy-to "^2.0.1"
-
-koa-compose@^3.0.0, koa-compose@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7"
-  dependencies:
-    any-promise "^1.1.0"
-
-koa-compose@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
-
-koa-compress@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-3.0.0.tgz#3194059c215cbc24e59bbc84c2c7453a4c88564f"
-  dependencies:
-    bytes "^3.0.0"
-    compressible "^2.0.0"
-    koa-is-json "^1.0.0"
-    statuses "^1.0.0"
-
-koa-convert@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0"
-  dependencies:
-    co "^4.6.0"
-    koa-compose "^3.0.0"
-
-koa-favicon@2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/koa-favicon/-/koa-favicon-2.0.1.tgz#cfae363e5fd00bd5dd67c1150fbef31e0b5d6f4d"
-  dependencies:
-    mz "^2.7.0"
-
-koa-is-json@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14"
-
-koa-json-body@5.3.0:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/koa-json-body/-/koa-json-body-5.3.0.tgz#64aad3f400adfb81df54b63f7a5eb38bad62d980"
-  dependencies:
-    co-body "^5.0.0"
-
-koa-logger@3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.0.tgz#8aef64d8b848fb6253a9b31aa708d0e05141f0e6"
-  dependencies:
-    bytes "^2.5.0"
-    chalk "^1.1.3"
-    humanize-number "0.0.2"
-    passthrough-counter "^1.0.0"
-
-koa-mount@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-3.0.0.tgz#08cab3b83d31442ed8b7e75c54b1abeb922ec197"
-  dependencies:
-    debug "^2.6.1"
-    koa-compose "^3.2.1"
-
-koa-multer@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/koa-multer/-/koa-multer-1.0.2.tgz#d38f7ffd1db97b1aad33e7774732f000ebd67259"
-  dependencies:
-    multer "1.3.0"
-
-koa-router@7.4.0:
-  version "7.4.0"
-  resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0"
-  dependencies:
-    debug "^3.1.0"
-    http-errors "^1.3.1"
-    koa-compose "^3.0.0"
-    methods "^1.0.1"
-    path-to-regexp "^1.1.1"
-    urijs "^1.19.0"
-
-koa-send@4.1.3, koa-send@^4.0.0:
-  version "4.1.3"
-  resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6"
-  dependencies:
-    debug "^2.6.3"
-    http-errors "^1.6.1"
-    mz "^2.6.0"
-    resolve-path "^1.4.0"
-
-koa-slow@2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/koa-slow/-/koa-slow-2.1.0.tgz#39007ca628c620f2b307b90dbf423d7a0c9be971"
-  dependencies:
-    lodash.isregexp "3.0.5"
-    q "1.4.1"
-
-koa-views@6.1.4:
-  version "6.1.4"
-  resolved "https://registry.yarnpkg.com/koa-views/-/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d"
-  dependencies:
-    consolidate "^0.15.0"
-    debug "^3.1.0"
-    get-paths "^0.0.2"
-    koa-send "^4.0.0"
-    mz "^2.4.0"
-    pretty "^2.0.0"
-
-koa@2.5.1:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.1.tgz#79f8b95f8d72d04fe9a58a8da5ebd6d341103f9c"
-  dependencies:
-    accepts "^1.2.2"
-    content-disposition "~0.5.0"
-    content-type "^1.0.0"
-    cookies "~0.7.0"
-    debug "*"
-    delegates "^1.0.0"
-    depd "^1.1.0"
-    destroy "^1.0.3"
-    error-inject "~1.0.0"
-    escape-html "~1.0.1"
-    fresh "^0.5.2"
-    http-assert "^1.1.0"
-    http-errors "^1.2.8"
-    is-generator-function "^1.0.3"
-    koa-compose "^4.0.0"
-    koa-convert "^1.2.0"
-    koa-is-json "^1.0.0"
-    mime-types "^2.0.7"
-    on-finished "^2.1.0"
-    only "0.0.2"
-    parseurl "^1.3.0"
-    statuses "^1.2.0"
-    type-is "^1.5.5"
-    vary "^1.0.0"
-
-kue@0.11.6:
-  version "0.11.6"
-  resolved "https://registry.yarnpkg.com/kue/-/kue-0.11.6.tgz#5b76916bcedd56636a107861471c63c94611860a"
-  dependencies:
-    body-parser "^1.12.2"
-    express "^4.12.2"
-    lodash "^4.0.0"
-    nib "~1.1.2"
-    node-redis-warlock "~0.2.0"
-    pug "^2.0.0-beta3"
-    redis "~2.6.0-2"
-    stylus "~0.54.5"
-    yargs "^4.0.0"
-  optionalDependencies:
-    reds "^0.2.5"
-
-lazy-cache@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
-
-lazy-req@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
-
-lazystream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
-  dependencies:
-    readable-stream "^2.0.5"
-
-lcid@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
-  dependencies:
-    invert-kv "^1.0.0"
-
-lead@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
-  dependencies:
-    flush-write-stream "^1.0.2"
-
-leb@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3"
-
-left-pad@^1.2.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
-
-levn@^0.3.0, levn@~0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
-  dependencies:
-    prelude-ls "~1.1.2"
-    type-check "~0.3.2"
-
-license-checker@20.0.0:
-  version "20.0.0"
-  resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-20.0.0.tgz#29b338ba7f4e841b850cc59ddd393dbc8927f375"
-  dependencies:
-    chalk "^2.4.1"
-    debug "^3.1.0"
-    mkdirp "^0.5.1"
-    nopt "^4.0.1"
-    read-installed "~4.0.3"
-    semver "^5.5.0"
-    spdx "^0.5.1"
-    spdx-correct "^3.0.0"
-    spdx-satisfies "^4.0.0"
-    strip-ansi "^4.0.0"
-    treeify "^1.1.0"
-
-liftoff@^2.1.0:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
-  dependencies:
-    extend "^3.0.0"
-    findup-sync "^2.0.0"
-    fined "^1.0.1"
-    flagged-respawn "^1.0.0"
-    is-plain-object "^2.0.4"
-    object.map "^1.0.0"
-    rechoir "^0.6.2"
-    resolve "^1.1.7"
-
-listr-silent-renderer@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
-
-listr-update-renderer@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
-  dependencies:
-    chalk "^1.1.3"
-    cli-truncate "^0.2.1"
-    elegant-spinner "^1.0.1"
-    figures "^1.7.0"
-    indent-string "^3.0.0"
-    log-symbols "^1.0.2"
-    log-update "^1.0.2"
-    strip-ansi "^3.0.1"
-
-listr-verbose-renderer@^0.4.0:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
-  dependencies:
-    chalk "^1.1.3"
-    cli-cursor "^1.0.2"
-    date-fns "^1.27.2"
-    figures "^1.7.0"
-
-listr@^0.14.1:
-  version "0.14.1"
-  resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d"
-  dependencies:
-    "@samverschueren/stream-to-observable" "^0.3.0"
-    cli-truncate "^0.2.1"
-    figures "^1.7.0"
-    indent-string "^2.1.0"
-    is-observable "^1.1.0"
-    is-promise "^2.1.0"
-    is-stream "^1.1.0"
-    listr-silent-renderer "^1.1.1"
-    listr-update-renderer "^0.4.0"
-    listr-verbose-renderer "^0.4.0"
-    log-symbols "^1.0.2"
-    log-update "^1.0.2"
-    ora "^0.2.3"
-    p-map "^1.1.1"
-    rxjs "^6.1.0"
-    strip-ansi "^3.0.1"
-
-load-json-file@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
-  dependencies:
-    graceful-fs "^4.1.2"
-    parse-json "^2.2.0"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-    strip-bom "^2.0.0"
-
-load-json-file@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
-  dependencies:
-    graceful-fs "^4.1.2"
-    parse-json "^2.2.0"
-    pify "^2.0.0"
-    strip-bom "^3.0.0"
-
-load-json-file@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
-  dependencies:
-    graceful-fs "^4.1.2"
-    parse-json "^4.0.0"
-    pify "^3.0.0"
-    strip-bom "^3.0.0"
-
-loader-runner@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
-
-loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
-  dependencies:
-    big.js "^3.1.3"
-    emojis-list "^2.0.0"
-    json5 "^0.5.0"
-
-locate-path@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
-  dependencies:
-    p-locate "^2.0.0"
-    path-exists "^3.0.0"
-
-lodash._baseassign@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
-  dependencies:
-    lodash._basecopy "^3.0.0"
-    lodash.keys "^3.0.0"
-
-lodash._basecopy@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
-
-lodash._basetostring@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
-
-lodash._basevalues@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
-
-lodash._bindcallback@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
-
-lodash._createassigner@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"
-  dependencies:
-    lodash._bindcallback "^3.0.0"
-    lodash._isiterateecall "^3.0.0"
-    lodash.restparam "^3.0.0"
-
-lodash._getnative@^3.0.0:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
-
-lodash._isiterateecall@^3.0.0:
-  version "3.0.9"
-  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
-
-lodash._reescape@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
-
-lodash._reevaluate@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
-
-lodash._reinterpolate@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
-
-lodash._root@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
-
-lodash.assign@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"
-  dependencies:
-    lodash._baseassign "^3.0.0"
-    lodash._createassigner "^3.0.0"
-    lodash.keys "^3.0.0"
-
-lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
-
-lodash.assignin@^4.0.9:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
-
-lodash.bind@^4.1.4:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
-
-lodash.camelcase@^4.3.0:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
-
-lodash.clone@^4.3.2:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
-
-lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
-
-lodash.defaults@^4.0.1:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
-
-lodash.escape@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
-  dependencies:
-    lodash._root "^3.0.0"
-
-lodash.filter@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
-
-lodash.flatten@^4.2.0:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
-
-lodash.foreach@^4.3.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
-
-lodash.get@^4.0.0, lodash.get@^4.4.2:
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
-
-lodash.isarguments@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
-
-lodash.isarray@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
-
-lodash.isequal@^4.0.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
-
-lodash.isregexp@3.0.5:
-  version "3.0.5"
-  resolved "https://registry.yarnpkg.com/lodash.isregexp/-/lodash.isregexp-3.0.5.tgz#e0f596242f2fa228a840086b6c8ad82e4b71fd2d"
-
-lodash.keys@^3.0.0:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
-  dependencies:
-    lodash._getnative "^3.0.0"
-    lodash.isarguments "^3.0.0"
-    lodash.isarray "^3.0.0"
-
-lodash.map@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
-
-lodash.memoize@^4.1.2:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
-
-lodash.merge@^4.4.0:
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
-
-lodash.mergewith@^4.6.0:
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
-
-lodash.partialright@^4.1.4:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b"
-
-lodash.pick@^4.2.1:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
-
-lodash.reduce@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
-
-lodash.reject@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
-
-lodash.restparam@^3.0.0:
-  version "3.6.1"
-  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
-
-lodash.some@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
-
-lodash.sortby@^4.7.0:
-  version "4.7.0"
-  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
-
-lodash.startcase@^4.4.0:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8"
-
-lodash.tail@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
-
-lodash.template@^3.0.0:
-  version "3.6.2"
-  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
-  dependencies:
-    lodash._basecopy "^3.0.0"
-    lodash._basetostring "^3.0.0"
-    lodash._basevalues "^3.0.0"
-    lodash._isiterateecall "^3.0.0"
-    lodash._reinterpolate "^3.0.0"
-    lodash.escape "^3.0.0"
-    lodash.keys "^3.0.0"
-    lodash.restparam "^3.0.0"
-    lodash.templatesettings "^3.0.0"
-
-lodash.templatesettings@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
-  dependencies:
-    lodash._reinterpolate "^3.0.0"
-    lodash.escape "^3.0.0"
-
-lodash.unescape@4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
-
-lodash.uniq@^4.3.0, lodash.uniq@^4.5.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
-
-lodash@^3.10.1:
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
-
-lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10:
-  version "4.17.10"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
-
-lodash@~1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
-
-log-symbols@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
-  dependencies:
-    chalk "^1.0.0"
-
-log-symbols@^2.1.0, log-symbols@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
-  dependencies:
-    chalk "^2.0.1"
-
-log-update@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
-  dependencies:
-    ansi-escapes "^1.0.0"
-    cli-cursor "^1.0.2"
-
-logalot@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
-  dependencies:
-    figures "^1.3.5"
-    squeak "^1.0.0"
-
-long@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
-
-longest@^1.0.0, longest@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
-
-loose-envify@^1.0.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
-  dependencies:
-    js-tokens "^3.0.0"
-
-loud-rejection@^1.0.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
-  dependencies:
-    currently-unhandled "^0.4.1"
-    signal-exit "^3.0.0"
-
-lower-case@^1.1.1:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
-
-lowercase-keys@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
-
-lowercase-keys@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
-
-lpad-align@^1.0.1:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
-  dependencies:
-    get-stdin "^4.0.1"
-    indent-string "^2.1.0"
-    longest "^1.0.0"
-    meow "^3.3.0"
-
-lru-cache@2, lru-cache@^2.5.0:
-  version "2.7.3"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
-
-lru-cache@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
-  dependencies:
-    pseudomap "^1.0.1"
-
-lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2:
-  version "4.1.3"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
-  dependencies:
-    pseudomap "^1.0.2"
-    yallist "^2.1.2"
-
-lru-queue@0.1:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
-  dependencies:
-    es5-ext "~0.10.2"
-
-make-dir@^1.0.0, make-dir@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
-  dependencies:
-    pify "^3.0.0"
-
-make-error-cause@^1.1.1:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d"
-  dependencies:
-    make-error "^1.2.0"
-
-make-error@^1.1.1, make-error@^1.2.0:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535"
-
-make-iterator@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
-  dependencies:
-    kind-of "^6.0.2"
-
-map-cache@^0.2.0, map-cache@^0.2.2:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
-
-map-obj@^1.0.0, map-obj@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
-
-map-stream@~0.0.7:
-  version "0.0.7"
-  resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8"
-
-map-visit@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
-  dependencies:
-    object-visit "^1.0.0"
-
-math-expression-evaluator@^1.2.14:
-  version "1.2.17"
-  resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
-
-math-random@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
-
-md5.js@^1.3.4:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
-  dependencies:
-    hash-base "^3.0.0"
-    inherits "^2.0.1"
-
-mdn-data@^1.0.0, mdn-data@~1.1.0:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
-
-mecab-async@0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/mecab-async/-/mecab-async-0.1.2.tgz#69efb838729216709597a57da2df03922f9b593a"
-  dependencies:
-    shell-quote "*"
-
-media-typer@0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
-
-mem-fs-editor@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz#55a79b1e824da631254c4c95ba6366602c77af90"
-  dependencies:
-    commondir "^1.0.1"
-    deep-extend "^0.5.1"
-    ejs "^2.5.9"
-    glob "^7.0.3"
-    globby "^8.0.0"
-    isbinaryfile "^3.0.2"
-    mkdirp "^0.5.0"
-    multimatch "^2.0.0"
-    rimraf "^2.2.8"
-    through2 "^2.0.0"
-    vinyl "^2.0.1"
-
-mem-fs@^1.1.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc"
-  dependencies:
-    through2 "^2.0.0"
-    vinyl "^1.1.0"
-    vinyl-file "^2.0.0"
-
-mem@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
-  dependencies:
-    mimic-fn "^1.0.0"
-
-memoizee@0.4.X:
-  version "0.4.12"
-  resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb"
-  dependencies:
-    d "1"
-    es5-ext "^0.10.30"
-    es6-weak-map "^2.0.2"
-    event-emitter "^0.3.5"
-    is-promise "^2.1"
-    lru-queue "0.1"
-    next-tick "1"
-    timers-ext "^0.1.2"
-
-memory-fs@^0.4.0, memory-fs@~0.4.1:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
-  dependencies:
-    errno "^0.1.3"
-    readable-stream "^2.0.1"
-
-meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, meow@^3.7.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
-  dependencies:
-    camelcase-keys "^2.0.0"
-    decamelize "^1.1.2"
-    loud-rejection "^1.0.0"
-    map-obj "^1.0.1"
-    minimist "^1.1.3"
-    normalize-package-data "^2.3.4"
-    object-assign "^4.0.1"
-    read-pkg-up "^1.0.1"
-    redent "^1.0.0"
-    trim-newlines "^1.0.0"
-
-merge-descriptors@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
-
-merge-source-map@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
-  dependencies:
-    source-map "^0.6.1"
-
-merge-stream@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
-  dependencies:
-    readable-stream "^2.0.1"
-
-merge2@^1.2.1:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34"
-
-methods@^1.0.1, methods@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
-
-micromatch@^2.1.5, micromatch@^2.3.7:
-  version "2.3.11"
-  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
-  dependencies:
-    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"
-
-micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
-  version "3.1.10"
-  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
-  dependencies:
-    arr-diff "^4.0.0"
-    array-unique "^0.3.2"
-    braces "^2.3.1"
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    extglob "^2.0.4"
-    fragment-cache "^0.2.1"
-    kind-of "^6.0.2"
-    nanomatch "^1.2.9"
-    object.pick "^1.3.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.2"
-
-miller-rabin@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
-  dependencies:
-    bn.js "^4.0.0"
-    brorand "^1.0.1"
-
-"mime-db@>= 1.34.0 < 2":
-  version "1.34.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a"
-
-mime-db@~1.33.0:
-  version "1.33.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
-
-mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
-  version "2.1.18"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
-  dependencies:
-    mime-db "~1.33.0"
-
-mime@1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
-
-mime@^2.0.3:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369"
-
-mimic-fn@^1.0.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
-
-mimic-response@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
-
-minimalistic-assert@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
-
-minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
-
-"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
-  dependencies:
-    brace-expansion "^1.1.7"
-
-minimatch@^2.0.1:
-  version "2.0.10"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
-  dependencies:
-    brace-expansion "^1.0.0"
-
-minimatch@~0.2.11:
-  version "0.2.14"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
-  dependencies:
-    lru-cache "2"
-    sigmund "~1.0.0"
-
-minimist@0.0.8:
-  version "0.0.8"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-
-minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-
-minimist@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de"
-
-minipass@^2.2.1, minipass@^2.3.3:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
-  dependencies:
-    safe-buffer "^5.1.2"
-    yallist "^3.0.0"
-
-minizlib@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
-  dependencies:
-    minipass "^2.2.1"
-
-mississippi@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
-  dependencies:
-    concat-stream "^1.5.0"
-    duplexify "^3.4.2"
-    end-of-stream "^1.1.0"
-    flush-write-stream "^1.0.0"
-    from2 "^2.1.0"
-    parallel-transform "^1.1.0"
-    pump "^2.0.1"
-    pumpify "^1.3.3"
-    stream-each "^1.1.0"
-    through2 "^2.0.0"
-
-mixin-deep@^1.2.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
-  dependencies:
-    for-in "^1.0.2"
-    is-extendable "^1.0.1"
-
-mixin-object@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
-  dependencies:
-    for-in "^0.1.3"
-    is-extendable "^0.1.1"
-
-mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
-  dependencies:
-    minimist "0.0.8"
-
-mocha@5.2.0, mocha@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
-  dependencies:
-    browser-stdout "1.3.1"
-    commander "2.15.1"
-    debug "3.1.0"
-    diff "3.5.0"
-    escape-string-regexp "1.0.5"
-    glob "7.1.2"
-    growl "1.10.5"
-    he "1.1.1"
-    minimatch "3.0.4"
-    mkdirp "0.5.1"
-    supports-color "5.4.0"
-
-moji@0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/moji/-/moji-0.5.1.tgz#088eecd1c22c8f31a240adcf9c95e54f33eb54fb"
-  dependencies:
-    object-assign "^3.0.0"
-
-mongodb-core@2.1.19:
-  version "2.1.19"
-  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b"
-  dependencies:
-    bson "~1.0.4"
-    require_optional "~1.0.0"
-
-mongodb-core@3.0.9:
-  version "3.0.9"
-  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.9.tgz#8327410c88811013fb3e4ac7c4c670f324349be1"
-  dependencies:
-    bson "~1.0.4"
-    require_optional "^1.0.1"
-
-mongodb@3.0.10:
-  version "3.0.10"
-  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.10.tgz#f948cb9595adcbfcad7444f6b24a040b653b23e8"
-  dependencies:
-    mongodb-core "3.0.9"
-
-mongodb@^2.1.18:
-  version "2.2.35"
-  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.35.tgz#cd1b5af8a9463e3f9a787fa5b3d05565579730f9"
-  dependencies:
-    es6-promise "3.2.1"
-    mongodb-core "2.1.19"
-    readable-stream "2.2.7"
-
-monk-middleware-cast-ids@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz#40c40e5a6cb33ccedc289220943275ee8861c529"
-
-monk-middleware-fields@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz#ff637af35f5948879ccb2be15a91360911bea6c1"
-
-monk-middleware-handle-callback@^0.2.0:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz#47de6cc1248726c72a2be0c81bc4e68310c32146"
-
-monk-middleware-options@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz#58dae1c518d46636ebdff506fadfc773bb442886"
-
-monk-middleware-query@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz#a926c677d4a5620c62151b0a56d0c0c151675874"
-
-monk-middleware-wait-for-connection@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz#312958d30e588b57d09754dd7c97b4843316835a"
-
-monk@6.0.6:
-  version "6.0.6"
-  resolved "https://registry.yarnpkg.com/monk/-/monk-6.0.6.tgz#2ff1cd57f001bba0fea73d1eea3952a7d35450c5"
-  dependencies:
-    debug "*"
-    mongodb "^2.1.18"
-    monk-middleware-cast-ids "^0.2.1"
-    monk-middleware-fields "^0.2.0"
-    monk-middleware-handle-callback "^0.2.0"
-    monk-middleware-options "^0.2.1"
-    monk-middleware-query "^0.2.0"
-    monk-middleware-wait-for-connection "^0.2.0"
-    object-assign "^4.1.1"
-
-move-concurrently@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
-  dependencies:
-    aproba "^1.1.1"
-    copy-concurrently "^1.0.0"
-    fs-write-stream-atomic "^1.0.8"
-    mkdirp "^0.5.1"
-    rimraf "^2.5.4"
-    run-queue "^1.0.3"
-
-ms@2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
-
-ms@2.1.1, ms@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
-
-multer@1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2"
-  dependencies:
-    append-field "^0.1.0"
-    busboy "^0.2.11"
-    concat-stream "^1.5.0"
-    mkdirp "^0.5.1"
-    object-assign "^3.0.0"
-    on-finished "^2.3.0"
-    type-is "^1.6.4"
-    xtend "^4.0.0"
-
-multimatch@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
-  dependencies:
-    array-differ "^1.0.0"
-    array-union "^1.0.1"
-    arrify "^1.0.0"
-    minimatch "^3.0.0"
-
-multipipe@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
-  dependencies:
-    duplexer2 "0.0.2"
-
-mute-stream@0.0.7:
-  version "0.0.7"
-  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
-
-mz@^2.4.0, mz@^2.6.0, mz@^2.7.0:
-  version "2.7.0"
-  resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
-  dependencies:
-    any-promise "^1.0.0"
-    object-assign "^4.0.1"
-    thenify-all "^1.0.0"
-
-nan@2.10.0, nan@^2.10.0, nan@^2.3.3, nan@^2.5.0, nan@^2.9.2:
-  version "2.10.0"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
-
-nanomatch@^1.2.9:
-  version "1.2.9"
-  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
-  dependencies:
-    arr-diff "^4.0.0"
-    array-unique "^0.3.2"
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    fragment-cache "^0.2.1"
-    is-odd "^2.0.0"
-    is-windows "^1.0.2"
-    kind-of "^6.0.2"
-    object.pick "^1.3.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-natives@^1.1.0:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58"
-
-natural-compare@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
-
-natural@^0.2.0:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/natural/-/natural-0.2.1.tgz#1eb5156a9d90b4591949e20e94ebc77bb2339eda"
-  dependencies:
-    apparatus ">= 0.0.9"
-    sylvester ">= 0.0.12"
-    underscore ">=1.3.1"
-
-needle@^2.2.0:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
-  dependencies:
-    debug "^2.1.2"
-    iconv-lite "^0.4.4"
-    sax "^1.2.4"
-
-negotiator@0.6.1:
-  version "0.6.1"
-  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
-
-neo-async@^2.5.0:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
-
-next-tick@1:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
-
-nib@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/nib/-/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7"
-  dependencies:
-    stylus "0.54.5"
-
-nice-try@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
-
-no-case@^2.2.0:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
-  dependencies:
-    lower-case "^1.1.1"
-
-node-dir@0.1.8:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
-
-node-fetch@1.6.3:
-  version "1.6.3"
-  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
-  dependencies:
-    encoding "^0.1.11"
-    is-stream "^1.0.1"
-
-node-gyp@^3.3.1:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203"
-  dependencies:
-    fstream "^1.0.0"
-    glob "^7.0.3"
-    graceful-fs "^4.1.2"
-    mkdirp "^0.5.0"
-    nopt "2 || 3"
-    npmlog "0 || 1 || 2 || 3 || 4"
-    osenv "0"
-    request ">=2.9.0 <2.82.0"
-    rimraf "2"
-    semver "~5.3.0"
-    tar "^2.0.0"
-    which "1"
-
-node-libs-browser@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
-  dependencies:
-    assert "^1.1.1"
-    browserify-zlib "^0.2.0"
-    buffer "^4.3.0"
-    console-browserify "^1.1.0"
-    constants-browserify "^1.0.0"
-    crypto-browserify "^3.11.0"
-    domain-browser "^1.1.1"
-    events "^1.0.0"
-    https-browserify "^1.0.0"
-    os-browserify "^0.3.0"
-    path-browserify "0.0.0"
-    process "^0.11.10"
-    punycode "^1.2.4"
-    querystring-es3 "^0.2.0"
-    readable-stream "^2.3.3"
-    stream-browserify "^2.0.1"
-    stream-http "^2.7.2"
-    string_decoder "^1.0.0"
-    timers-browserify "^2.0.4"
-    tty-browserify "0.0.0"
-    url "^0.11.0"
-    util "^0.10.3"
-    vm-browserify "0.0.4"
-
-node-object-hash@^1.2.0:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.1.tgz#de968492e20c493b8bbc25ad2ee828265fd60934"
-
-node-pre-gyp@^0.10.0:
-  version "0.10.0"
-  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46"
-  dependencies:
-    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"
-
-node-redis-scripty@0.0.5:
-  version "0.0.5"
-  resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625"
-  dependencies:
-    extend "^1.2.1"
-    lru-cache "^2.5.0"
-
-node-redis-warlock@~0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/node-redis-warlock/-/node-redis-warlock-0.2.0.tgz#56395b994c828e8e32f6aae53b93b6edfcd97990"
-  dependencies:
-    node-redis-scripty "0.0.5"
-    uuid "^2.0.1"
-
-node-sass-json-importer@3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/node-sass-json-importer/-/node-sass-json-importer-3.2.0.tgz#9cfe2355035d5437b7c2ecb535450bf6acde8195"
-  dependencies:
-    is-there "^4.0.0"
-    json5 "0.5.1"
-    lodash "^3.10.1"
-
-node-sass@4.9.0:
-  version "4.9.0"
-  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.0.tgz#d1b8aa855d98ed684d6848db929a20771cc2ae52"
-  dependencies:
-    async-foreach "^0.1.3"
-    chalk "^1.1.1"
-    cross-spawn "^3.0.0"
-    gaze "^1.0.0"
-    get-stdin "^4.0.1"
-    glob "^7.0.3"
-    in-publish "^2.0.0"
-    lodash.assign "^4.2.0"
-    lodash.clonedeep "^4.3.2"
-    lodash.mergewith "^4.6.0"
-    meow "^3.7.0"
-    mkdirp "^0.5.1"
-    nan "^2.10.0"
-    node-gyp "^3.3.1"
-    npmlog "^4.0.0"
-    request "~2.79.0"
-    sass-graph "^2.2.4"
-    stdout-stream "^1.4.0"
-    "true-case-path" "^1.0.2"
-
-node-status-codes@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
-
-nomnom@^1.8.1:
-  version "1.8.1"
-  resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
-  dependencies:
-    chalk "~0.4.0"
-    underscore "~1.6.0"
-
-"nopt@2 || 3", nopt@~3.0.1:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
-  dependencies:
-    abbrev "1"
-
-nopt@4.0.1, nopt@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
-  dependencies:
-    abbrev "1"
-    osenv "^0.1.4"
-
-normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
-  dependencies:
-    hosted-git-info "^2.1.4"
-    is-builtin-module "^1.0.0"
-    semver "2 || 3 || 4 || 5"
-    validate-npm-package-license "^3.0.1"
-
-normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
-  dependencies:
-    remove-trailing-separator "^1.0.1"
-
-normalize-range@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
-
-normalize-url@2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
-  dependencies:
-    prepend-http "^2.0.0"
-    query-string "^5.0.1"
-    sort-keys "^2.0.0"
-
-normalize-url@^1.4.0:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
-  dependencies:
-    object-assign "^4.0.1"
-    prepend-http "^1.0.0"
-    query-string "^4.1.0"
-    sort-keys "^1.0.0"
-
-normalize-wheel@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
-
-now-and-later@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee"
-  dependencies:
-    once "^1.3.2"
-
-npm-bundled@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
-
-npm-packlist@^1.1.6:
-  version "1.1.10"
-  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
-  dependencies:
-    ignore-walk "^3.0.1"
-    npm-bundled "^1.0.1"
-
-npm-run-path@^2.0.0, npm-run-path@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
-  dependencies:
-    path-key "^2.0.0"
-
-"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
-  dependencies:
-    are-we-there-yet "~1.1.2"
-    console-control-strings "~1.1.0"
-    gauge "~2.7.3"
-    set-blocking "~2.0.0"
-
-nprogress@0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
-
-nth-check@^1.0.1, nth-check@~1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
-  dependencies:
-    boolbase "~1.0.0"
-
-num2fraction@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
-
-number-is-nan@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
-
-nwsapi@^2.0.0:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959"
-
-oauth-sign@~0.8.1, oauth-sign@~0.8.2:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
-
-oauth@0.9.15:
-  version "0.9.15"
-  resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
-
-object-assign-deep@0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/object-assign-deep/-/object-assign-deep-0.4.0.tgz#43505d3679abb9686ab359b97ac14cc837a9d143"
-
-object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
-
-object-assign@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
-
-object-assign@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
-
-object-copy@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
-  dependencies:
-    copy-descriptor "^0.1.0"
-    define-property "^0.2.5"
-    kind-of "^3.0.3"
-
-object-keys@^1.0.11, object-keys@^1.0.8:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
-
-object-visit@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
-  dependencies:
-    isobject "^3.0.0"
-
-object.assign@^4.0.1, object.assign@^4.0.4:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
-  dependencies:
-    define-properties "^1.1.2"
-    function-bind "^1.1.1"
-    has-symbols "^1.0.0"
-    object-keys "^1.0.11"
-
-object.defaults@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
-  dependencies:
-    array-each "^1.0.1"
-    array-slice "^1.0.0"
-    for-own "^1.0.0"
-    isobject "^3.0.0"
-
-object.getownpropertydescriptors@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
-  dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.5.1"
-
-object.map@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
-  dependencies:
-    for-own "^1.0.0"
-    make-iterator "^1.0.0"
-
-object.omit@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
-  dependencies:
-    for-own "^0.1.4"
-    is-extendable "^0.1.1"
-
-object.pick@^1.2.0, object.pick@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
-  dependencies:
-    isobject "^3.0.1"
-
-object.values@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
-  dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.6.1"
-    function-bind "^1.1.0"
-    has "^1.0.1"
-
-on-build-webpack@0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/on-build-webpack/-/on-build-webpack-0.1.0.tgz#a287c0e17766e6141926e5f2cbb0d8bb53b76814"
-
-on-finished@^2.1.0, on-finished@^2.3.0, on-finished@~2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
-  dependencies:
-    ee-first "1.1.1"
-
-once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
-  dependencies:
-    wrappy "1"
-
-once@~1.3.0:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
-  dependencies:
-    wrappy "1"
-
-onetime@^1.0.0:
-  version "1.1.0"
-  resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
-
-onetime@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
-  dependencies:
-    mimic-fn "^1.0.0"
-
-only@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
-
-ono@^2.0.1:
-  version "2.2.5"
-  resolved "https://registry.yarnpkg.com/ono/-/ono-2.2.5.tgz#daf09488b51174da7a7e4275dfab31b438ffa0e3"
-
-ono@^4.0.2:
-  version "4.0.5"
-  resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.5.tgz#bc62740493a5c1c08b2c21e60cbb0e5c56ab7de2"
-  dependencies:
-    format-util "^1.0.3"
-
-opencollective@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1"
-  dependencies:
-    babel-polyfill "6.23.0"
-    chalk "1.1.3"
-    inquirer "3.0.6"
-    minimist "1.2.0"
-    node-fetch "1.6.3"
-    opn "4.0.2"
-
-opn@4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
-  dependencies:
-    object-assign "^4.0.1"
-    pinkie-promise "^2.0.0"
-
-optionator@^0.8.1, optionator@^0.8.2:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
-  dependencies:
-    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"
-
-optipng-bin@^3.0.0:
-  version "3.1.4"
-  resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-3.1.4.tgz#95d34f2c488704f6fd70606bfea0c659f1d95d84"
-  dependencies:
-    bin-build "^2.0.0"
-    bin-wrapper "^3.0.0"
-    logalot "^2.0.0"
-
-ora@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
-  dependencies:
-    chalk "^1.1.1"
-    cli-cursor "^1.0.2"
-    cli-spinners "^0.1.2"
-    object-assign "^4.0.1"
-
-orchestrator@^0.3.0:
-  version "0.3.8"
-  resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
-  dependencies:
-    end-of-stream "~0.1.5"
-    sequencify "~0.0.7"
-    stream-consume "~0.1.0"
-
-ordered-read-streams@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
-
-ordered-read-streams@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b"
-  dependencies:
-    is-stream "^1.0.1"
-    readable-stream "^2.0.1"
-
-ordered-read-streams@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
-  dependencies:
-    readable-stream "^2.0.1"
-
-os-browserify@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
-
-os-filter-obj@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad"
-
-os-homedir@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-
-os-locale@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
-  dependencies:
-    lcid "^1.0.0"
-
-os-locale@^2.0.0, os-locale@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
-  dependencies:
-    execa "^0.7.0"
-    lcid "^1.0.0"
-    mem "^1.1.0"
-
-os-shim@^0.1.2:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
-
-os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-
-os-utils@0.0.14:
-  version "0.0.14"
-  resolved "https://registry.yarnpkg.com/os-utils/-/os-utils-0.0.14.tgz#29e511697b1982b8c627722175fe39797ef64156"
-
-osenv@0, osenv@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
-  dependencies:
-    os-homedir "^1.0.0"
-    os-tmpdir "^1.0.0"
-
-p-cancelable@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
-
-p-cancelable@^0.4.0:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
-
-p-each-series@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71"
-  dependencies:
-    p-reduce "^1.0.0"
-
-p-finally@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
-
-p-is-promise@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
-
-p-lazy@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-lazy/-/p-lazy-1.0.0.tgz#ec53c802f2ee3ac28f166cc82d0b2b02de27a835"
-
-p-limit@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
-  dependencies:
-    p-try "^1.0.0"
-
-p-locate@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
-  dependencies:
-    p-limit "^1.1.0"
-
-p-map@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
-
-p-pipe@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9"
-
-p-reduce@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
-
-p-timeout@^1.1.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
-  dependencies:
-    p-finally "^1.0.0"
-
-p-timeout@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
-  dependencies:
-    p-finally "^1.0.0"
-
-p-try@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
-
-pako@~1.0.5:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
-
-parallel-transform@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
-  dependencies:
-    cyclist "~0.2.2"
-    inherits "^2.0.3"
-    readable-stream "^2.1.5"
-
-param-case@2.1.x:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
-  dependencies:
-    no-case "^2.2.0"
-
-parse-asn1@^5.0.0:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
-  dependencies:
-    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-filepath@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
-  dependencies:
-    is-absolute "^1.0.0"
-    map-cache "^0.2.0"
-    path-root "^0.1.1"
-
-parse-glob@^3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
-  dependencies:
-    glob-base "^0.3.0"
-    is-dotfile "^1.0.0"
-    is-extglob "^1.0.0"
-    is-glob "^2.0.0"
-
-parse-json@^2.1.0, parse-json@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
-  dependencies:
-    error-ex "^1.2.0"
-
-parse-json@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
-  dependencies:
-    error-ex "^1.3.1"
-    json-parse-better-errors "^1.0.1"
-
-parse-passwd@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
-
-parse5@*, parse5@5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a"
-
-parse5@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
-
-parseurl@^1.3.0, parseurl@~1.3.2:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
-
-pascalcase@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
-
-passthrough-counter@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa"
-
-path-browserify@0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
-
-path-dirname@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
-
-path-exists@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
-  dependencies:
-    pinkie-promise "^2.0.0"
-
-path-exists@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
-
-path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
-
-path-is-inside@^1.0.1, path-is-inside@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
-
-path-key@^2.0.0, path-key@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
-
-path-parse@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
-
-path-root-regex@^0.1.0:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
-
-path-root@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
-  dependencies:
-    path-root-regex "^0.1.0"
-
-path-to-regexp@0.1.7:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
-
-path-to-regexp@^1.1.1:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
-  dependencies:
-    isarray "0.0.1"
-
-path-type@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
-  dependencies:
-    graceful-fs "^4.1.2"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-
-path-type@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
-  dependencies:
-    pify "^2.0.0"
-
-path-type@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
-  dependencies:
-    pify "^3.0.0"
-
-pbkdf2@^3.0.3:
-  version "3.0.16"
-  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
-  dependencies:
-    create-hash "^1.1.2"
-    create-hmac "^1.1.4"
-    ripemd160 "^2.0.1"
-    safe-buffer "^5.0.1"
-    sha.js "^2.4.8"
-
-pend@~1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
-
-performance-now@^0.2.0:
-  version "0.2.0"
-  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:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
-
-pify@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
-
-pinkie-promise@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
-  dependencies:
-    pinkie "^2.0.0"
-
-pinkie@^2.0.0:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
-
-pkg-dir@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
-  dependencies:
-    find-up "^2.1.0"
-
-plugin-error@1.0.1, plugin-error@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
-  dependencies:
-    ansi-colors "^1.0.1"
-    arr-diff "^4.0.0"
-    arr-union "^3.1.0"
-    extend-shallow "^3.0.2"
-
-plugin-error@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace"
-  dependencies:
-    ansi-cyan "^0.1.1"
-    ansi-red "^0.1.1"
-    arr-diff "^1.0.1"
-    arr-union "^2.0.1"
-    extend-shallow "^1.1.2"
-
-plur@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a"
-  dependencies:
-    irregular-plurals "^1.0.0"
-
-pluralize@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
-
-pn@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
-
-pngjs@^3.3.0:
-  version "3.3.3"
-  resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b"
-
-popper.js@^1.12.9:
-  version "1.14.3"
-  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095"
-
-posix-character-classes@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
-
-postcss-calc@^5.2.0:
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
-  dependencies:
-    postcss "^5.0.2"
-    postcss-message-helpers "^2.0.0"
-    reduce-css-calc "^1.2.6"
-
-postcss-colormin@^2.1.8:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
-  dependencies:
-    colormin "^1.0.5"
-    postcss "^5.0.13"
-    postcss-value-parser "^3.2.3"
-
-postcss-convert-values@^2.3.4:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
-  dependencies:
-    postcss "^5.0.11"
-    postcss-value-parser "^3.1.2"
-
-postcss-discard-comments@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
-  dependencies:
-    postcss "^5.0.14"
-
-postcss-discard-duplicates@^2.0.1:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
-  dependencies:
-    postcss "^5.0.4"
-
-postcss-discard-empty@^2.0.1:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
-  dependencies:
-    postcss "^5.0.14"
-
-postcss-discard-overridden@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
-  dependencies:
-    postcss "^5.0.16"
-
-postcss-discard-unused@^2.2.1:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
-  dependencies:
-    postcss "^5.0.14"
-    uniqs "^2.0.0"
-
-postcss-filter-plugins@^2.0.0:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
-  dependencies:
-    postcss "^5.0.4"
-
-postcss-merge-idents@^2.1.5:
-  version "2.1.7"
-  resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
-  dependencies:
-    has "^1.0.1"
-    postcss "^5.0.10"
-    postcss-value-parser "^3.1.1"
-
-postcss-merge-longhand@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
-  dependencies:
-    postcss "^5.0.4"
-
-postcss-merge-rules@^2.0.3:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
-  dependencies:
-    browserslist "^1.5.2"
-    caniuse-api "^1.5.2"
-    postcss "^5.0.4"
-    postcss-selector-parser "^2.2.2"
-    vendors "^1.0.0"
-
-postcss-message-helpers@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
-
-postcss-minify-font-values@^1.0.2:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
-  dependencies:
-    object-assign "^4.0.1"
-    postcss "^5.0.4"
-    postcss-value-parser "^3.0.2"
-
-postcss-minify-gradients@^1.0.1:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
-  dependencies:
-    postcss "^5.0.12"
-    postcss-value-parser "^3.3.0"
-
-postcss-minify-params@^1.0.4:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
-  dependencies:
-    alphanum-sort "^1.0.1"
-    postcss "^5.0.2"
-    postcss-value-parser "^3.0.2"
-    uniqs "^2.0.0"
-
-postcss-minify-selectors@^2.0.4:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
-  dependencies:
-    alphanum-sort "^1.0.2"
-    has "^1.0.1"
-    postcss "^5.0.14"
-    postcss-selector-parser "^2.0.0"
-
-postcss-modules-extract-imports@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
-  dependencies:
-    postcss "^6.0.1"
-
-postcss-modules-local-by-default@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
-  dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
-
-postcss-modules-scope@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
-  dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
-
-postcss-modules-values@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
-  dependencies:
-    icss-replace-symbols "^1.1.0"
-    postcss "^6.0.1"
-
-postcss-normalize-charset@^1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
-  dependencies:
-    postcss "^5.0.5"
-
-postcss-normalize-url@^3.0.7:
-  version "3.0.8"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
-  dependencies:
-    is-absolute-url "^2.0.0"
-    normalize-url "^1.4.0"
-    postcss "^5.0.14"
-    postcss-value-parser "^3.2.3"
-
-postcss-ordered-values@^2.1.0:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
-  dependencies:
-    postcss "^5.0.4"
-    postcss-value-parser "^3.0.1"
-
-postcss-reduce-idents@^2.2.2:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
-  dependencies:
-    postcss "^5.0.4"
-    postcss-value-parser "^3.0.2"
-
-postcss-reduce-initial@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
-  dependencies:
-    postcss "^5.0.4"
-
-postcss-reduce-transforms@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
-  dependencies:
-    has "^1.0.1"
-    postcss "^5.0.8"
-    postcss-value-parser "^3.0.1"
-
-postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
-  dependencies:
-    flatten "^1.0.2"
-    indexes-of "^1.0.1"
-    uniq "^1.0.1"
-
-postcss-selector-parser@^3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
-  dependencies:
-    dot-prop "^4.1.1"
-    indexes-of "^1.0.1"
-    uniq "^1.0.1"
-
-postcss-svgo@^2.1.1:
-  version "2.1.6"
-  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
-  dependencies:
-    is-svg "^2.0.0"
-    postcss "^5.0.14"
-    postcss-value-parser "^3.2.3"
-    svgo "^0.7.0"
-
-postcss-unique-selectors@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
-  dependencies:
-    alphanum-sort "^1.0.1"
-    postcss "^5.0.4"
-    uniqs "^2.0.0"
-
-postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
-
-postcss-zindex@^2.0.1:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
-  dependencies:
-    has "^1.0.1"
-    postcss "^5.0.4"
-    uniqs "^2.0.0"
-
-postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
-  version "5.2.18"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
-  dependencies:
-    chalk "^1.1.3"
-    js-base64 "^2.1.9"
-    source-map "^0.5.6"
-    supports-color "^3.2.3"
-
-postcss@^6.0.1, postcss@^6.0.20:
-  version "6.0.22"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3"
-  dependencies:
-    chalk "^2.4.1"
-    source-map "^0.6.1"
-    supports-color "^5.4.0"
-
-prelude-ls@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
-
-prepend-http@^1.0.0, prepend-http@^1.0.1:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
-
-prepend-http@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
-
-preserve@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-
-prettier@^1.12.1, prettier@^1.13.0:
-  version "1.13.5"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0"
-
-pretty-bytes@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
-
-pretty-hrtime@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
-
-pretty@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5"
-  dependencies:
-    condense-newlines "^0.2.1"
-    extend-shallow "^2.0.1"
-    js-beautify "^1.6.12"
-
-prettyjson@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289"
-  dependencies:
-    colors "^1.1.2"
-    minimist "^1.2.0"
-
-printj@~1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
-
-private@^0.1.6, private@^0.1.8, private@~0.1.5:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
-
-process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
-
-process-nextick-args@~1.0.6:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
-
-process@^0.11.10:
-  version "0.11.10"
-  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
-
-progress-bar-webpack-plugin@1.11.0:
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.11.0.tgz#4f801288443c55ec029b20cbfdcbf3e1dc17f852"
-  dependencies:
-    chalk "^1.1.1"
-    object.assign "^4.0.1"
-    progress "^1.1.8"
-
-progress@^1.1.8:
-  version "1.1.8"
-  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
-
-progress@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
-
-prominence@0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/prominence/-/prominence-0.2.0.tgz#38704264981ddf65e5b00b0b5cfce6e53348f2b2"
-
-promise-inflight@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
-
-promise-sequential@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/promise-sequential/-/promise-sequential-1.1.1.tgz#f79e8950ef86e7a7a85bf320452643592f6d2fb2"
-
-promise@^7.0.1:
-  version "7.3.1"
-  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
-  dependencies:
-    asap "~2.0.3"
-
-proto-list@~1.2.1:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
-
-proxy-addr@~2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
-  dependencies:
-    forwarded "~0.1.2"
-    ipaddr.js "1.6.0"
-
-prr@~1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
-
-pseudomap@^1.0.1, pseudomap@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
-
-psl@^1.1.24:
-  version "1.1.28"
-  resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b"
-
-public-encrypt@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
-  dependencies:
-    bn.js "^4.1.0"
-    browserify-rsa "^4.0.0"
-    create-hash "^1.1.0"
-    parse-asn1 "^5.0.0"
-    randombytes "^2.0.1"
-
-pug-attrs@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15"
-  dependencies:
-    constantinople "^3.0.1"
-    js-stringify "^1.0.1"
-    pug-runtime "^2.0.4"
-
-pug-code-gen@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c"
-  dependencies:
-    constantinople "^3.0.1"
-    doctypes "^1.1.0"
-    js-stringify "^1.0.1"
-    pug-attrs "^2.0.3"
-    pug-error "^1.3.2"
-    pug-runtime "^2.0.4"
-    void-elements "^2.0.1"
-    with "^5.0.0"
-
-pug-error@^1.3.2:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26"
-
-pug-filters@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e"
-  dependencies:
-    clean-css "^4.1.11"
-    constantinople "^3.0.1"
-    jstransformer "1.0.0"
-    pug-error "^1.3.2"
-    pug-walk "^1.1.7"
-    resolve "^1.1.6"
-    uglify-js "^2.6.1"
-
-pug-lexer@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278"
-  dependencies:
-    character-parser "^2.1.1"
-    is-expression "^3.0.0"
-    pug-error "^1.3.2"
-
-pug-linker@^3.0.5:
-  version "3.0.5"
-  resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f"
-  dependencies:
-    pug-error "^1.3.2"
-    pug-walk "^1.1.7"
-
-pug-load@^2.0.11:
-  version "2.0.11"
-  resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527"
-  dependencies:
-    object-assign "^4.1.0"
-    pug-walk "^1.1.7"
-
-pug-parser@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4"
-  dependencies:
-    pug-error "^1.3.2"
-    token-stream "0.0.1"
-
-pug-runtime@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58"
-
-pug-strip-comments@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f"
-  dependencies:
-    pug-error "^1.3.2"
-
-pug-walk@^1.1.7:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3"
-
-pug@2.0.3, pug@^2.0.0-beta3, pug@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e"
-  dependencies:
-    pug-code-gen "^2.0.1"
-    pug-filters "^3.1.0"
-    pug-lexer "^4.0.0"
-    pug-linker "^3.0.5"
-    pug-load "^2.0.11"
-    pug-parser "^5.0.0"
-    pug-runtime "^2.0.4"
-    pug-strip-comments "^1.0.3"
-
-pump@^2.0.0, pump@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
-pumpify@^1.3.3, pumpify@^1.3.5:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
-  dependencies:
-    duplexify "^3.6.0"
-    inherits "^2.0.3"
-    pump "^2.0.0"
-
-punycode@1.3.2:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
-
-punycode@2.1.1, punycode@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
-
-punycode@^1.2.4, punycode@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
-
-q@0.9.7:
-  version "0.9.7"
-  resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
-
-q@1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
-
-q@^1.1.2:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
-
-qrcode@1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a"
-  dependencies:
-    can-promise "^0.0.1"
-    dijkstrajs "^1.0.1"
-    isarray "^2.0.1"
-    pngjs "^3.3.0"
-    yargs "^8.0.2"
-
-qs@6.5.1:
-  version "6.5.1"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
-
-qs@6.5.2, qs@^6.4.0, qs@^6.5.2, qs@~6.5.1:
-  version "6.5.2"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
-
-qs@~6.3.0:
-  version "6.3.2"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
-
-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:
-  version "4.3.4"
-  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
-  dependencies:
-    object-assign "^4.1.0"
-    strict-uri-encode "^1.0.0"
-
-query-string@^5.0.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
-  dependencies:
-    decode-uri-component "^0.2.0"
-    object-assign "^4.1.0"
-    strict-uri-encode "^1.0.0"
-
-querystring-es3@^0.2.0:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
-
-querystring@0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
-
-randomatic@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
-  dependencies:
-    is-number "^4.0.0"
-    kind-of "^6.0.0"
-    math-random "^1.0.1"
-
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
-  dependencies:
-    safe-buffer "^5.1.0"
-
-randomfill@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
-  dependencies:
-    randombytes "^2.0.5"
-    safe-buffer "^5.1.0"
-
-range-parser@~1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
-
-rangestr@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/rangestr/-/rangestr-0.0.1.tgz#f72ff9246f10f2a7d7c16e14616f617be2c2635a"
-
-ratelimiter@3.0.3:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/ratelimiter/-/ratelimiter-3.0.3.tgz#6dbca58b05422f2a08e224d4ba3a0cfb86c30966"
-
-raw-body@2.3.2:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
-  dependencies:
-    bytes "3.0.0"
-    http-errors "1.6.2"
-    iconv-lite "0.4.19"
-    unpipe "1.0.0"
-
-raw-body@2.3.3, raw-body@^2.2.0, raw-body@^2.3.3:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
-  dependencies:
-    bytes "3.0.0"
-    http-errors "1.6.3"
-    iconv-lite "0.4.23"
-    unpipe "1.0.0"
-
-rc@^1.1.2, rc@^1.1.7:
-  version "1.2.8"
-  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
-  dependencies:
-    deep-extend "^0.6.0"
-    ini "~1.3.0"
-    minimist "^1.2.0"
-    strip-json-comments "~2.0.1"
-
-read-all-stream@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
-  dependencies:
-    pinkie-promise "^2.0.0"
-    readable-stream "^2.0.0"
-
-read-chunk@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655"
-  dependencies:
-    pify "^3.0.0"
-    safe-buffer "^5.1.1"
-
-read-installed@~4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
-  dependencies:
-    debuglog "^1.0.1"
-    read-package-json "^2.0.0"
-    readdir-scoped-modules "^1.0.0"
-    semver "2 || 3 || 4 || 5"
-    slide "~1.1.3"
-    util-extend "^1.0.1"
-  optionalDependencies:
-    graceful-fs "^4.1.2"
-
-read-package-json@^2.0.0:
-  version "2.0.13"
-  resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
-  dependencies:
-    glob "^7.1.1"
-    json-parse-better-errors "^1.0.1"
-    normalize-package-data "^2.0.0"
-    slash "^1.0.0"
-  optionalDependencies:
-    graceful-fs "^4.1.2"
-
-read-pkg-up@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
-  dependencies:
-    find-up "^1.0.0"
-    read-pkg "^1.0.0"
-
-read-pkg-up@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
-  dependencies:
-    find-up "^2.0.0"
-    read-pkg "^2.0.0"
-
-read-pkg-up@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
-  dependencies:
-    find-up "^2.0.0"
-    read-pkg "^3.0.0"
-
-read-pkg@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
-  dependencies:
-    load-json-file "^1.0.0"
-    normalize-package-data "^2.3.2"
-    path-type "^1.0.0"
-
-read-pkg@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
-  dependencies:
-    load-json-file "^2.0.0"
-    normalize-package-data "^2.3.2"
-    path-type "^2.0.0"
-
-read-pkg@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
-  dependencies:
-    load-json-file "^4.0.0"
-    normalize-package-data "^2.3.2"
-    path-type "^3.0.0"
-
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6:
-  version "2.3.6"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.3"
-    isarray "~1.0.0"
-    process-nextick-args "~2.0.0"
-    safe-buffer "~5.1.1"
-    string_decoder "~1.1.1"
-    util-deprecate "~1.0.1"
-
-readable-stream@1.1.x, readable-stream@~1.1.9:
-  version "1.1.14"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "0.0.1"
-    string_decoder "~0.10.x"
-
-readable-stream@2.2.7:
-  version "2.2.7"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1"
-  dependencies:
-    buffer-shims "~1.0.0"
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "~1.0.0"
-    process-nextick-args "~1.0.6"
-    string_decoder "~1.0.0"
-    util-deprecate "~1.0.1"
-
-"readable-stream@>=1.0.33-1 <1.1.0-0":
-  version "1.0.34"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "0.0.1"
-    string_decoder "~0.10.x"
-
-readdir-scoped-modules@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
-  dependencies:
-    debuglog "^1.0.1"
-    dezalgo "^1.0.0"
-    graceful-fs "^4.1.2"
-    once "^1.3.0"
-
-readdirp@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
-  dependencies:
-    graceful-fs "^4.1.2"
-    minimatch "^3.0.2"
-    readable-stream "^2.0.2"
-    set-immediate-shim "^1.0.1"
-
-recaptcha-promise@0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/recaptcha-promise/-/recaptcha-promise-0.1.3.tgz#7d3d66d045a53674054ebdfa1684e0609ef5d912"
-  dependencies:
-    bluebird "^3.4.1"
-    request "^2.73.0"
-
-recast@^0.12.5:
-  version "0.12.9"
-  resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1"
-  dependencies:
-    ast-types "0.10.1"
-    core-js "^2.4.1"
-    esprima "~4.0.0"
-    private "~0.1.5"
-    source-map "~0.6.1"
-
-recast@^0.15.0:
-  version "0.15.0"
-  resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.0.tgz#b8c8bfdda245e1580c0a4d9fc25d4e820bf57208"
-  dependencies:
-    ast-types "0.11.5"
-    esprima "~4.0.0"
-    private "~0.1.5"
-    source-map "~0.6.1"
-
-rechoir@^0.6.2:
-  version "0.6.2"
-  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
-  dependencies:
-    resolve "^1.1.6"
-
-reconnecting-websocket@3.2.2:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-3.2.2.tgz#8097514e926e9855e03c39e76efa2e3d1f371bee"
-
-recursive-iterator@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/recursive-iterator/-/recursive-iterator-2.0.3.tgz#d0e0d2c7e7a83109d73091cf043fc509e5a76dc3"
-
-redent@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
-  dependencies:
-    indent-string "^2.1.0"
-    strip-indent "^1.0.1"
-
-redis-commands@^1.2.0:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
-
-redis-parser@^2.0.0, redis-parser@^2.6.0:
-  version "2.6.0"
-  resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
-
-redis@2.8.0:
-  version "2.8.0"
-  resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
-  dependencies:
-    double-ended-queue "^2.1.0-0"
-    redis-commands "^1.2.0"
-    redis-parser "^2.6.0"
-
-redis@^0.12.1:
-  version "0.12.1"
-  resolved "https://registry.yarnpkg.com/redis/-/redis-0.12.1.tgz#64df76ad0fc8acebaebd2a0645e8a48fac49185e"
-
-redis@~2.6.0-2:
-  version "2.6.5"
-  resolved "https://registry.yarnpkg.com/redis/-/redis-2.6.5.tgz#87c1eff4a489f94b70871f3d08b6988f23a95687"
-  dependencies:
-    double-ended-queue "^2.1.0-0"
-    redis-commands "^1.2.0"
-    redis-parser "^2.0.0"
-
-reds@^0.2.5:
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/reds/-/reds-0.2.5.tgz#38a767f7663cd749036848697d82c74fd29bc01f"
-  dependencies:
-    natural "^0.2.0"
-    redis "^0.12.1"
-
-reduce-css-calc@^1.2.6:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
-  dependencies:
-    balanced-match "^0.4.2"
-    math-expression-evaluator "^1.2.14"
-    reduce-function-call "^1.0.1"
-
-reduce-function-call@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
-  dependencies:
-    balanced-match "^0.4.2"
-
-regenerate@^1.2.1:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
-
-regenerator-runtime@^0.10.0:
-  version "0.10.5"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
-
-regenerator-runtime@^0.11.0:
-  version "0.11.1"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
-
-regenerator-transform@^0.10.0:
-  version "0.10.1"
-  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
-  dependencies:
-    babel-runtime "^6.18.0"
-    babel-types "^6.19.0"
-    private "^0.1.6"
-
-regex-cache@^0.4.2:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
-  dependencies:
-    is-equal-shallow "^0.1.3"
-
-regex-not@^1.0.0, regex-not@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
-  dependencies:
-    extend-shallow "^3.0.2"
-    safe-regex "^1.1.0"
-
-regexpp@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
-
-regexpu-core@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
-  dependencies:
-    regenerate "^1.2.1"
-    regjsgen "^0.2.0"
-    regjsparser "^0.1.4"
-
-regexpu-core@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
-  dependencies:
-    regenerate "^1.2.1"
-    regjsgen "^0.2.0"
-    regjsparser "^0.1.4"
-
-regjsgen@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
-
-regjsparser@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
-  dependencies:
-    jsesc "~0.5.0"
-
-relateurl@0.2.x:
-  version "0.2.7"
-  resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
-
-remove-bom-buffer@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
-  dependencies:
-    is-buffer "^1.1.5"
-    is-utf8 "^0.2.1"
-
-remove-bom-stream@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
-  dependencies:
-    remove-bom-buffer "^3.0.0"
-    safe-buffer "^5.1.0"
-    through2 "^2.0.3"
-
-remove-trailing-separator@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
-
-repeat-element@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
-
-repeat-string@^1.5.2, repeat-string@^1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
-
-repeating@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
-  dependencies:
-    is-finite "^1.0.0"
-
-replace-ext@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
-
-replace-ext@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
-
-replacestream@^4.0.0:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36"
-  dependencies:
-    escape-string-regexp "^1.0.3"
-    object-assign "^4.0.1"
-    readable-stream "^2.0.2"
-
-request-promise-core@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
-  dependencies:
-    lodash "^4.13.1"
-
-request-promise-native@1.0.5, request-promise-native@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
-  dependencies:
-    request-promise-core "1.1.1"
-    stealthy-require "^1.1.0"
-    tough-cookie ">=2.3.3"
-
-request@2.85.0:
-  version "2.85.0"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
-  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"
-
-request@2.87.0, request@^2.73.0, request@^2.83.0:
-  version "2.87.0"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
-  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"
-    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"
-    tough-cookie "~2.3.3"
-    tunnel-agent "^0.6.0"
-    uuid "^3.1.0"
-
-"request@>=2.9.0 <2.82.0":
-  version "2.81.0"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
-  dependencies:
-    aws-sign2 "~0.6.0"
-    aws4 "^1.2.1"
-    caseless "~0.12.0"
-    combined-stream "~1.0.5"
-    extend "~3.0.0"
-    forever-agent "~0.6.1"
-    form-data "~2.1.1"
-    har-validator "~4.2.1"
-    hawk "~3.1.3"
-    http-signature "~1.1.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.7"
-    oauth-sign "~0.8.1"
-    performance-now "^0.2.0"
-    qs "~6.4.0"
-    safe-buffer "^5.0.1"
-    stringstream "~0.0.4"
-    tough-cookie "~2.3.0"
-    tunnel-agent "^0.6.0"
-    uuid "^3.0.0"
-
-request@~2.79.0:
-  version "2.79.0"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
-  dependencies:
-    aws-sign2 "~0.6.0"
-    aws4 "^1.2.1"
-    caseless "~0.11.0"
-    combined-stream "~1.0.5"
-    extend "~3.0.0"
-    forever-agent "~0.6.1"
-    form-data "~2.1.1"
-    har-validator "~2.0.6"
-    hawk "~3.1.3"
-    http-signature "~1.1.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.7"
-    oauth-sign "~0.8.1"
-    qs "~6.3.0"
-    stringstream "~0.0.4"
-    tough-cookie "~2.3.0"
-    tunnel-agent "~0.4.1"
-    uuid "^3.0.0"
-
-require-all@2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/require-all/-/require-all-2.2.0.tgz#b4420c233ac0282d0ff49b277fb880a8b5de0894"
-
-require-directory@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
-
-require-main-filename@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
-
-require-uncached@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
-  dependencies:
-    caller-path "^0.1.0"
-    resolve-from "^1.0.0"
-
-require_optional@^1.0.1, require_optional@~1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
-  dependencies:
-    resolve-from "^2.0.0"
-    semver "^5.1.0"
-
-resize-observer-polyfill@^1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69"
-
-resolve-cwd@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
-  dependencies:
-    resolve-from "^3.0.0"
-
-resolve-dir@^1.0.0, resolve-dir@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
-  dependencies:
-    expand-tilde "^2.0.0"
-    global-modules "^1.0.0"
-
-resolve-from@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
-
-resolve-from@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
-
-resolve-from@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
-
-resolve-options@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
-  dependencies:
-    value-or-function "^3.0.0"
-
-resolve-path@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
-  dependencies:
-    http-errors "~1.6.2"
-    path-is-absolute "1.0.1"
-
-resolve-url@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
-
-resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e"
-  dependencies:
-    path-parse "^1.0.5"
-
-responselike@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
-  dependencies:
-    lowercase-keys "^1.0.0"
-
-restore-cursor@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
-  dependencies:
-    exit-hook "^1.0.0"
-    onetime "^1.0.0"
-
-restore-cursor@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
-  dependencies:
-    onetime "^2.0.0"
-    signal-exit "^3.0.2"
-
-ret@~0.1.10:
-  version "0.1.15"
-  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
-
-right-align@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
-  dependencies:
-    align-text "^0.1.1"
-
-rimraf@2, rimraf@2.6.2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
-  dependencies:
-    glob "^7.0.5"
-
-rimraf@~2.2.6:
-  version "2.2.8"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
-
-ripemd160@^2.0.0, ripemd160@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
-  dependencies:
-    hash-base "^3.0.0"
-    inherits "^2.0.1"
-
-rndstr@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/rndstr/-/rndstr-1.0.0.tgz#77e66fa8f9b4836853fdd91e50719591bb67d349"
-  dependencies:
-    rangestr "0.0.1"
-    seedrandom "2.4.2"
-
-rsvp@^4.7.0:
-  version "4.8.2"
-  resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.2.tgz#9d5647108735784eb13418cdddb56f75b919d722"
-
-run-async@^2.0.0, run-async@^2.2.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
-  dependencies:
-    is-promise "^2.1.0"
-
-run-queue@^1.0.0, run-queue@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
-  dependencies:
-    aproba "^1.1.1"
-
-rx-lite-aggregates@^4.0.8:
-  version "4.0.8"
-  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
-  dependencies:
-    rx-lite "*"
-
-rx-lite@*, rx-lite@^4.0.8:
-  version "4.0.8"
-  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
-
-rx@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
-
-rxjs@^5.5.2:
-  version "5.5.11"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87"
-  dependencies:
-    symbol-observable "1.0.1"
-
-rxjs@^6.1.0:
-  version "6.2.1"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1"
-  dependencies:
-    tslib "^1.9.0"
-
-s-age@1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/s-age/-/s-age-1.1.2.tgz#c0cf15233ccc93f41de92ea42c36d957977d1ea2"
-
-safe-buffer@5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
-
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
-
-safe-regex@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
-  dependencies:
-    ret "~0.1.10"
-
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
-
-sass-graph@^2.2.4:
-  version "2.2.4"
-  resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
-  dependencies:
-    glob "^7.0.0"
-    lodash "^4.0.0"
-    scss-tokenizer "^0.2.3"
-    yargs "^7.0.0"
-
-sass-loader@7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.1.tgz#fd937259ccba3a9cfe0d5f8a98746d48adfcc261"
-  dependencies:
-    clone-deep "^2.0.1"
-    loader-utils "^1.0.1"
-    lodash.tail "^4.1.1"
-    neo-async "^2.5.0"
-    pify "^3.0.0"
-
-sax@0.5.x:
-  version "0.5.8"
-  resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
-
-sax@^1.2.4, sax@~1.2.1, sax@~1.2.4:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
-
-schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5:
-  version "0.4.5"
-  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
-  dependencies:
-    ajv "^6.1.0"
-    ajv-keywords "^3.1.0"
-
-scoped-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8"
-
-scss-tokenizer@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
-  dependencies:
-    js-base64 "^2.1.8"
-    source-map "^0.4.2"
-
-seedrandom@2.4.2:
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.2.tgz#18d78c41287d13aff8eadb29e235938b248aa9ff"
-
-seedrandom@2.4.3:
-  version "2.4.3"
-  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc"
-
-seek-bzip@^1.0.3:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
-  dependencies:
-    commander "~2.8.1"
-
-semver-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9"
-
-semver-truncate@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
-  dependencies:
-    semver "^5.3.0"
-
-"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0:
-  version "5.5.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
-
-semver@^4.0.3, semver@^4.1.0:
-  version "4.3.6"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
-
-semver@~5.3.0:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
-
-send@0.16.2:
-  version "0.16.2"
-  resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
-  dependencies:
-    debug "2.6.9"
-    depd "~1.1.2"
-    destroy "~1.0.4"
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    etag "~1.8.1"
-    fresh "0.5.2"
-    http-errors "~1.6.2"
-    mime "1.4.1"
-    ms "2.0.0"
-    on-finished "~2.3.0"
-    range-parser "~1.2.0"
-    statuses "~1.4.0"
-
-sequencify@~0.0.7:
-  version "0.0.7"
-  resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
-
-serialize-javascript@^1.4.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
-
-serve-static@1.13.2:
-  version "1.13.2"
-  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
-  dependencies:
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    parseurl "~1.3.2"
-    send "0.16.2"
-
-set-blocking@^2.0.0, set-blocking@~2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
-
-set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
-
-set-value@^0.4.3:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-extendable "^0.1.1"
-    is-plain-object "^2.0.1"
-    to-object-path "^0.3.0"
-
-set-value@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-extendable "^0.1.1"
-    is-plain-object "^2.0.3"
-    split-string "^3.0.1"
-
-setimmediate@^1.0.4:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
-
-setprototypeof@1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
-
-setprototypeof@1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
-
-sha.js@^2.4.0, sha.js@^2.4.8:
-  version "2.4.11"
-  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
-  dependencies:
-    inherits "^2.0.1"
-    safe-buffer "^5.0.1"
-
-shallow-clone@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
-  dependencies:
-    is-extendable "^0.1.1"
-    kind-of "^5.0.0"
-    mixin-object "^2.0.1"
-
-shebang-command@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
-  dependencies:
-    shebang-regex "^1.0.0"
-
-shebang-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
-
-shell-quote@*:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
-  dependencies:
-    array-filter "~0.0.0"
-    array-map "~0.0.0"
-    array-reduce "~0.0.0"
-    jsonify "~0.0.0"
-
-shelljs@^0.8.0:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35"
-  dependencies:
-    glob "^7.0.0"
-    interpret "^1.0.0"
-    rechoir "^0.6.2"
-
-shvl@^1.3.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/shvl/-/shvl-1.3.1.tgz#6c20a17b4a20b08e9f8cab60c50a92229fcc176e"
-
-sigmund@^1.0.1, sigmund@~1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
-
-signal-exit@^3.0.0, signal-exit@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
-
-single-line-log@1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364"
-  dependencies:
-    string-width "^1.0.1"
-
-slash@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
-
-slice-ansi@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
-
-slice-ansi@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
-  dependencies:
-    is-fullwidth-code-point "^2.0.0"
-
-slide@^1.1.5, slide@~1.1.3:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
-
-snapdragon-node@^2.0.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
-  dependencies:
-    define-property "^1.0.0"
-    isobject "^3.0.0"
-    snapdragon-util "^3.0.1"
-
-snapdragon-util@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
-  dependencies:
-    kind-of "^3.2.0"
-
-snapdragon@^0.8.1:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
-  dependencies:
-    base "^0.11.1"
-    debug "^2.2.0"
-    define-property "^0.2.5"
-    extend-shallow "^2.0.1"
-    map-cache "^0.2.2"
-    source-map "^0.5.6"
-    source-map-resolve "^0.5.0"
-    use "^3.1.0"
-
-sntp@1.x.x:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
-  dependencies:
-    hoek "2.x.x"
-
-sntp@2.x.x:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
-  dependencies:
-    hoek "4.x.x"
-
-sort-keys@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
-  dependencies:
-    is-plain-obj "^1.0.0"
-
-sort-keys@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
-  dependencies:
-    is-plain-obj "^1.0.0"
-
-sortablejs@^1.7.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28"
-
-source-list-map@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
-
-source-list-map@~0.1.7:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
-
-source-map-resolve@^0.5.0, source-map-resolve@^0.5.1:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
-  dependencies:
-    atob "^2.1.1"
-    decode-uri-component "^0.2.0"
-    resolve-url "^0.2.1"
-    source-map-url "^0.4.0"
-    urix "^0.1.0"
-
-source-map-support@^0.4.15:
-  version "0.4.18"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
-  dependencies:
-    source-map "^0.5.6"
-
-source-map-support@^0.5.3:
-  version "0.5.6"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
-  dependencies:
-    buffer-from "^1.0.0"
-    source-map "^0.6.0"
-
-source-map-url@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
-
-source-map@0.1.x, source-map@^0.1.38:
-  version "0.1.43"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
-  dependencies:
-    amdefine ">=0.0.4"
-
-source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
-  version "0.5.7"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
-
-source-map@^0.4.2, source-map@~0.4.1:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
-  dependencies:
-    amdefine ">=0.0.4"
-
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
-  version "0.6.1"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
-
-sparkles@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
-
-spawn-sync@^1.0.15:
-  version "1.0.15"
-  resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
-  dependencies:
-    concat-stream "^1.4.7"
-    os-shim "^0.1.2"
-
-spdx-compare@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7"
-  dependencies:
-    array-find-index "^1.0.2"
-    spdx-expression-parse "^3.0.0"
-    spdx-ranges "^2.0.0"
-
-spdx-correct@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
-  dependencies:
-    spdx-expression-parse "^3.0.0"
-    spdx-license-ids "^3.0.0"
-
-spdx-exceptions@^1.0.0:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz#9d21ac4da4bdb71d060fb74e5a67531d032cbba6"
-
-spdx-exceptions@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
-
-spdx-expression-parse@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
-  dependencies:
-    spdx-exceptions "^2.1.0"
-    spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^1.0.0:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
-
-spdx-license-ids@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
-
-spdx-ranges@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.0.0.tgz#257686798e5edb41d45c1aba3d3f1bb47af8d5ec"
-
-spdx-satisfies@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz#ebc79eec88b68ac75618e2e5ee94fbc347587552"
-  dependencies:
-    spdx-compare "^1.0.0"
-    spdx-expression-parse "^3.0.0"
-    spdx-ranges "^2.0.0"
-
-spdx@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.1.tgz#d36c275088b48d75a9046cd44a838ce4b5339998"
-  dependencies:
-    spdx-exceptions "^1.0.0"
-    spdx-license-ids "^1.0.0"
-
-speakeasy@2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a"
-  dependencies:
-    base32.js "0.0.1"
-
-split-string@^3.0.1, split-string@^3.0.2:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
-  dependencies:
-    extend-shallow "^3.0.0"
-
-sprintf-js@~1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
-
-squeak@^1.0.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
-  dependencies:
-    chalk "^1.0.0"
-    console-stream "^0.1.1"
-    lpad-align "^1.0.1"
-
-sshpk@^1.7.0:
-  version "1.14.2"
-  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
-  dependencies:
-    asn1 "~0.2.3"
-    assert-plus "^1.0.0"
-    dashdash "^1.12.0"
-    getpass "^0.1.1"
-    safer-buffer "^2.0.2"
-  optionalDependencies:
-    bcrypt-pbkdf "^1.0.0"
-    ecc-jsbn "~0.1.1"
-    jsbn "~0.1.0"
-    tweetnacl "~0.14.0"
-
-ssri@^5.2.4:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
-  dependencies:
-    safe-buffer "^5.1.1"
-
-stable@~0.1.6:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
-
-stat-mode@^0.2.0:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502"
-
-static-extend@^0.1.1:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
-  dependencies:
-    define-property "^0.2.5"
-    object-copy "^0.1.0"
-
-"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", statuses@^1.0.0, statuses@^1.2.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
-
-statuses@~1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
-
-stdout-stream@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b"
-  dependencies:
-    readable-stream "^2.0.1"
-
-stealthy-require@^1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
-
-stream-browserify@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
-  dependencies:
-    inherits "~2.0.1"
-    readable-stream "^2.0.2"
-
-stream-combiner2@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
-  dependencies:
-    duplexer2 "~0.1.0"
-    readable-stream "^2.0.2"
-
-stream-consume@~0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
-
-stream-each@^1.1.0:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
-  dependencies:
-    end-of-stream "^1.1.0"
-    stream-shift "^1.0.0"
-
-stream-http@^2.7.2:
-  version "2.8.3"
-  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
-  dependencies:
-    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-shift@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
-
-streamsearch@0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
-
-strict-uri-encode@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
-
-string-template@~0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
-
-string-width@^1.0.1, string-width@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
-  dependencies:
-    code-point-at "^1.0.0"
-    is-fullwidth-code-point "^1.0.0"
-    strip-ansi "^3.0.0"
-
-"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
-  dependencies:
-    is-fullwidth-code-point "^2.0.0"
-    strip-ansi "^4.0.0"
-
-string_decoder@^1.0.0, string_decoder@~1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
-  dependencies:
-    safe-buffer "~5.1.0"
-
-string_decoder@~0.10.x:
-  version "0.10.31"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
-
-string_decoder@~1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
-  dependencies:
-    safe-buffer "~5.1.0"
-
-stringstream@~0.0.4, stringstream@~0.0.5:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72"
-
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
-  dependencies:
-    ansi-regex "^2.0.0"
-
-strip-ansi@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
-  dependencies:
-    ansi-regex "^3.0.0"
-
-strip-ansi@~0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
-
-strip-bom-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
-  dependencies:
-    first-chunk-stream "^1.0.0"
-    strip-bom "^2.0.0"
-
-strip-bom-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca"
-  dependencies:
-    first-chunk-stream "^2.0.0"
-    strip-bom "^2.0.0"
-
-strip-bom-string@1.X:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
-
-strip-bom@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
-  dependencies:
-    first-chunk-stream "^1.0.0"
-    is-utf8 "^0.2.0"
-
-strip-bom@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
-  dependencies:
-    is-utf8 "^0.2.0"
-
-strip-bom@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
-
-strip-dirs@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0"
-  dependencies:
-    chalk "^1.0.0"
-    get-stdin "^4.0.1"
-    is-absolute "^0.1.5"
-    is-natural-number "^2.0.0"
-    minimist "^1.1.0"
-    sum-up "^1.0.1"
-
-strip-eof@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
-
-strip-indent@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
-  dependencies:
-    get-stdin "^4.0.1"
-
-strip-json-comments@~2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
-
-strip-outer@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
-  dependencies:
-    escape-string-regexp "^1.0.2"
-
-style-loader@0.21.0:
-  version "0.21.0"
-  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852"
-  dependencies:
-    loader-utils "^1.1.0"
-    schema-utils "^0.4.5"
-
-stylus-loader@3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6"
-  dependencies:
-    loader-utils "^1.0.2"
-    lodash.clonedeep "^4.5.0"
-    when "~3.6.x"
-
-stylus@0.54.5, stylus@^0.54.0, stylus@~0.54.5:
-  version "0.54.5"
-  resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
-  dependencies:
-    css-parse "1.7.x"
-    debug "*"
-    glob "7.0.x"
-    mkdirp "0.5.x"
-    sax "0.5.x"
-    source-map "0.1.x"
-
-sum-up@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e"
-  dependencies:
-    chalk "^1.0.0"
-
-summaly@2.0.6:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.0.6.tgz#559561e05c267f01e7199a296dd650a994b19053"
-  dependencies:
-    cheerio-httpcli "0.7.2"
-    debug "3.1.0"
-    escape-regexp "0.0.1"
-    html-entities "1.2.1"
-    request "2.85.0"
-    request-promise-native "1.0.5"
-    require-all "2.2.0"
-    trace-redirect "1.0.6"
-
-supports-color@5.4.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0:
-  version "5.4.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
-  dependencies:
-    has-flag "^3.0.0"
-
-supports-color@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
-
-supports-color@^3.2.3:
-  version "3.2.3"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
-  dependencies:
-    has-flag "^1.0.0"
-
-svgo@^0.7.0:
-  version "0.7.2"
-  resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
-  dependencies:
-    coa "~1.0.1"
-    colors "~1.1.2"
-    csso "~2.3.1"
-    js-yaml "~3.7.0"
-    mkdirp "~0.5.1"
-    sax "~1.2.1"
-    whet.extend "~0.9.9"
-
-svgo@^1.0.0:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a"
-  dependencies:
-    coa "~2.0.1"
-    colors "~1.1.2"
-    css-select "~1.3.0-rc0"
-    css-select-base-adapter "~0.1.0"
-    css-tree "1.0.0-alpha25"
-    css-url-regex "^1.1.0"
-    csso "^3.5.0"
-    js-yaml "~3.10.0"
-    mkdirp "~0.5.1"
-    object.values "^1.0.4"
-    sax "~1.2.4"
-    stable "~0.1.6"
-    unquote "~1.1.1"
-    util.promisify "~1.0.0"
-
-swagger-jsdoc@1.9.7:
-  version "1.9.7"
-  resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-1.9.7.tgz#7a761d4d7ef4a54bf457cea5c67ec316bb82f8b9"
-  dependencies:
-    chokidar "^1.7.0"
-    commander "^2.11.0"
-    doctrine "^2.0.0"
-    glob "^7.1.2"
-    js-yaml "^3.8.4"
-    recursive-iterator "^2.0.3"
-    swagger-parser "^3.4.1"
-
-swagger-methods@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.4.tgz#2c5b844f4a22ab2f5e773f98193c28e386b1c37e"
-
-swagger-parser@^3.4.1:
-  version "3.4.2"
-  resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-3.4.2.tgz#244d67d6eeed08c00acb5d95950d5aefbd6185a3"
-  dependencies:
-    call-me-maybe "^1.0.1"
-    debug "^3.0.0"
-    es6-promise "^4.1.1"
-    json-schema-ref-parser "^1.4.1"
-    ono "^4.0.2"
-    swagger-methods "^1.0.0"
-    swagger-schema-official "2.0.0-bab6bed"
-    z-schema "^3.16.1"
-
-swagger-schema-official@2.0.0-bab6bed:
-  version "2.0.0-bab6bed"
-  resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd"
-
-"sylvester@>= 0.0.12", "sylvester@>= 0.0.8":
-  version "0.0.21"
-  resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7"
-
-symbol-observable@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
-
-symbol-observable@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
-
-symbol-tree@^3.2.2:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
-
-syuilo-password-strength@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/syuilo-password-strength/-/syuilo-password-strength-0.0.1.tgz#08f71a8f0ecb77db649f3d9a6424510d9d945f52"
-
-table@4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
-  dependencies:
-    ajv "^5.2.3"
-    ajv-keywords "^2.1.0"
-    chalk "^2.1.0"
-    lodash "^4.17.4"
-    slice-ansi "1.0.0"
-    string-width "^2.1.1"
-
-tapable@^1.0.0, tapable@^1.0.0-beta.5:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
-
-tar-stream@^1.1.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395"
-  dependencies:
-    bl "^1.0.0"
-    buffer-alloc "^1.1.0"
-    end-of-stream "^1.0.0"
-    fs-constants "^1.0.0"
-    readable-stream "^2.3.0"
-    to-buffer "^1.1.0"
-    xtend "^4.0.0"
-
-tar@^2.0.0:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
-  dependencies:
-    block-stream "*"
-    fstream "^1.0.2"
-    inherits "2"
-
-tar@^4:
-  version "4.4.4"
-  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
-  dependencies:
-    chownr "^1.0.1"
-    fs-minipass "^1.2.5"
-    minipass "^2.3.3"
-    minizlib "^1.1.0"
-    mkdirp "^0.5.0"
-    safe-buffer "^5.1.2"
-    yallist "^3.0.2"
-
-tcp-port-used@0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-0.1.2.tgz#9450e8768c83b416fd4d1a6a9449eeccbf496c29"
-  dependencies:
-    debug "0.7.4"
-    is2 "0.0.9"
-    q "0.9.7"
-
-temp-dir@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
-
-temp@^0.8.1:
-  version "0.8.3"
-  resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
-  dependencies:
-    os-tmpdir "^1.0.0"
-    rimraf "~2.2.6"
-
-tempfile@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2"
-  dependencies:
-    os-tmpdir "^1.0.0"
-    uuid "^2.0.1"
-
-tempfile@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
-  dependencies:
-    temp-dir "^1.0.0"
-    uuid "^3.0.1"
-
-text-table@^0.2.0, text-table@~0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
-
-textarea-caret@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f"
-
-textextensions@2:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286"
-
-thenify-all@^1.0.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
-  dependencies:
-    thenify ">= 3.1.0 < 4"
-
-"thenify@>= 3.1.0 < 4":
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
-  dependencies:
-    any-promise "^1.0.0"
-
-throttle-debounce@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd"
-
-through2-concurrent@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-1.1.1.tgz#11cb4ea4c9e31bca6e4c1e6dba48d1c728c3524b"
-  dependencies:
-    through2 "^2.0.0"
-
-through2-filter@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
-  dependencies:
-    through2 "~2.0.0"
-    xtend "~4.0.0"
-
-through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
-  dependencies:
-    readable-stream "^2.1.5"
-    xtend "~4.0.1"
-
-through2@^0.6.0, through2@^0.6.1:
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
-  dependencies:
-    readable-stream ">=1.0.33-1 <1.1.0-0"
-    xtend ">=4.0.0 <4.1.0-0"
-
-through@^2.3.6, through@~2.3.8:
-  version "2.3.8"
-  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
-
-tildify@^1.0.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
-  dependencies:
-    os-homedir "^1.0.0"
-
-time-stamp@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
-
-timed-out@^3.0.0:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
-
-timed-out@^4.0.0, timed-out@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
-
-timers-browserify@^2.0.4:
-  version "2.0.10"
-  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
-  dependencies:
-    setimmediate "^1.0.4"
-
-timers-ext@^0.1.2:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922"
-  dependencies:
-    es5-ext "~0.10.14"
-    next-tick "1"
-
-tmp@0.0.33, tmp@^0.0.33:
-  version "0.0.33"
-  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
-  dependencies:
-    os-tmpdir "~1.0.2"
-
-to-absolute-glob@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
-  dependencies:
-    extend-shallow "^2.0.1"
-
-to-absolute-glob@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
-  dependencies:
-    is-absolute "^1.0.0"
-    is-negated-glob "^1.0.0"
-
-to-arraybuffer@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
-
-to-buffer@^1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
-
-to-fast-properties@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
-
-to-object-path@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
-  dependencies:
-    kind-of "^3.0.2"
-
-to-regex-range@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
-  dependencies:
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-
-to-regex@^3.0.1, to-regex@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
-  dependencies:
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    regex-not "^1.0.2"
-    safe-regex "^1.1.0"
-
-to-through@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
-  dependencies:
-    through2 "^2.0.3"
-
-token-stream@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
-
-tough-cookie@>=2.3.3, tough-cookie@^2.3.3:
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c"
-  dependencies:
-    psl "^1.1.24"
-    punycode "^1.4.1"
-
-tough-cookie@~2.3.0, tough-cookie@~2.3.3:
-  version "2.3.4"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
-  dependencies:
-    punycode "^1.4.1"
-
-tr46@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
-  dependencies:
-    punycode "^2.1.0"
-
-trace-redirect@1.0.6:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504"
-
-treeify@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8"
-
-trim-newlines@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
-
-trim-repeated@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
-  dependencies:
-    escape-string-regexp "^1.0.2"
-
-trim-right@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
-
-"true-case-path@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62"
-  dependencies:
-    glob "^6.0.4"
-
-tryit@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
-
-ts-loader@4.3.0:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.3.0.tgz#4e3ba172783d1256d3a23bdfadde011a795fae9e"
-  dependencies:
-    chalk "^2.3.0"
-    enhanced-resolve "^4.0.0"
-    loader-utils "^1.0.2"
-    micromatch "^3.1.4"
-    semver "^5.0.1"
-
-ts-node@6.0.4:
-  version "6.0.4"
-  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.4.tgz#245af3a8cdf3baa1121893fe12b9a54ee297c4c5"
-  dependencies:
-    arrify "^1.0.0"
-    chalk "^2.3.0"
-    diff "^3.1.0"
-    make-error "^1.1.1"
-    minimist "^1.2.0"
-    mkdirp "^0.5.1"
-    source-map-support "^0.5.3"
-    yn "^2.0.0"
-
-tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
-  version "1.9.2"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e"
-
-tslint@5.10.0:
-  version "5.10.0"
-  resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3"
-  dependencies:
-    babel-code-frame "^6.22.0"
-    builtin-modules "^1.1.1"
-    chalk "^2.3.0"
-    commander "^2.12.1"
-    diff "^3.2.0"
-    glob "^7.1.1"
-    js-yaml "^3.7.0"
-    minimatch "^3.0.4"
-    resolve "^1.3.2"
-    semver "^5.3.0"
-    tslib "^1.8.0"
-    tsutils "^2.12.1"
-
-tsutils@^2.12.1:
-  version "2.27.1"
-  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.1.tgz#ab0276ac23664f36ce8fd4414daec4aebf4373ee"
-  dependencies:
-    tslib "^1.8.1"
-
-tty-browserify@0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
-
-tunnel-agent@^0.4.0, tunnel-agent@~0.4.1:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
-
-tunnel-agent@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
-  dependencies:
-    safe-buffer "^5.0.1"
-
-tweetnacl@^0.14.3, tweetnacl@~0.14.0:
-  version "0.14.5"
-  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
-
-type-check@~0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
-  dependencies:
-    prelude-ls "~1.1.2"
-
-type-is@^1.5.5, type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16:
-  version "1.6.16"
-  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
-  dependencies:
-    media-typer "0.3.0"
-    mime-types "~2.1.18"
-
-type-of@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972"
-
-typedarray-to-buffer@^3.1.2:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
-  dependencies:
-    is-typedarray "^1.0.0"
-
-typedarray@^0.0.6:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
-
-typescript-eslint-parser@15.0.0:
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f"
-  dependencies:
-    lodash.unescape "4.0.1"
-    semver "5.5.0"
-
-typescript@2.8.3:
-  version "2.8.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
-
-uglify-es@3.3.9, uglify-es@^3.3.4:
-  version "3.3.9"
-  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
-  dependencies:
-    commander "~2.13.0"
-    source-map "~0.6.1"
-
-uglify-js@3.3.x:
-  version "3.3.28"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06"
-  dependencies:
-    commander "~2.15.0"
-    source-map "~0.6.1"
-
-uglify-js@^2.6.1, uglify-js@^2.7.0:
-  version "2.8.29"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
-  dependencies:
-    source-map "~0.5.1"
-    yargs "~3.10.0"
-  optionalDependencies:
-    uglify-to-browserify "~1.0.0"
-
-uglify-js@^3.0.5:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d"
-  dependencies:
-    commander "~2.15.0"
-    source-map "~0.6.1"
-
-uglify-to-browserify@~1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
-
-uglifyjs-webpack-plugin@^1.2.4:
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641"
-  dependencies:
-    cacache "^10.0.4"
-    find-cache-dir "^1.0.0"
-    schema-utils "^0.4.5"
-    serialize-javascript "^1.4.0"
-    source-map "^0.6.1"
-    uglify-es "^3.3.4"
-    webpack-sources "^1.1.0"
-    worker-farm "^1.5.2"
-
-unc-path-regex@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
-
-underscore@>=1.3.1:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
-
-underscore@~1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
-
-union-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
-  dependencies:
-    arr-union "^3.1.0"
-    get-value "^2.0.6"
-    is-extendable "^0.1.1"
-    set-value "^0.4.3"
-
-uniq@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
-
-uniqs@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
-
-unique-filename@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
-  dependencies:
-    unique-slug "^2.0.0"
-
-unique-slug@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
-  dependencies:
-    imurmurhash "^0.1.4"
-
-unique-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
-
-unique-stream@^2.0.2:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369"
-  dependencies:
-    json-stable-stringify "^1.0.0"
-    through2-filter "^2.0.0"
-
-universalify@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
-
-unpipe@1.0.0, unpipe@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
-
-unquote@~1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
-
-unset-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
-  dependencies:
-    has-value "^0.3.1"
-    isobject "^3.0.0"
-
-untildify@^3.0.2:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9"
-
-unzip-response@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
-
-upath@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
-
-upper-case@^1.1.1:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
-
-uri-js@^4.2.1:
-  version "4.2.2"
-  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
-  dependencies:
-    punycode "^2.1.0"
-
-urijs@^1.19.0:
-  version "1.19.1"
-  resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a"
-
-urix@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
-
-url-loader@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee"
-  dependencies:
-    loader-utils "^1.1.0"
-    mime "^2.0.3"
-    schema-utils "^0.4.3"
-
-url-parse-lax@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
-  dependencies:
-    prepend-http "^1.0.1"
-
-url-parse-lax@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
-  dependencies:
-    prepend-http "^2.0.0"
-
-url-regex@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
-  dependencies:
-    ip-regex "^1.0.1"
-
-url-to-options@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
-
-url@^0.11.0:
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
-  dependencies:
-    punycode "1.3.2"
-    querystring "0.2.0"
-
-urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6"
-
-use@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
-  dependencies:
-    kind-of "^6.0.2"
-
-user-home@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
-
-util-deprecate@~1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
-
-util-extend@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
-
-util.promisify@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
-  dependencies:
-    define-properties "^1.1.2"
-    object.getownpropertydescriptors "^2.0.3"
-
-util@0.10.3:
-  version "0.10.3"
-  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
-  dependencies:
-    inherits "2.0.1"
-
-util@^0.10.3:
-  version "0.10.4"
-  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
-  dependencies:
-    inherits "2.0.3"
-
-utils-merge@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
-
-uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
-
-uuid@^2.0.1:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
-
-v-animate-css@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/v-animate-css/-/v-animate-css-0.0.2.tgz#61f233b641de5ab544ab50bc5450c747030e3bde"
-
-v8-compile-cache@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a"
-
-v8flags@^2.0.2:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
-  dependencies:
-    user-home "^1.1.1"
-
-vali-date@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6"
-
-valid-url@^1.0.9:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
-
-validate-npm-package-license@^3.0.1:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
-  dependencies:
-    spdx-correct "^3.0.0"
-    spdx-expression-parse "^3.0.0"
-
-validator@^10.0.0:
-  version "10.3.0"
-  resolved "https://registry.yarnpkg.com/validator/-/validator-10.3.0.tgz#157a8c0981858cff381f59aabcdb8f83b57317cc"
-
-value-or-function@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
-
-vary@^1.0.0, vary@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
-
-vendors@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801"
-
-verror@1.10.0:
-  version "1.10.0"
-  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
-  dependencies:
-    assert-plus "^1.0.0"
-    core-util-is "1.0.2"
-    extsprintf "^1.2.0"
-
-vinyl-assign@^1.0.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45"
-  dependencies:
-    object-assign "^4.0.1"
-    readable-stream "^2.0.0"
-
-vinyl-file@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a"
-  dependencies:
-    graceful-fs "^4.1.2"
-    pify "^2.3.0"
-    pinkie-promise "^2.0.0"
-    strip-bom "^2.0.0"
-    strip-bom-stream "^2.0.0"
-    vinyl "^1.1.0"
-
-vinyl-fs@^0.3.0:
-  version "0.3.14"
-  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
-  dependencies:
-    defaults "^1.0.0"
-    glob-stream "^3.1.5"
-    glob-watcher "^0.0.6"
-    graceful-fs "^3.0.0"
-    mkdirp "^0.5.0"
-    strip-bom "^1.0.0"
-    through2 "^0.6.1"
-    vinyl "^0.4.0"
-
-vinyl-fs@^2.2.0:
-  version "2.4.4"
-  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239"
-  dependencies:
-    duplexify "^3.2.0"
-    glob-stream "^5.3.2"
-    graceful-fs "^4.0.0"
-    gulp-sourcemaps "1.6.0"
-    is-valid-glob "^0.3.0"
-    lazystream "^1.0.0"
-    lodash.isequal "^4.0.0"
-    merge-stream "^1.0.0"
-    mkdirp "^0.5.0"
-    object-assign "^4.0.0"
-    readable-stream "^2.0.4"
-    strip-bom "^2.0.0"
-    strip-bom-stream "^1.0.0"
-    through2 "^2.0.0"
-    through2-filter "^2.0.0"
-    vali-date "^1.0.0"
-    vinyl "^1.0.0"
-
-vinyl-fs@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
-  dependencies:
-    fs-mkdirp-stream "^1.0.0"
-    glob-stream "^6.1.0"
-    graceful-fs "^4.0.0"
-    is-valid-glob "^1.0.0"
-    lazystream "^1.0.0"
-    lead "^1.0.0"
-    object.assign "^4.0.4"
-    pumpify "^1.3.5"
-    readable-stream "^2.3.3"
-    remove-bom-buffer "^3.0.0"
-    remove-bom-stream "^1.2.0"
-    resolve-options "^1.1.0"
-    through2 "^2.0.0"
-    to-through "^2.0.0"
-    value-or-function "^3.0.0"
-    vinyl "^2.0.0"
-    vinyl-sourcemap "^1.1.0"
-
-vinyl-sourcemap@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
-  dependencies:
-    append-buffer "^1.0.2"
-    convert-source-map "^1.5.0"
-    graceful-fs "^4.1.6"
-    normalize-path "^2.1.1"
-    now-and-later "^2.0.0"
-    remove-bom-buffer "^3.0.0"
-    vinyl "^2.0.0"
-
-vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
-  dependencies:
-    source-map "^0.5.1"
-
-vinyl@^0.4.0, vinyl@^0.4.3:
-  version "0.4.6"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
-  dependencies:
-    clone "^0.2.0"
-    clone-stats "^0.0.1"
-
-vinyl@^0.5.0:
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
-  dependencies:
-    clone "^1.0.0"
-    clone-stats "^0.0.1"
-    replace-ext "0.0.1"
-
-vinyl@^1.0.0, vinyl@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
-  dependencies:
-    clone "^1.0.0"
-    clone-stats "^0.0.1"
-    replace-ext "0.0.1"
-
-vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c"
-  dependencies:
-    clone "^2.1.1"
-    clone-buffer "^1.0.0"
-    clone-stats "^1.0.0"
-    cloneable-readable "^1.0.0"
-    remove-trailing-separator "^1.0.1"
-    replace-ext "^1.0.0"
-
-vm-browserify@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
-  dependencies:
-    indexof "0.0.1"
-
-void-elements@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
-
-vue-cropperjs@2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/vue-cropperjs/-/vue-cropperjs-2.2.0.tgz#cd8f00ee01914e86f114ee8aa3f7354e3c76a8fc"
-  dependencies:
-    cropperjs "^1.1.3"
-
-vue-eslint-parser@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
-  dependencies:
-    debug "^3.1.0"
-    eslint-scope "^3.7.1"
-    eslint-visitor-keys "^1.0.0"
-    espree "^3.5.2"
-    esquery "^1.0.0"
-    lodash "^4.17.4"
-
-vue-functional-data-merge@^2.0.5:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.6.tgz#f08055adfb92458debcf2ad10c3aa712277f7fc2"
-
-vue-hot-reload-api@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
-
-vue-js-modal@1.3.13:
-  version "1.3.13"
-  resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-1.3.13.tgz#1718c3182a94a03e03422db50c60229bbbd53f18"
-
-vue-json-tree-view@2.1.4:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.4.tgz#b6f8ae2ba2eec4eec5b6f53b90fa187054cad79b"
-  dependencies:
-    lodash "^4.17.4"
-    vue "^2.5.16"
-
-vue-loader@15.2.1:
-  version "15.2.1"
-  resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.2.1.tgz#89a13b6b7dec63614729c73b1b46a571a69bb20e"
-  dependencies:
-    "@vue/component-compiler-utils" "^1.2.1"
-    hash-sum "^1.0.2"
-    loader-utils "^1.1.0"
-    vue-hot-reload-api "^2.3.0"
-    vue-style-loader "^4.1.0"
-
-vue-router@3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9"
-
-vue-style-loader@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863"
-  dependencies:
-    hash-sum "^1.0.2"
-    loader-utils "^1.0.2"
-
-vue-template-compiler@2.5.16:
-  version "2.5.16"
-  resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb"
-  dependencies:
-    de-indent "^1.0.2"
-    he "^1.1.0"
-
-vue-template-es2015-compiler@^1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18"
-
-vue@2.5.16, vue@^2.5.16:
-  version "2.5.16"
-  resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.16.tgz#07edb75e8412aaeed871ebafa99f4672584a0085"
-
-vuedraggable@2.16.0:
-  version "2.16.0"
-  resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.16.0.tgz#52127081a2adb3de5fabd214d404ff3eee63575a"
-  dependencies:
-    sortablejs "^1.7.0"
-
-vuex-persistedstate@^2.5.4:
-  version "2.5.4"
-  resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-2.5.4.tgz#a19710ad7f9a08cea4e65fc585924d9fdac7384a"
-  dependencies:
-    deepmerge "^2.1.0"
-    shvl "^1.3.0"
-
-vuex@3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2"
-
-w3c-hr-time@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
-  dependencies:
-    browser-process-hrtime "^0.1.2"
-
-ware@^1.2.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4"
-  dependencies:
-    wrap-fn "^0.1.0"
-
-watchpack@^1.5.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
-  dependencies:
-    chokidar "^2.0.2"
-    graceful-fs "^4.1.2"
-    neo-async "^2.5.0"
-
-web-push@3.3.1:
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.3.1.tgz#6d49517b927ffb97241a719d2f7f9014de130f09"
-  dependencies:
-    asn1.js "^5.0.0"
-    http_ece "1.0.5"
-    https-proxy-agent "^2.2.1"
-    jws "^3.1.3"
-    minimist "^1.2.0"
-    urlsafe-base64 "^1.0.0"
-
-webassemblyjs@1.4.3:
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.4.3.tgz#0591893efb8fbde74498251cbe4b2d83df9239cb"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/validation" "1.4.3"
-    "@webassemblyjs/wasm-parser" "1.4.3"
-    "@webassemblyjs/wast-parser" "1.4.3"
-    long "^3.2.0"
-
-webfinger.js@2.6.6:
-  version "2.6.6"
-  resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae"
-  dependencies:
-    xhr2 "^0.1.4"
-
-webidl-conversions@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
-
-webpack-addons@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/webpack-addons/-/webpack-addons-1.1.5.tgz#2b178dfe873fb6e75e40a819fa5c26e4a9bc837a"
-  dependencies:
-    jscodeshift "^0.4.0"
-
-webpack-cli@2.1.4:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.4.tgz#cab81e79249127384fb69b2fdfe2055f9c771b76"
-  dependencies:
-    chalk "^2.4.1"
-    cross-spawn "^6.0.5"
-    diff "^3.5.0"
-    enhanced-resolve "^4.0.0"
-    envinfo "^5.7.0"
-    glob-all "^3.1.0"
-    global-modules "^1.0.0"
-    got "^8.3.1"
-    import-local "^1.0.0"
-    inquirer "^5.2.0"
-    interpret "^1.1.0"
-    jscodeshift "^0.5.0"
-    listr "^0.14.1"
-    loader-utils "^1.1.0"
-    lodash "^4.17.10"
-    log-symbols "^2.2.0"
-    mkdirp "^0.5.1"
-    p-each-series "^1.0.0"
-    p-lazy "^1.0.0"
-    prettier "^1.12.1"
-    supports-color "^5.4.0"
-    v8-compile-cache "^2.0.0"
-    webpack-addons "^1.1.5"
-    yargs "^11.1.0"
-    yeoman-environment "^2.1.1"
-    yeoman-generator "^2.0.5"
-
-webpack-core@~0.6.0:
-  version "0.6.9"
-  resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
-  dependencies:
-    source-list-map "~0.1.7"
-    source-map "~0.4.1"
-
-webpack-sources@^1.0.1, webpack-sources@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
-  dependencies:
-    source-list-map "^2.0.0"
-    source-map "~0.6.1"
-
-webpack@4.9.1:
-  version "4.9.1"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.9.1.tgz#fa7bd738b17fd7f09f37da461b2f5c16c6565f34"
-  dependencies:
-    "@webassemblyjs/ast" "1.4.3"
-    "@webassemblyjs/wasm-edit" "1.4.3"
-    "@webassemblyjs/wasm-parser" "1.4.3"
-    acorn "^5.0.0"
-    acorn-dynamic-import "^3.0.0"
-    ajv "^6.1.0"
-    ajv-keywords "^3.1.0"
-    chrome-trace-event "^0.1.1"
-    enhanced-resolve "^4.0.0"
-    eslint-scope "^3.7.1"
-    json-parse-better-errors "^1.0.2"
-    loader-runner "^2.3.0"
-    loader-utils "^1.1.0"
-    memory-fs "~0.4.1"
-    micromatch "^3.1.8"
-    mkdirp "~0.5.0"
-    neo-async "^2.5.0"
-    node-libs-browser "^2.0.0"
-    schema-utils "^0.4.4"
-    tapable "^1.0.0"
-    uglifyjs-webpack-plugin "^1.2.4"
-    watchpack "^1.5.0"
-    webpack-sources "^1.0.1"
-
-websocket@1.0.26:
-  version "1.0.26"
-  resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194"
-  dependencies:
-    debug "^2.2.0"
-    nan "^2.3.3"
-    typedarray-to-buffer "^3.1.2"
-    yaeti "^0.0.6"
-
-whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
-  dependencies:
-    iconv-lite "0.4.19"
-
-whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4"
-
-whatwg-url@^6.4.0, whatwg-url@^6.4.1:
-  version "6.5.0"
-  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
-  dependencies:
-    lodash.sortby "^4.7.0"
-    tr46 "^1.0.1"
-    webidl-conversions "^4.0.2"
-
-when@^3.7.7:
-  version "3.7.8"
-  resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
-
-when@~3.6.x:
-  version "3.6.4"
-  resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e"
-
-whet.extend@~0.9.9:
-  version "0.9.9"
-  resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
-
-which-module@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
-
-which-module@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
-
-which@1, which@^1.2.14, which@^1.2.9:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
-  dependencies:
-    isexe "^2.0.0"
-
-wide-align@^1.1.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
-  dependencies:
-    string-width "^1.0.2 || 2"
-
-window-or-global@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de"
-
-window-size@0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
-
-window-size@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
-
-with@^5.0.0:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
-  dependencies:
-    acorn "^3.1.0"
-    acorn-globals "^3.0.0"
-
-wordwrap@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
-
-wordwrap@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
-
-worker-farm@^1.5.2:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
-  dependencies:
-    errno "~0.1.7"
-
-wrap-ansi@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
-  dependencies:
-    string-width "^1.0.1"
-    strip-ansi "^3.0.1"
-
-wrap-fn@^0.1.0:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845"
-  dependencies:
-    co "3.1.0"
-
-wrappy@1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-
-write-file-atomic@^1.2.0:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
-  dependencies:
-    graceful-fs "^4.1.11"
-    imurmurhash "^0.1.4"
-    slide "^1.1.5"
-
-write-file-atomic@^2.0.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
-  dependencies:
-    graceful-fs "^4.1.11"
-    imurmurhash "^0.1.4"
-    signal-exit "^3.0.2"
-
-write-json-file@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
-  dependencies:
-    detect-indent "^5.0.0"
-    graceful-fs "^4.1.2"
-    make-dir "^1.0.0"
-    pify "^3.0.0"
-    sort-keys "^2.0.0"
-    write-file-atomic "^2.0.0"
-
-write@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
-  dependencies:
-    mkdirp "^0.5.1"
-
-ws@5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.0.tgz#9fd95e3ac7c76f6ae8bcc868a0e3f11f1290c33e"
-  dependencies:
-    async-limiter "~1.0.0"
-
-ws@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
-  dependencies:
-    async-limiter "~1.0.0"
-    safe-buffer "~5.1.0"
-
-xev@2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7"
-
-xhr2@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f"
-
-xml-name-validator@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
-
-"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
-
-y18n@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
-
-y18n@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
-
-yaeti@^0.0.6:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
-
-yallist@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
-
-yallist@^3.0.0, yallist@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
-
-yargs-parser@^2.4.1:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
-  dependencies:
-    camelcase "^3.0.0"
-    lodash.assign "^4.0.6"
-
-yargs-parser@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
-  dependencies:
-    camelcase "^3.0.0"
-
-yargs-parser@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
-  dependencies:
-    camelcase "^4.1.0"
-
-yargs-parser@^8.1.0:
-  version "8.1.0"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
-  dependencies:
-    camelcase "^4.1.0"
-
-yargs-parser@^9.0.2:
-  version "9.0.2"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
-  dependencies:
-    camelcase "^4.1.0"
-
-yargs@^10.0.3:
-  version "10.1.2"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
-  dependencies:
-    cliui "^4.0.0"
-    decamelize "^1.1.1"
-    find-up "^2.1.0"
-    get-caller-file "^1.0.1"
-    os-locale "^2.0.0"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^2.0.0"
-    which-module "^2.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^8.1.0"
-
-yargs@^11.1.0:
-  version "11.1.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
-  dependencies:
-    cliui "^4.0.0"
-    decamelize "^1.1.1"
-    find-up "^2.1.0"
-    get-caller-file "^1.0.1"
-    os-locale "^2.0.0"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^2.0.0"
-    which-module "^2.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^9.0.2"
-
-yargs@^4.0.0:
-  version "4.8.1"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
-  dependencies:
-    cliui "^3.2.0"
-    decamelize "^1.1.1"
-    get-caller-file "^1.0.1"
-    lodash.assign "^4.0.3"
-    os-locale "^1.4.0"
-    read-pkg-up "^1.0.1"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^1.0.1"
-    which-module "^1.0.0"
-    window-size "^0.2.0"
-    y18n "^3.2.1"
-    yargs-parser "^2.4.1"
-
-yargs@^7.0.0:
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
-  dependencies:
-    camelcase "^3.0.0"
-    cliui "^3.2.0"
-    decamelize "^1.1.1"
-    get-caller-file "^1.0.1"
-    os-locale "^1.4.0"
-    read-pkg-up "^1.0.1"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^1.0.2"
-    which-module "^1.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^5.0.0"
-
-yargs@^8.0.2:
-  version "8.0.2"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
-  dependencies:
-    camelcase "^4.1.0"
-    cliui "^3.2.0"
-    decamelize "^1.1.1"
-    get-caller-file "^1.0.1"
-    os-locale "^2.0.0"
-    read-pkg-up "^2.0.0"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^2.0.0"
-    which-module "^2.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^7.0.0"
-
-yargs@~1.2.6:
-  version "1.2.6"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b"
-  dependencies:
-    minimist "^0.1.0"
-
-yargs@~3.10.0:
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
-  dependencies:
-    camelcase "^1.0.2"
-    cliui "^2.1.0"
-    decamelize "^1.0.0"
-    window-size "0.1.0"
-
-yauzl@^2.2.1:
-  version "2.9.2"
-  resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.2.tgz#4fb1bc7ae1fc2f57037b54af6acc8fe1031c5b77"
-  dependencies:
-    buffer-crc32 "~0.2.3"
-    fd-slicer "~1.1.0"
-
-yeoman-environment@^2.0.5, yeoman-environment@^2.1.1:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.2.0.tgz#6c0ee93a8d962a9f6dbc5ad4e90ae7ab34875393"
-  dependencies:
-    chalk "^2.1.0"
-    cross-spawn "^6.0.5"
-    debug "^3.1.0"
-    diff "^3.3.1"
-    escape-string-regexp "^1.0.2"
-    globby "^8.0.1"
-    grouped-queue "^0.3.3"
-    inquirer "^5.2.0"
-    is-scoped "^1.0.0"
-    lodash "^4.17.10"
-    log-symbols "^2.1.0"
-    mem-fs "^1.1.0"
-    strip-ansi "^4.0.0"
-    text-table "^0.2.0"
-    untildify "^3.0.2"
-
-yeoman-generator@^2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81"
-  dependencies:
-    async "^2.6.0"
-    chalk "^2.3.0"
-    cli-table "^0.3.1"
-    cross-spawn "^6.0.5"
-    dargs "^5.1.0"
-    dateformat "^3.0.3"
-    debug "^3.1.0"
-    detect-conflict "^1.0.0"
-    error "^7.0.2"
-    find-up "^2.1.0"
-    github-username "^4.0.0"
-    istextorbinary "^2.2.1"
-    lodash "^4.17.10"
-    make-dir "^1.1.0"
-    mem-fs-editor "^4.0.0"
-    minimist "^1.2.0"
-    pretty-bytes "^4.0.2"
-    read-chunk "^2.1.0"
-    read-pkg-up "^3.0.0"
-    rimraf "^2.6.2"
-    run-async "^2.0.0"
-    shelljs "^0.8.0"
-    text-table "^0.2.0"
-    through2 "^2.0.0"
-    yeoman-environment "^2.0.5"
-
-yn@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
-
-z-schema@^3.16.1:
-  version "3.22.0"
-  resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.22.0.tgz#e1326063cb438f348c648350770258ff5e20a22b"
-  dependencies:
-    lodash.get "^4.0.0"
-    lodash.isequal "^4.0.0"
-    validator "^10.0.0"
-  optionalDependencies:
-    commander "^2.7.1"
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@fortawesome/fontawesome-free-brands@5.0.2":
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3"
+
+"@fortawesome/fontawesome-free-regular@5.0.2":
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017"
+
+"@fortawesome/fontawesome-free-solid@5.0.2":
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5"
+
+"@fortawesome/fontawesome@1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d"
+
+"@gulp-sourcemaps/identity-map@1.X":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1"
+  dependencies:
+    acorn "^5.0.3"
+    css "^2.2.1"
+    normalize-path "^2.1.1"
+    source-map "^0.5.6"
+    through2 "^2.0.3"
+
+"@gulp-sourcemaps/map-sources@1.X":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
+  dependencies:
+    normalize-path "^2.0.1"
+    through2 "^2.0.3"
+
+"@koa/cors@2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+  dependencies:
+    call-me-maybe "^1.0.1"
+    glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.stat@^1.0.1":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a"
+
+"@prezzemolo/rap@0.1.2":
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/@prezzemolo/rap/-/rap-0.1.2.tgz#01f8a60bb61de33822fc632563fb8b23e574854e"
+
+"@prezzemolo/zip@0.0.3":
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/@prezzemolo/zip/-/zip-0.0.3.tgz#6532d4bcd77c6a95e3a90ca5388a09b532a1f8e4"
+
+"@samverschueren/stream-to-observable@^0.3.0":
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
+  dependencies:
+    any-observable "^0.3.0"
+
+"@sindresorhus/is@^0.7.0":
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+
+"@types/accepts@*":
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
+  dependencies:
+    "@types/node" "*"
+
+"@types/babel-types@*", "@types/babel-types@^7.0.0":
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.3.tgz#9dc5316090ad99cd2679051ab21a5676c90a2bcc"
+
+"@types/babylon@^6.16.2":
+  version "6.16.3"
+  resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb"
+  dependencies:
+    "@types/babel-types" "*"
+
+"@types/bcryptjs@2.4.1":
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.1.tgz#7fb63922b5b106edacdcfe084cd38850f78aacfc"
+
+"@types/body-parser@*":
+  version "1.17.0"
+  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
+  dependencies:
+    "@types/connect" "*"
+    "@types/node" "*"
+
+"@types/bson@*":
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.8.tgz#6ad272b3f049e9598ec33aed09cf56d8946b75f1"
+  dependencies:
+    "@types/node" "*"
+
+"@types/caseless@*":
+  version "0.12.1"
+  resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a"
+
+"@types/cheerio@^0.22.5":
+  version "0.22.7"
+  resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce"
+
+"@types/clean-css@*":
+  version "3.4.30"
+  resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-3.4.30.tgz#0052c136f5248002428e3638b37de4a39818641d"
+
+"@types/connect@*":
+  version "3.4.32"
+  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28"
+  dependencies:
+    "@types/node" "*"
+
+"@types/cookies@*":
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540"
+  dependencies:
+    "@types/connect" "*"
+    "@types/express" "*"
+    "@types/keygrip" "*"
+    "@types/node" "*"
+
+"@types/debug@0.0.30":
+  version "0.0.30"
+  resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df"
+
+"@types/deep-equal@1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03"
+
+"@types/elasticsearch@5.0.23":
+  version "5.0.23"
+  resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.23.tgz#235622772a7c7f3ccedd0dc9769dfcfe20eed1ec"
+
+"@types/events@*":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
+
+"@types/express-serve-static-core@*":
+  version "4.16.0"
+  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+    "@types/range-parser" "*"
+
+"@types/express@*":
+  version "4.16.0"
+  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19"
+  dependencies:
+    "@types/body-parser" "*"
+    "@types/express-serve-static-core" "*"
+    "@types/serve-static" "*"
+
+"@types/fancy-log@1.3.0":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0"
+
+"@types/form-data@*":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e"
+  dependencies:
+    "@types/node" "*"
+
+"@types/glob@*":
+  version "5.0.35"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
+  dependencies:
+    "@types/events" "*"
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/gm@1.18.0":
+  version "1.18.0"
+  resolved "https://registry.yarnpkg.com/@types/gm/-/gm-1.18.0.tgz#49be90ff74286fcdc23b00f13d3699e6dfaceef2"
+  dependencies:
+    "@types/node" "*"
+
+"@types/gulp-htmlmin@1.3.32":
+  version "1.3.32"
+  resolved "https://registry.yarnpkg.com/@types/gulp-htmlmin/-/gulp-htmlmin-1.3.32.tgz#342baec649f285c7cbd78dfcf54dd17c388bde2b"
+  dependencies:
+    "@types/html-minifier" "*"
+    "@types/node" "*"
+
+"@types/gulp-mocha@0.0.32":
+  version "0.0.32"
+  resolved "https://registry.yarnpkg.com/@types/gulp-mocha/-/gulp-mocha-0.0.32.tgz#dbc425e804a8354236c31ab23406222a8ab9bdaf"
+  dependencies:
+    "@types/mocha" "*"
+    "@types/node" "*"
+
+"@types/gulp-rename@0.0.33":
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/@types/gulp-rename/-/gulp-rename-0.0.33.tgz#38d146e97786569f74f5391a1b1f9b5198674b6c"
+  dependencies:
+    "@types/node" "*"
+
+"@types/gulp-replace@0.0.31":
+  version "0.0.31"
+  resolved "https://registry.yarnpkg.com/@types/gulp-replace/-/gulp-replace-0.0.31.tgz#87c3ac90b437694c58d68d1da677fcaff38b25ff"
+  dependencies:
+    "@types/node" "*"
+
+"@types/gulp-uglify@3.0.5":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135"
+  dependencies:
+    "@types/node" "*"
+    "@types/uglify-js" "^2"
+
+"@types/gulp-util@3.0.34":
+  version "3.0.34"
+  resolved "https://registry.yarnpkg.com/@types/gulp-util/-/gulp-util-3.0.34.tgz#d1291ebf706d93f46eb8df11344bbfd96247697e"
+  dependencies:
+    "@types/node" "*"
+    "@types/through2" "*"
+    "@types/vinyl" "*"
+    chalk "^2.2.0"
+
+"@types/gulp@3.8.36":
+  version "3.8.36"
+  resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-3.8.36.tgz#11eaf583bf0534669b4ffa9bfed51557faa00a4c"
+  dependencies:
+    "@types/node" "*"
+    "@types/orchestrator" "*"
+    "@types/vinyl" "*"
+
+"@types/html-minifier@*":
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-3.5.2.tgz#f897a13d847a774e9b6fd91497e9b0e0ead71c35"
+  dependencies:
+    "@types/clean-css" "*"
+    "@types/relateurl" "*"
+    "@types/uglify-js" "*"
+
+"@types/http-assert@*":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd"
+
+"@types/inquirer@0.0.41":
+  version "0.0.41"
+  resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.41.tgz#0c33027dcd0b0dde234e22afa454f2c75d8b30d2"
+  dependencies:
+    "@types/rx" "*"
+    "@types/through" "*"
+
+"@types/is-root@1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@types/is-root/-/is-root-1.0.0.tgz#1cf41787243a8f030eb737a9aaf08b071e4f2453"
+
+"@types/is-url@1.2.28":
+  version "1.2.28"
+  resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787"
+
+"@types/js-yaml@3.11.1":
+  version "3.11.1"
+  resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40"
+
+"@types/keygrip@*":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878"
+
+"@types/koa-bodyparser@4.2.0":
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.2.0.tgz#04febc567f3d3dd40e3d1a0e095cdf7b07c4d7ce"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-compose@*":
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847"
+
+"@types/koa-compress@2.0.8":
+  version "2.0.8"
+  resolved "https://registry.yarnpkg.com/@types/koa-compress/-/koa-compress-2.0.8.tgz#426a2fac419aff7d1a7d87fd78203bf0d26a94fb"
+  dependencies:
+    "@types/koa" "*"
+    "@types/node" "*"
+
+"@types/koa-favicon@2.0.19":
+  version "2.0.19"
+  resolved "https://registry.yarnpkg.com/@types/koa-favicon/-/koa-favicon-2.0.19.tgz#a1b584fd64c99f16710633272292bf7d4b0ca1fa"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-logger@3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@types/koa-logger/-/koa-logger-3.1.0.tgz#133acdbc56d87b5a559cab25528b087381a8fc0d"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-mount@3.0.1":
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/@types/koa-mount/-/koa-mount-3.0.1.tgz#2c068d1696b173c62c316158210c4316c4401f57"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-multer@1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@types/koa-multer/-/koa-multer-1.0.0.tgz#f449f399ac3f80c05753452f000e8694ceec4249"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-router@7.0.28":
+  version "7.0.28"
+  resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.0.28.tgz#67487c862a831099aed8864a8996bfa7e989edc0"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-send@4.1.1":
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.1.tgz#88f57cbe0343c8204903f9096d8ff6b98ec3296f"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-views@2.0.3":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@types/koa-views/-/koa-views-2.0.3.tgz#38fc1f3027503acba73a93fe06678813f306779b"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa@*":
+  version "2.0.46"
+  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.46.tgz#24bc3cd405d10fcde81f876cd8285b44d4ddc3e9"
+  dependencies:
+    "@types/accepts" "*"
+    "@types/cookies" "*"
+    "@types/events" "*"
+    "@types/http-assert" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
+"@types/koa@2.0.45":
+  version "2.0.45"
+  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.45.tgz#133cbda6cc8d12b73434b5d9663898c833f80aa2"
+  dependencies:
+    "@types/accepts" "*"
+    "@types/cookies" "*"
+    "@types/events" "*"
+    "@types/http-assert" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
+"@types/koa__cors@2.2.2":
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-2.2.2.tgz#03d7cf3b076d5dfab8a5444ac6c5df5173147de8"
+  dependencies:
+    "@types/koa" "*"
+
+"@types/kue@0.11.8":
+  version "0.11.8"
+  resolved "https://registry.yarnpkg.com/@types/kue/-/kue-0.11.8.tgz#820f5e3db6025f0411e0942cd3ccab461a060c90"
+  dependencies:
+    "@types/express" "*"
+    "@types/node" "*"
+    "@types/redis" "*"
+
+"@types/license-checker@15.0.0":
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/@types/license-checker/-/license-checker-15.0.0.tgz#685d69e2cf61ffd862320434601f51c85e28bba1"
+
+"@types/mime@*":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
+
+"@types/minimatch@*":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+
+"@types/mkdirp@0.5.2":
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
+  dependencies:
+    "@types/node" "*"
+
+"@types/mocha@*":
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.2.tgz#202d2b8fe1364c5b617b439b26a54f0e75eac0a7"
+
+"@types/mocha@5.2.0":
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.0.tgz#b3c8e69f038835db1a7fdc0b3d879fc50506e29e"
+
+"@types/mongodb@3.0.18":
+  version "3.0.18"
+  resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.0.18.tgz#e5775ba9c15bf1601e57ada52d9fcbc6d6095d18"
+  dependencies:
+    "@types/bson" "*"
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@types/ms@0.7.30":
+  version "0.7.30"
+  resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.30.tgz#f6c38b7ecbbf698b0bbd138315a0f0f18954f85f"
+
+"@types/node@*":
+  version "10.3.3"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3"
+
+"@types/node@10.1.2":
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6"
+
+"@types/node@^8.0.47":
+  version "8.10.20"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac"
+
+"@types/nopt@3.0.29":
+  version "3.0.29"
+  resolved "https://registry.yarnpkg.com/@types/nopt/-/nopt-3.0.29.tgz#f19df3db4c97ee1459a2740028320a71d70964ce"
+
+"@types/orchestrator@*":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.3.2.tgz#cd15c6cea978a32b98e5054239cbcc78e55671f1"
+  dependencies:
+    "@types/node" "*"
+    "@types/q" "*"
+
+"@types/parse5@3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-3.0.0.tgz#b63305718d82af42a9e5da79c56ecfc1f32e32c0"
+  dependencies:
+    parse5 "*"
+
+"@types/pug@2.0.4", "@types/pug@^2.0.4":
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2"
+
+"@types/q@*":
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.0.tgz#87567ea1206935405e51c03635b6cbf3a01f7bc4"
+
+"@types/qrcode@0.8.1":
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-0.8.1.tgz#5776cb5da299cfa7cee2610f59997acad90ad38d"
+  dependencies:
+    "@types/node" "*"
+
+"@types/range-parser@*":
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d"
+
+"@types/ratelimiter@2.1.28":
+  version "2.1.28"
+  resolved "https://registry.yarnpkg.com/@types/ratelimiter/-/ratelimiter-2.1.28.tgz#cf6371e6d9b1d236e3f0b25889a6d52aed2e0e22"
+  dependencies:
+    "@types/redis" "*"
+
+"@types/redis@*", "@types/redis@2.8.6":
+  version "2.8.6"
+  resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.6.tgz#3674d07a13ad76bccda4c37dc3909e4e95757e7e"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@types/relateurl@*":
+  version "0.2.28"
+  resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6"
+
+"@types/request-promise-native@1.0.14":
+  version "1.0.14"
+  resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.14.tgz#20f2ba136e6f29c2ea745c60767738d434793d31"
+  dependencies:
+    "@types/request" "*"
+
+"@types/request@*":
+  version "2.47.1"
+  resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.1.tgz#25410d3afbdac04c91a94ad9efc9824100735824"
+  dependencies:
+    "@types/caseless" "*"
+    "@types/form-data" "*"
+    "@types/node" "*"
+    "@types/tough-cookie" "*"
+
+"@types/request@2.47.0":
+  version "2.47.0"
+  resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.0.tgz#76a666cee4cb85dcffea6cd4645227926d9e114e"
+  dependencies:
+    "@types/caseless" "*"
+    "@types/form-data" "*"
+    "@types/node" "*"
+    "@types/tough-cookie" "*"
+
+"@types/rimraf@2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e"
+  dependencies:
+    "@types/glob" "*"
+    "@types/node" "*"
+
+"@types/rx-core-binding@*":
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3"
+  dependencies:
+    "@types/rx-core" "*"
+
+"@types/rx-core@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60"
+
+"@types/rx-lite-aggregates@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-async@*":
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-backpressure@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-coincidence@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-experimental@*":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-joinpatterns@*":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-testing@*":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9"
+  dependencies:
+    "@types/rx-lite-virtualtime" "*"
+
+"@types/rx-lite-time@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite-virtualtime@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537"
+  dependencies:
+    "@types/rx-lite" "*"
+
+"@types/rx-lite@*":
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.5.tgz#b3581525dff69423798daa9a0d33c1e66a5e8c4c"
+  dependencies:
+    "@types/rx-core" "*"
+    "@types/rx-core-binding" "*"
+
+"@types/rx@*":
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48"
+  dependencies:
+    "@types/rx-core" "*"
+    "@types/rx-core-binding" "*"
+    "@types/rx-lite" "*"
+    "@types/rx-lite-aggregates" "*"
+    "@types/rx-lite-async" "*"
+    "@types/rx-lite-backpressure" "*"
+    "@types/rx-lite-coincidence" "*"
+    "@types/rx-lite-experimental" "*"
+    "@types/rx-lite-joinpatterns" "*"
+    "@types/rx-lite-testing" "*"
+    "@types/rx-lite-time" "*"
+    "@types/rx-lite-virtualtime" "*"
+
+"@types/seedrandom@2.4.27":
+  version "2.4.27"
+  resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41"
+
+"@types/serve-static@*":
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48"
+  dependencies:
+    "@types/express-serve-static-core" "*"
+    "@types/mime" "*"
+
+"@types/single-line-log@1.1.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@types/single-line-log/-/single-line-log-1.1.0.tgz#7e6fc4e8e785f5f5ab11157418df2684a21ed971"
+
+"@types/speakeasy@2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@types/speakeasy/-/speakeasy-2.0.2.tgz#153ec3636eea0562209b0a2f1fdf8b479286919b"
+
+"@types/tapable@*":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd"
+
+"@types/through2@*":
+  version "2.0.33"
+  resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.33.tgz#1ff2e88a100dfb5b140e7bb98791f1194400d131"
+  dependencies:
+    "@types/node" "*"
+
+"@types/through@*":
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93"
+  dependencies:
+    "@types/node" "*"
+
+"@types/tmp@0.0.33":
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
+
+"@types/tough-cookie@*":
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.3.tgz#7f226d67d654ec9070e755f46daebf014628e9d9"
+
+"@types/uglify-js@*":
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.2.tgz#f30c75458d18e8ee885c792c04adcb78a13bc286"
+  dependencies:
+    source-map "^0.6.1"
+
+"@types/uglify-js@^2":
+  version "2.6.31"
+  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b"
+  dependencies:
+    source-map "^0.6.1"
+
+"@types/uuid@3.4.3":
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.3.tgz#121ace265f5569ce40f4f6d0ff78a338c732a754"
+  dependencies:
+    "@types/node" "*"
+
+"@types/vinyl@*":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.2.tgz#4f3b8dae8f5828d3800ef709b0cff488ee852de3"
+  dependencies:
+    "@types/node" "*"
+
+"@types/webpack-stream@3.2.10":
+  version "3.2.10"
+  resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.10.tgz#eed8389a60d9928b357aa6d13599428d2c4889e7"
+  dependencies:
+    "@types/node" "*"
+    "@types/webpack" "*"
+
+"@types/webpack@*", "@types/webpack@4.4.0":
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.0.tgz#c0551b772be241d786c0548812dd75a932f8efb4"
+  dependencies:
+    "@types/node" "*"
+    "@types/tapable" "*"
+    "@types/uglify-js" "*"
+    source-map "^0.6.0"
+
+"@types/websocket@0.0.39":
+  version "0.0.39"
+  resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.39.tgz#aa971e24f9c1455fe2a57ee3e69c7d395016b12a"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@types/ws@5.1.1":
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.1.tgz#4adc1f1a5e92e7e0e95658fb35c7eab1bc52f4ac"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+
+"@vue/component-compiler-utils@^1.2.1":
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-1.3.1.tgz#686f0b913d59590ae327b2a1cb4b6d9b931bbe0e"
+  dependencies:
+    consolidate "^0.15.1"
+    hash-sum "^1.0.2"
+    lru-cache "^4.1.2"
+    merge-source-map "^1.1.0"
+    postcss "^6.0.20"
+    postcss-selector-parser "^3.1.1"
+    prettier "^1.13.0"
+    source-map "^0.5.6"
+    vue-template-es2015-compiler "^1.6.0"
+
+"@webassemblyjs/ast@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.4.3.tgz#3b3f6fced944d8660273347533e6d4d315b5934a"
+  dependencies:
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/wast-parser" "1.4.3"
+    debug "^3.1.0"
+    webassemblyjs "1.4.3"
+
+"@webassemblyjs/floating-point-hex-parser@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz#f5aee4c376a717c74264d7bacada981e7e44faad"
+
+"@webassemblyjs/helper-buffer@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz#0434b55958519bf503697d3824857b1dea80b729"
+  dependencies:
+    debug "^3.1.0"
+
+"@webassemblyjs/helper-code-frame@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz#f1349ca3e01a8e29ee2098c770773ef97af43641"
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.4.3"
+
+"@webassemblyjs/helper-fsm@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz#65a921db48fb43e868f17b27497870bdcae22b79"
+
+"@webassemblyjs/helper-wasm-bytecode@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz#0e5b4b5418e33f8a26e940b7809862828c3721a5"
+
+"@webassemblyjs/helper-wasm-section@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz#9ceedd53a3f152c3412e072887ade668d0b1acbf"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-buffer" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/wasm-gen" "1.4.3"
+    debug "^3.1.0"
+
+"@webassemblyjs/leb128@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.4.3.tgz#5a5e5949dbb5adfe3ae95664d0439927ac557fb8"
+  dependencies:
+    leb "^0.3.0"
+
+"@webassemblyjs/validation@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/validation/-/validation-1.4.3.tgz#9e66c9b3079d7bbcf2070c1bf52a54af2a09aac9"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+
+"@webassemblyjs/wasm-edit@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz#87febd565e0ffb5ae25f6495bb3958d17aa0a779"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-buffer" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/helper-wasm-section" "1.4.3"
+    "@webassemblyjs/wasm-gen" "1.4.3"
+    "@webassemblyjs/wasm-opt" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    "@webassemblyjs/wast-printer" "1.4.3"
+    debug "^3.1.0"
+
+"@webassemblyjs/wasm-gen@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz#8553164d0154a6be8f74d653d7ab355f73240aa4"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/leb128" "1.4.3"
+
+"@webassemblyjs/wasm-opt@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz#26c7a23bfb136aa405b1d3410e63408ec60894b8"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-buffer" "1.4.3"
+    "@webassemblyjs/wasm-gen" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    debug "^3.1.0"
+
+"@webassemblyjs/wasm-parser@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz#7ddd3e408f8542647ed612019cfb780830993698"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/helper-wasm-bytecode" "1.4.3"
+    "@webassemblyjs/leb128" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    webassemblyjs "1.4.3"
+
+"@webassemblyjs/wast-parser@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz#3250402e2c5ed53dbe2233c9de1fe1f9f0d51745"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/floating-point-hex-parser" "1.4.3"
+    "@webassemblyjs/helper-code-frame" "1.4.3"
+    "@webassemblyjs/helper-fsm" "1.4.3"
+    long "^3.2.0"
+    webassemblyjs "1.4.3"
+
+"@webassemblyjs/wast-printer@1.4.3":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz#3d59aa8d0252d6814a3ef4e6d2a34c9ded3904e0"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/wast-parser" "1.4.3"
+    long "^3.2.0"
+
+abab@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+accepts@^1.2.2, accepts@~1.3.5:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+  dependencies:
+    mime-types "~2.1.18"
+    negotiator "0.6.1"
+
+accord@^0.26.3:
+  version "0.26.4"
+  resolved "https://registry.yarnpkg.com/accord/-/accord-0.26.4.tgz#fc4c8d3ebab406a07cb28819b859651c44a92e80"
+  dependencies:
+    convert-source-map "^1.2.0"
+    glob "^7.0.5"
+    indx "^0.2.3"
+    lodash.clone "^4.3.2"
+    lodash.defaults "^4.0.1"
+    lodash.flatten "^4.2.0"
+    lodash.merge "^4.4.0"
+    lodash.partialright "^4.1.4"
+    lodash.pick "^4.2.1"
+    lodash.uniq "^4.3.0"
+    resolve "^1.1.7"
+    semver "^5.3.0"
+    uglify-js "^2.7.0"
+    when "^3.7.7"
+
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-globals@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+  dependencies:
+    acorn "^4.0.4"
+
+acorn-globals@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  dependencies:
+    acorn "^3.0.4"
+
+acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+acorn@^3.0.4, acorn@^3.1.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.4, acorn@~4.0.2:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+agent-base@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce"
+  dependencies:
+    es6-promisify "^5.0.0"
+
+agentkeepalive@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c"
+  dependencies:
+    humanize-ms "^1.2.1"
+
+ajv-keywords@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
+ajv-keywords@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d"
+  dependencies:
+    fast-deep-equal "^2.0.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+animejs@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/animejs/-/animejs-2.2.0.tgz#35eefdfc535b81949c9cb06f0b3e60c02e6fdc80"
+
+ansi-colors@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
+  dependencies:
+    ansi-wrap "^0.1.0"
+
+ansi-cyan@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
+  dependencies:
+    ansi-wrap "0.1.0"
+
+ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-escapes@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
+
+ansi-gray@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
+  dependencies:
+    ansi-wrap "0.1.0"
+
+ansi-red@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
+  dependencies:
+    ansi-wrap "0.1.0"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
+
+ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+
+any-observable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
+
+any-promise@^1.0.0, any-promise@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+
+anymatch@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+  dependencies:
+    micromatch "^2.1.5"
+    normalize-path "^2.0.0"
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+"apparatus@>= 0.0.9":
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e"
+  dependencies:
+    sylvester ">= 0.0.8"
+
+append-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
+  dependencies:
+    buffer-equal "^1.0.0"
+
+append-field@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a"
+
+aproba@^1.0.3, aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+archive-type@^3.0.0, archive-type@^3.0.1:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6"
+  dependencies:
+    file-type "^3.1.0"
+
+archy@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
+  dependencies:
+    arr-flatten "^1.0.1"
+    array-slice "^0.2.3"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d"
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-differ@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+
+array-each@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
+
+array-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-find-index@^1.0.1, array-find-index@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-parallel@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d"
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-series@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f"
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-slice@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arrify@^1.0.0, arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@^2.0.0, asap@~2.0.3:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1.js@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.0.1.tgz#7668b56416953f0ce3421adbb3893ace59c96f59"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+ast-types@0.10.1:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd"
+
+ast-types@0.11.5:
+  version "0.11.5"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28"
+
+async-each-series@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-foreach@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+
+async-limiter@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+
+async-validator@~1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.2.tgz#b77597226e96242f8d531c0d46ae295f62422ba4"
+  dependencies:
+    babel-runtime "6.x"
+
+async@^1.5.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.5.0, async@^2.6.0:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+  dependencies:
+    lodash "^4.17.10"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+autoprefixer@^6.3.1:
+  version "6.7.7"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+  dependencies:
+    browserslist "^1.7.6"
+    caniuse-db "^1.0.30000634"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^5.2.16"
+    postcss-value-parser "^3.2.3"
+
+autosize@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9"
+
+autwh@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/autwh/-/autwh-0.1.0.tgz#24a5300923309d105133401a2568f9c8ab7d7e03"
+  dependencies:
+    oauth "0.9.15"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+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.7.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.26.0:
+  version "6.26.3"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+  dependencies:
+    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"
+
+babel-generator@^6.26.0:
+  version "6.26.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+  dependencies:
+    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"
+
+babel-helper-bindify-decorators@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+  dependencies:
+    babel-helper-explode-assignable-expression "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+  dependencies:
+    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@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-explode-class@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
+  dependencies:
+    babel-helper-bindify-decorators "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+  dependencies:
+    babel-helper-function-name "^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-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+  dependencies:
+    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-helper-vue-jsx-merge-props@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-async-generators@^6.5.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
+
+babel-plugin-syntax-class-constructor-call@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
+
+babel-plugin-syntax-class-properties@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-decorators@^6.13.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
+
+babel-plugin-syntax-dynamic-import@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-export-extensions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
+
+babel-plugin-syntax-flow@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-generator-functions@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-generators "^6.5.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-functions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-class-constructor-call@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9"
+  dependencies:
+    babel-plugin-syntax-class-constructor-call "^6.18.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-class-properties@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-plugin-syntax-class-properties "^6.8.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-decorators@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
+  dependencies:
+    babel-helper-explode-class "^6.24.1"
+    babel-plugin-syntax-decorators "^6.13.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+  dependencies:
+    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@^6.24.1:
+  version "6.26.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+  dependencies:
+    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@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+  dependencies:
+    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+    babel-plugin-syntax-exponentiation-operator "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-export-extensions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
+  dependencies:
+    babel-plugin-syntax-export-extensions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.8.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+  dependencies:
+    babel-plugin-syntax-flow "^6.18.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.22.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
+  dependencies:
+    babel-plugin-syntax-object-rest-spread "^6.8.0"
+    babel-runtime "^6.26.0"
+
+babel-plugin-transform-regenerator@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+  dependencies:
+    regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-polyfill@6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-preset-es2015@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+  dependencies:
+    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-preset-stage-1@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
+  dependencies:
+    babel-plugin-transform-class-constructor-call "^6.24.1"
+    babel-plugin-transform-export-extensions "^6.22.0"
+    babel-preset-stage-2 "^6.24.1"
+
+babel-preset-stage-2@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
+  dependencies:
+    babel-plugin-syntax-dynamic-import "^6.18.0"
+    babel-plugin-transform-class-properties "^6.24.1"
+    babel-plugin-transform-decorators "^6.24.1"
+    babel-preset-stage-3 "^6.24.1"
+
+babel-preset-stage-3@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
+  dependencies:
+    babel-plugin-syntax-trailing-function-commas "^6.22.0"
+    babel-plugin-transform-async-generator-functions "^6.24.1"
+    babel-plugin-transform-async-to-generator "^6.24.1"
+    babel-plugin-transform-exponentiation-operator "^6.24.1"
+    babel-plugin-transform-object-rest-spread "^6.22.0"
+
+babel-register@^6.26.0, babel-register@^6.9.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  dependencies:
+    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@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  dependencies:
+    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@^6.24.1, babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  dependencies:
+    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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babylon@^6.17.3, babylon@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+babylon@^7.0.0-beta.47:
+  version "7.0.0-beta.47"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80"
+
+balanced-match@^0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base32.js@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba"
+
+base64-js@^1.0.2:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+bcryptjs@2.4.3:
+  version "2.4.3"
+  resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
+
+beeper@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+bin-build@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc"
+  dependencies:
+    archive-type "^3.0.1"
+    decompress "^3.0.0"
+    download "^4.1.2"
+    exec-series "^1.0.0"
+    rimraf "^2.2.6"
+    tempfile "^1.0.0"
+    url-regex "^3.0.0"
+
+bin-check@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930"
+  dependencies:
+    executable "^1.0.0"
+
+bin-version-check@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0"
+  dependencies:
+    bin-version "^1.0.0"
+    minimist "^1.1.0"
+    semver "^4.0.3"
+    semver-truncate "^1.0.0"
+
+bin-version@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e"
+  dependencies:
+    find-versions "^1.0.0"
+
+bin-wrapper@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb"
+  dependencies:
+    bin-check "^2.0.0"
+    bin-version-check "^2.1.0"
+    download "^4.0.0"
+    each-async "^1.1.1"
+    lazy-req "^1.0.0"
+    os-filter-obj "^1.0.0"
+
+binary-extensions@^1.0.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+binaryextensions@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935"
+
+bl@^1.0.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
+  dependencies:
+    readable-stream "^2.3.5"
+    safe-buffer "^5.1.1"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.0.5, bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@1.18.2:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+  dependencies:
+    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"
+
+body-parser@^1.12.2:
+  version "1.18.3"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
+  dependencies:
+    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"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    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-vue@2.0.0-rc.6:
+  version "2.0.0-rc.6"
+  resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.6.tgz#12d0a241414f1efd647e8b14a88c51707c920c86"
+  dependencies:
+    bootstrap "^4.0.0"
+    lodash.get "^4.4.2"
+    lodash.startcase "^4.4.0"
+    opencollective "^1.0.3"
+    popper.js "^1.12.9"
+    vue-functional-data-merge "^2.0.5"
+
+bootstrap@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.1.tgz#3aec85000fa619085da8d2e4983dfd67cf2114cb"
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+braces@^2.3.0, braces@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-process-hrtime@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
+browser-stdout@1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  dependencies:
+    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@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    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@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  dependencies:
+    pako "~1.0.5"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+  version "1.7.7"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+  dependencies:
+    caniuse-db "^1.0.30000639"
+    electron-to-chromium "^1.2.7"
+
+bson@~1.0.4:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57"
+
+buffer-alloc-unsafe@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+
+buffer-alloc@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+  version "0.2.13"
+  resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+
+buffer-equal-constant-time@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+
+buffer-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+
+buffer-from@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0"
+
+buffer-from@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+
+buffer-shims@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+buffer-to-vinyl@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262"
+  dependencies:
+    file-type "^3.1.0"
+    readable-stream "^2.0.2"
+    uuid "^2.0.1"
+    vinyl "^1.0.0"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+bufferstreams@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72"
+  dependencies:
+    readable-stream "^2.0.2"
+
+builtin-modules@^1.0.0, builtin-modules@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+busboy@^0.2.11:
+  version "0.2.14"
+  resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+  dependencies:
+    dicer "0.2.5"
+    readable-stream "1.1.x"
+
+bytes@3.0.0, bytes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+bytes@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a"
+
+cacache@^10.0.4:
+  version "10.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^2.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^5.2.4"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+cacheable-request@^2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+  dependencies:
+    clone-response "1.0.2"
+    get-stream "3.0.0"
+    http-cache-semantics "3.8.1"
+    keyv "3.0.0"
+    lowercase-keys "1.0.0"
+    normalize-url "2.0.1"
+    responselike "1.0.2"
+
+cafy@8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/cafy/-/cafy-8.0.0.tgz#8f6ce8556d64ee145c5cdc79b5b68f7fc57ee46f"
+
+call-me-maybe@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  dependencies:
+    callsites "^0.2.0"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+camel-case@3.0.x:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+  dependencies:
+    no-case "^2.2.0"
+    upper-case "^1.1.1"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+can-promise@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3"
+  dependencies:
+    window-or-global "^1.0.1"
+
+caniuse-api@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+  dependencies:
+    browserslist "^1.3.6"
+    caniuse-db "^1.0.30000529"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+  version "1.0.30000856"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f"
+
+capture-stack-trace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+caw@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034"
+  dependencies:
+    get-proxy "^1.0.1"
+    is-obj "^1.0.0"
+    object-assign "^3.0.0"
+    tunnel-agent "^0.4.0"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    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"
+
+chalk@2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796"
+  dependencies:
+    ansi-styles "^3.2.0"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.2.0"
+
+chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.2.0, chalk@^2.3.0, chalk@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chalk@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
+  dependencies:
+    ansi-styles "~1.0.0"
+    has-color "~0.1.0"
+    strip-ansi "~0.1.0"
+
+character-parser@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+  dependencies:
+    is-regex "^1.0.3"
+
+chardet@^0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+
+cheerio-httpcli@0.7.2:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/cheerio-httpcli/-/cheerio-httpcli-0.7.2.tgz#346d41b0f00f01aaa2da8d5e7efb3f806fb277a3"
+  dependencies:
+    "@types/cheerio" "^0.22.5"
+    "@types/node" "^8.0.47"
+    async "^2.5.0"
+    cheerio "^0.22.0"
+    colors "^1.1.2"
+    foreach "^2.0.5"
+    he "^1.1.1"
+    iconv-lite "^0.4.19"
+    jschardet "^1.6.0"
+    object-assign "^4.1.1"
+    os-locale "^2.1.0"
+    prettyjson "^1.2.1"
+    request "^2.83.0"
+    require-uncached "^1.0.3"
+    rsvp "^4.7.0"
+    spawn-sync "^1.0.15"
+    tough-cookie "^2.3.3"
+    type-of "^2.0.1"
+    valid-url "^1.0.9"
+    yargs "^10.0.3"
+
+cheerio@^0.22.0:
+  version "0.22.0"
+  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
+  dependencies:
+    css-select "~1.2.0"
+    dom-serializer "~0.1.0"
+    entities "~1.1.1"
+    htmlparser2 "^3.9.1"
+    lodash.assignin "^4.0.9"
+    lodash.bind "^4.1.4"
+    lodash.defaults "^4.0.1"
+    lodash.filter "^4.4.0"
+    lodash.flatten "^4.2.0"
+    lodash.foreach "^4.3.0"
+    lodash.map "^4.4.0"
+    lodash.merge "^4.4.0"
+    lodash.pick "^4.2.1"
+    lodash.reduce "^4.4.0"
+    lodash.reject "^4.4.0"
+    lodash.some "^4.4.0"
+
+chokidar@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^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"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chokidar@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.0"
+    braces "^2.3.0"
+    glob-parent "^3.1.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^2.1.1"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+    upath "^1.0.0"
+  optionalDependencies:
+    fsevents "^1.1.2"
+
+chownr@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chrome-trace-event@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
+clap@^1.0.9:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
+  dependencies:
+    chalk "^1.1.3"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+clean-css@4.1.x, clean-css@^4.1.11:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a"
+  dependencies:
+    source-map "0.5.x"
+
+cli-cursor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  dependencies:
+    restore-cursor "^1.0.1"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-spinners@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
+
+cli-table@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
+  dependencies:
+    colors "1.0.3"
+
+cli-truncate@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
+  dependencies:
+    slice-ansi "0.0.4"
+    string-width "^1.0.1"
+
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+cliui@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+  dependencies:
+    string-width "^2.1.1"
+    strip-ansi "^4.0.0"
+    wrap-ansi "^2.0.0"
+
+clone-buffer@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+
+clone-deep@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
+  dependencies:
+    for-own "^1.0.0"
+    is-plain-object "^2.0.4"
+    kind-of "^6.0.0"
+    shallow-clone "^1.0.0"
+
+clone-response@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+  dependencies:
+    mimic-response "^1.0.0"
+
+clone-stats@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+
+clone-stats@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+
+clone@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
+
+clone@^1.0.0, clone@^1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+
+clone@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+
+cloneable-readable@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65"
+  dependencies:
+    inherits "^2.0.1"
+    process-nextick-args "^2.0.0"
+    readable-stream "^2.3.5"
+
+co-body@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124"
+  dependencies:
+    inflation "^2.0.0"
+    qs "^6.4.0"
+    raw-body "^2.2.0"
+    type-is "^1.6.14"
+
+co-body@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3"
+  dependencies:
+    inflation "^2.0.0"
+    qs "^6.5.2"
+    raw-body "^2.3.3"
+    type-is "^1.6.16"
+
+co@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+  dependencies:
+    q "^1.1.2"
+
+coa@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af"
+  dependencies:
+    q "^1.1.2"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.3.0, color-convert@^1.9.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+  dependencies:
+    color-name "1.1.1"
+
+color-name@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+color-name@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+color-string@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+  dependencies:
+    color-name "^1.0.0"
+
+color-support@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+
+color@^0.11.0:
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+  dependencies:
+    clone "^1.0.2"
+    color-convert "^1.3.0"
+    color-string "^0.3.0"
+
+colormin@^1.0.5:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+  dependencies:
+    color "^0.11.0"
+    css-color-names "0.0.4"
+    has "^1.0.1"
+
+colors@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+
+colors@^1.1.2:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e"
+
+colors@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@2.15.1, commander@2.15.x, commander@^2.11.0, commander@^2.12.1, commander@^2.7.1, commander@^2.9.0, commander@~2.15.0:
+  version "2.15.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+
+commander@~2.13.0:
+  version "2.13.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commander@~2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
+  dependencies:
+    graceful-readlink ">= 1.0.0"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+compressible@^2.0.0:
+  version "2.0.14"
+  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7"
+  dependencies:
+    mime-db ">= 1.34.0 < 2"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+condense-newlines@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-whitespace "^0.3.0"
+    kind-of "^3.0.2"
+
+config-chain@~1.1.5:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
+  dependencies:
+    ini "^1.3.4"
+    proto-list "~1.2.1"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+console-stream@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
+
+consolidate@^0.15.0, consolidate@^0.15.1:
+  version "0.15.1"
+  resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
+  dependencies:
+    bluebird "^3.1.1"
+
+constantinople@^3.0.1:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
+  dependencies:
+    "@types/babel-types" "^7.0.0"
+    "@types/babylon" "^6.16.2"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2, content-disposition@~0.5.0:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type@^1.0.0, content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@1.X, convert-source-map@^1.1.1, convert-source-map@^1.2.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+cookies@~0.7.0:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b"
+  dependencies:
+    depd "~1.1.1"
+    keygrip "~1.0.2"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+copy-to@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5"
+
+core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
+  version "2.5.7"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+crc-32@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
+  dependencies:
+    exit-on-epipe "~1.0.1"
+    printj "~1.1.0"
+
+create-ecdh@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-error-class@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+  dependencies:
+    capture-stack-trace "^1.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  dependencies:
+    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@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  dependencies:
+    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"
+
+cropperjs@^1.1.3:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.4.0.tgz#e9851559c590d148a10c17c36cdc8126acf01a2e"
+
+cross-spawn@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cross-spawn@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+  version "6.0.5"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    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@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    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"
+
+css-color-names@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-loader@0.28.11:
+  version "0.28.11"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    css-selector-tokenizer "^0.7.0"
+    cssnano "^3.10.0"
+    icss-utils "^2.1.0"
+    loader-utils "^1.0.2"
+    lodash.camelcase "^4.3.0"
+    object-assign "^4.1.1"
+    postcss "^5.0.6"
+    postcss-modules-extract-imports "^1.2.0"
+    postcss-modules-local-by-default "^1.2.0"
+    postcss-modules-scope "^1.1.0"
+    postcss-modules-values "^1.3.0"
+    postcss-value-parser "^3.3.0"
+    source-list-map "^2.0.0"
+
+css-parse@1.7.x:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
+
+css-select-base-adapter@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990"
+
+css-select@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+  dependencies:
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
+css-select@~1.3.0-rc0:
+  version "1.3.0-rc0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231"
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "^1.0.1"
+
+css-selector-tokenizer@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+  dependencies:
+    cssesc "^0.1.0"
+    fastparse "^1.1.1"
+    regexpu-core "^1.0.0"
+
+css-tree@1.0.0-alpha.29:
+  version "1.0.0-alpha.29"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
+  dependencies:
+    mdn-data "~1.1.0"
+    source-map "^0.5.3"
+
+css-tree@1.0.0-alpha25:
+  version "1.0.0-alpha25"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597"
+  dependencies:
+    mdn-data "^1.0.0"
+    source-map "^0.5.3"
+
+css-url-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec"
+
+css-what@2.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+css@2.X, css@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be"
+  dependencies:
+    inherits "^2.0.1"
+    source-map "^0.1.38"
+    source-map-resolve "^0.5.1"
+    urix "^0.1.0"
+
+cssesc@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+cssnano@^3.0.0, cssnano@^3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+  dependencies:
+    autoprefixer "^6.3.1"
+    decamelize "^1.1.2"
+    defined "^1.0.0"
+    has "^1.0.1"
+    object-assign "^4.0.1"
+    postcss "^5.0.14"
+    postcss-calc "^5.2.0"
+    postcss-colormin "^2.1.8"
+    postcss-convert-values "^2.3.4"
+    postcss-discard-comments "^2.0.4"
+    postcss-discard-duplicates "^2.0.1"
+    postcss-discard-empty "^2.0.1"
+    postcss-discard-overridden "^0.1.1"
+    postcss-discard-unused "^2.2.1"
+    postcss-filter-plugins "^2.0.0"
+    postcss-merge-idents "^2.1.5"
+    postcss-merge-longhand "^2.0.1"
+    postcss-merge-rules "^2.0.3"
+    postcss-minify-font-values "^1.0.2"
+    postcss-minify-gradients "^1.0.1"
+    postcss-minify-params "^1.0.4"
+    postcss-minify-selectors "^2.0.4"
+    postcss-normalize-charset "^1.1.0"
+    postcss-normalize-url "^3.0.7"
+    postcss-ordered-values "^2.1.0"
+    postcss-reduce-idents "^2.2.2"
+    postcss-reduce-initial "^1.0.0"
+    postcss-reduce-transforms "^1.0.3"
+    postcss-svgo "^2.1.1"
+    postcss-unique-selectors "^2.0.2"
+    postcss-value-parser "^3.2.3"
+    postcss-zindex "^2.0.1"
+
+csso@^3.5.0:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
+  dependencies:
+    css-tree "1.0.0-alpha.29"
+
+csso@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+  dependencies:
+    clap "^1.0.9"
+    source-map "^0.5.3"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.3.1 < 0.4.0":
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf"
+  dependencies:
+    cssom "0.3.x"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+cyclist@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dargs@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+data-urls@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f"
+  dependencies:
+    abab "^1.0.4"
+    whatwg-mimetype "^2.0.0"
+    whatwg-url "^6.4.0"
+
+date-fns@^1.27.2:
+  version "1.29.0"
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+dateformat@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
+
+dateformat@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
+
+de-indent@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+
+debug-fabulous@1.X:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e"
+  dependencies:
+    debug "3.X"
+    memoizee "0.4.X"
+    object-assign "4.X"
+
+debug@*, debug@3.1.0, debug@3.X, debug@^3.0.0, debug@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+debug@0.7.4:
+  version "0.7.4"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
+
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.1, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debuglog@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  dependencies:
+    mimic-response "^1.0.0"
+
+decompress-tar@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466"
+  dependencies:
+    is-tar "^1.0.0"
+    object-assign "^2.0.0"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-tarbz2@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d"
+  dependencies:
+    is-bzip2 "^1.0.0"
+    object-assign "^2.0.0"
+    seek-bzip "^1.0.3"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-targz@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0"
+  dependencies:
+    is-gzip "^1.0.0"
+    object-assign "^2.0.0"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-unzip@^3.0.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb"
+  dependencies:
+    is-zip "^1.0.0"
+    read-all-stream "^3.0.0"
+    stat-mode "^0.2.0"
+    strip-dirs "^1.0.0"
+    through2 "^2.0.0"
+    vinyl "^1.0.0"
+    yauzl "^2.2.1"
+
+decompress@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed"
+  dependencies:
+    buffer-to-vinyl "^1.0.0"
+    concat-stream "^1.4.6"
+    decompress-tar "^3.0.0"
+    decompress-tarbz2 "^3.0.0"
+    decompress-targz "^3.0.0"
+    decompress-unzip "^3.0.0"
+    stream-combiner2 "^1.1.1"
+    vinyl-assign "^1.0.1"
+    vinyl-fs "^2.2.0"
+
+deep-equal@1.0.1, deep-equal@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+deep-extend@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
+
+deep-extend@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+deep-is@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.2.tgz#9ced65ea0bc0b09f42a6d79c1b1903f9d913cc18"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+deepcopy@0.6.3:
+  version "0.6.3"
+  resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0"
+
+deepmerge@^1.2.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
+
+deepmerge@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768"
+
+defaults@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+  dependencies:
+    clone "^1.0.2"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+depd@^1.1.0, depd@~1.1.1, depd@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+deprecated@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+destroy@^1.0.3, destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-conflict@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e"
+
+detect-file@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-indent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+
+detect-libc@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detect-newline@2.X:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+
+dezalgo@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
+  dependencies:
+    asap "^2.0.0"
+    wrappy "1"
+
+dicer@0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
+  dependencies:
+    readable-stream "1.1.x"
+    streamsearch "0.1.2"
+
+diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+
+diffie-hellman@^5.0.0:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+dijkstrajs@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
+
+dir-glob@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
+  dependencies:
+    arrify "^1.0.1"
+    path-type "^3.0.0"
+
+diskusage@0.2.4:
+  version "0.2.4"
+  resolved "https://registry.yarnpkg.com/diskusage/-/diskusage-0.2.4.tgz#e956f7a1051e0c6a1af706154efe620a2ee432ec"
+  dependencies:
+    nan "^2.5.0"
+
+doctrine@^2.0.0, doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  dependencies:
+    esutils "^2.0.2"
+
+doctypes@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
+
+dom-serializer@0, dom-serializer@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+  dependencies:
+    domelementtype "~1.1.1"
+    entities "~1.1.1"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+domelementtype@1, domelementtype@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domexception@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+  dependencies:
+    webidl-conversions "^4.0.2"
+
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  dependencies:
+    domelementtype "1"
+
+dompurify@1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-1.0.4.tgz#b0655d07856c1ef76fd27ae18e8ab1174ed18819"
+
+domutils@1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+dot-prop@^4.1.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+  dependencies:
+    is-obj "^1.0.0"
+
+double-ended-queue@^2.1.0-0:
+  version "2.1.0-0"
+  resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+
+download@^4.0.0, download@^4.1.2:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac"
+  dependencies:
+    caw "^1.0.1"
+    concat-stream "^1.4.7"
+    each-async "^1.0.0"
+    filenamify "^1.0.1"
+    got "^5.0.0"
+    gulp-decompress "^1.2.0"
+    gulp-rename "^1.2.0"
+    is-url "^1.2.0"
+    object-assign "^4.0.1"
+    read-all-stream "^3.0.0"
+    readable-stream "^2.0.2"
+    stream-combiner2 "^1.1.1"
+    vinyl "^1.0.0"
+    vinyl-fs "^2.2.0"
+    ware "^1.2.0"
+
+duplexer2@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+  dependencies:
+    readable-stream "~1.1.9"
+
+duplexer2@^0.1.4, duplexer2@~0.1.0:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+  dependencies:
+    readable-stream "^2.0.2"
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+each-async@^1.0.0, each-async@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473"
+  dependencies:
+    onetime "^1.0.0"
+    set-immediate-shim "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ecdsa-sig-formatter@1.0.10:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+editions@^1.3.3:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b"
+
+editorconfig@^0.13.2:
+  version "0.13.3"
+  resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34"
+  dependencies:
+    bluebird "^3.0.5"
+    commander "^2.9.0"
+    lru-cache "^3.2.0"
+    semver "^5.1.0"
+    sigmund "^1.0.1"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+ejs@^2.5.9:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
+
+elasticsearch@15.0.0:
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.0.0.tgz#d888ceb858bba30221b68698d72c54bdcfdf2fba"
+  dependencies:
+    agentkeepalive "^3.4.1"
+    chalk "^1.0.0"
+    lodash "^4.17.10"
+
+electron-to-chromium@^1.2.7:
+  version "1.3.48"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900"
+
+elegant-spinner@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
+
+element-ui@2.3.9:
+  version "2.3.9"
+  resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.3.9.tgz#0c5996e74b375f2665d703c68bdb3269ae9269e0"
+  dependencies:
+    async-validator "~1.8.1"
+    babel-helper-vue-jsx-merge-props "^2.0.0"
+    deepmerge "^1.2.0"
+    normalize-wheel "^1.0.1"
+    resize-observer-polyfill "^1.5.0"
+    throttle-debounce "^1.0.1"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    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"
+
+emojilib@2.2.12:
+  version "2.2.12"
+  resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.2.12.tgz#29481fa5521ac5ed97a5cc0503901c3435d523fa"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  dependencies:
+    once "^1.4.0"
+
+end-of-stream@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
+  dependencies:
+    once "~1.3.0"
+
+enhanced-resolve@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    tapable "^1.0.0"
+
+entities@^1.1.1, entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+envinfo@^5.7.0:
+  version "5.10.0"
+  resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df"
+
+errno@^0.1.3, errno@~0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+error-inject@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37"
+
+error@^7.0.2:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02"
+  dependencies:
+    string-template "~0.2.1"
+    xtend "~4.0.0"
+
+es-abstract@^1.5.1, es-abstract@^1.6.1:
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2:
+  version "0.10.45"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.1"
+    next-tick "1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-promise@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4"
+
+es6-promise@^3.0.2:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
+
+es6-promise@^4.0.3, es6-promise@^4.1.1:
+  version "4.2.4"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
+
+es6-promisify@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+  dependencies:
+    es6-promise "^4.0.3"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.1, escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-regexp@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/escape-regexp/-/escape-regexp-0.0.1.tgz#f44bda12d45bbdf9cb7f862ee7e4827b3dd32254"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.9.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e"
+  dependencies:
+    esprima "^3.1.3"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+eslint-plugin-vue@4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.5.0.tgz#09d6597f4849e31a3846c2c395fccf17685b69c3"
+  dependencies:
+    vue-eslint-parser "^2.0.3"
+
+eslint-scope@^3.7.1:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+
+eslint@4.19.1:
+  version "4.19.1"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
+  dependencies:
+    ajv "^5.3.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.1.0"
+    doctrine "^2.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.4"
+    esquery "^1.0.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.0.1"
+    ignore "^3.3.3"
+    imurmurhash "^0.1.4"
+    inquirer "^3.0.6"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    regexpp "^1.0.1"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
+    strip-json-comments "~2.0.1"
+    table "4.0.2"
+    text-table "~0.2.0"
+
+espree@^3.5.2, espree@^3.5.4:
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+  dependencies:
+    acorn "^5.5.0"
+    acorn-jsx "^3.0.0"
+
+esprima@^2.6.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0, esprima@~4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esquery@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+eventemitter3@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
+
+events@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+exec-buffer@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
+  dependencies:
+    execa "^0.7.0"
+    p-finally "^1.0.0"
+    pify "^3.0.0"
+    rimraf "^2.5.4"
+    tempfile "^2.0.0"
+
+exec-series@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a"
+  dependencies:
+    async-each-series "^1.1.0"
+    object-assign "^4.1.0"
+
+execa@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+  dependencies:
+    cross-spawn "^6.0.0"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+executable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9"
+  dependencies:
+    meow "^3.1.0"
+
+exif-js@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814"
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+exit-on-epipe@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+  dependencies:
+    homedir-polyfill "^1.0.1"
+
+express@^4.12.2:
+  version "4.16.3"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
+  dependencies:
+    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"
+
+extend-shallow@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071"
+  dependencies:
+    kind-of "^1.1.0"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8"
+
+extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.1, external-editor@^2.0.4, external-editor@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+  dependencies:
+    chardet "^0.4.0"
+    iconv-lite "^0.4.17"
+    tmp "^0.0.33"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1"
+  dependencies:
+    ansi-gray "^0.1.1"
+    color-support "^1.1.3"
+    time-stamp "^1.0.0"
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-deep-equal@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-glob@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf"
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.0.1"
+    glob-parent "^3.1.0"
+    is-glob "^4.0.0"
+    merge2 "^1.2.1"
+    micromatch "^3.1.10"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fastparse@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
+fd-slicer@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+  dependencies:
+    pend "~1.2.0"
+
+figures@^1.3.5, figures@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-loader@1.1.11:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8"
+  dependencies:
+    loader-utils "^1.0.2"
+    schema-utils "^0.4.5"
+
+file-type@8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.0.0.tgz#6e4bccc741187f4113334a4e4a4ef84d54d7cc1e"
+
+file-type@^3.1.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+
+file-type@^4.1.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+filename-reserved-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4"
+
+filenamify@^1.0.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5"
+  dependencies:
+    filename-reserved-regex "^1.0.0"
+    strip-outer "^1.0.0"
+    trim-repeated "^1.0.0"
+
+fill-range@^2.1.0:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^3.0.0"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+finalhandler@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
+  dependencies:
+    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"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-index@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+find-versions@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62"
+  dependencies:
+    array-uniq "^1.0.0"
+    get-stdin "^4.0.1"
+    meow "^3.5.0"
+    semver-regex "^1.0.0"
+
+findup-sync@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
+  dependencies:
+    detect-file "^1.0.0"
+    is-glob "^3.1.0"
+    micromatch "^3.0.4"
+    resolve-dir "^1.0.1"
+
+fined@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476"
+  dependencies:
+    expand-tilde "^2.0.2"
+    is-plain-object "^2.0.3"
+    object.defaults "^1.1.0"
+    object.pick "^1.2.0"
+    parse-filepath "^1.0.1"
+
+first-chunk-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
+
+first-chunk-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70"
+  dependencies:
+    readable-stream "^2.0.2"
+
+flagged-respawn@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7"
+
+flat-cache@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+flatten@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+flow-parser@^0.*:
+  version "0.74.0"
+  resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.74.0.tgz#4acc8f55bdce5fa4da43c72c28ef8a9600ace87c"
+
+flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.4"
+
+for-in@^0.1.3:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
+
+for-in@^1.0.1, for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+for-own@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+form-data@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "1.0.6"
+    mime-types "^2.1.12"
+
+format-util@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95"
+
+forwarded@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
+fresh@0.5.2, fresh@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+
+from2@^2.1.0, from2@^2.1.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-constants@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+
+fs-extra@^4.0.2:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+  dependencies:
+    minipass "^2.2.1"
+
+fs-mkdirp-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
+  dependencies:
+    graceful-fs "^4.1.11"
+    through2 "^2.0.3"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0, fsevents@^1.1.2:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+  dependencies:
+    nan "^2.9.2"
+    node-pre-gyp "^0.10.0"
+
+fstream@^1.0.0, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+fuckadblock@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/fuckadblock/-/fuckadblock-3.2.1.tgz#17fa3237a5e15c86613406b911e608191a3e62e2"
+
+function-bind@^1.1.0, function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    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"
+
+gaze@^0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
+  dependencies:
+    globule "~0.1.0"
+
+gaze@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+  dependencies:
+    globule "^1.0.0"
+
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+  dependencies:
+    is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-paths@^0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.2.tgz#a9c27b1a8d006c931a4f26fcf7d1546e3ad71bea"
+  dependencies:
+    fs-extra "^4.0.2"
+
+get-proxy@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb"
+  dependencies:
+    rc "^1.1.2"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@3.0.0, get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+gh-got@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0"
+  dependencies:
+    got "^7.0.0"
+    is-plain-obj "^1.1.0"
+
+gifsicle@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+github-username@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417"
+  dependencies:
+    gh-got "^6.0.0"
+
+glob-all@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab"
+  dependencies:
+    glob "^7.0.5"
+    yargs "~1.2.6"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob-parent@^3.0.0, glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob-stream@^3.1.5:
+  version "3.1.18"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
+  dependencies:
+    glob "^4.3.1"
+    glob2base "^0.0.12"
+    minimatch "^2.0.1"
+    ordered-read-streams "^0.1.0"
+    through2 "^0.6.1"
+    unique-stream "^1.0.0"
+
+glob-stream@^5.3.2:
+  version "5.3.5"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22"
+  dependencies:
+    extend "^3.0.0"
+    glob "^5.0.3"
+    glob-parent "^3.0.0"
+    micromatch "^2.3.7"
+    ordered-read-streams "^0.3.0"
+    through2 "^0.6.0"
+    to-absolute-glob "^0.1.1"
+    unique-stream "^2.0.2"
+
+glob-stream@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
+  dependencies:
+    extend "^3.0.0"
+    glob "^7.1.1"
+    glob-parent "^3.1.0"
+    is-negated-glob "^1.0.0"
+    ordered-read-streams "^1.0.0"
+    pumpify "^1.3.5"
+    readable-stream "^2.1.5"
+    remove-trailing-separator "^1.0.1"
+    to-absolute-glob "^2.0.0"
+    unique-stream "^2.0.2"
+
+glob-to-regexp@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+
+glob-watcher@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
+  dependencies:
+    gaze "^0.5.1"
+
+glob2base@^0.0.12:
+  version "0.0.12"
+  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
+  dependencies:
+    find-index "^0.1.1"
+
+glob@7.0.x:
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.2"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    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@^4.3.1:
+  version "4.5.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^2.0.1"
+    once "^1.3.0"
+
+glob@^5.0.3:
+  version "5.0.15"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^6.0.4:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@~3.1.21:
+  version "3.1.21"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
+  dependencies:
+    graceful-fs "~1.2.0"
+    inherits "1"
+    minimatch "~0.2.11"
+
+global-modules@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+  dependencies:
+    global-prefix "^1.0.1"
+    is-windows "^1.0.1"
+    resolve-dir "^1.0.0"
+
+global-prefix@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+  dependencies:
+    expand-tilde "^2.0.2"
+    homedir-polyfill "^1.0.1"
+    ini "^1.3.4"
+    is-windows "^1.0.1"
+    which "^1.2.14"
+
+globals@^11.0.1:
+  version "11.5.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642"
+
+globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globby@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  dependencies:
+    array-union "^1.0.1"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globby@^8.0.0, globby@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50"
+  dependencies:
+    array-union "^1.0.1"
+    dir-glob "^2.0.0"
+    fast-glob "^2.0.2"
+    glob "^7.1.2"
+    ignore "^3.3.5"
+    pify "^3.0.0"
+    slash "^1.0.0"
+
+globule@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
+  dependencies:
+    glob "~7.1.1"
+    lodash "~4.17.10"
+    minimatch "~3.0.2"
+
+globule@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
+  dependencies:
+    glob "~3.1.21"
+    lodash "~1.0.1"
+    minimatch "~0.2.11"
+
+glogg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810"
+  dependencies:
+    sparkles "^1.0.0"
+
+gm@1.23.1:
+  version "1.23.1"
+  resolved "https://registry.yarnpkg.com/gm/-/gm-1.23.1.tgz#2edeeb958084d0f8ea7988e5d995b1c7dfc14777"
+  dependencies:
+    array-parallel "~0.1.3"
+    array-series "~0.1.5"
+    cross-spawn "^4.0.0"
+    debug "^3.1.0"
+
+got@^5.0.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35"
+  dependencies:
+    create-error-class "^3.0.1"
+    duplexer2 "^0.1.4"
+    is-redirect "^1.0.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    lowercase-keys "^1.0.0"
+    node-status-codes "^1.0.0"
+    object-assign "^4.0.1"
+    parse-json "^2.1.0"
+    pinkie-promise "^2.0.0"
+    read-all-stream "^3.0.0"
+    readable-stream "^2.0.5"
+    timed-out "^3.0.0"
+    unzip-response "^1.0.2"
+    url-parse-lax "^1.0.0"
+
+got@^7.0.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+  dependencies:
+    decompress-response "^3.2.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    is-plain-obj "^1.1.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    p-cancelable "^0.3.0"
+    p-timeout "^1.1.1"
+    safe-buffer "^5.0.1"
+    timed-out "^4.0.0"
+    url-parse-lax "^1.0.0"
+    url-to-options "^1.0.1"
+
+got@^8.3.1:
+  version "8.3.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed"
+  dependencies:
+    "@sindresorhus/is" "^0.7.0"
+    cacheable-request "^2.1.1"
+    decompress-response "^3.3.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    into-stream "^3.1.0"
+    is-retry-allowed "^1.1.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    mimic-response "^1.0.0"
+    p-cancelable "^0.4.0"
+    p-timeout "^2.0.1"
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+    timed-out "^4.0.1"
+    url-parse-lax "^3.0.0"
+    url-to-options "^1.0.1"
+
+graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+graceful-fs@^3.0.0:
+  version "3.0.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
+  dependencies:
+    natives "^1.1.0"
+
+graceful-fs@~1.2.0:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
+
+"graceful-readlink@>= 1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+grouped-queue@^0.3.3:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c"
+  dependencies:
+    lodash "^4.17.2"
+
+growl@1.10.5:
+  version "1.10.5"
+  resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+
+gulp-cssnano@2.1.3:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz#02007e2817af09b3688482b430ad7db807aebf72"
+  dependencies:
+    buffer-from "^1.0.0"
+    cssnano "^3.0.0"
+    object-assign "^4.0.1"
+    plugin-error "^1.0.1"
+    vinyl-sourcemaps-apply "^0.2.1"
+
+gulp-decompress@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7"
+  dependencies:
+    archive-type "^3.0.0"
+    decompress "^3.0.0"
+    gulp-util "^3.0.1"
+    readable-stream "^2.0.2"
+
+gulp-htmlmin@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz#266feaed83588838aedda3666f67d057ec120313"
+  dependencies:
+    bufferstreams "^1.1.0"
+    html-minifier "^3.0.3"
+    plugin-error "^0.1.2"
+    readable-stream "^2.0.2"
+    tryit "^1.0.1"
+
+gulp-imagemin@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz#5ce347f1d1706fed3cc8f1777ca9094a583b50b7"
+  dependencies:
+    chalk "^2.1.0"
+    fancy-log "^1.3.2"
+    imagemin "^5.3.1"
+    plugin-error "^0.1.2"
+    plur "^2.1.2"
+    pretty-bytes "^4.0.2"
+    through2-concurrent "^1.1.1"
+  optionalDependencies:
+    imagemin-gifsicle "^5.2.0"
+    imagemin-jpegtran "^5.0.2"
+    imagemin-optipng "^5.2.1"
+    imagemin-svgo "^6.0.0"
+
+gulp-mocha@6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-6.0.0.tgz#80f32bc705ce30747f355ddb8ccd96a1c73bef13"
+  dependencies:
+    dargs "^5.1.0"
+    execa "^0.10.0"
+    mocha "^5.2.0"
+    npm-run-path "^2.0.2"
+    plugin-error "^1.0.1"
+    supports-color "^5.4.0"
+    through2 "^2.0.3"
+
+gulp-pug@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/gulp-pug/-/gulp-pug-4.0.1.tgz#5c5bb38303a5a565add8b200e292b4a076cf2efa"
+  dependencies:
+    "@types/pug" "^2.0.4"
+    fancy-log "^1.3.2"
+    plugin-error "^1.0.1"
+    pug "^2.0.3"
+    replace-ext "^1.0.0"
+    through2 "^2.0.3"
+
+gulp-rename@1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz#37b75298e9d3e6c0fe9ac4eac13ce3be5434646b"
+
+gulp-rename@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826"
+
+gulp-replace@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143"
+  dependencies:
+    istextorbinary "2.2.1"
+    readable-stream "^2.0.1"
+    replacestream "^4.0.0"
+
+gulp-sourcemaps@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c"
+  dependencies:
+    convert-source-map "^1.1.1"
+    graceful-fs "^4.1.2"
+    strip-bom "^2.0.0"
+    through2 "^2.0.0"
+    vinyl "^1.0.0"
+
+gulp-sourcemaps@2.6.4:
+  version "2.6.4"
+  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz#cbb2008450b1bcce6cd23bf98337be751bf6e30a"
+  dependencies:
+    "@gulp-sourcemaps/identity-map" "1.X"
+    "@gulp-sourcemaps/map-sources" "1.X"
+    acorn "5.X"
+    convert-source-map "1.X"
+    css "2.X"
+    debug-fabulous "1.X"
+    detect-newline "2.X"
+    graceful-fs "4.X"
+    source-map "~0.6.0"
+    strip-bom-string "1.X"
+    through2 "2.X"
+
+gulp-stylus@2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/gulp-stylus/-/gulp-stylus-2.7.0.tgz#f3e932626004927b75ea27ff5c1d3b0ba0b7cbb1"
+  dependencies:
+    accord "^0.26.3"
+    lodash.assign "^3.2.0"
+    plugin-error "^0.1.2"
+    replace-ext "0.0.1"
+    stylus "^0.54.0"
+    through2 "^2.0.0"
+    vinyl-sourcemaps-apply "^0.2.0"
+
+gulp-tslint@8.1.3:
+  version "8.1.3"
+  resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.3.tgz#a89ed144038ae861ee7bfea9528272d126a93da1"
+  dependencies:
+    "@types/fancy-log" "1.3.0"
+    chalk "2.3.1"
+    fancy-log "1.3.2"
+    map-stream "~0.0.7"
+    plugin-error "1.0.1"
+    through "~2.3.8"
+
+gulp-typescript@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-4.0.2.tgz#80bb9e376e7aa87b763a6ad5fe054a5d078da1e6"
+  dependencies:
+    ansi-colors "^1.0.1"
+    plugin-error "^0.1.2"
+    source-map "^0.6.1"
+    through2 "^2.0.3"
+    vinyl "^2.1.0"
+    vinyl-fs "^3.0.0"
+
+gulp-uglify@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca"
+  dependencies:
+    gulplog "^1.0.0"
+    has-gulplog "^0.1.0"
+    lodash "^4.13.1"
+    make-error-cause "^1.1.1"
+    through2 "^2.0.0"
+    uglify-js "^3.0.5"
+    vinyl-sourcemaps-apply "^0.2.0"
+
+gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.1:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
+  dependencies:
+    array-differ "^1.0.0"
+    array-uniq "^1.0.2"
+    beeper "^1.0.0"
+    chalk "^1.0.0"
+    dateformat "^2.0.0"
+    fancy-log "^1.1.0"
+    gulplog "^1.0.0"
+    has-gulplog "^0.1.0"
+    lodash._reescape "^3.0.0"
+    lodash._reevaluate "^3.0.0"
+    lodash._reinterpolate "^3.0.0"
+    lodash.template "^3.0.0"
+    minimist "^1.1.0"
+    multipipe "^0.1.2"
+    object-assign "^3.0.0"
+    replace-ext "0.0.1"
+    through2 "^2.0.0"
+    vinyl "^0.5.0"
+
+gulp@3.9.1:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
+  dependencies:
+    archy "^1.0.0"
+    chalk "^1.0.0"
+    deprecated "^0.0.1"
+    gulp-util "^3.0.0"
+    interpret "^1.0.0"
+    liftoff "^2.1.0"
+    minimist "^1.1.0"
+    orchestrator "^0.3.0"
+    pretty-hrtime "^1.0.0"
+    semver "^4.1.0"
+    tildify "^1.0.0"
+    v8flags "^2.0.2"
+    vinyl-fs "^0.3.0"
+
+gulplog@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+  dependencies:
+    glogg "^1.0.0"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  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:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    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"
+
+hard-source-webpack-plugin@0.6.10:
+  version "0.6.10"
+  resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.6.10.tgz#bae18a97c12150d31fa9d5e40625c65b0b10034d"
+  dependencies:
+    lodash "^4.15.0"
+    mkdirp "^0.5.1"
+    node-object-hash "^1.2.0"
+    rimraf "^2.6.2"
+    tapable "^1.0.0-beta.5"
+    webpack-core "~0.6.0"
+    webpack-sources "^1.0.1"
+    write-json-file "^2.3.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-color@~0.1.0:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-gulplog@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+  dependencies:
+    sparkles "^1.0.0"
+
+has-symbol-support-x@^1.4.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+
+has-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
+
+has-to-string-tag-x@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+  dependencies:
+    has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  dependencies:
+    function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash-sum@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.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.x, he@^1.1.0, he@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+highlight.js@9.12.0:
+  version "9.12.0"
+  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoek@4.x.x:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+homedir-polyfill@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
+  dependencies:
+    parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
+
+html-comment-regex@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+html-encoding-sniffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+  dependencies:
+    whatwg-encoding "^1.0.1"
+
+html-entities@1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+html-minifier@3.5.16, html-minifier@^3.0.3:
+  version "3.5.16"
+  resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175"
+  dependencies:
+    camel-case "3.0.x"
+    clean-css "4.1.x"
+    commander "2.15.x"
+    he "1.1.x"
+    param-case "2.1.x"
+    relateurl "0.2.x"
+    uglify-js "3.3.x"
+
+htmlparser2@^3.9.1:
+  version "3.9.2"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+  dependencies:
+    domelementtype "^1.3.0"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+http-assert@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a"
+  dependencies:
+    deep-equal "~1.0.1"
+    http-errors "~1.6.1"
+
+http-cache-semantics@3.8.1:
+  version "3.8.1"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+
+http-errors@1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+  dependencies:
+    depd "1.1.1"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3:
+  version "1.6.3"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.3"
+    setprototypeof "1.1.0"
+    statuses ">= 1.4.0 < 2"
+
+http-signature@1.2.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"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+http_ece@1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.0.5.tgz#b60660faaf14215102d1493ea720dcd92b53372f"
+  dependencies:
+    urlsafe-base64 "~1.0.0"
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+https-proxy-agent@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
+  dependencies:
+    agent-base "^4.1.0"
+    debug "^3.1.0"
+
+humanize-ms@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+  dependencies:
+    ms "^2.0.0"
+
+humanize-number@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18"
+
+iconv-lite@0.4.19:
+  version "0.4.19"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
+  version "0.4.23"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+icss-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+  dependencies:
+    postcss "^6.0.1"
+
+ieee754@^1.1.4:
+  version "1.1.12"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore-walk@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+  dependencies:
+    minimatch "^3.0.4"
+
+ignore@^3.3.3, ignore@^3.3.5:
+  version "3.3.8"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
+
+imagemin-gifsicle@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz#3781524c457612ef04916af34241a2b42bfcb40a"
+  dependencies:
+    exec-buffer "^3.0.0"
+    gifsicle "^3.0.0"
+    is-gif "^1.0.0"
+
+imagemin-jpegtran@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz#e6882263b8f7916fddb800640cf75d2e970d2ad6"
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-jpg "^1.0.0"
+    jpegtran-bin "^3.0.0"
+
+imagemin-optipng@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#d22da412c09f5ff00a4339960b98a88b1dbe8695"
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-png "^1.0.0"
+    optipng-bin "^3.0.0"
+
+imagemin-svgo@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz#2dd8c82946be42a8e2cbcae3c5bf007bc2b8b9e8"
+  dependencies:
+    buffer-from "^0.1.1"
+    is-svg "^2.0.0"
+    svgo "^1.0.0"
+
+imagemin@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-5.3.1.tgz#f19c2eee1e71ba6c6558c515f9fc96680189a6d4"
+  dependencies:
+    file-type "^4.1.0"
+    globby "^6.1.0"
+    make-dir "^1.0.0"
+    p-pipe "^1.1.0"
+    pify "^2.3.0"
+    replace-ext "^1.0.0"
+
+import-local@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+  dependencies:
+    pkg-dir "^2.0.0"
+    resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+in-publish@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+indent-string@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
+
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+indx@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50"
+
+inflation@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.4, ini@~1.3.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+inquirer@3.0.6:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.1"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx "^4.1.0"
+    string-width "^2.0.0"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+inquirer@5.2.0, inquirer@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.1.0"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rxjs "^5.5.2"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+inquirer@^3.0.6:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+interpret@^1.0.0, interpret@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+into-stream@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+  dependencies:
+    from2 "^2.1.1"
+    p-is-promise "^1.1.0"
+
+invariant@^2.2.2:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ip-regex@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
+
+ipaddr.js@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
+
+irregular-plurals@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766"
+
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-absolute@^0.1.5:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f"
+  dependencies:
+    is-relative "^0.1.0"
+
+is-absolute@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
+  dependencies:
+    is-relative "^1.0.0"
+    is-windows "^1.0.1"
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-bzip2@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-expression@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
+  dependencies:
+    acorn "~4.0.2"
+    object-assign "^4.0.1"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-generator-function@^1.0.3:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
+
+is-gif@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-gzip@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83"
+
+is-jpg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975"
+
+is-my-ip-valid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
+
+is-my-json-valid@^2.12.4:
+  version "2.17.2"
+  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c"
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    is-my-ip-valid "^1.0.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
+
+is-natural-number@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7"
+
+is-negated-glob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+
+is-observable@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
+  dependencies:
+    symbol-observable "^1.1.0"
+
+is-odd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
+  dependencies:
+    is-number "^4.0.0"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
+
+is-png@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.0.0, is-promise@^2.1, is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-redirect@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-regex@^1.0.3, is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-relative@^0.1.0:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82"
+
+is-relative@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
+  dependencies:
+    is-unc-path "^1.0.0"
+
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
+is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-root@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019"
+
+is-scoped@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30"
+  dependencies:
+    scoped-regex "^1.0.0"
+
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-svg@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+  dependencies:
+    html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-tar@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d"
+
+is-there@^4.0.0:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.4.3.tgz#a2c49366c6a487f719dbcad80cbde21248d2c18d"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-unc-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
+  dependencies:
+    unc-path-regex "^0.1.2"
+
+is-url@1.2.4, is-url@^1.2.0:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+
+is-utf8@^0.2.0, is-utf8@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-valid-glob@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe"
+
+is-valid-glob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
+
+is-whitespace@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
+
+is-windows@^1.0.1, is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+is-zip@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325"
+
+is2@0.0.9:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629"
+  dependencies:
+    deep-is "0.1.2"
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isarray@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
+
+isbinaryfile@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istextorbinary@2.2.1, istextorbinary@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53"
+  dependencies:
+    binaryextensions "2"
+    editions "^1.3.3"
+    textextensions "2"
+
+isurl@^1.0.0-alpha5:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+  dependencies:
+    has-to-string-tag-x "^1.2.0"
+    is-object "^1.0.1"
+
+jpegtran-bin@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz#f60ecf4ae999c0bdad2e9fbcdf2b6f0981e7a29b"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+js-base64@^2.1.8, js-base64@^2.1.9:
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92"
+
+js-beautify@^1.6.12:
+  version "1.7.5"
+  resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919"
+  dependencies:
+    config-chain "~1.1.5"
+    editorconfig "^0.13.2"
+    mkdirp "~0.5.0"
+    nopt "~3.0.1"
+
+js-stringify@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@^3.4.6, js-yaml@^3.7.0, js-yaml@^3.8.4, js-yaml@^3.9.1:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@~3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^2.6.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jschardet@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678"
+
+jscodeshift@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.4.1.tgz#da91a1c2eccfa03a3387a21d39948e251ced444a"
+  dependencies:
+    async "^1.5.0"
+    babel-plugin-transform-flow-strip-types "^6.8.0"
+    babel-preset-es2015 "^6.9.0"
+    babel-preset-stage-1 "^6.5.0"
+    babel-register "^6.9.0"
+    babylon "^6.17.3"
+    colors "^1.1.2"
+    flow-parser "^0.*"
+    lodash "^4.13.1"
+    micromatch "^2.3.7"
+    node-dir "0.1.8"
+    nomnom "^1.8.1"
+    recast "^0.12.5"
+    temp "^0.8.1"
+    write-file-atomic "^1.2.0"
+
+jscodeshift@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.5.1.tgz#4af6a721648be8638ae1464a190342da52960c33"
+  dependencies:
+    babel-plugin-transform-flow-strip-types "^6.8.0"
+    babel-preset-es2015 "^6.9.0"
+    babel-preset-stage-1 "^6.5.0"
+    babel-register "^6.9.0"
+    babylon "^7.0.0-beta.47"
+    colors "^1.1.2"
+    flow-parser "^0.*"
+    lodash "^4.13.1"
+    micromatch "^2.3.7"
+    neo-async "^2.5.0"
+    node-dir "0.1.8"
+    nomnom "^1.8.1"
+    recast "^0.15.0"
+    temp "^0.8.1"
+    write-file-atomic "^1.2.0"
+
+jsdom@11.11.0:
+  version "11.11.0"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e"
+  dependencies:
+    abab "^1.0.4"
+    acorn "^5.3.0"
+    acorn-globals "^4.1.0"
+    array-equal "^1.0.0"
+    cssom ">= 0.3.2 < 0.4.0"
+    cssstyle ">= 0.3.1 < 0.4.0"
+    data-urls "^1.0.0"
+    domexception "^1.0.0"
+    escodegen "^1.9.0"
+    html-encoding-sniffer "^1.0.2"
+    left-pad "^1.2.0"
+    nwsapi "^2.0.0"
+    parse5 "4.0.0"
+    pn "^1.1.0"
+    request "^2.83.0"
+    request-promise-native "^1.0.5"
+    sax "^1.2.4"
+    symbol-tree "^3.2.2"
+    tough-cookie "^2.3.3"
+    w3c-hr-time "^1.0.1"
+    webidl-conversions "^4.0.2"
+    whatwg-encoding "^1.0.3"
+    whatwg-mimetype "^2.1.0"
+    whatwg-url "^6.4.1"
+    ws "^4.0.0"
+    xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-buffer@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-schema-ref-parser@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-1.4.1.tgz#c0c2e438bf0796723b02451bae8bc7dd0b37fed0"
+  dependencies:
+    call-me-maybe "^1.0.1"
+    debug "^2.2.0"
+    es6-promise "^3.0.2"
+    js-yaml "^3.4.6"
+    ono "^2.0.1"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@0.5.1, json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+jstransformer@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
+  dependencies:
+    is-promise "^2.0.0"
+    promise "^7.0.1"
+
+jwa@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6"
+  dependencies:
+    buffer-equal-constant-time "1.0.1"
+    ecdsa-sig-formatter "1.0.10"
+    safe-buffer "^5.0.1"
+
+jws@^3.1.3:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f"
+  dependencies:
+    jwa "^1.1.5"
+    safe-buffer "^5.0.1"
+
+keygrip@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91"
+
+keyv@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+  dependencies:
+    json-buffer "3.0.0"
+
+kind-of@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+koa-bodyparser@4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29"
+  dependencies:
+    co-body "^6.0.0"
+    copy-to "^2.0.1"
+
+koa-compose@^3.0.0, koa-compose@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7"
+  dependencies:
+    any-promise "^1.1.0"
+
+koa-compose@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+
+koa-compress@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-3.0.0.tgz#3194059c215cbc24e59bbc84c2c7453a4c88564f"
+  dependencies:
+    bytes "^3.0.0"
+    compressible "^2.0.0"
+    koa-is-json "^1.0.0"
+    statuses "^1.0.0"
+
+koa-convert@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0"
+  dependencies:
+    co "^4.6.0"
+    koa-compose "^3.0.0"
+
+koa-favicon@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/koa-favicon/-/koa-favicon-2.0.1.tgz#cfae363e5fd00bd5dd67c1150fbef31e0b5d6f4d"
+  dependencies:
+    mz "^2.7.0"
+
+koa-is-json@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14"
+
+koa-json-body@5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/koa-json-body/-/koa-json-body-5.3.0.tgz#64aad3f400adfb81df54b63f7a5eb38bad62d980"
+  dependencies:
+    co-body "^5.0.0"
+
+koa-logger@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.0.tgz#8aef64d8b848fb6253a9b31aa708d0e05141f0e6"
+  dependencies:
+    bytes "^2.5.0"
+    chalk "^1.1.3"
+    humanize-number "0.0.2"
+    passthrough-counter "^1.0.0"
+
+koa-mount@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-3.0.0.tgz#08cab3b83d31442ed8b7e75c54b1abeb922ec197"
+  dependencies:
+    debug "^2.6.1"
+    koa-compose "^3.2.1"
+
+koa-multer@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/koa-multer/-/koa-multer-1.0.2.tgz#d38f7ffd1db97b1aad33e7774732f000ebd67259"
+  dependencies:
+    multer "1.3.0"
+
+koa-router@7.4.0:
+  version "7.4.0"
+  resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0"
+  dependencies:
+    debug "^3.1.0"
+    http-errors "^1.3.1"
+    koa-compose "^3.0.0"
+    methods "^1.0.1"
+    path-to-regexp "^1.1.1"
+    urijs "^1.19.0"
+
+koa-send@4.1.3, koa-send@^4.0.0:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6"
+  dependencies:
+    debug "^2.6.3"
+    http-errors "^1.6.1"
+    mz "^2.6.0"
+    resolve-path "^1.4.0"
+
+koa-slow@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/koa-slow/-/koa-slow-2.1.0.tgz#39007ca628c620f2b307b90dbf423d7a0c9be971"
+  dependencies:
+    lodash.isregexp "3.0.5"
+    q "1.4.1"
+
+koa-views@6.1.4:
+  version "6.1.4"
+  resolved "https://registry.yarnpkg.com/koa-views/-/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d"
+  dependencies:
+    consolidate "^0.15.0"
+    debug "^3.1.0"
+    get-paths "^0.0.2"
+    koa-send "^4.0.0"
+    mz "^2.4.0"
+    pretty "^2.0.0"
+
+koa@2.5.1:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.1.tgz#79f8b95f8d72d04fe9a58a8da5ebd6d341103f9c"
+  dependencies:
+    accepts "^1.2.2"
+    content-disposition "~0.5.0"
+    content-type "^1.0.0"
+    cookies "~0.7.0"
+    debug "*"
+    delegates "^1.0.0"
+    depd "^1.1.0"
+    destroy "^1.0.3"
+    error-inject "~1.0.0"
+    escape-html "~1.0.1"
+    fresh "^0.5.2"
+    http-assert "^1.1.0"
+    http-errors "^1.2.8"
+    is-generator-function "^1.0.3"
+    koa-compose "^4.0.0"
+    koa-convert "^1.2.0"
+    koa-is-json "^1.0.0"
+    mime-types "^2.0.7"
+    on-finished "^2.1.0"
+    only "0.0.2"
+    parseurl "^1.3.0"
+    statuses "^1.2.0"
+    type-is "^1.5.5"
+    vary "^1.0.0"
+
+kue@0.11.6:
+  version "0.11.6"
+  resolved "https://registry.yarnpkg.com/kue/-/kue-0.11.6.tgz#5b76916bcedd56636a107861471c63c94611860a"
+  dependencies:
+    body-parser "^1.12.2"
+    express "^4.12.2"
+    lodash "^4.0.0"
+    nib "~1.1.2"
+    node-redis-warlock "~0.2.0"
+    pug "^2.0.0-beta3"
+    redis "~2.6.0-2"
+    stylus "~0.54.5"
+    yargs "^4.0.0"
+  optionalDependencies:
+    reds "^0.2.5"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazy-req@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
+
+lazystream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+  dependencies:
+    readable-stream "^2.0.5"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+lead@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
+  dependencies:
+    flush-write-stream "^1.0.2"
+
+leb@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3"
+
+left-pad@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+license-checker@20.0.0:
+  version "20.0.0"
+  resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-20.0.0.tgz#29b338ba7f4e841b850cc59ddd393dbc8927f375"
+  dependencies:
+    chalk "^2.4.1"
+    debug "^3.1.0"
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    read-installed "~4.0.3"
+    semver "^5.5.0"
+    spdx "^0.5.1"
+    spdx-correct "^3.0.0"
+    spdx-satisfies "^4.0.0"
+    strip-ansi "^4.0.0"
+    treeify "^1.1.0"
+
+liftoff@^2.1.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
+  dependencies:
+    extend "^3.0.0"
+    findup-sync "^2.0.0"
+    fined "^1.0.1"
+    flagged-respawn "^1.0.0"
+    is-plain-object "^2.0.4"
+    object.map "^1.0.0"
+    rechoir "^0.6.2"
+    resolve "^1.1.7"
+
+listr-silent-renderer@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
+
+listr-update-renderer@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
+  dependencies:
+    chalk "^1.1.3"
+    cli-truncate "^0.2.1"
+    elegant-spinner "^1.0.1"
+    figures "^1.7.0"
+    indent-string "^3.0.0"
+    log-symbols "^1.0.2"
+    log-update "^1.0.2"
+    strip-ansi "^3.0.1"
+
+listr-verbose-renderer@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
+  dependencies:
+    chalk "^1.1.3"
+    cli-cursor "^1.0.2"
+    date-fns "^1.27.2"
+    figures "^1.7.0"
+
+listr@^0.14.1:
+  version "0.14.1"
+  resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d"
+  dependencies:
+    "@samverschueren/stream-to-observable" "^0.3.0"
+    cli-truncate "^0.2.1"
+    figures "^1.7.0"
+    indent-string "^2.1.0"
+    is-observable "^1.1.0"
+    is-promise "^2.1.0"
+    is-stream "^1.1.0"
+    listr-silent-renderer "^1.1.1"
+    listr-update-renderer "^0.4.0"
+    listr-verbose-renderer "^0.4.0"
+    log-symbols "^1.0.2"
+    log-update "^1.0.2"
+    ora "^0.2.3"
+    p-map "^1.1.1"
+    rxjs "^6.1.0"
+    strip-ansi "^3.0.1"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+load-json-file@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^4.0.0"
+    pify "^3.0.0"
+    strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash._baseassign@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+  dependencies:
+    lodash._basecopy "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basetostring@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+
+lodash._basevalues@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+
+lodash._bindcallback@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+
+lodash._createassigner@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"
+  dependencies:
+    lodash._bindcallback "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+    lodash.restparam "^3.0.0"
+
+lodash._getnative@^3.0.0:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._reescape@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+
+lodash._reevaluate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+
+lodash._reinterpolate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash._root@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+
+lodash.assign@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"
+  dependencies:
+    lodash._baseassign "^3.0.0"
+    lodash._createassigner "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+
+lodash.assignin@^4.0.9:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
+
+lodash.bind@^4.1.4:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
+
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+
+lodash.clone@^4.3.2:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
+
+lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+
+lodash.defaults@^4.0.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.escape@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+  dependencies:
+    lodash._root "^3.0.0"
+
+lodash.filter@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
+
+lodash.flatten@^4.2.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+
+lodash.foreach@^4.3.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+
+lodash.get@^4.0.0, lodash.get@^4.4.2:
+  version "4.4.2"
+  resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+
+lodash.isarguments@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isequal@^4.0.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+
+lodash.isregexp@3.0.5:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/lodash.isregexp/-/lodash.isregexp-3.0.5.tgz#e0f596242f2fa228a840086b6c8ad82e4b71fd2d"
+
+lodash.keys@^3.0.0:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+  dependencies:
+    lodash._getnative "^3.0.0"
+    lodash.isarguments "^3.0.0"
+    lodash.isarray "^3.0.0"
+
+lodash.map@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
+
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
+lodash.merge@^4.4.0:
+  version "4.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
+
+lodash.mergewith@^4.6.0:
+  version "4.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
+
+lodash.partialright@^4.1.4:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b"
+
+lodash.pick@^4.2.1:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+
+lodash.reduce@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
+
+lodash.reject@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
+
+lodash.restparam@^3.0.0:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
+lodash.some@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash.startcase@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8"
+
+lodash.tail@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
+
+lodash.template@^3.0.0:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+  dependencies:
+    lodash._basecopy "^3.0.0"
+    lodash._basetostring "^3.0.0"
+    lodash._basevalues "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+    lodash._reinterpolate "^3.0.0"
+    lodash.escape "^3.0.0"
+    lodash.keys "^3.0.0"
+    lodash.restparam "^3.0.0"
+    lodash.templatesettings "^3.0.0"
+
+lodash.templatesettings@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+  dependencies:
+    lodash._reinterpolate "^3.0.0"
+    lodash.escape "^3.0.0"
+
+lodash.unescape@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
+
+lodash.uniq@^4.3.0, lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+lodash@^3.10.1:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10:
+  version "4.17.10"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+lodash@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
+
+log-symbols@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
+  dependencies:
+    chalk "^1.0.0"
+
+log-symbols@^2.1.0, log-symbols@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+  dependencies:
+    chalk "^2.0.1"
+
+log-update@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
+  dependencies:
+    ansi-escapes "^1.0.0"
+    cli-cursor "^1.0.2"
+
+logalot@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
+  dependencies:
+    figures "^1.3.5"
+    squeak "^1.0.0"
+
+long@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
+
+longest@^1.0.0, longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+lower-case@^1.1.1:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+
+lowercase-keys@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lowercase-keys@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+
+lpad-align@^1.0.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
+  dependencies:
+    get-stdin "^4.0.1"
+    indent-string "^2.1.0"
+    longest "^1.0.0"
+    meow "^3.3.0"
+
+lru-cache@2, lru-cache@^2.5.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+
+lru-cache@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+  dependencies:
+    pseudomap "^1.0.1"
+
+lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-queue@0.1:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+  dependencies:
+    es5-ext "~0.10.2"
+
+make-dir@^1.0.0, make-dir@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  dependencies:
+    pify "^3.0.0"
+
+make-error-cause@^1.1.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d"
+  dependencies:
+    make-error "^1.2.0"
+
+make-error@^1.1.1, make-error@^1.2.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535"
+
+make-iterator@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
+  dependencies:
+    kind-of "^6.0.2"
+
+map-cache@^0.2.0, map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+map-stream@~0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
+
+math-expression-evaluator@^1.2.14:
+  version "1.2.17"
+  resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+
+math-random@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+mdn-data@^1.0.0, mdn-data@~1.1.0:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
+
+mecab-async@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/mecab-async/-/mecab-async-0.1.2.tgz#69efb838729216709597a57da2df03922f9b593a"
+  dependencies:
+    shell-quote "*"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem-fs-editor@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz#55a79b1e824da631254c4c95ba6366602c77af90"
+  dependencies:
+    commondir "^1.0.1"
+    deep-extend "^0.5.1"
+    ejs "^2.5.9"
+    glob "^7.0.3"
+    globby "^8.0.0"
+    isbinaryfile "^3.0.2"
+    mkdirp "^0.5.0"
+    multimatch "^2.0.0"
+    rimraf "^2.2.8"
+    through2 "^2.0.0"
+    vinyl "^2.0.1"
+
+mem-fs@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc"
+  dependencies:
+    through2 "^2.0.0"
+    vinyl "^1.1.0"
+    vinyl-file "^2.0.0"
+
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+memoizee@0.4.X:
+  version "0.4.12"
+  resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.30"
+    es6-weak-map "^2.0.2"
+    event-emitter "^0.3.5"
+    is-promise "^2.1"
+    lru-queue "0.1"
+    next-tick "1"
+    timers-ext "^0.1.2"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, meow@^3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+merge-source-map@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+  dependencies:
+    source-map "^0.6.1"
+
+merge-stream@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+  dependencies:
+    readable-stream "^2.0.1"
+
+merge2@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34"
+
+methods@^1.0.1, methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.7:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    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"
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+"mime-db@>= 1.34.0 < 2":
+  version "1.34.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a"
+
+mime-db@~1.33.0:
+  version "1.33.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+
+mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
+  version "2.1.18"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+  dependencies:
+    mime-db "~1.33.0"
+
+mime@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+
+mime@^2.0.3:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369"
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+mimic-response@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimatch@^2.0.1:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+  dependencies:
+    brace-expansion "^1.0.0"
+
+minimatch@~0.2.11:
+  version "0.2.14"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
+  dependencies:
+    lru-cache "2"
+    sigmund "~1.0.0"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de"
+
+minipass@^2.2.1, minipass@^2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+  dependencies:
+    safe-buffer "^5.1.2"
+    yallist "^3.0.0"
+
+minizlib@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+  dependencies:
+    minipass "^2.2.1"
+
+mississippi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^2.0.1"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+mixin-object@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
+  dependencies:
+    for-in "^0.1.3"
+    is-extendable "^0.1.1"
+
+mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+mocha@5.2.0, mocha@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
+  dependencies:
+    browser-stdout "1.3.1"
+    commander "2.15.1"
+    debug "3.1.0"
+    diff "3.5.0"
+    escape-string-regexp "1.0.5"
+    glob "7.1.2"
+    growl "1.10.5"
+    he "1.1.1"
+    minimatch "3.0.4"
+    mkdirp "0.5.1"
+    supports-color "5.4.0"
+
+moji@0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/moji/-/moji-0.5.1.tgz#088eecd1c22c8f31a240adcf9c95e54f33eb54fb"
+  dependencies:
+    object-assign "^3.0.0"
+
+mongodb-core@2.1.19:
+  version "2.1.19"
+  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b"
+  dependencies:
+    bson "~1.0.4"
+    require_optional "~1.0.0"
+
+mongodb-core@3.0.9:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.9.tgz#8327410c88811013fb3e4ac7c4c670f324349be1"
+  dependencies:
+    bson "~1.0.4"
+    require_optional "^1.0.1"
+
+mongodb@3.0.10:
+  version "3.0.10"
+  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.10.tgz#f948cb9595adcbfcad7444f6b24a040b653b23e8"
+  dependencies:
+    mongodb-core "3.0.9"
+
+mongodb@^2.1.18:
+  version "2.2.35"
+  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.35.tgz#cd1b5af8a9463e3f9a787fa5b3d05565579730f9"
+  dependencies:
+    es6-promise "3.2.1"
+    mongodb-core "2.1.19"
+    readable-stream "2.2.7"
+
+monk-middleware-cast-ids@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz#40c40e5a6cb33ccedc289220943275ee8861c529"
+
+monk-middleware-fields@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz#ff637af35f5948879ccb2be15a91360911bea6c1"
+
+monk-middleware-handle-callback@^0.2.0:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz#47de6cc1248726c72a2be0c81bc4e68310c32146"
+
+monk-middleware-options@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz#58dae1c518d46636ebdff506fadfc773bb442886"
+
+monk-middleware-query@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz#a926c677d4a5620c62151b0a56d0c0c151675874"
+
+monk-middleware-wait-for-connection@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz#312958d30e588b57d09754dd7c97b4843316835a"
+
+monk@6.0.6:
+  version "6.0.6"
+  resolved "https://registry.yarnpkg.com/monk/-/monk-6.0.6.tgz#2ff1cd57f001bba0fea73d1eea3952a7d35450c5"
+  dependencies:
+    debug "*"
+    mongodb "^2.1.18"
+    monk-middleware-cast-ids "^0.2.1"
+    monk-middleware-fields "^0.2.0"
+    monk-middleware-handle-callback "^0.2.0"
+    monk-middleware-options "^0.2.1"
+    monk-middleware-query "^0.2.0"
+    monk-middleware-wait-for-connection "^0.2.0"
+    object-assign "^4.1.1"
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+ms@2.1.1, ms@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+
+multer@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2"
+  dependencies:
+    append-field "^0.1.0"
+    busboy "^0.2.11"
+    concat-stream "^1.5.0"
+    mkdirp "^0.5.1"
+    object-assign "^3.0.0"
+    on-finished "^2.3.0"
+    type-is "^1.6.4"
+    xtend "^4.0.0"
+
+multimatch@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
+  dependencies:
+    array-differ "^1.0.0"
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    minimatch "^3.0.0"
+
+multipipe@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+  dependencies:
+    duplexer2 "0.0.2"
+
+mute-stream@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+mz@^2.4.0, mz@^2.6.0, mz@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+  dependencies:
+    any-promise "^1.0.0"
+    object-assign "^4.0.1"
+    thenify-all "^1.0.0"
+
+nan@2.10.0, nan@^2.10.0, nan@^2.3.3, nan@^2.5.0, nan@^2.9.2:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-odd "^2.0.0"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+natives@^1.1.0:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+natural@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/natural/-/natural-0.2.1.tgz#1eb5156a9d90b4591949e20e94ebc77bb2339eda"
+  dependencies:
+    apparatus ">= 0.0.9"
+    sylvester ">= 0.0.12"
+    underscore ">=1.3.1"
+
+needle@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+  dependencies:
+    debug "^2.1.2"
+    iconv-lite "^0.4.4"
+    sax "^1.2.4"
+
+negotiator@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+neo-async@^2.5.0:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+next-tick@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
+nib@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/nib/-/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7"
+  dependencies:
+    stylus "0.54.5"
+
+nice-try@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
+
+no-case@^2.2.0:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+  dependencies:
+    lower-case "^1.1.1"
+
+node-dir@0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
+
+node-fetch@1.6.3:
+  version "1.6.3"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
+  dependencies:
+    encoding "^0.1.11"
+    is-stream "^1.0.1"
+
+node-gyp@^3.3.1:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203"
+  dependencies:
+    fstream "^1.0.0"
+    glob "^7.0.3"
+    graceful-fs "^4.1.2"
+    mkdirp "^0.5.0"
+    nopt "2 || 3"
+    npmlog "0 || 1 || 2 || 3 || 4"
+    osenv "0"
+    request ">=2.9.0 <2.82.0"
+    rimraf "2"
+    semver "~5.3.0"
+    tar "^2.0.0"
+    which "1"
+
+node-libs-browser@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.0"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-object-hash@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.1.tgz#de968492e20c493b8bbc25ad2ee828265fd60934"
+
+node-pre-gyp@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46"
+  dependencies:
+    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"
+
+node-redis-scripty@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625"
+  dependencies:
+    extend "^1.2.1"
+    lru-cache "^2.5.0"
+
+node-redis-warlock@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/node-redis-warlock/-/node-redis-warlock-0.2.0.tgz#56395b994c828e8e32f6aae53b93b6edfcd97990"
+  dependencies:
+    node-redis-scripty "0.0.5"
+    uuid "^2.0.1"
+
+node-sass-json-importer@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/node-sass-json-importer/-/node-sass-json-importer-3.2.0.tgz#9cfe2355035d5437b7c2ecb535450bf6acde8195"
+  dependencies:
+    is-there "^4.0.0"
+    json5 "0.5.1"
+    lodash "^3.10.1"
+
+node-sass@4.9.0:
+  version "4.9.0"
+  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.0.tgz#d1b8aa855d98ed684d6848db929a20771cc2ae52"
+  dependencies:
+    async-foreach "^0.1.3"
+    chalk "^1.1.1"
+    cross-spawn "^3.0.0"
+    gaze "^1.0.0"
+    get-stdin "^4.0.1"
+    glob "^7.0.3"
+    in-publish "^2.0.0"
+    lodash.assign "^4.2.0"
+    lodash.clonedeep "^4.3.2"
+    lodash.mergewith "^4.6.0"
+    meow "^3.7.0"
+    mkdirp "^0.5.1"
+    nan "^2.10.0"
+    node-gyp "^3.3.1"
+    npmlog "^4.0.0"
+    request "~2.79.0"
+    sass-graph "^2.2.4"
+    stdout-stream "^1.4.0"
+    "true-case-path" "^1.0.2"
+
+node-status-codes@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
+
+nomnom@^1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
+  dependencies:
+    chalk "~0.4.0"
+    underscore "~1.6.0"
+
+"nopt@2 || 3", nopt@~3.0.1:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+nopt@4.0.1, nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+
+normalize-url@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+  dependencies:
+    prepend-http "^2.0.0"
+    query-string "^5.0.1"
+    sort-keys "^2.0.0"
+
+normalize-url@^1.4.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+  dependencies:
+    object-assign "^4.0.1"
+    prepend-http "^1.0.0"
+    query-string "^4.1.0"
+    sort-keys "^1.0.0"
+
+normalize-wheel@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
+
+now-and-later@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee"
+  dependencies:
+    once "^1.3.2"
+
+npm-bundled@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+  version "1.1.10"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
+  dependencies:
+    ignore-walk "^3.0.1"
+    npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0, npm-run-path@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+nprogress@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
+
+nth-check@^1.0.1, nth-check@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+  dependencies:
+    boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+nwsapi@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959"
+
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+oauth@0.9.15:
+  version "0.9.15"
+  resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
+
+object-assign-deep@0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/object-assign-deep/-/object-assign-deep-0.4.0.tgz#43505d3679abb9686ab359b97ac14cc837a9d143"
+
+object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-assign@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
+
+object-assign@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-keys@^1.0.11, object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  dependencies:
+    isobject "^3.0.0"
+
+object.assign@^4.0.1, object.assign@^4.0.4:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.1"
+    has-symbols "^1.0.0"
+    object-keys "^1.0.11"
+
+object.defaults@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
+  dependencies:
+    array-each "^1.0.1"
+    array-slice "^1.0.0"
+    for-own "^1.0.0"
+    isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.5.1"
+
+object.map@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
+  dependencies:
+    for-own "^1.0.0"
+    make-iterator "^1.0.0"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.pick@^1.2.0, object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  dependencies:
+    isobject "^3.0.1"
+
+object.values@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
+on-build-webpack@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/on-build-webpack/-/on-build-webpack-0.1.0.tgz#a287c0e17766e6141926e5f2cbb0d8bb53b76814"
+
+on-finished@^2.1.0, on-finished@^2.3.0, on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+once@~1.3.0:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
+  dependencies:
+    wrappy "1"
+
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+only@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
+
+ono@^2.0.1:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/ono/-/ono-2.2.5.tgz#daf09488b51174da7a7e4275dfab31b438ffa0e3"
+
+ono@^4.0.2:
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.5.tgz#bc62740493a5c1c08b2c21e60cbb0e5c56ab7de2"
+  dependencies:
+    format-util "^1.0.3"
+
+opencollective@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1"
+  dependencies:
+    babel-polyfill "6.23.0"
+    chalk "1.1.3"
+    inquirer "3.0.6"
+    minimist "1.2.0"
+    node-fetch "1.6.3"
+    opn "4.0.2"
+
+opn@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
+  dependencies:
+    object-assign "^4.0.1"
+    pinkie-promise "^2.0.0"
+
+optionator@^0.8.1, optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    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"
+
+optipng-bin@^3.0.0:
+  version "3.1.4"
+  resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-3.1.4.tgz#95d34f2c488704f6fd70606bfea0c659f1d95d84"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+ora@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
+  dependencies:
+    chalk "^1.1.1"
+    cli-cursor "^1.0.2"
+    cli-spinners "^0.1.2"
+    object-assign "^4.0.1"
+
+orchestrator@^0.3.0:
+  version "0.3.8"
+  resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
+  dependencies:
+    end-of-stream "~0.1.5"
+    sequencify "~0.0.7"
+    stream-consume "~0.1.0"
+
+ordered-read-streams@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
+
+ordered-read-streams@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b"
+  dependencies:
+    is-stream "^1.0.1"
+    readable-stream "^2.0.1"
+
+ordered-read-streams@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
+  dependencies:
+    readable-stream "^2.0.1"
+
+os-browserify@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-filter-obj@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad"
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+  dependencies:
+    lcid "^1.0.0"
+
+os-locale@^2.0.0, os-locale@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
+os-shim@^0.1.2:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+os-utils@0.0.14:
+  version "0.0.14"
+  resolved "https://registry.yarnpkg.com/os-utils/-/os-utils-0.0.14.tgz#29e511697b1982b8c627722175fe39797ef64156"
+
+osenv@0, osenv@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-cancelable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+
+p-cancelable@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+
+p-each-series@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71"
+  dependencies:
+    p-reduce "^1.0.0"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-is-promise@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+
+p-lazy@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-lazy/-/p-lazy-1.0.0.tgz#ec53c802f2ee3ac28f166cc82d0b2b02de27a835"
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-map@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+p-pipe@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9"
+
+p-reduce@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+
+p-timeout@^1.1.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+  dependencies:
+    p-finally "^1.0.0"
+
+p-timeout@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+  dependencies:
+    p-finally "^1.0.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+  dependencies:
+    cyclist "~0.2.2"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+param-case@2.1.x:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+  dependencies:
+    no-case "^2.2.0"
+
+parse-asn1@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+  dependencies:
+    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-filepath@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
+  dependencies:
+    is-absolute "^1.0.0"
+    map-cache "^0.2.0"
+    path-root "^0.1.1"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.1.0, parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
+parse-passwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+
+parse5@*, parse5@5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a"
+
+parse5@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
+
+parseurl@^1.3.0, parseurl@~1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+passthrough-counter@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa"
+
+path-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0, path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-root-regex@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
+
+path-root@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
+  dependencies:
+    path-root-regex "^0.1.0"
+
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+path-to-regexp@^1.1.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
+  dependencies:
+    isarray "0.0.1"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  dependencies:
+    pify "^3.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.16"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  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:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+plugin-error@1.0.1, plugin-error@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
+  dependencies:
+    ansi-colors "^1.0.1"
+    arr-diff "^4.0.0"
+    arr-union "^3.1.0"
+    extend-shallow "^3.0.2"
+
+plugin-error@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace"
+  dependencies:
+    ansi-cyan "^0.1.1"
+    ansi-red "^0.1.1"
+    arr-diff "^1.0.1"
+    arr-union "^2.0.1"
+    extend-shallow "^1.1.2"
+
+plur@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a"
+  dependencies:
+    irregular-plurals "^1.0.0"
+
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+pn@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+
+pngjs@^3.3.0:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b"
+
+popper.js@^1.12.9:
+  version "1.14.3"
+  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+postcss-calc@^5.2.0:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+  dependencies:
+    postcss "^5.0.2"
+    postcss-message-helpers "^2.0.0"
+    reduce-css-calc "^1.2.6"
+
+postcss-colormin@^2.1.8:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+  dependencies:
+    colormin "^1.0.5"
+    postcss "^5.0.13"
+    postcss-value-parser "^3.2.3"
+
+postcss-convert-values@^2.3.4:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+  dependencies:
+    postcss "^5.0.11"
+    postcss-value-parser "^3.1.2"
+
+postcss-discard-comments@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-duplicates@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-discard-empty@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-overridden@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+  dependencies:
+    postcss "^5.0.16"
+
+postcss-discard-unused@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+  dependencies:
+    postcss "^5.0.14"
+    uniqs "^2.0.0"
+
+postcss-filter-plugins@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-merge-idents@^2.1.5:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.10"
+    postcss-value-parser "^3.1.1"
+
+postcss-merge-longhand@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-merge-rules@^2.0.3:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+  dependencies:
+    browserslist "^1.5.2"
+    caniuse-api "^1.5.2"
+    postcss "^5.0.4"
+    postcss-selector-parser "^2.2.2"
+    vendors "^1.0.0"
+
+postcss-message-helpers@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+
+postcss-minify-font-values@^1.0.2:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+  dependencies:
+    object-assign "^4.0.1"
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-minify-gradients@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+  dependencies:
+    postcss "^5.0.12"
+    postcss-value-parser "^3.3.0"
+
+postcss-minify-params@^1.0.4:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.2"
+    postcss-value-parser "^3.0.2"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^2.0.4:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+  dependencies:
+    alphanum-sort "^1.0.2"
+    has "^1.0.1"
+    postcss "^5.0.14"
+    postcss-selector-parser "^2.0.0"
+
+postcss-modules-extract-imports@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
+  dependencies:
+    postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-scope@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-values@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+  dependencies:
+    icss-replace-symbols "^1.1.0"
+    postcss "^6.0.1"
+
+postcss-normalize-charset@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+  dependencies:
+    postcss "^5.0.5"
+
+postcss-normalize-url@^3.0.7:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+  dependencies:
+    is-absolute-url "^2.0.0"
+    normalize-url "^1.4.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+
+postcss-ordered-values@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.1"
+
+postcss-reduce-idents@^2.2.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-reduce-initial@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-reduce-transforms@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.8"
+    postcss-value-parser "^3.0.1"
+
+postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+  dependencies:
+    flatten "^1.0.2"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-selector-parser@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+  dependencies:
+    dot-prop "^4.1.1"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-svgo@^2.1.1:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+  dependencies:
+    is-svg "^2.0.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+    svgo "^0.7.0"
+
+postcss-unique-selectors@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+
+postcss-zindex@^2.0.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
+  version "5.2.18"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+  dependencies:
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
+postcss@^6.0.1, postcss@^6.0.20:
+  version "6.0.22"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3"
+  dependencies:
+    chalk "^2.4.1"
+    source-map "^0.6.1"
+    supports-color "^5.4.0"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.0, prepend-http@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+prepend-http@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+prettier@^1.12.1, prettier@^1.13.0:
+  version "1.13.5"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0"
+
+pretty-bytes@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
+
+pretty-hrtime@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
+
+pretty@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5"
+  dependencies:
+    condense-newlines "^0.2.1"
+    extend-shallow "^2.0.1"
+    js-beautify "^1.6.12"
+
+prettyjson@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289"
+  dependencies:
+    colors "^1.1.2"
+    minimist "^1.2.0"
+
+printj@~1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+
+private@^0.1.6, private@^0.1.8, private@~0.1.5:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@^0.11.10:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress-bar-webpack-plugin@1.11.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.11.0.tgz#4f801288443c55ec029b20cbfdcbf3e1dc17f852"
+  dependencies:
+    chalk "^1.1.1"
+    object.assign "^4.0.1"
+    progress "^1.1.8"
+
+progress@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+
+progress@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+prominence@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/prominence/-/prominence-0.2.0.tgz#38704264981ddf65e5b00b0b5cfce6e53348f2b2"
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+promise-sequential@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/promise-sequential/-/promise-sequential-1.1.1.tgz#f79e8950ef86e7a7a85bf320452643592f6d2fb2"
+
+promise@^7.0.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+  dependencies:
+    asap "~2.0.3"
+
+proto-list@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+
+proxy-addr@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
+  dependencies:
+    forwarded "~0.1.2"
+    ipaddr.js "1.6.0"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.1, pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+psl@^1.1.24:
+  version "1.1.28"
+  resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b"
+
+public-encrypt@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+pug-attrs@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15"
+  dependencies:
+    constantinople "^3.0.1"
+    js-stringify "^1.0.1"
+    pug-runtime "^2.0.4"
+
+pug-code-gen@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c"
+  dependencies:
+    constantinople "^3.0.1"
+    doctypes "^1.1.0"
+    js-stringify "^1.0.1"
+    pug-attrs "^2.0.3"
+    pug-error "^1.3.2"
+    pug-runtime "^2.0.4"
+    void-elements "^2.0.1"
+    with "^5.0.0"
+
+pug-error@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26"
+
+pug-filters@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e"
+  dependencies:
+    clean-css "^4.1.11"
+    constantinople "^3.0.1"
+    jstransformer "1.0.0"
+    pug-error "^1.3.2"
+    pug-walk "^1.1.7"
+    resolve "^1.1.6"
+    uglify-js "^2.6.1"
+
+pug-lexer@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278"
+  dependencies:
+    character-parser "^2.1.1"
+    is-expression "^3.0.0"
+    pug-error "^1.3.2"
+
+pug-linker@^3.0.5:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f"
+  dependencies:
+    pug-error "^1.3.2"
+    pug-walk "^1.1.7"
+
+pug-load@^2.0.11:
+  version "2.0.11"
+  resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527"
+  dependencies:
+    object-assign "^4.1.0"
+    pug-walk "^1.1.7"
+
+pug-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4"
+  dependencies:
+    pug-error "^1.3.2"
+    token-stream "0.0.1"
+
+pug-runtime@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58"
+
+pug-strip-comments@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f"
+  dependencies:
+    pug-error "^1.3.2"
+
+pug-walk@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3"
+
+pug@2.0.3, pug@^2.0.0-beta3, pug@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e"
+  dependencies:
+    pug-code-gen "^2.0.1"
+    pug-filters "^3.1.0"
+    pug-lexer "^4.0.0"
+    pug-linker "^3.0.5"
+    pug-load "^2.0.11"
+    pug-parser "^5.0.0"
+    pug-runtime "^2.0.4"
+    pug-strip-comments "^1.0.3"
+
+pump@^2.0.0, pump@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3, pumpify@^1.3.5:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  dependencies:
+    duplexify "^3.6.0"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@2.1.1, punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+punycode@^1.2.4, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@0.9.7:
+  version "0.9.7"
+  resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
+
+q@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+
+q@^1.1.2:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qrcode@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a"
+  dependencies:
+    can-promise "^0.0.1"
+    dijkstrajs "^1.0.1"
+    isarray "^2.0.1"
+    pngjs "^3.3.0"
+    yargs "^8.0.2"
+
+qs@6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@6.5.2, qs@^6.4.0, qs@^6.5.2, qs@~6.5.1:
+  version "6.5.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+
+qs@~6.3.0:
+  version "6.3.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+
+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:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  dependencies:
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+query-string@^5.0.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+  dependencies:
+    decode-uri-component "^0.2.0"
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randomatic@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
+  dependencies:
+    is-number "^4.0.0"
+    kind-of "^6.0.0"
+    math-random "^1.0.1"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+range-parser@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+rangestr@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/rangestr/-/rangestr-0.0.1.tgz#f72ff9246f10f2a7d7c16e14616f617be2c2635a"
+
+ratelimiter@3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/ratelimiter/-/ratelimiter-3.0.3.tgz#6dbca58b05422f2a08e224d4ba3a0cfb86c30966"
+
+raw-body@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.2"
+    iconv-lite "0.4.19"
+    unpipe "1.0.0"
+
+raw-body@2.3.3, raw-body@^2.2.0, raw-body@^2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.3"
+    iconv-lite "0.4.23"
+    unpipe "1.0.0"
+
+rc@^1.1.2, rc@^1.1.7:
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+  dependencies:
+    deep-extend "^0.6.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-all-stream@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
+  dependencies:
+    pinkie-promise "^2.0.0"
+    readable-stream "^2.0.0"
+
+read-chunk@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655"
+  dependencies:
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+
+read-installed@~4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
+  dependencies:
+    debuglog "^1.0.1"
+    read-package-json "^2.0.0"
+    readdir-scoped-modules "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    slide "~1.1.3"
+    util-extend "^1.0.1"
+  optionalDependencies:
+    graceful-fs "^4.1.2"
+
+read-package-json@^2.0.0:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
+  dependencies:
+    glob "^7.1.1"
+    json-parse-better-errors "^1.0.1"
+    normalize-package-data "^2.0.0"
+    slash "^1.0.0"
+  optionalDependencies:
+    graceful-fs "^4.1.2"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^3.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+read-pkg@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+  dependencies:
+    load-json-file "^4.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^3.0.0"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6:
+  version "2.3.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+readable-stream@1.1.x, readable-stream@~1.1.9:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@2.2.7:
+  version "2.2.7"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1"
+  dependencies:
+    buffer-shims "~1.0.0"
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~1.0.0"
+    util-deprecate "~1.0.1"
+
+"readable-stream@>=1.0.33-1 <1.1.0-0":
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readdir-scoped-modules@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
+  dependencies:
+    debuglog "^1.0.1"
+    dezalgo "^1.0.0"
+    graceful-fs "^4.1.2"
+    once "^1.3.0"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+recaptcha-promise@0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/recaptcha-promise/-/recaptcha-promise-0.1.3.tgz#7d3d66d045a53674054ebdfa1684e0609ef5d912"
+  dependencies:
+    bluebird "^3.4.1"
+    request "^2.73.0"
+
+recast@^0.12.5:
+  version "0.12.9"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1"
+  dependencies:
+    ast-types "0.10.1"
+    core-js "^2.4.1"
+    esprima "~4.0.0"
+    private "~0.1.5"
+    source-map "~0.6.1"
+
+recast@^0.15.0:
+  version "0.15.0"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.0.tgz#b8c8bfdda245e1580c0a4d9fc25d4e820bf57208"
+  dependencies:
+    ast-types "0.11.5"
+    esprima "~4.0.0"
+    private "~0.1.5"
+    source-map "~0.6.1"
+
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+  dependencies:
+    resolve "^1.1.6"
+
+reconnecting-websocket@3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-3.2.2.tgz#8097514e926e9855e03c39e76efa2e3d1f371bee"
+
+recursive-iterator@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/recursive-iterator/-/recursive-iterator-2.0.3.tgz#d0e0d2c7e7a83109d73091cf043fc509e5a76dc3"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+redis-commands@^1.2.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
+
+redis-parser@^2.0.0, redis-parser@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
+
+redis@2.8.0:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
+  dependencies:
+    double-ended-queue "^2.1.0-0"
+    redis-commands "^1.2.0"
+    redis-parser "^2.6.0"
+
+redis@^0.12.1:
+  version "0.12.1"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-0.12.1.tgz#64df76ad0fc8acebaebd2a0645e8a48fac49185e"
+
+redis@~2.6.0-2:
+  version "2.6.5"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-2.6.5.tgz#87c1eff4a489f94b70871f3d08b6988f23a95687"
+  dependencies:
+    double-ended-queue "^2.1.0-0"
+    redis-commands "^1.2.0"
+    redis-parser "^2.0.0"
+
+reds@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/reds/-/reds-0.2.5.tgz#38a767f7663cd749036848697d82c74fd29bc01f"
+  dependencies:
+    natural "^0.2.0"
+    redis "^0.12.1"
+
+reduce-css-calc@^1.2.6:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+  dependencies:
+    balanced-match "^0.4.2"
+    math-expression-evaluator "^1.2.14"
+    reduce-function-call "^1.0.1"
+
+reduce-function-call@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+  dependencies:
+    balanced-match "^0.4.2"
+
+regenerate@^1.2.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-runtime@^0.10.0:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+regexpp@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
+
+regexpu-core@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  dependencies:
+    jsesc "~0.5.0"
+
+relateurl@0.2.x:
+  version "0.2.7"
+  resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+
+remove-bom-buffer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
+  dependencies:
+    is-buffer "^1.1.5"
+    is-utf8 "^0.2.1"
+
+remove-bom-stream@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
+  dependencies:
+    remove-bom-buffer "^3.0.0"
+    safe-buffer "^5.1.0"
+    through2 "^2.0.3"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+replace-ext@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+
+replace-ext@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+
+replacestream@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36"
+  dependencies:
+    escape-string-regexp "^1.0.3"
+    object-assign "^4.0.1"
+    readable-stream "^2.0.2"
+
+request-promise-core@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+  dependencies:
+    lodash "^4.13.1"
+
+request-promise-native@1.0.5, request-promise-native@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+  dependencies:
+    request-promise-core "1.1.1"
+    stealthy-require "^1.1.0"
+    tough-cookie ">=2.3.3"
+
+request@2.85.0:
+  version "2.85.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
+  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"
+
+request@2.87.0, request@^2.73.0, request@^2.83.0:
+  version "2.87.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
+  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"
+    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"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
+"request@>=2.9.0 <2.82.0":
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+request@~2.79.0:
+  version "2.79.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    qs "~6.3.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+    uuid "^3.0.0"
+
+require-all@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/require-all/-/require-all-2.2.0.tgz#b4420c233ac0282d0ff49b277fb880a8b5de0894"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+require_optional@^1.0.1, require_optional@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
+  dependencies:
+    resolve-from "^2.0.0"
+    semver "^5.1.0"
+
+resize-observer-polyfill@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69"
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+  dependencies:
+    expand-tilde "^2.0.0"
+    global-modules "^1.0.0"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-from@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-options@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
+  dependencies:
+    value-or-function "^3.0.0"
+
+resolve-path@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
+  dependencies:
+    http-errors "~1.6.2"
+    path-is-absolute "1.0.1"
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e"
+  dependencies:
+    path-parse "^1.0.5"
+
+responselike@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+  dependencies:
+    lowercase-keys "^1.0.0"
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@2.6.2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+rimraf@~2.2.6:
+  version "2.2.8"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+rndstr@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rndstr/-/rndstr-1.0.0.tgz#77e66fa8f9b4836853fdd91e50719591bb67d349"
+  dependencies:
+    rangestr "0.0.1"
+    seedrandom "2.4.2"
+
+rsvp@^4.7.0:
+  version "4.8.2"
+  resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.2.tgz#9d5647108735784eb13418cdddb56f75b919d722"
+
+run-async@^2.0.0, run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  dependencies:
+    aproba "^1.1.1"
+
+rx-lite-aggregates@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+  dependencies:
+    rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+rx@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
+rxjs@^5.5.2:
+  version "5.5.11"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87"
+  dependencies:
+    symbol-observable "1.0.1"
+
+rxjs@^6.1.0:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1"
+  dependencies:
+    tslib "^1.9.0"
+
+s-age@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/s-age/-/s-age-1.1.2.tgz#c0cf15233ccc93f41de92ea42c36d957977d1ea2"
+
+safe-buffer@5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  dependencies:
+    ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sass-graph@^2.2.4:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
+  dependencies:
+    glob "^7.0.0"
+    lodash "^4.0.0"
+    scss-tokenizer "^0.2.3"
+    yargs "^7.0.0"
+
+sass-loader@7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.1.tgz#fd937259ccba3a9cfe0d5f8a98746d48adfcc261"
+  dependencies:
+    clone-deep "^2.0.1"
+    loader-utils "^1.0.1"
+    lodash.tail "^4.1.1"
+    neo-async "^2.5.0"
+    pify "^3.0.0"
+
+sax@0.5.x:
+  version "0.5.8"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
+
+sax@^1.2.4, sax@~1.2.1, sax@~1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
+scoped-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8"
+
+scss-tokenizer@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
+  dependencies:
+    js-base64 "^2.1.8"
+    source-map "^0.4.2"
+
+seedrandom@2.4.2:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.2.tgz#18d78c41287d13aff8eadb29e235938b248aa9ff"
+
+seedrandom@2.4.3:
+  version "2.4.3"
+  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc"
+
+seek-bzip@^1.0.3:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
+  dependencies:
+    commander "~2.8.1"
+
+semver-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9"
+
+semver-truncate@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
+  dependencies:
+    semver "^5.3.0"
+
+"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+semver@^4.0.3, semver@^4.1.0:
+  version "4.3.6"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+
+semver@~5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+send@0.16.2:
+  version "0.16.2"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+  dependencies:
+    debug "2.6.9"
+    depd "~1.1.2"
+    destroy "~1.0.4"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    fresh "0.5.2"
+    http-errors "~1.6.2"
+    mime "1.4.1"
+    ms "2.0.0"
+    on-finished "~2.3.0"
+    range-parser "~1.2.0"
+    statuses "~1.4.0"
+
+sequencify@~0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
+
+serialize-javascript@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
+
+serve-static@1.13.2:
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+  dependencies:
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    parseurl "~1.3.2"
+    send "0.16.2"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+setprototypeof@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+  version "2.4.11"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shallow-clone@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
+  dependencies:
+    is-extendable "^0.1.1"
+    kind-of "^5.0.0"
+    mixin-object "^2.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@*:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shelljs@^0.8.0:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35"
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
+shvl@^1.3.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/shvl/-/shvl-1.3.1.tgz#6c20a17b4a20b08e9f8cab60c50a92229fcc176e"
+
+sigmund@^1.0.1, sigmund@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+single-line-log@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364"
+  dependencies:
+    string-width "^1.0.1"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
+slice-ansi@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+
+slide@^1.1.5, slide@~1.1.3:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+sntp@2.x.x:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+  dependencies:
+    hoek "4.x.x"
+
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+sort-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+sortablejs@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28"
+
+source-list-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-list-map@~0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
+
+source-map-resolve@^0.5.0, source-map-resolve@^0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+  dependencies:
+    atob "^2.1.1"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map-support@^0.5.3:
+  version "0.5.6"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@0.1.x, source-map@^0.1.38:
+  version "0.1.43"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.4.2, source-map@~0.4.1:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+sparkles@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
+
+spawn-sync@^1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
+  dependencies:
+    concat-stream "^1.4.7"
+    os-shim "^0.1.2"
+
+spdx-compare@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7"
+  dependencies:
+    array-find-index "^1.0.2"
+    spdx-expression-parse "^3.0.0"
+    spdx-ranges "^2.0.0"
+
+spdx-correct@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz#9d21ac4da4bdb71d060fb74e5a67531d032cbba6"
+
+spdx-exceptions@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^1.0.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+spdx-ranges@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.0.0.tgz#257686798e5edb41d45c1aba3d3f1bb47af8d5ec"
+
+spdx-satisfies@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz#ebc79eec88b68ac75618e2e5ee94fbc347587552"
+  dependencies:
+    spdx-compare "^1.0.0"
+    spdx-expression-parse "^3.0.0"
+    spdx-ranges "^2.0.0"
+
+spdx@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.1.tgz#d36c275088b48d75a9046cd44a838ce4b5339998"
+  dependencies:
+    spdx-exceptions "^1.0.0"
+    spdx-license-ids "^1.0.0"
+
+speakeasy@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a"
+  dependencies:
+    base32.js "0.0.1"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  dependencies:
+    extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+squeak@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
+  dependencies:
+    chalk "^1.0.0"
+    console-stream "^0.1.1"
+    lpad-align "^1.0.1"
+
+sshpk@^1.7.0:
+  version "1.14.2"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+    safer-buffer "^2.0.2"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+ssri@^5.2.4:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+  dependencies:
+    safe-buffer "^5.1.1"
+
+stable@~0.1.6:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+
+stat-mode@^0.2.0:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502"
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", statuses@^1.0.0, statuses@^1.2.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+
+statuses@~1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+stdout-stream@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b"
+  dependencies:
+    readable-stream "^2.0.1"
+
+stealthy-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
+stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+  dependencies:
+    duplexer2 "~0.1.0"
+    readable-stream "^2.0.2"
+
+stream-consume@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
+
+stream-each@^1.1.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  dependencies:
+    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-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+streamsearch@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-template@~0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+stringstream@~0.0.4, stringstream@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-ansi@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
+
+strip-bom-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
+  dependencies:
+    first-chunk-stream "^1.0.0"
+    strip-bom "^2.0.0"
+
+strip-bom-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca"
+  dependencies:
+    first-chunk-stream "^2.0.0"
+    strip-bom "^2.0.0"
+
+strip-bom-string@1.X:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
+
+strip-bom@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
+  dependencies:
+    first-chunk-stream "^1.0.0"
+    is-utf8 "^0.2.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-dirs@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0"
+  dependencies:
+    chalk "^1.0.0"
+    get-stdin "^4.0.1"
+    is-absolute "^0.1.5"
+    is-natural-number "^2.0.0"
+    minimist "^1.1.0"
+    sum-up "^1.0.1"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+strip-outer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
+style-loader@0.21.0:
+  version "0.21.0"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852"
+  dependencies:
+    loader-utils "^1.1.0"
+    schema-utils "^0.4.5"
+
+stylus-loader@3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6"
+  dependencies:
+    loader-utils "^1.0.2"
+    lodash.clonedeep "^4.5.0"
+    when "~3.6.x"
+
+stylus@0.54.5, stylus@^0.54.0, stylus@~0.54.5:
+  version "0.54.5"
+  resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
+  dependencies:
+    css-parse "1.7.x"
+    debug "*"
+    glob "7.0.x"
+    mkdirp "0.5.x"
+    sax "0.5.x"
+    source-map "0.1.x"
+
+sum-up@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e"
+  dependencies:
+    chalk "^1.0.0"
+
+summaly@2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.0.6.tgz#559561e05c267f01e7199a296dd650a994b19053"
+  dependencies:
+    cheerio-httpcli "0.7.2"
+    debug "3.1.0"
+    escape-regexp "0.0.1"
+    html-entities "1.2.1"
+    request "2.85.0"
+    request-promise-native "1.0.5"
+    require-all "2.2.0"
+    trace-redirect "1.0.6"
+
+supports-color@5.4.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+svgo@^0.7.0:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+  dependencies:
+    coa "~1.0.1"
+    colors "~1.1.2"
+    csso "~2.3.1"
+    js-yaml "~3.7.0"
+    mkdirp "~0.5.1"
+    sax "~1.2.1"
+    whet.extend "~0.9.9"
+
+svgo@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a"
+  dependencies:
+    coa "~2.0.1"
+    colors "~1.1.2"
+    css-select "~1.3.0-rc0"
+    css-select-base-adapter "~0.1.0"
+    css-tree "1.0.0-alpha25"
+    css-url-regex "^1.1.0"
+    csso "^3.5.0"
+    js-yaml "~3.10.0"
+    mkdirp "~0.5.1"
+    object.values "^1.0.4"
+    sax "~1.2.4"
+    stable "~0.1.6"
+    unquote "~1.1.1"
+    util.promisify "~1.0.0"
+
+swagger-jsdoc@1.9.7:
+  version "1.9.7"
+  resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-1.9.7.tgz#7a761d4d7ef4a54bf457cea5c67ec316bb82f8b9"
+  dependencies:
+    chokidar "^1.7.0"
+    commander "^2.11.0"
+    doctrine "^2.0.0"
+    glob "^7.1.2"
+    js-yaml "^3.8.4"
+    recursive-iterator "^2.0.3"
+    swagger-parser "^3.4.1"
+
+swagger-methods@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.4.tgz#2c5b844f4a22ab2f5e773f98193c28e386b1c37e"
+
+swagger-parser@^3.4.1:
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-3.4.2.tgz#244d67d6eeed08c00acb5d95950d5aefbd6185a3"
+  dependencies:
+    call-me-maybe "^1.0.1"
+    debug "^3.0.0"
+    es6-promise "^4.1.1"
+    json-schema-ref-parser "^1.4.1"
+    ono "^4.0.2"
+    swagger-methods "^1.0.0"
+    swagger-schema-official "2.0.0-bab6bed"
+    z-schema "^3.16.1"
+
+swagger-schema-official@2.0.0-bab6bed:
+  version "2.0.0-bab6bed"
+  resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd"
+
+"sylvester@>= 0.0.12", "sylvester@>= 0.0.8":
+  version "0.0.21"
+  resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7"
+
+symbol-observable@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
+
+symbol-observable@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
+
+symbol-tree@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+syuilo-password-strength@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/syuilo-password-strength/-/syuilo-password-strength-0.0.1.tgz#08f71a8f0ecb77db649f3d9a6424510d9d945f52"
+
+table@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+  dependencies:
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
+    chalk "^2.1.0"
+    lodash "^4.17.4"
+    slice-ansi "1.0.0"
+    string-width "^2.1.1"
+
+tapable@^1.0.0, tapable@^1.0.0-beta.5:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
+
+tar-stream@^1.1.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395"
+  dependencies:
+    bl "^1.0.0"
+    buffer-alloc "^1.1.0"
+    end-of-stream "^1.0.0"
+    fs-constants "^1.0.0"
+    readable-stream "^2.3.0"
+    to-buffer "^1.1.0"
+    xtend "^4.0.0"
+
+tar@^2.0.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+tar@^4:
+  version "4.4.4"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+  dependencies:
+    chownr "^1.0.1"
+    fs-minipass "^1.2.5"
+    minipass "^2.3.3"
+    minizlib "^1.1.0"
+    mkdirp "^0.5.0"
+    safe-buffer "^5.1.2"
+    yallist "^3.0.2"
+
+tcp-port-used@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-0.1.2.tgz#9450e8768c83b416fd4d1a6a9449eeccbf496c29"
+  dependencies:
+    debug "0.7.4"
+    is2 "0.0.9"
+    q "0.9.7"
+
+temp-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+
+temp@^0.8.1:
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    rimraf "~2.2.6"
+
+tempfile@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    uuid "^2.0.1"
+
+tempfile@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
+  dependencies:
+    temp-dir "^1.0.0"
+    uuid "^3.0.1"
+
+text-table@^0.2.0, text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+textarea-caret@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f"
+
+textextensions@2:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286"
+
+thenify-all@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+  dependencies:
+    thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
+  dependencies:
+    any-promise "^1.0.0"
+
+throttle-debounce@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd"
+
+through2-concurrent@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-1.1.1.tgz#11cb4ea4c9e31bca6e4c1e6dba48d1c728c3524b"
+  dependencies:
+    through2 "^2.0.0"
+
+through2-filter@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
+  dependencies:
+    through2 "~2.0.0"
+    xtend "~4.0.0"
+
+through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+through2@^0.6.0, through2@^0.6.1:
+  version "0.6.5"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
+  dependencies:
+    readable-stream ">=1.0.33-1 <1.1.0-0"
+    xtend ">=4.0.0 <4.1.0-0"
+
+through@^2.3.6, through@~2.3.8:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+tildify@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
+  dependencies:
+    os-homedir "^1.0.0"
+
+time-stamp@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+
+timed-out@^3.0.0:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+timers-browserify@^2.0.4:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+  dependencies:
+    setimmediate "^1.0.4"
+
+timers-ext@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922"
+  dependencies:
+    es5-ext "~0.10.14"
+    next-tick "1"
+
+tmp@0.0.33, tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+to-absolute-glob@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
+  dependencies:
+    extend-shallow "^2.0.1"
+
+to-absolute-glob@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
+  dependencies:
+    is-absolute "^1.0.0"
+    is-negated-glob "^1.0.0"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-buffer@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+to-through@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
+  dependencies:
+    through2 "^2.0.3"
+
+token-stream@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
+
+tough-cookie@>=2.3.3, tough-cookie@^2.3.3:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c"
+  dependencies:
+    psl "^1.1.24"
+    punycode "^1.4.1"
+
+tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+  dependencies:
+    punycode "^1.4.1"
+
+tr46@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  dependencies:
+    punycode "^2.1.0"
+
+trace-redirect@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504"
+
+treeify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-repeated@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+"true-case-path@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62"
+  dependencies:
+    glob "^6.0.4"
+
+tryit@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
+ts-loader@4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.3.0.tgz#4e3ba172783d1256d3a23bdfadde011a795fae9e"
+  dependencies:
+    chalk "^2.3.0"
+    enhanced-resolve "^4.0.0"
+    loader-utils "^1.0.2"
+    micromatch "^3.1.4"
+    semver "^5.0.1"
+
+ts-node@6.0.4:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.4.tgz#245af3a8cdf3baa1121893fe12b9a54ee297c4c5"
+  dependencies:
+    arrify "^1.0.0"
+    chalk "^2.3.0"
+    diff "^3.1.0"
+    make-error "^1.1.1"
+    minimist "^1.2.0"
+    mkdirp "^0.5.1"
+    source-map-support "^0.5.3"
+    yn "^2.0.0"
+
+tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e"
+
+tslint@5.10.0:
+  version "5.10.0"
+  resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3"
+  dependencies:
+    babel-code-frame "^6.22.0"
+    builtin-modules "^1.1.1"
+    chalk "^2.3.0"
+    commander "^2.12.1"
+    diff "^3.2.0"
+    glob "^7.1.1"
+    js-yaml "^3.7.0"
+    minimatch "^3.0.4"
+    resolve "^1.3.2"
+    semver "^5.3.0"
+    tslib "^1.8.0"
+    tsutils "^2.12.1"
+
+tsutils@^2.12.1:
+  version "2.27.1"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.1.tgz#ab0276ac23664f36ce8fd4414daec4aebf4373ee"
+  dependencies:
+    tslib "^1.8.1"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@^0.4.0, tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@^1.5.5, type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16:
+  version "1.6.16"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.18"
+
+type-of@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972"
+
+typedarray-to-buffer@^3.1.2:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+  dependencies:
+    is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+typescript-eslint-parser@15.0.0:
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f"
+  dependencies:
+    lodash.unescape "4.0.1"
+    semver "5.5.0"
+
+typescript@2.8.3:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
+
+uglify-es@3.3.9, uglify-es@^3.3.4:
+  version "3.3.9"
+  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+  dependencies:
+    commander "~2.13.0"
+    source-map "~0.6.1"
+
+uglify-js@3.3.x:
+  version "3.3.28"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06"
+  dependencies:
+    commander "~2.15.0"
+    source-map "~0.6.1"
+
+uglify-js@^2.6.1, uglify-js@^2.7.0:
+  version "2.8.29"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-js@^3.0.5:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d"
+  dependencies:
+    commander "~2.15.0"
+    source-map "~0.6.1"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^1.2.4:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641"
+  dependencies:
+    cacache "^10.0.4"
+    find-cache-dir "^1.0.0"
+    schema-utils "^0.4.5"
+    serialize-javascript "^1.4.0"
+    source-map "^0.6.1"
+    uglify-es "^3.3.4"
+    webpack-sources "^1.1.0"
+    worker-farm "^1.5.2"
+
+unc-path-regex@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+
+underscore@>=1.3.1:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+
+underscore@~1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
+
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+
+unique-filename@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+  dependencies:
+    imurmurhash "^0.1.4"
+
+unique-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
+
+unique-stream@^2.0.2:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369"
+  dependencies:
+    json-stable-stringify "^1.0.0"
+    through2-filter "^2.0.0"
+
+universalify@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unquote@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+untildify@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9"
+
+unzip-response@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
+
+upath@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+upper-case@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+
+uri-js@^4.2.1:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+  dependencies:
+    punycode "^2.1.0"
+
+urijs@^1.19.0:
+  version "1.19.1"
+  resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url-loader@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee"
+  dependencies:
+    loader-utils "^1.1.0"
+    mime "^2.0.3"
+    schema-utils "^0.4.3"
+
+url-parse-lax@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+  dependencies:
+    prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+  dependencies:
+    prepend-http "^2.0.0"
+
+url-regex@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
+  dependencies:
+    ip-regex "^1.0.1"
+
+url-to-options@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+
+url@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6"
+
+use@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
+  dependencies:
+    kind-of "^6.0.2"
+
+user-home@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util-extend@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
+
+util.promisify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+  dependencies:
+    define-properties "^1.1.2"
+    object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+util@^0.10.3:
+  version "0.10.4"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+  dependencies:
+    inherits "2.0.3"
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+
+uuid@^2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+
+v-animate-css@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/v-animate-css/-/v-animate-css-0.0.2.tgz#61f233b641de5ab544ab50bc5450c747030e3bde"
+
+v8-compile-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a"
+
+v8flags@^2.0.2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
+  dependencies:
+    user-home "^1.1.1"
+
+vali-date@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6"
+
+valid-url@^1.0.9:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+validator@^10.0.0:
+  version "10.3.0"
+  resolved "https://registry.yarnpkg.com/validator/-/validator-10.3.0.tgz#157a8c0981858cff381f59aabcdb8f83b57317cc"
+
+value-or-function@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
+
+vary@^1.0.0, vary@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+
+vendors@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vinyl-assign@^1.0.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45"
+  dependencies:
+    object-assign "^4.0.1"
+    readable-stream "^2.0.0"
+
+vinyl-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.3.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+    strip-bom-stream "^2.0.0"
+    vinyl "^1.1.0"
+
+vinyl-fs@^0.3.0:
+  version "0.3.14"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
+  dependencies:
+    defaults "^1.0.0"
+    glob-stream "^3.1.5"
+    glob-watcher "^0.0.6"
+    graceful-fs "^3.0.0"
+    mkdirp "^0.5.0"
+    strip-bom "^1.0.0"
+    through2 "^0.6.1"
+    vinyl "^0.4.0"
+
+vinyl-fs@^2.2.0:
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239"
+  dependencies:
+    duplexify "^3.2.0"
+    glob-stream "^5.3.2"
+    graceful-fs "^4.0.0"
+    gulp-sourcemaps "1.6.0"
+    is-valid-glob "^0.3.0"
+    lazystream "^1.0.0"
+    lodash.isequal "^4.0.0"
+    merge-stream "^1.0.0"
+    mkdirp "^0.5.0"
+    object-assign "^4.0.0"
+    readable-stream "^2.0.4"
+    strip-bom "^2.0.0"
+    strip-bom-stream "^1.0.0"
+    through2 "^2.0.0"
+    through2-filter "^2.0.0"
+    vali-date "^1.0.0"
+    vinyl "^1.0.0"
+
+vinyl-fs@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
+  dependencies:
+    fs-mkdirp-stream "^1.0.0"
+    glob-stream "^6.1.0"
+    graceful-fs "^4.0.0"
+    is-valid-glob "^1.0.0"
+    lazystream "^1.0.0"
+    lead "^1.0.0"
+    object.assign "^4.0.4"
+    pumpify "^1.3.5"
+    readable-stream "^2.3.3"
+    remove-bom-buffer "^3.0.0"
+    remove-bom-stream "^1.2.0"
+    resolve-options "^1.1.0"
+    through2 "^2.0.0"
+    to-through "^2.0.0"
+    value-or-function "^3.0.0"
+    vinyl "^2.0.0"
+    vinyl-sourcemap "^1.1.0"
+
+vinyl-sourcemap@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
+  dependencies:
+    append-buffer "^1.0.2"
+    convert-source-map "^1.5.0"
+    graceful-fs "^4.1.6"
+    normalize-path "^2.1.1"
+    now-and-later "^2.0.0"
+    remove-bom-buffer "^3.0.0"
+    vinyl "^2.0.0"
+
+vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
+  dependencies:
+    source-map "^0.5.1"
+
+vinyl@^0.4.0, vinyl@^0.4.3:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
+  dependencies:
+    clone "^0.2.0"
+    clone-stats "^0.0.1"
+
+vinyl@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+  dependencies:
+    clone "^1.0.0"
+    clone-stats "^0.0.1"
+    replace-ext "0.0.1"
+
+vinyl@^1.0.0, vinyl@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
+  dependencies:
+    clone "^1.0.0"
+    clone-stats "^0.0.1"
+    replace-ext "0.0.1"
+
+vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c"
+  dependencies:
+    clone "^2.1.1"
+    clone-buffer "^1.0.0"
+    clone-stats "^1.0.0"
+    cloneable-readable "^1.0.0"
+    remove-trailing-separator "^1.0.1"
+    replace-ext "^1.0.0"
+
+vm-browserify@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+void-elements@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+
+vue-cropperjs@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/vue-cropperjs/-/vue-cropperjs-2.2.0.tgz#cd8f00ee01914e86f114ee8aa3f7354e3c76a8fc"
+  dependencies:
+    cropperjs "^1.1.3"
+
+vue-eslint-parser@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
+  dependencies:
+    debug "^3.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.2"
+    esquery "^1.0.0"
+    lodash "^4.17.4"
+
+vue-functional-data-merge@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.6.tgz#f08055adfb92458debcf2ad10c3aa712277f7fc2"
+
+vue-hot-reload-api@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
+
+vue-js-modal@1.3.13:
+  version "1.3.13"
+  resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-1.3.13.tgz#1718c3182a94a03e03422db50c60229bbbd53f18"
+
+vue-json-tree-view@2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.4.tgz#b6f8ae2ba2eec4eec5b6f53b90fa187054cad79b"
+  dependencies:
+    lodash "^4.17.4"
+    vue "^2.5.16"
+
+vue-loader@15.2.1:
+  version "15.2.1"
+  resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.2.1.tgz#89a13b6b7dec63614729c73b1b46a571a69bb20e"
+  dependencies:
+    "@vue/component-compiler-utils" "^1.2.1"
+    hash-sum "^1.0.2"
+    loader-utils "^1.1.0"
+    vue-hot-reload-api "^2.3.0"
+    vue-style-loader "^4.1.0"
+
+vue-router@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9"
+
+vue-style-loader@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863"
+  dependencies:
+    hash-sum "^1.0.2"
+    loader-utils "^1.0.2"
+
+vue-template-compiler@2.5.16:
+  version "2.5.16"
+  resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb"
+  dependencies:
+    de-indent "^1.0.2"
+    he "^1.1.0"
+
+vue-template-es2015-compiler@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18"
+
+vue@2.5.16, vue@^2.5.16:
+  version "2.5.16"
+  resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.16.tgz#07edb75e8412aaeed871ebafa99f4672584a0085"
+
+vuedraggable@2.16.0:
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.16.0.tgz#52127081a2adb3de5fabd214d404ff3eee63575a"
+  dependencies:
+    sortablejs "^1.7.0"
+
+vuex-persistedstate@^2.5.4:
+  version "2.5.4"
+  resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-2.5.4.tgz#a19710ad7f9a08cea4e65fc585924d9fdac7384a"
+  dependencies:
+    deepmerge "^2.1.0"
+    shvl "^1.3.0"
+
+vuex@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2"
+
+w3c-hr-time@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+  dependencies:
+    browser-process-hrtime "^0.1.2"
+
+ware@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4"
+  dependencies:
+    wrap-fn "^0.1.0"
+
+watchpack@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+  dependencies:
+    chokidar "^2.0.2"
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+
+web-push@3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.3.1.tgz#6d49517b927ffb97241a719d2f7f9014de130f09"
+  dependencies:
+    asn1.js "^5.0.0"
+    http_ece "1.0.5"
+    https-proxy-agent "^2.2.1"
+    jws "^3.1.3"
+    minimist "^1.2.0"
+    urlsafe-base64 "^1.0.0"
+
+webassemblyjs@1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.4.3.tgz#0591893efb8fbde74498251cbe4b2d83df9239cb"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/validation" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    "@webassemblyjs/wast-parser" "1.4.3"
+    long "^3.2.0"
+
+webfinger.js@2.6.6:
+  version "2.6.6"
+  resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae"
+  dependencies:
+    xhr2 "^0.1.4"
+
+webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+webpack-addons@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/webpack-addons/-/webpack-addons-1.1.5.tgz#2b178dfe873fb6e75e40a819fa5c26e4a9bc837a"
+  dependencies:
+    jscodeshift "^0.4.0"
+
+webpack-cli@2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.4.tgz#cab81e79249127384fb69b2fdfe2055f9c771b76"
+  dependencies:
+    chalk "^2.4.1"
+    cross-spawn "^6.0.5"
+    diff "^3.5.0"
+    enhanced-resolve "^4.0.0"
+    envinfo "^5.7.0"
+    glob-all "^3.1.0"
+    global-modules "^1.0.0"
+    got "^8.3.1"
+    import-local "^1.0.0"
+    inquirer "^5.2.0"
+    interpret "^1.1.0"
+    jscodeshift "^0.5.0"
+    listr "^0.14.1"
+    loader-utils "^1.1.0"
+    lodash "^4.17.10"
+    log-symbols "^2.2.0"
+    mkdirp "^0.5.1"
+    p-each-series "^1.0.0"
+    p-lazy "^1.0.0"
+    prettier "^1.12.1"
+    supports-color "^5.4.0"
+    v8-compile-cache "^2.0.0"
+    webpack-addons "^1.1.5"
+    yargs "^11.1.0"
+    yeoman-environment "^2.1.1"
+    yeoman-generator "^2.0.5"
+
+webpack-core@~0.6.0:
+  version "0.6.9"
+  resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
+  dependencies:
+    source-list-map "~0.1.7"
+    source-map "~0.4.1"
+
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@4.9.1:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.9.1.tgz#fa7bd738b17fd7f09f37da461b2f5c16c6565f34"
+  dependencies:
+    "@webassemblyjs/ast" "1.4.3"
+    "@webassemblyjs/wasm-edit" "1.4.3"
+    "@webassemblyjs/wasm-parser" "1.4.3"
+    acorn "^5.0.0"
+    acorn-dynamic-import "^3.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    chrome-trace-event "^0.1.1"
+    enhanced-resolve "^4.0.0"
+    eslint-scope "^3.7.1"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    micromatch "^3.1.8"
+    mkdirp "~0.5.0"
+    neo-async "^2.5.0"
+    node-libs-browser "^2.0.0"
+    schema-utils "^0.4.4"
+    tapable "^1.0.0"
+    uglifyjs-webpack-plugin "^1.2.4"
+    watchpack "^1.5.0"
+    webpack-sources "^1.0.1"
+
+websocket@1.0.26:
+  version "1.0.26"
+  resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194"
+  dependencies:
+    debug "^2.2.0"
+    nan "^2.3.3"
+    typedarray-to-buffer "^3.1.2"
+    yaeti "^0.0.6"
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+  dependencies:
+    iconv-lite "0.4.19"
+
+whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4"
+
+whatwg-url@^6.4.0, whatwg-url@^6.4.1:
+  version "6.5.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.1"
+    webidl-conversions "^4.0.2"
+
+when@^3.7.7:
+  version "3.7.8"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
+
+when@~3.6.x:
+  version "3.6.4"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e"
+
+whet.extend@~0.9.9:
+  version "0.9.9"
+  resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
+which-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@1, which@^1.2.14, which@^1.2.9:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+  dependencies:
+    string-width "^1.0.2 || 2"
+
+window-or-global@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+window-size@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+
+with@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
+  dependencies:
+    acorn "^3.1.0"
+    acorn-globals "^3.0.0"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+worker-farm@^1.5.2:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+  dependencies:
+    errno "~0.1.7"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrap-fn@^0.1.0:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845"
+  dependencies:
+    co "3.1.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^1.2.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    slide "^1.1.5"
+
+write-file-atomic@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    signal-exit "^3.0.2"
+
+write-json-file@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
+  dependencies:
+    detect-indent "^5.0.0"
+    graceful-fs "^4.1.2"
+    make-dir "^1.0.0"
+    pify "^3.0.0"
+    sort-keys "^2.0.0"
+    write-file-atomic "^2.0.0"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  dependencies:
+    mkdirp "^0.5.1"
+
+ws@5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.0.tgz#9fd95e3ac7c76f6ae8bcc868a0e3f11f1290c33e"
+  dependencies:
+    async-limiter "~1.0.0"
+
+ws@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+
+xev@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7"
+
+xhr2@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f"
+
+xml-name-validator@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yaeti@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+  dependencies:
+    camelcase "^3.0.0"
+    lodash.assign "^4.0.6"
+
+yargs-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
+  dependencies:
+    camelcase "^3.0.0"
+
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^9.0.2:
+  version "9.0.2"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^10.0.3:
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.1.0"
+
+yargs@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^9.0.2"
+
+yargs@^4.0.0:
+  version "4.8.1"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+  dependencies:
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    lodash.assign "^4.0.3"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.1"
+    which-module "^1.0.0"
+    window-size "^0.2.0"
+    y18n "^3.2.1"
+    yargs-parser "^2.4.1"
+
+yargs@^7.0.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
+  dependencies:
+    camelcase "^3.0.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.2"
+    which-module "^1.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^5.0.0"
+
+yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
+
+yargs@~1.2.6:
+  version "1.2.6"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b"
+  dependencies:
+    minimist "^0.1.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+
+yauzl@^2.2.1:
+  version "2.9.2"
+  resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.2.tgz#4fb1bc7ae1fc2f57037b54af6acc8fe1031c5b77"
+  dependencies:
+    buffer-crc32 "~0.2.3"
+    fd-slicer "~1.1.0"
+
+yeoman-environment@^2.0.5, yeoman-environment@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.2.0.tgz#6c0ee93a8d962a9f6dbc5ad4e90ae7ab34875393"
+  dependencies:
+    chalk "^2.1.0"
+    cross-spawn "^6.0.5"
+    debug "^3.1.0"
+    diff "^3.3.1"
+    escape-string-regexp "^1.0.2"
+    globby "^8.0.1"
+    grouped-queue "^0.3.3"
+    inquirer "^5.2.0"
+    is-scoped "^1.0.0"
+    lodash "^4.17.10"
+    log-symbols "^2.1.0"
+    mem-fs "^1.1.0"
+    strip-ansi "^4.0.0"
+    text-table "^0.2.0"
+    untildify "^3.0.2"
+
+yeoman-generator@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81"
+  dependencies:
+    async "^2.6.0"
+    chalk "^2.3.0"
+    cli-table "^0.3.1"
+    cross-spawn "^6.0.5"
+    dargs "^5.1.0"
+    dateformat "^3.0.3"
+    debug "^3.1.0"
+    detect-conflict "^1.0.0"
+    error "^7.0.2"
+    find-up "^2.1.0"
+    github-username "^4.0.0"
+    istextorbinary "^2.2.1"
+    lodash "^4.17.10"
+    make-dir "^1.1.0"
+    mem-fs-editor "^4.0.0"
+    minimist "^1.2.0"
+    pretty-bytes "^4.0.2"
+    read-chunk "^2.1.0"
+    read-pkg-up "^3.0.0"
+    rimraf "^2.6.2"
+    run-async "^2.0.0"
+    shelljs "^0.8.0"
+    text-table "^0.2.0"
+    through2 "^2.0.0"
+    yeoman-environment "^2.0.5"
+
+yn@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+
+z-schema@^3.16.1:
+  version "3.22.0"
+  resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.22.0.tgz#e1326063cb438f348c648350770258ff5e20a22b"
+  dependencies:
+    lodash.get "^4.0.0"
+    lodash.isequal "^4.0.0"
+    validator "^10.0.0"
+  optionalDependencies:
+    commander "^2.7.1"

From cd8bfca29ce05f283c14bc0172b5dbe2c18a358c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 13:10:17 +0900
Subject: [PATCH 331/369] =?UTF-8?q?npm=20install=20--only=3Ddev=20?=
 =?UTF-8?q?=E3=81=99=E3=82=8B=E3=81=AE=E3=81=8C=E6=97=A2=E5=AD=98=E3=81=AE?=
 =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88=E3=81=A8?=
 =?UTF-8?q?=E4=BA=92=E6=8F=9B=E6=80=A7=E3=81=8C=E7=84=A1=E3=81=84=E3=81=9F?=
 =?UTF-8?q?=E3=82=81=E6=88=BB=E3=81=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 package.json | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/package.json b/package.json
index 72cbc7356b..a830ba8fd0 100644
--- a/package.json
+++ b/package.json
@@ -86,9 +86,8 @@
 		"webfinger.js": "2.6.6",
 		"websocket": "1.0.26",
 		"ws": "5.2.0",
-		"xev": "2.0.1"
-	},
-	"devDependencies": {
+		"xev": "2.0.1",
+
 		"@prezzemolo/zip": "0.0.3",
 		"@types/bcryptjs": "2.4.1",
 		"@types/debug": "0.0.30",

From 9cac293efc5433f6a2efc7ec7ae3f5244bcfbd0d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 15:23:03 +0900
Subject: [PATCH 332/369] #1708

---
 src/models/note.ts                            |  3 ++-
 src/server/api/endpoints/hashtags/trend.ts    | 20 +++++++++----------
 .../api/endpoints/notes/search_by_tag.ts      |  2 +-
 src/services/note/create.ts                   |  1 +
 4 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/models/note.ts b/src/models/note.ts
index 461bb405a0..21ec2b3857 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -16,7 +16,7 @@ import Following from './following';
 const Note = db.get<INote>('notes');
 Note.createIndex('uri', { sparse: true, unique: true });
 Note.createIndex('userId');
-Note.createIndex('tags', { sparse: true });
+Note.createIndex('tagsLower');
 Note.createIndex({
 	createdAt: -1
 });
@@ -40,6 +40,7 @@ export type INote = {
 	poll: any; // todo
 	text: string;
 	tags: string[];
+	tagsLower: string[];
 	cw: string;
 	userId: mongo.ObjectID;
 	appId: mongo.ObjectID;
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index df7addab98..947dd6e448 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -7,7 +7,7 @@ import Note from '../../../../models/note';
 
 const rangeA = 1000 * 60 * 30; // 30分
 const rangeB = 1000 * 60 * 120; // 2時間
-const coefficient = 1.5; // 「n倍」の部分
+const coefficient = 1.25; // 「n倍」の部分
 const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか
 
 const max = 5;
@@ -22,20 +22,20 @@ module.exports = () => new Promise(async (res, rej) => {
 			createdAt: {
 				$gt: new Date(Date.now() - rangeA)
 			},
-			tags: {
+			tagsLower: {
 				$exists: true,
 				$ne: []
 			}
 		}
 	}, {
-		$unwind: '$tags'
+		$unwind: '$tagsLower'
 	}, {
 		$group: {
-			_id: { tags: '$tags', userId: '$userId' }
+			_id: { tag: '$tagsLower', userId: '$userId' }
 		}
 	}]) as Array<{
 		_id: {
-			tags: string;
+			tag: string;
 			userId: any;
 		}
 	}>;
@@ -49,12 +49,12 @@ module.exports = () => new Promise(async (res, rej) => {
 
 	// カウント
 	data.map(x => x._id).forEach(x => {
-		const i = tags.findIndex(tag => tag.name == x.tags);
+		const i = tags.findIndex(tag => tag.name == x.tag);
 		if (i != -1) {
 			tags[i].count++;
 		} else {
 			tags.push({
-				name: x.tags,
+				name: x.tag,
 				count: 1
 			});
 		}
@@ -66,7 +66,7 @@ module.exports = () => new Promise(async (res, rej) => {
 	//#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する
 	const hotsPromises = limitedTags.map(async tag => {
 		const passedCount = (await Note.distinct('userId', {
-			tags: tag.name,
+			tagsLower: tag.name,
 			createdAt: {
 				$lt: new Date(Date.now() - rangeA),
 				$gt: new Date(Date.now() - rangeB)
@@ -108,7 +108,7 @@ module.exports = () => new Promise(async (res, rej) => {
 
 	for (let i = 0; i < range; i++) {
 		countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', {
-			tags: tag,
+			tagsLower: tag,
 			createdAt: {
 				$lt: new Date(Date.now() - (interval * i)),
 				$gt: new Date(Date.now() - (interval * (i + 1)))
@@ -119,7 +119,7 @@ module.exports = () => new Promise(async (res, rej) => {
 	const countsLog = await Promise.all(countPromises);
 
 	const totalCounts: any = await Promise.all(hots.map(tag => Note.distinct('userId', {
-		tags: tag,
+		tagsLower: tag,
 		createdAt: {
 			$gt: new Date(Date.now() - (interval * range))
 		}
diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts
index 4cf070f4ce..1eb4cde49c 100644
--- a/src/server/api/endpoints/notes/search_by_tag.ts
+++ b/src/server/api/endpoints/notes/search_by_tag.ts
@@ -101,7 +101,7 @@ async function search(
 
 	let q: any = {
 		$and: [{
-			tags: tag
+			tagsLower: tag.toLowerCase()
 		}]
 	};
 
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index b21bfa316e..98415b8971 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -130,6 +130,7 @@ export default async (user: IUser, data: {
 		poll: data.poll,
 		cw: data.cw == null ? null : data.cw,
 		tags,
+		tagsLower: tags.map(tag => tag.toLowerCase()),
 		userId: user._id,
 		viaMobile: data.viaMobile,
 		geo: data.geo || null,

From 792632d7263e963e45d5d10e8128635334278430 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 15:23:44 +0900
Subject: [PATCH 333/369] 3.0.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index a830ba8fd0..fac4383d96 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "3.0.0",
+	"version": "3.0.1",
 	"clientVersion": "1.0.6517",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From 555a0f276cfabfc5288bb76bdf1274cf9e7fb8d4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 18:42:49 +0900
Subject: [PATCH 334/369] MisskeyShare

---
 package.json                                  |  1 -
 .../app/desktop/api/choose-drive-file.ts      |  2 +-
 src/client/app/desktop/script.ts              |  2 +
 .../desktop/views/components/post-form.vue    | 48 +++++++++++----
 src/client/app/desktop/views/pages/share.vue  | 58 +++++++++++++++++++
 src/client/app/mobile/script.ts               |  2 +
 .../app/mobile/views/components/index.ts      |  2 +
 .../app/mobile/views/components/post-form.vue | 30 +++++++++-
 src/client/app/mobile/views/pages/share.vue   | 56 ++++++++++++++++++
 9 files changed, 185 insertions(+), 16 deletions(-)
 create mode 100644 src/client/app/desktop/views/pages/share.vue
 create mode 100644 src/client/app/mobile/views/pages/share.vue

diff --git a/package.json b/package.json
index fac4383d96..ca6f0387fa 100644
--- a/package.json
+++ b/package.json
@@ -87,7 +87,6 @@
 		"websocket": "1.0.26",
 		"ws": "5.2.0",
 		"xev": "2.0.1",
-
 		"@prezzemolo/zip": "0.0.3",
 		"@types/bcryptjs": "2.4.1",
 		"@types/debug": "0.0.30",
diff --git a/src/client/app/desktop/api/choose-drive-file.ts b/src/client/app/desktop/api/choose-drive-file.ts
index 3d0004b741..a362a1289b 100644
--- a/src/client/app/desktop/api/choose-drive-file.ts
+++ b/src/client/app/desktop/api/choose-drive-file.ts
@@ -21,7 +21,7 @@ export default (os: OS) => opts => {
 				res(file);
 			};
 
-			window.open(url + '/selectdrive',
+			window.open(url + `/selectdrive?multiple=${o.multiple}`,
 				'choose_drive_window',
 				'height=500, width=800');
 		}
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index 8b1623ce45..076d532d6d 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -35,6 +35,7 @@ import MkNote from './views/pages/note.vue';
 import MkSearch from './views/pages/search.vue';
 import MkTag from './views/pages/tag.vue';
 import MkOthello from './views/pages/othello.vue';
+import MkShare from './views/pages/share.vue';
 
 /**
  * init
@@ -62,6 +63,7 @@ init(async (launch) => {
 			{ path: '/selectdrive', component: MkSelectDrive },
 			{ path: '/search', component: MkSearch },
 			{ path: '/tags/:tag', component: MkTag },
+			{ path: '/share', component: MkShare },
 			{ path: '/othello', component: MkOthello },
 			{ path: '/othello/:game', component: MkOthello },
 			{ path: '/@:user', component: MkUser },
diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index a0670a084e..33f2288e06 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -58,7 +58,25 @@ export default Vue.extend({
 		MkVisibilityChooser
 	},
 
-	props: ['reply', 'renote'],
+	props: {
+		reply: {
+			type: Object,
+			required: false
+		},
+		renote: {
+			type: Object,
+			required: false
+		},
+		initialText: {
+			type: String,
+			required: false
+		},
+		instant: {
+			type: Boolean,
+			required: false,
+			default: false
+		}
+	},
 
 	data() {
 		return {
@@ -118,6 +136,10 @@ export default Vue.extend({
 	},
 
 	mounted() {
+		if (this.initialText) {
+			this.text = this.initialText;
+		}
+
 		if (this.reply && this.reply.user.host != null) {
 			this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
 		}
@@ -141,17 +163,19 @@ export default Vue.extend({
 
 		this.$nextTick(() => {
 			// 書きかけの投稿を復元
-			const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId];
-			if (draft) {
-				this.text = draft.data.text;
-				this.files = draft.data.files;
-				if (draft.data.poll) {
-					this.poll = true;
-					this.$nextTick(() => {
-						(this.$refs.poll as any).set(draft.data.poll);
-					});
+			if (!this.instant) {
+				const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId];
+				if (draft) {
+					this.text = draft.data.text;
+					this.files = draft.data.files;
+					if (draft.data.poll) {
+						this.poll = true;
+						this.$nextTick(() => {
+							(this.$refs.poll as any).set(draft.data.poll);
+						});
+					}
+					this.$emit('change-attached-media', this.files);
 				}
-				this.$emit('change-attached-media', this.files);
 			}
 
 			this.$nextTick(() => this.watch());
@@ -349,6 +373,8 @@ export default Vue.extend({
 		},
 
 		saveDraft() {
+			if (this.instant) return;
+
 			const data = JSON.parse(localStorage.getItem('drafts') || '{}');
 
 			data[this.draftId] = {
diff --git a/src/client/app/desktop/views/pages/share.vue b/src/client/app/desktop/views/pages/share.vue
new file mode 100644
index 0000000000..e60434074a
--- /dev/null
+++ b/src/client/app/desktop/views/pages/share.vue
@@ -0,0 +1,58 @@
+<template>
+<div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr">
+	<h1>Misskeyで共有</h1>
+	<div>
+		<mk-signin v-if="!$store.getters.isSignedIn"/>
+		<mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/>
+		<p v-if="posted" class="posted">%fa:check%</p>
+	</div>
+	<button v-if="posted" class="ui button" @click="close">閉じる</button>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+
+export default Vue.extend({
+	data() {
+		return {
+			posted: false,
+			text: new URLSearchParams(location.search).get('text')
+		};
+	},
+	methods: {
+		close() {
+			window.close();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+.pptjhabgjtt7kwskbfv4y3uml6fpuhmr
+	padding 16px
+
+	> h1
+		margin 0 0 8px 0
+		color #555
+		font-size 20px
+		text-align center
+
+	> div
+		max-width 500px
+		margin 0 auto
+		background #fff
+		border solid 1px rgba(#000, 0.1)
+		border-radius 6px
+		overflow hidden
+
+		> .posted
+			display block
+			margin 0
+			padding 64px
+			text-align center
+
+	> button
+		display block
+		margin 16px auto
+</style>
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index 8ee078d621..1572fd73ed 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -37,6 +37,7 @@ import MkUserList from './views/pages/user-list.vue';
 import MkSettings from './views/pages/settings.vue';
 import MkOthello from './views/pages/othello.vue';
 import MkTag from './views/pages/tag.vue';
+import MkShare from './views/pages/share.vue';
 
 /**
  * init
@@ -73,6 +74,7 @@ init((launch) => {
 			{ path: '/selectdrive', component: MkSelectDrive },
 			{ path: '/search', component: MkSearch },
 			{ path: '/tags/:tag', component: MkTag },
+			{ path: '/share', component: MkShare },
 			{ path: '/othello', name: 'othello', component: MkOthello },
 			{ path: '/othello/:game', component: MkOthello },
 			{ path: '/@:user', component: MkUser },
diff --git a/src/client/app/mobile/views/components/index.ts b/src/client/app/mobile/views/components/index.ts
index 5ed8427b05..38c130ecbf 100644
--- a/src/client/app/mobile/views/components/index.ts
+++ b/src/client/app/mobile/views/components/index.ts
@@ -22,6 +22,7 @@ import userTimeline from './user-timeline.vue';
 import userListTimeline from './user-list-timeline.vue';
 import activity from './activity.vue';
 import widgetContainer from './widget-container.vue';
+import postForm from './post-form.vue';
 
 Vue.component('mk-ui', ui);
 Vue.component('mk-note', note);
@@ -45,3 +46,4 @@ Vue.component('mk-user-timeline', userTimeline);
 Vue.component('mk-user-list-timeline', userListTimeline);
 Vue.component('mk-activity', activity);
 Vue.component('mk-widget-container', widgetContainer);
+Vue.component('mk-post-form', postForm);
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index 88853fa236..62fa185085 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -54,7 +54,25 @@ export default Vue.extend({
 		MkVisibilityChooser
 	},
 
-	props: ['reply', 'renote'],
+	props: {
+		reply: {
+			type: Object,
+			required: false
+		},
+		renote: {
+			type: Object,
+			required: false
+		},
+		initialText: {
+			type: String,
+			required: false
+		},
+		instant: {
+			type: Boolean,
+			required: false,
+			default: false
+		}
+	},
 
 	data() {
 		return {
@@ -112,6 +130,10 @@ export default Vue.extend({
 	},
 
 	mounted() {
+		if (this.initialText) {
+			this.text = this.initialText;
+		}
+
 		if (this.reply && this.reply.user.host != null) {
 			this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
 		}
@@ -252,8 +274,10 @@ export default Vue.extend({
 				visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
 				viaMobile: viaMobile
 			}).then(data => {
-				this.$emit('note');
-				this.$destroy();
+				this.$emit('posted');
+				this.$nextTick(() => {
+					this.$destroy();
+				});
 			}).catch(err => {
 				this.posting = false;
 			});
diff --git a/src/client/app/mobile/views/pages/share.vue b/src/client/app/mobile/views/pages/share.vue
new file mode 100644
index 0000000000..c69498007d
--- /dev/null
+++ b/src/client/app/mobile/views/pages/share.vue
@@ -0,0 +1,56 @@
+<template>
+<div class="azibmfpleajagva420swmu4c3r7ni7iw">
+	<h1>Misskeyで共有</h1>
+	<div>
+		<mk-signin v-if="!$store.getters.isSignedIn"/>
+		<mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/>
+		<p v-if="posted" class="posted">%fa:check%</p>
+	</div>
+	<ui-button class="close" v-if="posted" @click="close">閉じる</ui-button>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+
+export default Vue.extend({
+	data() {
+		return {
+			posted: false,
+			text: new URLSearchParams(location.search).get('text')
+		};
+	},
+	methods: {
+		close() {
+			window.close();
+		}
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+.azibmfpleajagva420swmu4c3r7ni7iw
+	> h1
+		margin 8px 0
+		color #555
+		font-size 20px
+		text-align center
+
+	> div
+		max-width 500px
+		margin 0 auto
+
+		> .posted
+			display block
+			margin 0 auto
+			padding 64px
+			text-align center
+			background #fff
+			border-radius 6px
+			width calc(100% - 32px)
+
+	> .close
+		display block
+		margin 16px auto
+		width calc(100% - 32px)
+</style>

From e55a254353b608795386ae5efe1104f1177e6fd6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 18:43:25 +0900
Subject: [PATCH 335/369] 3.1.0

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index ca6f0387fa..af404da5e9 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "3.0.1",
-	"clientVersion": "1.0.6517",
+	"version": "3.1.0",
+	"clientVersion": "1.0.6526",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 80d1ee75433e1c0e166e343c8e9a98c47ace2db2 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 19:45:29 +0900
Subject: [PATCH 336/369] Fix bug

---
 src/client/app/mobile/api/post.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/mobile/api/post.ts b/src/client/app/mobile/api/post.ts
index 0634c52642..15b2f6b691 100644
--- a/src/client/app/mobile/api/post.ts
+++ b/src/client/app/mobile/api/post.ts
@@ -18,7 +18,7 @@ export default (os) => (opts) => {
 		}
 	}).$mount();
 	vm.$once('cancel', recover);
-	vm.$once('note', recover);
+	vm.$once('posted', recover);
 	document.body.appendChild(vm.$el);
 	(vm as any).focus();
 };

From f6d9a7e7c3fa6bd6a6251c0ccd3fc941324ff8fb Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 16 Jun 2018 19:45:47 +0900
Subject: [PATCH 337/369] 3.1.1

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index af404da5e9..c5092e6f19 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "3.1.0",
-	"clientVersion": "1.0.6526",
+	"version": "3.1.1",
+	"clientVersion": "1.0.6528",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From f336241576d2a49cf15b3e255fc142597a8f9951 Mon Sep 17 00:00:00 2001
From: Tosuke <tasukeprg@gmail.com>
Date: Sat, 16 Jun 2018 19:45:49 +0900
Subject: [PATCH 338/369] improve web app manifest

---
 src/client/assets/manifest.json | 40 ++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/client/assets/manifest.json b/src/client/assets/manifest.json
index a0f6745b01..25be82fdc6 100644
--- a/src/client/assets/manifest.json
+++ b/src/client/assets/manifest.json
@@ -4,11 +4,39 @@
 	"start_url": "/",
 	"display": "standalone",
 	"background_color": "#313a42",
-	"icons": {
-		"16": "/assets/favicon/16.png",
-		"32": "/assets/favicon/32.png",
-		"64": "/assets/favicon/64.png",
-		"128": "/assets/favicon/128.png",
-		"256": "/assets/favicon/256.png"
+	"icons": [
+		{
+			"src": "/assets/favicon/16.png",
+			"size": "16x16",
+			"type": "image/png"
+		},
+		{
+			"src": "/assets/favicon/32.png",
+			"size": "32x32",
+			"type": "image/png"
+		},
+		{
+			"src": "/assets/favicon/64.png",
+			"size": "64x64",
+			"type": "image/png"
+		},
+		{
+			"src": "/assets/favicon/128.png",
+			"size": "128x128",
+			"type": "image/png"
+		},
+		{
+			"src": "/assets/favicon/192.png",
+			"size": "192x192",
+			"type": "image/png"
+		},
+		{
+			"src": "/assets/favicon/256.png",
+			"size": "256x256",
+			"type": "image/png"
+		}
+	],
+	"share_target": {
+		"url_template": "share?text={title}%20-%20{text}%20-%20{url}"
 	}
 }

From d150b10b3e466c6153649354c445cd842b71c38d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 06:57:50 +0900
Subject: [PATCH 339/369] Update default home widgets

---
 src/client/app/desktop/views/components/home.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue
index 8774aada63..ba48ce24e8 100644
--- a/src/client/app/desktop/views/components/home.vue
+++ b/src/client/app/desktop/views/components/home.vue
@@ -84,7 +84,7 @@ const defaultDesktopHomeWidgets = {
 		'calendar',
 		'activity',
 		'rss',
-		'trends',
+		'hashtags',
 		'photo-stream',
 		'version'
 	],

From 03f20599ba9d192b0c7de391af5d23b63168f18e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 07:39:51 +0900
Subject: [PATCH 340/369] Add missing semicolon

---
 src/remote/activitypub/renderer/note.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index 39335a7cca..06956fd23f 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -56,7 +56,7 @@ export default async function renderNote(note: INote, dive = true) {
 
 	const hashtagTags = (note.tags || []).map(renderHashtag);
 	const mentionTags = (note.mentionedRemoteUsers || []).map(renderMention);
-	const tag = hashtagTags.concat(mentionTags)
+	const tag = hashtagTags.concat(mentionTags);
 
 	return {
 		id: `${config.url}/notes/${note._id}`,

From 1ef66c962a1cea81dee4f5db32cd011feac7de44 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 08:10:54 +0900
Subject: [PATCH 341/369] reversi :white_flower: :100:

---
 locales/de.yml                                |   2 +-
 locales/en.yml                                |   4 +-
 locales/es.yml                                |   2 +-
 locales/fr.yml                                |   2 +-
 locales/it.yml                                |   2 +-
 locales/ja.yml                                |   2 +-
 locales/ko.yml                                |   2 +-
 locales/pl.yml                                |   2 +-
 locales/pt.yml                                |   2 +-
 locales/ru.yml                                |   2 +-
 locales/zh.yml                                |   2 +-
 .../common/scripts/compose-notification.ts    |   2 +-
 .../{othello-game.ts => reversi-game.ts}      |   4 +-
 .../streaming/{othello.ts => reversi.ts}      |   8 +--
 .../app/common/views/components/index.ts      |   4 +-
 .../{othello.game.vue => reversi.game.vue}    |  14 ++--
 ...ello.gameroom.vue => reversi.gameroom.vue} |   8 +--
 .../{othello.room.vue => reversi.room.vue}    |   2 +-
 .../components/{othello.vue => reversi.vue}   |  34 +++++-----
 src/client/app/desktop/script.ts              |  10 +--
 .../desktop/views/components/game-window.vue  |   6 +-
 .../views/components/ui.header.nav.vue        |  12 ++--
 .../views/pages/{othello.vue => reversi.vue}  |   6 +-
 src/client/app/mios.ts                        |   8 +--
 src/client/app/mobile/script.ts               |   6 +-
 .../app/mobile/views/components/ui.header.vue |  12 ++--
 .../app/mobile/views/components/ui.nav.vue    |  14 ++--
 .../views/pages/{othello.vue => reversi.vue}  |  10 +--
 ...{othello-put-me.mp3 => reversi-put-me.mp3} | Bin
 ...thello-put-you.mp3 => reversi-put-you.mp3} | Bin
 src/config/types.ts                           |   2 +-
 .../{othello-game.ts => reversi-game.ts}      |  12 ++--
 ...thello-matching.ts => reversi-matching.ts} |   4 +-
 src/publishers/stream.ts                      |  12 ++--
 src/{othello => reversi}/ai/back.ts           |  14 ++--
 src/{othello => reversi}/ai/front.ts          |  34 +++++-----
 src/{othello => reversi}/ai/index.ts          |   0
 src/{othello => reversi}/core.ts              |   4 +-
 src/{othello => reversi}/maps.ts              |   2 +-
 src/server/api/endpoints.ts                   |  10 +--
 .../endpoints/{othello => reversi}/games.ts   |   4 +-
 .../{othello => reversi}/games/show.ts        |   8 +--
 .../{othello => reversi}/invitations.ts       |   2 +-
 .../endpoints/{othello => reversi}/match.ts   |  18 ++---
 .../{othello => reversi}/match/cancel.ts      |   2 +-
 .../{othello-game.ts => reversi-game.ts}      |  64 +++++++++---------
 .../api/stream/{othello.ts => reversi.ts}     |   8 +--
 src/server/api/streaming.ts                   |  10 +--
 48 files changed, 197 insertions(+), 197 deletions(-)
 rename src/client/app/common/scripts/streaming/{othello-game.ts => reversi-game.ts} (66%)
 rename src/client/app/common/scripts/streaming/{othello.ts => reversi.ts} (66%)
 rename src/client/app/common/views/components/{othello.game.vue => reversi.game.vue} (95%)
 rename src/client/app/common/views/components/{othello.gameroom.vue => reversi.gameroom.vue} (75%)
 rename src/client/app/common/views/components/{othello.room.vue => reversi.room.vue} (99%)
 rename src/client/app/common/views/components/{othello.vue => reversi.vue} (85%)
 rename src/client/app/desktop/views/pages/{othello.vue => reversi.vue} (80%)
 rename src/client/app/mobile/views/pages/{othello.vue => reversi.vue} (71%)
 rename src/client/assets/{othello-put-me.mp3 => reversi-put-me.mp3} (100%)
 rename src/client/assets/{othello-put-you.mp3 => reversi-put-you.mp3} (100%)
 rename src/models/{othello-game.ts => reversi-game.ts} (89%)
 rename src/models/{othello-matching.ts => reversi-matching.ts} (90%)
 rename src/{othello => reversi}/ai/back.ts (97%)
 rename src/{othello => reversi}/ai/front.ts (83%)
 rename src/{othello => reversi}/ai/index.ts (100%)
 rename src/{othello => reversi}/core.ts (99%)
 rename src/{othello => reversi}/maps.ts (99%)
 rename src/server/api/endpoints/{othello => reversi}/games.ts (92%)
 rename src/server/api/endpoints/{othello => reversi}/games/show.ts (75%)
 rename src/server/api/endpoints/{othello => reversi}/invitations.ts (94%)
 rename src/server/api/endpoints/{othello => reversi}/match.ts (77%)
 rename src/server/api/endpoints/{othello => reversi}/match/cancel.ts (68%)
 rename src/server/api/stream/{othello-game.ts => reversi-game.ts} (78%)
 rename src/server/api/stream/{othello.ts => reversi.ts} (77%)

diff --git a/locales/de.yml b/locales/de.yml
index 0a53d74651..dd6deed0f2 100644
--- a/locales/de.yml
+++ b/locales/de.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "Mehr"
   close: "Schließen"
 desktop/views/components/game-window.vue:
-  game: "Othello"
+  game: "Reversi"
 desktop/views/components/home.vue:
   done: "Verbunden"
   add-widget: "Widget hinzufügen:"
diff --git a/locales/en.yml b/locales/en.yml
index 9d2e2e76be..4a452dc129 100644
--- a/locales/en.yml
+++ b/locales/en.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "More"
   close: "Close"
 desktop/views/components/game-window.vue:
-  game: "Othello"
+  game: "Reversi"
 desktop/views/components/home.vue:
   done: "Submit"
   add-widget: "Add widget:"
@@ -549,7 +549,7 @@ desktop/views/components/ui.header.nav.vue:
   home: "Home"
   deck: "Deck"
   messaging: "Messages"
-  game: "Play Othello"
+  game: "Play Reversi"
 desktop/views/components/ui.header.notifications.vue:
   title: "Notifications"
 desktop/views/components/ui.header.post.vue:
diff --git a/locales/es.yml b/locales/es.yml
index 4d6b348658..add3258292 100644
--- a/locales/es.yml
+++ b/locales/es.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "もっと見る"
   close: "閉じる"
 desktop/views/components/game-window.vue:
-  game: "オセロ"
+  game: "リバーシ"
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
diff --git a/locales/fr.yml b/locales/fr.yml
index e618a876c5..0af534bc61 100644
--- a/locales/fr.yml
+++ b/locales/fr.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "Plus"
   close: "Fermer"
 desktop/views/components/game-window.vue:
-  game: "Othello"
+  game: "Reversi"
 desktop/views/components/home.vue:
   done: "Envoyer"
   add-widget: "Ajouter un widget"
diff --git a/locales/it.yml b/locales/it.yml
index 4d6b348658..add3258292 100644
--- a/locales/it.yml
+++ b/locales/it.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "もっと見る"
   close: "閉じる"
 desktop/views/components/game-window.vue:
-  game: "オセロ"
+  game: "リバーシ"
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
diff --git a/locales/ja.yml b/locales/ja.yml
index 86b16adaad..29decefe68 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -384,7 +384,7 @@ desktop/views/components/friends-maker.vue:
   close: "閉じる"
 
 desktop/views/components/game-window.vue:
-  game: "オセロ"
+  game: "リバーシ"
 
 desktop/views/components/home.vue:
   done: "完了"
diff --git a/locales/ko.yml b/locales/ko.yml
index 4d6b348658..add3258292 100644
--- a/locales/ko.yml
+++ b/locales/ko.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "もっと見る"
   close: "閉じる"
 desktop/views/components/game-window.vue:
-  game: "オセロ"
+  game: "リバーシ"
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
diff --git a/locales/pl.yml b/locales/pl.yml
index 7c0d41e693..8febac051c 100644
--- a/locales/pl.yml
+++ b/locales/pl.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "Więcej"
   close: "Zamknij"
 desktop/views/components/game-window.vue:
-  game: "Othello"
+  game: "Reversi"
 desktop/views/components/home.vue:
   done: "Wyślij"
   add-widget: "Dodaj widżet:"
diff --git a/locales/pt.yml b/locales/pt.yml
index 141209396f..a195c4d9b5 100644
--- a/locales/pt.yml
+++ b/locales/pt.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "もっと見る"
   close: "閉じる"
 desktop/views/components/game-window.vue:
-  game: "オセロ"
+  game: "リバーシ"
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
diff --git a/locales/ru.yml b/locales/ru.yml
index 57d9f905d0..05992e9310 100644
--- a/locales/ru.yml
+++ b/locales/ru.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "もっと見る"
   close: "閉じる"
 desktop/views/components/game-window.vue:
-  game: "オセロ"
+  game: "リバーシ"
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
diff --git a/locales/zh.yml b/locales/zh.yml
index 655d7e9fe6..cec6ff64a7 100644
--- a/locales/zh.yml
+++ b/locales/zh.yml
@@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
   refresh: "もっと見る"
   close: "閉じる"
 desktop/views/components/game-window.vue:
-  game: "オセロ"
+  game: "リバーシ"
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
diff --git a/src/client/app/common/scripts/compose-notification.ts b/src/client/app/common/scripts/compose-notification.ts
index c19b1c5ad0..cc28f75998 100644
--- a/src/client/app/common/scripts/compose-notification.ts
+++ b/src/client/app/common/scripts/compose-notification.ts
@@ -55,7 +55,7 @@ export default function(type, data): Notification {
 				icon: data.user.avatarUrl + '?thumbnail&size=64'
 			};
 
-		case 'othello_invited':
+		case 'reversi_invited':
 			return {
 				title: '対局への招待があります',
 				body: `${getUserName(data.parent)}さんから`,
diff --git a/src/client/app/common/scripts/streaming/othello-game.ts b/src/client/app/common/scripts/streaming/reversi-game.ts
similarity index 66%
rename from src/client/app/common/scripts/streaming/othello-game.ts
rename to src/client/app/common/scripts/streaming/reversi-game.ts
index 9e36f647bb..5638b3013f 100644
--- a/src/client/app/common/scripts/streaming/othello-game.ts
+++ b/src/client/app/common/scripts/streaming/reversi-game.ts
@@ -1,9 +1,9 @@
 import Stream from './stream';
 import MiOS from '../../../mios';
 
-export class OthelloGameStream extends Stream {
+export class ReversiGameStream extends Stream {
 	constructor(os: MiOS, me, game) {
-		super(os, 'othello-game', {
+		super(os, 'reversi-game', {
 			i: me ? me.token : null,
 			game: game.id
 		});
diff --git a/src/client/app/common/scripts/streaming/othello.ts b/src/client/app/common/scripts/streaming/reversi.ts
similarity index 66%
rename from src/client/app/common/scripts/streaming/othello.ts
rename to src/client/app/common/scripts/streaming/reversi.ts
index 8f4f217e39..2e4395f0f1 100644
--- a/src/client/app/common/scripts/streaming/othello.ts
+++ b/src/client/app/common/scripts/streaming/reversi.ts
@@ -2,15 +2,15 @@ import StreamManager from './stream-manager';
 import Stream from './stream';
 import MiOS from '../../../mios';
 
-export class OthelloStream extends Stream {
+export class ReversiStream extends Stream {
 	constructor(os: MiOS, me) {
-		super(os, 'othello', {
+		super(os, 'reversi', {
 			i: me.token
 		});
 	}
 }
 
-export class OthelloStreamManager extends StreamManager<OthelloStream> {
+export class ReversiStreamManager extends StreamManager<ReversiStream> {
 	private me;
 	private os: MiOS;
 
@@ -23,7 +23,7 @@ export class OthelloStreamManager extends StreamManager<OthelloStream> {
 
 	public getConnection() {
 		if (this.connection == null) {
-			this.connection = new OthelloStream(this.os, this.me);
+			this.connection = new ReversiStream(this.os, this.me);
 		}
 
 		return this.connection;
diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index b91008f718..5b2fa084fb 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -27,7 +27,7 @@ import urlPreview from './url-preview.vue';
 import twitterSetting from './twitter-setting.vue';
 import fileTypeIcon from './file-type-icon.vue';
 import Switch from './switch.vue';
-import Othello from './othello.vue';
+import Reversi from './reversi.vue';
 import welcomeTimeline from './welcome-timeline.vue';
 import uiInput from './ui/input.vue';
 import uiButton from './ui/button.vue';
@@ -65,7 +65,7 @@ Vue.component('mk-url-preview', urlPreview);
 Vue.component('mk-twitter-setting', twitterSetting);
 Vue.component('mk-file-type-icon', fileTypeIcon);
 Vue.component('mk-switch', Switch);
-Vue.component('mk-othello', Othello);
+Vue.component('mk-reversi', Reversi);
 Vue.component('mk-welcome-timeline', welcomeTimeline);
 Vue.component('ui-input', uiInput);
 Vue.component('ui-button', uiButton);
diff --git a/src/client/app/common/views/components/othello.game.vue b/src/client/app/common/views/components/reversi.game.vue
similarity index 95%
rename from src/client/app/common/views/components/othello.game.vue
rename to src/client/app/common/views/components/reversi.game.vue
index 4c63bd18b8..dc79c95bb8 100644
--- a/src/client/app/common/views/components/othello.game.vue
+++ b/src/client/app/common/views/components/reversi.game.vue
@@ -43,7 +43,7 @@
 <script lang="ts">
 import Vue from 'vue';
 import * as CRC32 from 'crc-32';
-import Othello, { Color } from '../../../../../othello/core';
+import Reversi, { Color } from '../../../../../reversi/core';
 import { url } from '../../../config';
 
 export default Vue.extend({
@@ -52,7 +52,7 @@ export default Vue.extend({
 	data() {
 		return {
 			game: null,
-			o: null as Othello,
+			o: null as Reversi,
 			logs: [],
 			logPos: 0,
 			pollingClock: null
@@ -98,7 +98,7 @@ export default Vue.extend({
 	watch: {
 		logPos(v) {
 			if (!this.game.isEnded) return;
-			this.o = new Othello(this.game.settings.map, {
+			this.o = new Reversi(this.game.settings.map, {
 				isLlotheo: this.game.settings.isLlotheo,
 				canPutEverywhere: this.game.settings.canPutEverywhere,
 				loopedBoard: this.game.settings.loopedBoard
@@ -115,7 +115,7 @@ export default Vue.extend({
 	created() {
 		this.game = this.initGame;
 
-		this.o = new Othello(this.game.settings.map, {
+		this.o = new Reversi(this.game.settings.map, {
 			isLlotheo: this.game.settings.isLlotheo,
 			canPutEverywhere: this.game.settings.canPutEverywhere,
 			loopedBoard: this.game.settings.loopedBoard
@@ -163,7 +163,7 @@ export default Vue.extend({
 
 			// サウンドを再生する
 			if (this.$store.state.device.enableSounds) {
-				const sound = new Audio(`${url}/assets/othello-put-me.mp3`);
+				const sound = new Audio(`${url}/assets/reversi-put-me.mp3`);
 				sound.volume = this.$store.state.device.soundVolume;
 				sound.play();
 			}
@@ -187,7 +187,7 @@ export default Vue.extend({
 
 			// サウンドを再生する
 			if (this.$store.state.device.enableSounds && x.color != this.myColor) {
-				const sound = new Audio(`${url}/assets/othello-put-you.mp3`);
+				const sound = new Audio(`${url}/assets/reversi-put-you.mp3`);
 				sound.volume = this.$store.state.device.soundVolume;
 				sound.play();
 			}
@@ -213,7 +213,7 @@ export default Vue.extend({
 		onRescue(game) {
 			this.game = game;
 
-			this.o = new Othello(this.game.settings.map, {
+			this.o = new Reversi(this.game.settings.map, {
 				isLlotheo: this.game.settings.isLlotheo,
 				canPutEverywhere: this.game.settings.canPutEverywhere,
 				loopedBoard: this.game.settings.loopedBoard
diff --git a/src/client/app/common/views/components/othello.gameroom.vue b/src/client/app/common/views/components/reversi.gameroom.vue
similarity index 75%
rename from src/client/app/common/views/components/othello.gameroom.vue
rename to src/client/app/common/views/components/reversi.gameroom.vue
index 2dbd04ce49..7ce0112451 100644
--- a/src/client/app/common/views/components/othello.gameroom.vue
+++ b/src/client/app/common/views/components/reversi.gameroom.vue
@@ -7,9 +7,9 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import XGame from './othello.game.vue';
-import XRoom from './othello.room.vue';
-import { OthelloGameStream } from '../../scripts/streaming/othello-game';
+import XGame from './reversi.game.vue';
+import XRoom from './reversi.room.vue';
+import { ReversiGameStream } from '../../scripts/streaming/reversi-game';
 
 export default Vue.extend({
 	components: {
@@ -25,7 +25,7 @@ export default Vue.extend({
 	},
 	created() {
 		this.g = this.game;
-		this.connection = new OthelloGameStream((this as any).os, this.$store.state.i, this.game);
+		this.connection = new ReversiGameStream((this as any).os, this.$store.state.i, this.game);
 		this.connection.on('started', this.onStarted);
 	},
 	beforeDestroy() {
diff --git a/src/client/app/common/views/components/othello.room.vue b/src/client/app/common/views/components/reversi.room.vue
similarity index 99%
rename from src/client/app/common/views/components/othello.room.vue
rename to src/client/app/common/views/components/reversi.room.vue
index dcf41f2e04..5074845758 100644
--- a/src/client/app/common/views/components/othello.room.vue
+++ b/src/client/app/common/views/components/reversi.room.vue
@@ -94,7 +94,7 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import * as maps from '../../../../../othello/maps';
+import * as maps from '../../../../../reversi/maps';
 
 export default Vue.extend({
 	props: ['game', 'connection'],
diff --git a/src/client/app/common/views/components/othello.vue b/src/client/app/common/views/components/reversi.vue
similarity index 85%
rename from src/client/app/common/views/components/othello.vue
rename to src/client/app/common/views/components/reversi.vue
index a0971c45b4..e4d7740bde 100644
--- a/src/client/app/common/views/components/othello.vue
+++ b/src/client/app/common/views/components/reversi.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="mk-othello">
+<div class="mk-reversi">
 	<div v-if="game">
 		<x-gameroom :game="game"/>
 	</div>
@@ -11,14 +11,14 @@
 	</div>
 	<div class="index" v-else>
 		<h1>Misskey %fa:circle%thell%fa:circle R%</h1>
-		<p>他のMisskeyユーザーとオセロで対戦しよう</p>
+		<p>他のMisskeyユーザーとリバーシで対戦しよう</p>
 		<div class="play">
 			<el-button round>フリーマッチ(準備中)</el-button>
 			<el-button type="primary" round @click="match">指名</el-button>
 			<details>
 				<summary>遊び方</summary>
 				<div>
-					<p>オセロは、相手と交互に石をボードに置いてゆき、相手の石を挟んでひっくり返しながら、最終的に残った石が多い方が勝ちというボードゲームです。</p>
+					<p>リバーシは、相手と交互に石をボードに置いてゆき、相手の石を挟んでひっくり返しながら、最終的に残った石が多い方が勝ちというボードゲームです。</p>
 					<dl>
 						<dt><b>フリーマッチ</b></dt>
 						<dd>ランダムなユーザーと対戦するモードです。</dd>
@@ -39,7 +39,7 @@
 		</section>
 		<section v-if="myGames.length > 0">
 			<h2>自分の対局</h2>
-			<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`">
+			<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
 				<mk-avatar class="avatar" :user="g.user1"/>
 				<mk-avatar class="avatar" :user="g.user2"/>
 				<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
@@ -48,7 +48,7 @@
 		</section>
 		<section v-if="games.length > 0">
 			<h2>みんなの対局</h2>
-			<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`">
+			<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
 				<mk-avatar class="avatar" :user="g.user1"/>
 				<mk-avatar class="avatar" :user="g.user2"/>
 				<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
@@ -61,7 +61,7 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import XGameroom from './othello.gameroom.vue';
+import XGameroom from './reversi.gameroom.vue';
 
 export default Vue.extend({
 	components: {
@@ -93,24 +93,24 @@ export default Vue.extend({
 		}
 	},
 	mounted() {
-		this.connection = (this as any).os.streams.othelloStream.getConnection();
-		this.connectionId = (this as any).os.streams.othelloStream.use();
+		this.connection = (this as any).os.streams.reversiStream.getConnection();
+		this.connectionId = (this as any).os.streams.reversiStream.use();
 
 		this.connection.on('matched', this.onMatched);
 		this.connection.on('invited', this.onInvited);
 
-		(this as any).api('othello/games', {
+		(this as any).api('reversi/games', {
 			my: true
 		}).then(games => {
 			this.myGames = games;
 		});
 
-		(this as any).api('othello/games').then(games => {
+		(this as any).api('reversi/games').then(games => {
 			this.games = games;
 			this.gamesFetching = false;
 		});
 
-		(this as any).api('othello/invitations').then(invitations => {
+		(this as any).api('reversi/invitations').then(invitations => {
 			this.invitations = this.invitations.concat(invitations);
 		});
 
@@ -126,13 +126,13 @@ export default Vue.extend({
 	beforeDestroy() {
 		this.connection.off('matched', this.onMatched);
 		this.connection.off('invited', this.onInvited);
-		(this as any).os.streams.othelloStream.dispose(this.connectionId);
+		(this as any).os.streams.reversiStream.dispose(this.connectionId);
 
 		clearInterval(this.pingClock);
 	},
 	methods: {
 		go(game) {
-			(this as any).api('othello/games/show', {
+			(this as any).api('reversi/games/show', {
 				gameId: game.id
 			}).then(game => {
 				this.matching = null;
@@ -146,7 +146,7 @@ export default Vue.extend({
 				(this as any).api('users/show', {
 					username
 				}).then(user => {
-					(this as any).api('othello/match', {
+					(this as any).api('reversi/match', {
 						userId: user.id
 					}).then(res => {
 						if (res == null) {
@@ -160,10 +160,10 @@ export default Vue.extend({
 		},
 		cancel() {
 			this.matching = null;
-			(this as any).api('othello/match/cancel');
+			(this as any).api('reversi/match/cancel');
 		},
 		accept(invitation) {
-			(this as any).api('othello/match', {
+			(this as any).api('reversi/match', {
 				userId: invitation.parent.id
 			}).then(game => {
 				if (game) {
@@ -186,7 +186,7 @@ export default Vue.extend({
 <style lang="stylus" scoped>
 @import '~const.styl'
 
-.mk-othello
+.mk-reversi
 	color #677f84
 	background #fff
 
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index 076d532d6d..201ab0a83d 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -34,7 +34,7 @@ import MkMessagingRoom from './views/pages/messaging-room.vue';
 import MkNote from './views/pages/note.vue';
 import MkSearch from './views/pages/search.vue';
 import MkTag from './views/pages/tag.vue';
-import MkOthello from './views/pages/othello.vue';
+import MkReversi from './views/pages/reversi.vue';
 import MkShare from './views/pages/share.vue';
 
 /**
@@ -64,8 +64,8 @@ init(async (launch) => {
 			{ path: '/search', component: MkSearch },
 			{ path: '/tags/:tag', component: MkTag },
 			{ path: '/share', component: MkShare },
-			{ path: '/othello', component: MkOthello },
-			{ path: '/othello/:game', component: MkOthello },
+			{ path: '/reversi', component: MkReversi },
+			{ path: '/reversi/:game', component: MkReversi },
 			{ path: '/@:user', component: MkUser },
 			{ path: '/notes/:note', component: MkNote }
 		]
@@ -166,8 +166,8 @@ function registerNotifications(stream: HomeStreamManager) {
 			setTimeout(n.close.bind(n), 7000);
 		});
 
-		connection.on('othello_invited', matching => {
-			const _n = composeNotification('othello_invited', matching);
+		connection.on('reversi_invited', matching => {
+			const _n = composeNotification('reversi_invited', matching);
 			const n = new Notification(_n.title, {
 				body: _n.body,
 				icon: _n.icon
diff --git a/src/client/app/desktop/views/components/game-window.vue b/src/client/app/desktop/views/components/game-window.vue
index c3c0f90075..7c6cb9cd40 100644
--- a/src/client/app/desktop/views/components/game-window.vue
+++ b/src/client/app/desktop/views/components/game-window.vue
@@ -1,7 +1,7 @@
 <template>
 <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
 	<span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span>
-	<mk-othello :class="$style.content" @gamed="g => game = g"/>
+	<mk-reversi :class="$style.content" @gamed="g => game = g"/>
 </mk-window>
 </template>
 
@@ -18,8 +18,8 @@ export default Vue.extend({
 	computed: {
 		popout(): string {
 			return this.game
-				? `${url}/othello/${this.game.id}`
-				: `${url}/othello`;
+				? `${url}/reversi/${this.game.id}`
+				: `${url}/reversi`;
 		}
 	}
 });
diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue
index fe2637cec3..42211b57fe 100644
--- a/src/client/app/desktop/views/components/ui.header.nav.vue
+++ b/src/client/app/desktop/views/components/ui.header.nav.vue
@@ -56,23 +56,23 @@ export default Vue.extend({
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
-			this.connection.on('othello_invited', this.onOthelloInvited);
-			this.connection.on('othello_no_invites', this.onOthelloNoInvites);
+			this.connection.on('reversi_invited', this.onReversiInvited);
+			this.connection.on('reversi_no_invites', this.onReversiNoInvites);
 		}
 	},
 	beforeDestroy() {
 		if (this.$store.getters.isSignedIn) {
-			this.connection.off('othello_invited', this.onOthelloInvited);
-			this.connection.off('othello_no_invites', this.onOthelloNoInvites);
+			this.connection.off('reversi_invited', this.onReversiInvited);
+			this.connection.off('reversi_no_invites', this.onReversiNoInvites);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
 	},
 	methods: {
-		onOthelloInvited() {
+		onReversiInvited() {
 			this.hasGameInvitations = true;
 		},
 
-		onOthelloNoInvites() {
+		onReversiNoInvites() {
 			this.hasGameInvitations = false;
 		},
 
diff --git a/src/client/app/desktop/views/pages/othello.vue b/src/client/app/desktop/views/pages/reversi.vue
similarity index 80%
rename from src/client/app/desktop/views/pages/othello.vue
rename to src/client/app/desktop/views/pages/reversi.vue
index 0d8e987dd9..098fc41f1c 100644
--- a/src/client/app/desktop/views/pages/othello.vue
+++ b/src/client/app/desktop/views/pages/reversi.vue
@@ -1,6 +1,6 @@
 <template>
 <component :is="ui ? 'mk-ui' : 'div'">
-	<mk-othello v-if="!fetching" :init-game="game" @gamed="onGamed"/>
+	<mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/>
 </component>
 </template>
 
@@ -33,7 +33,7 @@ export default Vue.extend({
 			Progress.start();
 			this.fetching = true;
 
-			(this as any).api('othello/games/show', {
+			(this as any).api('reversi/games/show', {
 				gameId: this.$route.params.game
 			}).then(game => {
 				this.game = game;
@@ -43,7 +43,7 @@ export default Vue.extend({
 			});
 		},
 		onGamed(game) {
-			history.pushState(null, null, '/othello/' + game.id);
+			history.pushState(null, null, '/reversi/' + game.id);
 		}
 	}
 });
diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts
index ba3f967a23..9a8d19adbd 100644
--- a/src/client/app/mios.ts
+++ b/src/client/app/mios.ts
@@ -11,7 +11,7 @@ import { DriveStreamManager } from './common/scripts/streaming/drive';
 import { ServerStatsStreamManager } from './common/scripts/streaming/server-stats';
 import { NotesStatsStreamManager } from './common/scripts/streaming/notes-stats';
 import { MessagingIndexStreamManager } from './common/scripts/streaming/messaging-index';
-import { OthelloStreamManager } from './common/scripts/streaming/othello';
+import { ReversiStreamManager } from './common/scripts/streaming/reversi';
 
 import Err from './common/views/components/connect-failed.vue';
 import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline';
@@ -108,7 +108,7 @@ export default class MiOS extends EventEmitter {
 		serverStatsStream: ServerStatsStreamManager;
 		notesStatsStream: NotesStatsStreamManager;
 		messagingIndexStream: MessagingIndexStreamManager;
-		othelloStream: OthelloStreamManager;
+		reversiStream: ReversiStreamManager;
 	} = {
 		localTimelineStream: null,
 		globalTimelineStream: null,
@@ -116,7 +116,7 @@ export default class MiOS extends EventEmitter {
 		serverStatsStream: null,
 		notesStatsStream: null,
 		messagingIndexStream: null,
-		othelloStream: null
+		reversiStream: null
 	};
 
 	/**
@@ -233,7 +233,7 @@ export default class MiOS extends EventEmitter {
 			this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i);
 			this.streams.driveStream = new DriveStreamManager(this, this.store.state.i);
 			this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.store.state.i);
-			this.streams.othelloStream = new OthelloStreamManager(this, this.store.state.i);
+			this.streams.reversiStream = new ReversiStreamManager(this, this.store.state.i);
 		});
 		//#endregion
 
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index 1572fd73ed..cc0a8331ba 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -35,7 +35,7 @@ import MkFavorites from './views/pages/favorites.vue';
 import MkUserLists from './views/pages/user-lists.vue';
 import MkUserList from './views/pages/user-list.vue';
 import MkSettings from './views/pages/settings.vue';
-import MkOthello from './views/pages/othello.vue';
+import MkReversi from './views/pages/reversi.vue';
 import MkTag from './views/pages/tag.vue';
 import MkShare from './views/pages/share.vue';
 
@@ -75,8 +75,8 @@ init((launch) => {
 			{ path: '/search', component: MkSearch },
 			{ path: '/tags/:tag', component: MkTag },
 			{ path: '/share', component: MkShare },
-			{ path: '/othello', name: 'othello', component: MkOthello },
-			{ path: '/othello/:game', component: MkOthello },
+			{ path: '/reversi', name: 'reversi', component: MkReversi },
+			{ path: '/reversi/:game', component: MkReversi },
 			{ path: '/@:user', component: MkUser },
 			{ path: '/@:user/followers', component: MkFollowers },
 			{ path: '/@:user/following', component: MkFollowing },
diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue
index c72b15fb8b..c1ee70d105 100644
--- a/src/client/app/mobile/views/components/ui.header.vue
+++ b/src/client/app/mobile/views/components/ui.header.vue
@@ -45,8 +45,8 @@ export default Vue.extend({
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
-			this.connection.on('othello_invited', this.onOthelloInvited);
-			this.connection.on('othello_no_invites', this.onOthelloNoInvites);
+			this.connection.on('reversi_invited', this.onReversiInvited);
+			this.connection.on('reversi_no_invites', this.onReversiNoInvites);
 
 			const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
 			const isHisasiburi = ago >= 3600;
@@ -98,16 +98,16 @@ export default Vue.extend({
 	},
 	beforeDestroy() {
 		if (this.$store.getters.isSignedIn) {
-			this.connection.off('othello_invited', this.onOthelloInvited);
-			this.connection.off('othello_no_invites', this.onOthelloNoInvites);
+			this.connection.off('reversi_invited', this.onReversiInvited);
+			this.connection.off('reversi_no_invites', this.onReversiNoInvites);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
 	},
 	methods: {
-		onOthelloInvited() {
+		onReversiInvited() {
 			this.hasGameInvitation = true;
 		},
-		onOthelloNoInvites() {
+		onReversiNoInvites() {
 			this.hasGameInvitation = false;
 		}
 	}
diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index 80f60e4232..bb7a2f558c 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -19,7 +19,7 @@
 					<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
 					<li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li>
-					<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
+					<li><router-link to="/reversi" :data-active="$route.name == 'reversi'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
 				</ul>
 				<ul>
 					<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li>
@@ -66,14 +66,14 @@ export default Vue.extend({
 			this.connection = (this as any).os.stream.getConnection();
 			this.connectionId = (this as any).os.stream.use();
 
-			this.connection.on('othello_invited', this.onOthelloInvited);
-			this.connection.on('othello_no_invites', this.onOthelloNoInvites);
+			this.connection.on('reversi_invited', this.onReversiInvited);
+			this.connection.on('reversi_no_invites', this.onReversiNoInvites);
 		}
 	},
 	beforeDestroy() {
 		if (this.$store.getters.isSignedIn) {
-			this.connection.off('othello_invited', this.onOthelloInvited);
-			this.connection.off('othello_no_invites', this.onOthelloNoInvites);
+			this.connection.off('reversi_invited', this.onReversiInvited);
+			this.connection.off('reversi_no_invites', this.onReversiNoInvites);
 			(this as any).os.stream.dispose(this.connectionId);
 		}
 	},
@@ -83,10 +83,10 @@ export default Vue.extend({
 			if (query == null || query == '') return;
 			this.$router.push('/search?q=' + encodeURIComponent(query));
 		},
-		onOthelloInvited() {
+		onReversiInvited() {
 			this.hasGameInvitation = true;
 		},
-		onOthelloNoInvites() {
+		onReversiNoInvites() {
 			this.hasGameInvitation = false;
 		},
 		dark() {
diff --git a/src/client/app/mobile/views/pages/othello.vue b/src/client/app/mobile/views/pages/reversi.vue
similarity index 71%
rename from src/client/app/mobile/views/pages/othello.vue
rename to src/client/app/mobile/views/pages/reversi.vue
index e04e583c20..e2f0db6d87 100644
--- a/src/client/app/mobile/views/pages/othello.vue
+++ b/src/client/app/mobile/views/pages/reversi.vue
@@ -1,7 +1,7 @@
 <template>
 <mk-ui>
-	<span slot="header">%fa:gamepad%オセロ</span>
-	<mk-othello v-if="!fetching" :init-game="game" @gamed="onGamed"/>
+	<span slot="header">%fa:gamepad%リバーシ</span>
+	<mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/>
 </mk-ui>
 </template>
 
@@ -23,7 +23,7 @@ export default Vue.extend({
 		this.fetch();
 	},
 	mounted() {
-		document.title = 'Misskey オセロ';
+		document.title = 'Misskey リバーシ';
 		document.documentElement.style.background = '#fff';
 	},
 	methods: {
@@ -33,7 +33,7 @@ export default Vue.extend({
 			Progress.start();
 			this.fetching = true;
 
-			(this as any).api('othello/games/show', {
+			(this as any).api('reversi/games/show', {
 				gameId: this.$route.params.game
 			}).then(game => {
 				this.game = game;
@@ -43,7 +43,7 @@ export default Vue.extend({
 			});
 		},
 		onGamed(game) {
-			history.pushState(null, null, '/othello/' + game.id);
+			history.pushState(null, null, '/reversi/' + game.id);
 		}
 	}
 });
diff --git a/src/client/assets/othello-put-me.mp3 b/src/client/assets/reversi-put-me.mp3
similarity index 100%
rename from src/client/assets/othello-put-me.mp3
rename to src/client/assets/reversi-put-me.mp3
diff --git a/src/client/assets/othello-put-you.mp3 b/src/client/assets/reversi-put-you.mp3
similarity index 100%
rename from src/client/assets/othello-put-you.mp3
rename to src/client/assets/reversi-put-you.mp3
diff --git a/src/config/types.ts b/src/config/types.ts
index 62f63d4a3c..49eeac508b 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -60,7 +60,7 @@ export type Source = {
 		hook_secret: string;
 		username: string;
 	};
-	othello_ai?: {
+	reversi_ai?: {
 		id: string;
 		i: string;
 	};
diff --git a/src/models/othello-game.ts b/src/models/reversi-game.ts
similarity index 89%
rename from src/models/othello-game.ts
rename to src/models/reversi-game.ts
index 1dd375d2e5..16b9ab0d4e 100644
--- a/src/models/othello-game.ts
+++ b/src/models/reversi-game.ts
@@ -3,10 +3,10 @@ import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 
-const OthelloGame = db.get<IOthelloGame>('othelloGames');
-export default OthelloGame;
+const ReversiGame = db.get<IReversiGame>('reversiGames');
+export default ReversiGame;
 
-export interface IOthelloGame {
+export interface IReversiGame {
 	_id: mongo.ObjectID;
 	createdAt: Date;
 	startedAt: Date;
@@ -45,7 +45,7 @@ export interface IOthelloGame {
 }
 
 /**
- * Pack an othello game for API response
+ * Pack an reversi game for API response
  */
 export const pack = (
 	game: any,
@@ -62,11 +62,11 @@ export const pack = (
 
 	// Populate the game if 'game' is ID
 	if (mongo.ObjectID.prototype.isPrototypeOf(game)) {
-		_game = await OthelloGame.findOne({
+		_game = await ReversiGame.findOne({
 			_id: game
 		});
 	} else if (typeof game === 'string') {
-		_game = await OthelloGame.findOne({
+		_game = await ReversiGame.findOne({
 			_id: new mongo.ObjectID(game)
 		});
 	} else {
diff --git a/src/models/othello-matching.ts b/src/models/reversi-matching.ts
similarity index 90%
rename from src/models/othello-matching.ts
rename to src/models/reversi-matching.ts
index 0efba3ae5d..5efa5d76ad 100644
--- a/src/models/othello-matching.ts
+++ b/src/models/reversi-matching.ts
@@ -3,7 +3,7 @@ import * as deepcopy from 'deepcopy';
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 
-const Matching = db.get<IMatching>('othelloMatchings');
+const Matching = db.get<IMatching>('reversiMatchings');
 export default Matching;
 
 export interface IMatching {
@@ -14,7 +14,7 @@ export interface IMatching {
 }
 
 /**
- * Pack an othello matching for API response
+ * Pack an reversi matching for API response
  */
 export const pack = (
 	matching: any,
diff --git a/src/publishers/stream.ts b/src/publishers/stream.ts
index 58a6ef49aa..b573b65a65 100644
--- a/src/publishers/stream.ts
+++ b/src/publishers/stream.ts
@@ -37,12 +37,12 @@ class MisskeyEvent {
 		this.publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
 	}
 
-	public publishOthelloStream(userId: ID, type: string, value?: any): void {
-		this.publish(`othello-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
+	public publishReversiStream(userId: ID, type: string, value?: any): void {
+		this.publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
 	}
 
-	public publishOthelloGameStream(gameId: ID, type: string, value?: any): void {
-		this.publish(`othello-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value);
+	public publishReversiGameStream(gameId: ID, type: string, value?: any): void {
+		this.publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value);
 	}
 
 	public publishLocalTimelineStream(note: any): void {
@@ -73,5 +73,5 @@ export const publishUserListStream = ev.publishUserListStream.bind(ev);
 export const publishNoteStream = ev.publishNoteStream.bind(ev);
 export const publishMessagingStream = ev.publishMessagingStream.bind(ev);
 export const publishMessagingIndexStream = ev.publishMessagingIndexStream.bind(ev);
-export const publishOthelloStream = ev.publishOthelloStream.bind(ev);
-export const publishOthelloGameStream = ev.publishOthelloGameStream.bind(ev);
+export const publishReversiStream = ev.publishReversiStream.bind(ev);
+export const publishReversiGameStream = ev.publishReversiGameStream.bind(ev);
diff --git a/src/othello/ai/back.ts b/src/reversi/ai/back.ts
similarity index 97%
rename from src/othello/ai/back.ts
rename to src/reversi/ai/back.ts
index e4d0cfdd33..42f1a0f4b8 100644
--- a/src/othello/ai/back.ts
+++ b/src/reversi/ai/back.ts
@@ -7,7 +7,7 @@
  */
 
 import * as request from 'request-promise-native';
-import Othello, { Color } from '../core';
+import Reversi, { Color } from '../core';
 import conf from '../../config';
 import getUserName from '../../renderers/get-user-name';
 
@@ -17,12 +17,12 @@ let form;
 /**
  * BotアカウントのユーザーID
  */
-const id = conf.othello_ai.id;
+const id = conf.reversi_ai.id;
 
 /**
  * BotアカウントのAPIキー
  */
-const i = conf.othello_ai.i;
+const i = conf.reversi_ai.i;
 
 let note;
 
@@ -44,7 +44,7 @@ process.on('message', async msg => {
 
 		//#region TLに投稿する
 		const game = msg.body;
-		const url = `${conf.url}/othello/${game.id}`;
+		const url = `${conf.url}/reversi/${game.id}`;
 		const user = game.user1Id == id ? game.user2 : game.user1;
 		const isSettai = form[0].value === 0;
 		const text = isSettai
@@ -100,7 +100,7 @@ process.on('message', async msg => {
 	}
 });
 
-let o: Othello;
+let o: Reversi;
 let botColor: Color;
 
 // 各マスの強さ
@@ -113,8 +113,8 @@ let cellWeights;
 function onGameStarted(g) {
 	game = g;
 
-	// オセロエンジン初期化
-	o = new Othello(game.settings.map, {
+	// リバーシエンジン初期化
+	o = new Reversi(game.settings.map, {
 		isLlotheo: game.settings.isLlotheo,
 		canPutEverywhere: game.settings.canPutEverywhere,
 		loopedBoard: game.settings.loopedBoard
diff --git a/src/othello/ai/front.ts b/src/reversi/ai/front.ts
similarity index 83%
rename from src/othello/ai/front.ts
rename to src/reversi/ai/front.ts
index ff74b7216e..25ee43225a 100644
--- a/src/othello/ai/front.ts
+++ b/src/reversi/ai/front.ts
@@ -17,12 +17,12 @@ import conf from '../../config';
 /**
  * BotアカウントのAPIキー
  */
-const i = conf.othello_ai.i;
+const i = conf.reversi_ai.i;
 
 /**
  * BotアカウントのユーザーID
  */
-const id = conf.othello_ai.id;
+const id = conf.reversi_ai.id;
 
 ////////////////////////////////////////////////////////////////
 
@@ -59,7 +59,7 @@ homeStream.on('message', message => {
 		});
 
 		if (note.text) {
-			if (note.text.indexOf('オセロ') > -1) {
+			if (note.text.indexOf('リバーシ') > -1) {
 				request.post(`${conf.api_url}/notes/create`, {
 					json: { i,
 						replyId: note.id,
@@ -76,7 +76,7 @@ homeStream.on('message', message => {
 	if (msg.type == 'messaging_message') {
 		const message = msg.body;
 		if (message.text) {
-			if (message.text.indexOf('オセロ') > -1) {
+			if (message.text.indexOf('リバーシ') > -1) {
 				request.post(`${conf.api_url}/messaging/messages/create`, {
 					json: { i,
 						userId: message.userId,
@@ -92,7 +92,7 @@ homeStream.on('message', message => {
 
 // ユーザーを対局に誘う
 function invite(userId) {
-	request.post(`${conf.api_url}/othello/match`, {
+	request.post(`${conf.api_url}/reversi/match`, {
 		json: { i,
 			userId: userId
 		}
@@ -100,21 +100,21 @@ function invite(userId) {
 }
 
 /**
- * オセロストリーム
+ * リバーシストリーム
  */
-const othelloStream = new ReconnectingWebSocket(`${conf.ws_url}/othello?i=${i}`, undefined, {
+const reversiStream = new ReconnectingWebSocket(`${conf.ws_url}/reversi?i=${i}`, undefined, {
 	constructor: WebSocket
 });
 
-othelloStream.on('open', () => {
-	console.log('othello stream opened');
+reversiStream.on('open', () => {
+	console.log('reversi stream opened');
 });
 
-othelloStream.on('close', () => {
-	console.log('othello stream closed');
+reversiStream.on('close', () => {
+	console.log('reversi stream closed');
 });
 
-othelloStream.on('message', message => {
+reversiStream.on('message', message => {
 	const msg = JSON.parse(message.toString());
 
 	// 招待されたとき
@@ -134,12 +134,12 @@ othelloStream.on('message', message => {
  */
 function gameStart(game) {
 	// ゲームストリームに接続
-	const gw = new ReconnectingWebSocket(`${conf.ws_url}/othello-game?i=${i}&game=${game.id}`, undefined, {
+	const gw = new ReconnectingWebSocket(`${conf.ws_url}/reversi-game?i=${i}&game=${game.id}`, undefined, {
 		constructor: WebSocket
 	});
 
 	gw.on('open', () => {
-		console.log('othello game stream opened');
+		console.log('reversi game stream opened');
 
 		// フォーム
 		const form = [{
@@ -210,19 +210,19 @@ function gameStart(game) {
 	});
 
 	gw.on('close', () => {
-		console.log('othello game stream closed');
+		console.log('reversi game stream closed');
 	});
 }
 
 /**
- * オセロの対局に招待されたとき
+ * リバーシの対局に招待されたとき
  * @param inviter 誘ってきたユーザー
  */
 async function onInviteMe(inviter) {
 	console.log(`Someone invited me: @${inviter.username}`);
 
 	// 承認
-	const game = await request.post(`${conf.api_url}/othello/match`, {
+	const game = await request.post(`${conf.api_url}/reversi/match`, {
 		json: {
 			i,
 			userId: inviter.id
diff --git a/src/othello/ai/index.ts b/src/reversi/ai/index.ts
similarity index 100%
rename from src/othello/ai/index.ts
rename to src/reversi/ai/index.ts
diff --git a/src/othello/core.ts b/src/reversi/core.ts
similarity index 99%
rename from src/othello/core.ts
rename to src/reversi/core.ts
index 217066d375..f1f9de1486 100644
--- a/src/othello/core.ts
+++ b/src/reversi/core.ts
@@ -37,9 +37,9 @@ export type Undo = {
 };
 
 /**
- * オセロエンジン
+ * リバーシエンジン
  */
-export default class Othello {
+export default class Reversi {
 	public map: MapPixel[];
 	public mapWidth: number;
 	public mapHeight: number;
diff --git a/src/othello/maps.ts b/src/reversi/maps.ts
similarity index 99%
rename from src/othello/maps.ts
rename to src/reversi/maps.ts
index 68e5a446f1..f55cb1d516 100644
--- a/src/othello/maps.ts
+++ b/src/reversi/maps.ts
@@ -892,7 +892,7 @@ export const test4: Map = {
 	]
 };
 
-// https://misskey.xyz/othello/5aaabf7fe126e10b5216ea09 64
+// https://misskey.xyz/reversi/5aaabf7fe126e10b5216ea09 64
 export const test5: Map = {
 	name: 'Test5',
 	category: 'Test',
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 5f0a020d6f..a5d13b0237 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -245,27 +245,27 @@ const endpoints: Endpoint[] = [
 	},
 
 	{
-		name: 'othello/match',
+		name: 'reversi/match',
 		withCredential: true
 	},
 
 	{
-		name: 'othello/match/cancel',
+		name: 'reversi/match/cancel',
 		withCredential: true
 	},
 
 	{
-		name: 'othello/invitations',
+		name: 'reversi/invitations',
 		withCredential: true
 	},
 
 	{
-		name: 'othello/games',
+		name: 'reversi/games',
 		withCredential: true
 	},
 
 	{
-		name: 'othello/games/show'
+		name: 'reversi/games/show'
 	},
 
 	{
diff --git a/src/server/api/endpoints/othello/games.ts b/src/server/api/endpoints/reversi/games.ts
similarity index 92%
rename from src/server/api/endpoints/othello/games.ts
rename to src/server/api/endpoints/reversi/games.ts
index 2320a34b04..9d879ecf23 100644
--- a/src/server/api/endpoints/othello/games.ts
+++ b/src/server/api/endpoints/reversi/games.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import OthelloGame, { pack } from '../../../../models/othello-game';
+import ReversiGame, { pack } from '../../../../models/reversi-game';
 
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Get 'my' parameter
@@ -50,7 +50,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	}
 
 	// Fetch games
-	const games = await OthelloGame.find(q, {
+	const games = await ReversiGame.find(q, {
 		sort,
 		limit
 	});
diff --git a/src/server/api/endpoints/othello/games/show.ts b/src/server/api/endpoints/reversi/games/show.ts
similarity index 75%
rename from src/server/api/endpoints/othello/games/show.ts
rename to src/server/api/endpoints/reversi/games/show.ts
index 6b2f5ce137..f32eb23513 100644
--- a/src/server/api/endpoints/othello/games/show.ts
+++ b/src/server/api/endpoints/reversi/games/show.ts
@@ -1,19 +1,19 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
-import OthelloGame, { pack } from '../../../../../models/othello-game';
-import Othello from '../../../../../othello/core';
+import ReversiGame, { pack } from '../../../../../models/reversi-game';
+import Reversi from '../../../../../reversi/core';
 
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Get 'gameId' parameter
 	const [gameId, gameIdErr] = $.type(ID).get(params.gameId);
 	if (gameIdErr) return rej('invalid gameId param');
 
-	const game = await OthelloGame.findOne({ _id: gameId });
+	const game = await ReversiGame.findOne({ _id: gameId });
 
 	if (game == null) {
 		return rej('game not found');
 	}
 
-	const o = new Othello(game.settings.map, {
+	const o = new Reversi(game.settings.map, {
 		isLlotheo: game.settings.isLlotheo,
 		canPutEverywhere: game.settings.canPutEverywhere,
 		loopedBoard: game.settings.loopedBoard
diff --git a/src/server/api/endpoints/othello/invitations.ts b/src/server/api/endpoints/reversi/invitations.ts
similarity index 94%
rename from src/server/api/endpoints/othello/invitations.ts
rename to src/server/api/endpoints/reversi/invitations.ts
index 4761537614..fc487205a9 100644
--- a/src/server/api/endpoints/othello/invitations.ts
+++ b/src/server/api/endpoints/reversi/invitations.ts
@@ -1,4 +1,4 @@
-import Matching, { pack as packMatching } from '../../../../models/othello-matching';
+import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
 
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Find session
diff --git a/src/server/api/endpoints/othello/match.ts b/src/server/api/endpoints/reversi/match.ts
similarity index 77%
rename from src/server/api/endpoints/othello/match.ts
rename to src/server/api/endpoints/reversi/match.ts
index e70e579755..5a699ddbae 100644
--- a/src/server/api/endpoints/othello/match.ts
+++ b/src/server/api/endpoints/reversi/match.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import Matching, { pack as packMatching } from '../../../../models/othello-matching';
-import OthelloGame, { pack as packGame } from '../../../../models/othello-game';
+import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
+import ReversiGame, { pack as packGame } from '../../../../models/reversi-game';
 import User from '../../../../models/user';
-import publishUserStream, { publishOthelloStream } from '../../../../publishers/stream';
-import { eighteight } from '../../../../othello/maps';
+import publishUserStream, { publishReversiStream } from '../../../../publishers/stream';
+import { eighteight } from '../../../../reversi/maps';
 
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
@@ -28,7 +28,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		});
 
 		// Create game
-		const game = await OthelloGame.insert({
+		const game = await ReversiGame.insert({
 			createdAt: new Date(),
 			user1Id: exist.parentId,
 			user2Id: user._id,
@@ -47,14 +47,14 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		// Reponse
 		res(await packGame(game, user));
 
-		publishOthelloStream(exist.parentId, 'matched', await packGame(game, exist.parentId));
+		publishReversiStream(exist.parentId, 'matched', await packGame(game, exist.parentId));
 
 		const other = await Matching.count({
 			childId: user._id
 		});
 
 		if (other == 0) {
-			publishUserStream(user._id, 'othello_no_invites');
+			publishUserStream(user._id, 'reversi_no_invites');
 		}
 	} else {
 		// Fetch child
@@ -88,8 +88,8 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		const packed = await packMatching(matching, child);
 
 		// 招待
-		publishOthelloStream(child._id, 'invited', packed);
+		publishReversiStream(child._id, 'invited', packed);
 
-		publishUserStream(child._id, 'othello_invited', packed);
+		publishUserStream(child._id, 'reversi_invited', packed);
 	}
 });
diff --git a/src/server/api/endpoints/othello/match/cancel.ts b/src/server/api/endpoints/reversi/match/cancel.ts
similarity index 68%
rename from src/server/api/endpoints/othello/match/cancel.ts
rename to src/server/api/endpoints/reversi/match/cancel.ts
index 562e691061..bc8a4cd640 100644
--- a/src/server/api/endpoints/othello/match/cancel.ts
+++ b/src/server/api/endpoints/reversi/match/cancel.ts
@@ -1,4 +1,4 @@
-import Matching from '../../../../../models/othello-matching';
+import Matching from '../../../../../models/reversi-matching';
 
 module.exports = (params, user) => new Promise(async (res, rej) => {
 	await Matching.remove({
diff --git a/src/server/api/stream/othello-game.ts b/src/server/api/stream/reversi-game.ts
similarity index 78%
rename from src/server/api/stream/othello-game.ts
rename to src/server/api/stream/reversi-game.ts
index 841e542610..63d9b220b0 100644
--- a/src/server/api/stream/othello-game.ts
+++ b/src/server/api/stream/reversi-game.ts
@@ -1,10 +1,10 @@
 import * as websocket from 'websocket';
 import * as redis from 'redis';
 import * as CRC32 from 'crc-32';
-import OthelloGame, { pack } from '../../../models/othello-game';
-import { publishOthelloGameStream } from '../../../publishers/stream';
-import Othello from '../../../othello/core';
-import * as maps from '../../../othello/maps';
+import ReversiGame, { pack } from '../../../models/reversi-game';
+import { publishReversiGameStream } from '../../../publishers/stream';
+import Reversi from '../../../reversi/core';
+import * as maps from '../../../reversi/maps';
 import { ParsedUrlQuery } from 'querystring';
 
 export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user?: any): void {
@@ -12,7 +12,7 @@ export default function(request: websocket.request, connection: websocket.connec
 	const gameId = q.game;
 
 	// Subscribe game stream
-	subscriber.subscribe(`misskey:othello-game-stream:${gameId}`);
+	subscriber.subscribe(`misskey:reversi-game-stream:${gameId}`);
 	subscriber.on('message', (_, data) => {
 		connection.send(data);
 	});
@@ -62,24 +62,24 @@ export default function(request: websocket.request, connection: websocket.connec
 	});
 
 	async function updateSettings(settings) {
-		const game = await OthelloGame.findOne({ _id: gameId });
+		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (game.isStarted) return;
 		if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
 		if (game.user1Id.equals(user._id) && game.user1Accepted) return;
 		if (game.user2Id.equals(user._id) && game.user2Accepted) return;
 
-		await OthelloGame.update({ _id: gameId }, {
+		await ReversiGame.update({ _id: gameId }, {
 			$set: {
 				settings
 			}
 		});
 
-		publishOthelloGameStream(gameId, 'update-settings', settings);
+		publishReversiGameStream(gameId, 'update-settings', settings);
 	}
 
 	async function initForm(form) {
-		const game = await OthelloGame.findOne({ _id: gameId });
+		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (game.isStarted) return;
 		if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
@@ -90,18 +90,18 @@ export default function(request: websocket.request, connection: websocket.connec
 			form2: form
 		};
 
-		await OthelloGame.update({ _id: gameId }, {
+		await ReversiGame.update({ _id: gameId }, {
 			$set: set
 		});
 
-		publishOthelloGameStream(gameId, 'init-form', {
+		publishReversiGameStream(gameId, 'init-form', {
 			userId: user._id,
 			form
 		});
 	}
 
 	async function updateForm(id, value) {
-		const game = await OthelloGame.findOne({ _id: gameId });
+		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (game.isStarted) return;
 		if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
@@ -120,11 +120,11 @@ export default function(request: websocket.request, connection: websocket.connec
 			form1: form
 		};
 
-		await OthelloGame.update({ _id: gameId }, {
+		await ReversiGame.update({ _id: gameId }, {
 			$set: set
 		});
 
-		publishOthelloGameStream(gameId, 'update-form', {
+		publishReversiGameStream(gameId, 'update-form', {
 			userId: user._id,
 			id,
 			value
@@ -133,40 +133,40 @@ export default function(request: websocket.request, connection: websocket.connec
 
 	async function message(message) {
 		message.id = Math.random();
-		publishOthelloGameStream(gameId, 'message', {
+		publishReversiGameStream(gameId, 'message', {
 			userId: user._id,
 			message
 		});
 	}
 
 	async function accept(accept: boolean) {
-		const game = await OthelloGame.findOne({ _id: gameId });
+		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (game.isStarted) return;
 
 		let bothAccepted = false;
 
 		if (game.user1Id.equals(user._id)) {
-			await OthelloGame.update({ _id: gameId }, {
+			await ReversiGame.update({ _id: gameId }, {
 				$set: {
 					user1Accepted: accept
 				}
 			});
 
-			publishOthelloGameStream(gameId, 'change-accepts', {
+			publishReversiGameStream(gameId, 'change-accepts', {
 				user1: accept,
 				user2: game.user2Accepted
 			});
 
 			if (accept && game.user2Accepted) bothAccepted = true;
 		} else if (game.user2Id.equals(user._id)) {
-			await OthelloGame.update({ _id: gameId }, {
+			await ReversiGame.update({ _id: gameId }, {
 				$set: {
 					user2Accepted: accept
 				}
 			});
 
-			publishOthelloGameStream(gameId, 'change-accepts', {
+			publishReversiGameStream(gameId, 'change-accepts', {
 				user1: game.user1Accepted,
 				user2: accept
 			});
@@ -179,7 +179,7 @@ export default function(request: websocket.request, connection: websocket.connec
 		if (bothAccepted) {
 			// 3秒後、まだacceptされていたらゲーム開始
 			setTimeout(async () => {
-				const freshGame = await OthelloGame.findOne({ _id: gameId });
+				const freshGame = await ReversiGame.findOne({ _id: gameId });
 				if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return;
 				if (!freshGame.user1Accepted || !freshGame.user2Accepted) return;
 
@@ -198,7 +198,7 @@ export default function(request: websocket.request, connection: websocket.connec
 
 				const map = freshGame.settings.map != null ? freshGame.settings.map : getRandomMap();
 
-				await OthelloGame.update({ _id: gameId }, {
+				await ReversiGame.update({ _id: gameId }, {
 					$set: {
 						startedAt: new Date(),
 						isStarted: true,
@@ -208,7 +208,7 @@ export default function(request: websocket.request, connection: websocket.connec
 				});
 
 				//#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理
-				const o = new Othello(map, {
+				const o = new Reversi(map, {
 					isLlotheo: freshGame.settings.isLlotheo,
 					canPutEverywhere: freshGame.settings.canPutEverywhere,
 					loopedBoard: freshGame.settings.loopedBoard
@@ -224,7 +224,7 @@ export default function(request: websocket.request, connection: websocket.connec
 						winner = null;
 					}
 
-					await OthelloGame.update({
+					await ReversiGame.update({
 						_id: gameId
 					}, {
 						$set: {
@@ -233,27 +233,27 @@ export default function(request: websocket.request, connection: websocket.connec
 						}
 					});
 
-					publishOthelloGameStream(gameId, 'ended', {
+					publishReversiGameStream(gameId, 'ended', {
 						winnerId: winner,
 						game: await pack(gameId, user)
 					});
 				}
 				//#endregion
 
-				publishOthelloGameStream(gameId, 'started', await pack(gameId, user));
+				publishReversiGameStream(gameId, 'started', await pack(gameId, user));
 			}, 3000);
 		}
 	}
 
 	// 石を打つ
 	async function set(pos) {
-		const game = await OthelloGame.findOne({ _id: gameId });
+		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (!game.isStarted) return;
 		if (game.isEnded) return;
 		if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
 
-		const o = new Othello(game.settings.map, {
+		const o = new Reversi(game.settings.map, {
 			isLlotheo: game.settings.isLlotheo,
 			canPutEverywhere: game.settings.canPutEverywhere,
 			loopedBoard: game.settings.loopedBoard
@@ -290,7 +290,7 @@ export default function(request: websocket.request, connection: websocket.connec
 
 		const crc32 = CRC32.str(game.logs.map(x => x.pos.toString()).join('') + pos.toString());
 
-		await OthelloGame.update({
+		await ReversiGame.update({
 			_id: gameId
 		}, {
 			$set: {
@@ -303,12 +303,12 @@ export default function(request: websocket.request, connection: websocket.connec
 			}
 		});
 
-		publishOthelloGameStream(gameId, 'set', Object.assign(log, {
+		publishReversiGameStream(gameId, 'set', Object.assign(log, {
 			next: o.turn
 		}));
 
 		if (o.isEnded) {
-			publishOthelloGameStream(gameId, 'ended', {
+			publishReversiGameStream(gameId, 'ended', {
 				winnerId: winner,
 				game: await pack(gameId, user)
 			});
@@ -316,7 +316,7 @@ export default function(request: websocket.request, connection: websocket.connec
 	}
 
 	async function check(crc32) {
-		const game = await OthelloGame.findOne({ _id: gameId });
+		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (!game.isStarted) return;
 
diff --git a/src/server/api/stream/othello.ts b/src/server/api/stream/reversi.ts
similarity index 77%
rename from src/server/api/stream/othello.ts
rename to src/server/api/stream/reversi.ts
index fa62b05836..35c6167364 100644
--- a/src/server/api/stream/othello.ts
+++ b/src/server/api/stream/reversi.ts
@@ -1,12 +1,12 @@
 import * as mongo from 'mongodb';
 import * as websocket from 'websocket';
 import * as redis from 'redis';
-import Matching, { pack } from '../../../models/othello-matching';
+import Matching, { pack } from '../../../models/reversi-matching';
 import publishUserStream from '../../../publishers/stream';
 
 export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
-	// Subscribe othello stream
-	subscriber.subscribe(`misskey:othello-stream:${user._id}`);
+	// Subscribe reversi stream
+	subscriber.subscribe(`misskey:reversi-stream:${user._id}`);
 	subscriber.on('message', (_, data) => {
 		connection.send(data);
 	});
@@ -22,7 +22,7 @@ export default function(request: websocket.request, connection: websocket.connec
 					childId: new mongo.ObjectID(msg.id)
 				});
 				if (matching == null) return;
-				publishUserStream(matching.childId, 'othello_invited', await pack(matching, matching.childId));
+				publishUserStream(matching.childId, 'reversi_invited', await pack(matching, matching.childId));
 				break;
 		}
 	});
diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts
index 2d4cfc108f..a3e4ed6f85 100644
--- a/src/server/api/streaming.ts
+++ b/src/server/api/streaming.ts
@@ -10,8 +10,8 @@ import userListStream from './stream/user-list';
 import driveStream from './stream/drive';
 import messagingStream from './stream/messaging';
 import messagingIndexStream from './stream/messaging-index';
-import othelloGameStream from './stream/othello-game';
-import othelloStream from './stream/othello';
+import reversiGameStream from './stream/reversi-game';
+import reversiStream from './stream/reversi';
 import serverStatsStream from './stream/server-stats';
 import notesStatsStream from './stream/notes-stats';
 import requestsStream from './stream/requests';
@@ -56,8 +56,8 @@ module.exports = (server: http.Server) => {
 		const q = request.resourceURL.query as ParsedUrlQuery;
 		const [user, app] = await authenticate(q.i as string);
 
-		if (request.resourceURL.pathname === '/othello-game') {
-			othelloGameStream(request, connection, subscriber, user);
+		if (request.resourceURL.pathname === '/reversi-game') {
+			reversiGameStream(request, connection, subscriber, user);
 			return;
 		}
 
@@ -75,7 +75,7 @@ module.exports = (server: http.Server) => {
 			request.resourceURL.pathname === '/drive' ? driveStream :
 			request.resourceURL.pathname === '/messaging' ? messagingStream :
 			request.resourceURL.pathname === '/messaging-index' ? messagingIndexStream :
-			request.resourceURL.pathname === '/othello' ? othelloStream :
+			request.resourceURL.pathname === '/reversi' ? reversiStream :
 			null;
 
 		if (channel !== null) {

From 11cf82c6a43285bade1e574a5e8294075993f45f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 08:15:57 +0900
Subject: [PATCH 342/369] 4.0.0

---
 CHANGELOG.md | 11 +++++++++++
 package.json |  4 ++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 614d50d0ff..a06780b108 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,17 @@
 ChangeLog
 =========
 
+4.0.0
+-----
+
+オセロがリバーシに変更されました。
+
+### Migration
+
+MongoDBの、`othelloGames`と`othelloMatchings`コレクションをそれぞれ`reversiGames`と`reversiMatchings`にリネームしてください。
+
+You need to rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings`.
+
 3.0.0
 -----
 
diff --git a/package.json b/package.json
index c5092e6f19..bd5dc8e84f 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "3.1.1",
-	"clientVersion": "1.0.6528",
+	"version": "4.0.0",
+	"clientVersion": "1.0.6535",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,

From 2acaca858290c26616603452f6364f7a35d20396 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 08:20:22 +0900
Subject: [PATCH 343/369] Update CHANGELOG.md

---
 CHANGELOG.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a06780b108..7978ea43ce 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
 ChangeLog
 =========
 
+破壊的変更のみ記載。
+
+This document only describes breaking changes.
+
 4.0.0
 -----
 

From 69a3efd5347defc177e3ef37995e405c87f5037f Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 08:20:56 +0900
Subject: [PATCH 344/369] Update CHANGELOG.md

---
 CHANGELOG.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7978ea43ce..0c3340aca4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@ ChangeLog
 
 破壊的変更のみ記載。
 
-This document only describes breaking changes.
+This document describes breaking changes only.
 
 4.0.0
 -----

From e4e65a4cd53cd0eabe3158987e71b6c73ae0c06c Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 08:23:46 +0900
Subject: [PATCH 345/369] Update CHANGELOG.md

---
 CHANGELOG.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c3340aca4..5c0214ff9f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,8 @@ This document describes breaking changes only.
 
 オセロがリバーシに変更されました。
 
+Othello is now Reversi.
+
 ### Migration
 
 MongoDBの、`othelloGames`と`othelloMatchings`コレクションをそれぞれ`reversiGames`と`reversiMatchings`にリネームしてください。

From 2fcebdd2813a5019eceaf290c4bdfa4e47f65a92 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 11:23:18 +0900
Subject: [PATCH 346/369] cors

---
 package.json            | 118 ++++++++++++++++++++--------------------
 src/server/api/index.ts |   2 +
 2 files changed, 61 insertions(+), 59 deletions(-)

diff --git a/package.json b/package.json
index bd5dc8e84f..fc61e99b81 100644
--- a/package.json
+++ b/package.json
@@ -29,64 +29,6 @@
 		"@fortawesome/fontawesome-free-solid": "5.0.2",
 		"@koa/cors": "2.2.1",
 		"@prezzemolo/rap": "0.1.2",
-		"autwh": "0.1.0",
-		"bcryptjs": "2.4.3",
-		"cafy": "8.0.0",
-		"chalk": "2.4.1",
-		"crc-32": "1.2.0",
-		"debug": "3.1.0",
-		"deepcopy": "0.6.3",
-		"diskusage": "0.2.4",
-		"elasticsearch": "15.0.0",
-		"emojilib": "2.2.12",
-		"escape-regexp": "0.0.1",
-		"file-type": "8.0.0",
-		"gm": "1.23.1",
-		"http-signature": "1.2.0",
-		"is-root": "2.0.0",
-		"is-url": "1.2.4",
-		"js-yaml": "3.11.0",
-		"jsdom": "11.11.0",
-		"koa": "2.5.1",
-		"koa-bodyparser": "4.2.1",
-		"koa-compress": "3.0.0",
-		"koa-favicon": "2.0.1",
-		"koa-json-body": "5.3.0",
-		"koa-logger": "3.2.0",
-		"koa-mount": "3.0.0",
-		"koa-multer": "1.0.2",
-		"koa-router": "7.4.0",
-		"koa-send": "4.1.3",
-		"koa-slow": "2.1.0",
-		"koa-views": "6.1.4",
-		"kue": "0.11.6",
-		"mongodb": "3.0.10",
-		"monk": "6.0.6",
-		"ms": "2.1.1",
-		"nopt": "4.0.1",
-		"os-utils": "0.0.14",
-		"parse5": "5.0.0",
-		"prominence": "0.2.0",
-		"promise-sequential": "1.1.1",
-		"punycode": "2.1.1",
-		"qrcode": "1.2.0",
-		"ratelimiter": "3.0.3",
-		"recaptcha-promise": "0.1.3",
-		"reconnecting-websocket": "3.2.2",
-		"redis": "2.8.0",
-		"request": "2.87.0",
-		"request-promise-native": "1.0.5",
-		"rndstr": "1.0.0",
-		"speakeasy": "2.0.0",
-		"summaly": "2.0.6",
-		"tcp-port-used": "0.1.2",
-		"tmp": "0.0.33",
-		"uuid": "3.2.1",
-		"web-push": "3.3.1",
-		"webfinger.js": "2.6.6",
-		"websocket": "1.0.26",
-		"ws": "5.2.0",
-		"xev": "2.0.1",
 		"@prezzemolo/zip": "0.0.3",
 		"@types/bcryptjs": "2.4.1",
 		"@types/debug": "0.0.30",
@@ -142,17 +84,30 @@
 		"@types/ws": "5.1.1",
 		"animejs": "2.2.0",
 		"autosize": "4.0.2",
+		"autwh": "0.1.0",
+		"bcryptjs": "2.4.3",
 		"bootstrap-vue": "2.0.0-rc.6",
+		"cafy": "8.0.0",
+		"chalk": "2.4.1",
+		"crc-32": "1.2.0",
 		"css-loader": "0.28.11",
+		"debug": "3.1.0",
 		"deep-equal": "1.0.1",
+		"deepcopy": "0.6.3",
+		"diskusage": "0.2.4",
 		"dompurify": "1.0.4",
+		"elasticsearch": "15.0.0",
 		"element-ui": "2.3.9",
+		"emojilib": "2.2.12",
+		"escape-regexp": "0.0.1",
 		"eslint": "4.19.1",
 		"eslint-plugin-vue": "4.5.0",
 		"eventemitter3": "3.1.0",
 		"exif-js": "2.3.0",
 		"file-loader": "1.1.11",
+		"file-type": "8.0.0",
 		"fuckadblock": "3.2.1",
+		"gm": "1.23.1",
 		"gulp": "3.9.1",
 		"gulp-cssnano": "2.1.3",
 		"gulp-htmlmin": "4.0.0",
@@ -170,32 +125,71 @@
 		"hard-source-webpack-plugin": "0.6.10",
 		"highlight.js": "9.12.0",
 		"html-minifier": "3.5.16",
+		"http-signature": "1.2.0",
 		"inquirer": "5.2.0",
+		"is-root": "2.0.0",
+		"is-url": "1.2.4",
+		"js-yaml": "3.11.0",
+		"jsdom": "11.11.0",
+		"koa": "2.5.1",
+		"koa-bodyparser": "4.2.1",
+		"koa-compress": "3.0.0",
+		"koa-favicon": "2.0.1",
+		"koa-json-body": "5.3.0",
+		"koa-logger": "3.2.0",
+		"koa-mount": "3.0.0",
+		"koa-multer": "1.0.2",
+		"koa-router": "7.4.0",
+		"koa-send": "4.1.3",
+		"koa-slow": "2.1.0",
+		"koa-views": "6.1.4",
+		"kue": "0.11.6",
 		"license-checker": "20.0.0",
 		"loader-utils": "1.1.0",
 		"mecab-async": "0.1.2",
 		"mkdirp": "0.5.1",
 		"mocha": "5.2.0",
 		"moji": "0.5.1",
+		"mongodb": "3.0.10",
+		"monk": "6.0.6",
+		"ms": "2.1.1",
 		"nan": "2.10.0",
 		"node-sass": "4.9.0",
 		"node-sass-json-importer": "3.2.0",
+		"nopt": "4.0.1",
 		"nprogress": "0.2.0",
 		"object-assign-deep": "0.4.0",
 		"on-build-webpack": "0.1.0",
+		"os-utils": "0.0.14",
+		"parse5": "5.0.0",
 		"progress-bar-webpack-plugin": "1.11.0",
+		"prominence": "0.2.0",
+		"promise-sequential": "1.1.1",
 		"pug": "2.0.3",
+		"punycode": "2.1.1",
+		"qrcode": "1.2.0",
+		"ratelimiter": "3.0.3",
+		"recaptcha-promise": "0.1.3",
+		"reconnecting-websocket": "3.2.2",
+		"redis": "2.8.0",
+		"request": "2.87.0",
+		"request-promise-native": "1.0.5",
 		"rimraf": "2.6.2",
+		"rndstr": "1.0.0",
 		"s-age": "1.1.2",
 		"sass-loader": "7.0.1",
 		"seedrandom": "2.4.3",
 		"single-line-log": "1.1.2",
+		"speakeasy": "2.0.0",
 		"style-loader": "0.21.0",
 		"stylus": "0.54.5",
 		"stylus-loader": "3.0.2",
+		"summaly": "2.0.6",
 		"swagger-jsdoc": "1.9.7",
 		"syuilo-password-strength": "0.0.1",
+		"tcp-port-used": "0.1.2",
 		"textarea-caret": "3.1.0",
+		"tmp": "0.0.33",
 		"ts-loader": "4.3.0",
 		"ts-node": "6.0.4",
 		"tslint": "5.10.0",
@@ -203,6 +197,7 @@
 		"typescript-eslint-parser": "15.0.0",
 		"uglify-es": "3.3.9",
 		"url-loader": "1.0.1",
+		"uuid": "3.2.1",
 		"v-animate-css": "0.0.2",
 		"vue": "2.5.16",
 		"vue-cropperjs": "2.2.0",
@@ -214,7 +209,12 @@
 		"vuedraggable": "2.16.0",
 		"vuex": "3.0.1",
 		"vuex-persistedstate": "^2.5.4",
+		"web-push": "3.3.1",
+		"webfinger.js": "2.6.6",
 		"webpack": "4.9.1",
-		"webpack-cli": "2.1.4"
+		"webpack-cli": "2.1.4",
+		"websocket": "1.0.26",
+		"ws": "5.2.0",
+		"xev": "2.0.1"
 	}
 }
diff --git a/src/server/api/index.ts b/src/server/api/index.ts
index 009c99acae..23203d9147 100644
--- a/src/server/api/index.ts
+++ b/src/server/api/index.ts
@@ -6,6 +6,7 @@ import * as Koa from 'koa';
 import * as Router from 'koa-router';
 import * as multer from 'koa-multer';
 import * as bodyParser from 'koa-bodyparser';
+const cors = require('@koa/cors');
 
 import endpoints from './endpoints';
 
@@ -13,6 +14,7 @@ const handler = require('./api-handler').default;
 
 // Init app
 const app = new Koa();
+app.use(cors());
 app.use(bodyParser({
 	// リクエストが multipart/form-data でない限りはJSONだと見なす
 	detectJSON: ctx => !ctx.is('multipart/form-data')

From 750c0d7df27eeab4caf0133cd3ba338940828533 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 11:27:20 +0900
Subject: [PATCH 347/369] Use wildcard

---
 src/server/api/index.ts | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/server/api/index.ts b/src/server/api/index.ts
index 23203d9147..c39911c35f 100644
--- a/src/server/api/index.ts
+++ b/src/server/api/index.ts
@@ -14,7 +14,11 @@ const handler = require('./api-handler').default;
 
 // Init app
 const app = new Koa();
-app.use(cors());
+
+app.use(cors({
+	origin: '*'
+}));
+
 app.use(bodyParser({
 	// リクエストが multipart/form-data でない限りはJSONだと見なす
 	detectJSON: ctx => !ctx.is('multipart/form-data')

From 73f5bf69e80d551d2e86b868bb465bd158d16359 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 11:33:24 +0900
Subject: [PATCH 348/369] 4.1.0

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index fc61e99b81..a5aceeef81 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "4.0.0",
+	"version": "4.1.0",
 	"clientVersion": "1.0.6535",
 	"codename": "nighthike",
 	"main": "./built/index.js",

From 0460cdedd7a3c05915185547ea0996c09669fea6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 11:42:23 +0900
Subject: [PATCH 349/369] =?UTF-8?q?input=E3=81=AEsuffix=E3=81=8C=E3=81=AF?=
 =?UTF-8?q?=E3=81=BF=E5=87=BA=E3=81=99=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE?=
 =?UTF-8?q?=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 package.json                                        | 4 ++--
 src/client/app/common/views/components/ui/input.vue | 4 ++++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index a5aceeef81..9cbbab1984 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
 	"name": "misskey",
 	"author": "syuilo <i@syuilo.com>",
-	"version": "4.1.0",
-	"clientVersion": "1.0.6535",
+	"version": "4.1.1",
+	"clientVersion": "1.0.6542",
 	"codename": "nighthike",
 	"main": "./built/index.js",
 	"private": true,
diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue
index 0d11c14131..ce28bfb12a 100644
--- a/src/client/app/common/views/components/ui/input.vue
+++ b/src/client/app/common/views/components/ui/input.vue
@@ -289,6 +289,10 @@ root(isDark, fill)
 			> *
 				display block
 				min-width 16px
+				max-width 150px
+				overflow hidden
+				white-space nowrap
+				text-overflow ellipsis
 
 		> .prefix
 			left 0

From 77013f982de34c99c1ea787888bcd7d690b8364c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 13:52:52 +0900
Subject: [PATCH 350/369] Fiox bug

---
 src/client/app/desktop/views/pages/deck/deck.widgets-column.vue | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
index 05e7f88a25..15397232e0 100644
--- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue
@@ -116,6 +116,8 @@ export default Vue.extend({
 					data: {}
 				}
 			});
+
+			this.widgetAdderSelected = null;
 		},
 
 		removeWidget(widget) {

From e5468713acfad73dbd8043a2a4afc8178aa45b97 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 14:11:31 +0900
Subject: [PATCH 351/369] maybe Support CW in ActivityPub

---
 src/remote/activitypub/models/note.ts   | 1 +
 src/remote/activitypub/renderer/note.ts | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index 91e700ef6f..974fce433b 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -170,6 +170,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
 		media,
 		reply,
 		renote: undefined,
+		cw: note.summary,
 		text: text,
 		viaMobile: false,
 		geo: undefined,
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index a05c12b388..4c531da970 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -49,6 +49,7 @@ export default async function renderNote(note: INote, dive = true) {
 		id: `${config.url}/notes/${note._id}`,
 		type: 'Note',
 		attributedTo,
+		summary: note.cw,
 		content: toHtml(note),
 		published: note.createdAt.toISOString(),
 		to: 'https://www.w3.org/ns/activitystreams#Public',

From 4991fb27698baa20a80a766d2e30e91720d2e0f9 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 14:29:07 +0900
Subject: [PATCH 352/369] Fix #1700

---
 src/models/note.ts | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/models/note.ts b/src/models/note.ts
index 21ec2b3857..83e85f8498 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -343,6 +343,10 @@ export const pack = async (
 		_note.mediaIds = [];
 		_note.text = null;
 		_note.poll = null;
+		_note.cw = null;
+		_note.tags = [];
+		_note.tagsLower = [];
+		_note.geo = null;
 		_note.isHidden = true;
 	}
 

From f0fec654ff4c533f16a4f2e9e30d19d102f94a63 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 15:58:23 +0900
Subject: [PATCH 353/369] fix #1726

---
 src/remote/activitypub/misc/get-note-html.ts |  2 +-
 src/text/html.ts                             | 12 +++++++-----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/remote/activitypub/misc/get-note-html.ts b/src/remote/activitypub/misc/get-note-html.ts
index 5bca4eed62..33dd381689 100644
--- a/src/remote/activitypub/misc/get-note-html.ts
+++ b/src/remote/activitypub/misc/get-note-html.ts
@@ -6,7 +6,7 @@ import config from '../../../config';
 export default function(note: INote) {
 	if (note.text == null) return null;
 
-	let html = toHtml(parse(note.text));
+	let html = toHtml(parse(note.text), note.mentionedRemoteUsers);
 
 	if (note.poll != null) {
 		const url = `${config.url}/notes/${note._id}`;
diff --git a/src/text/html.ts b/src/text/html.ts
index 70b341689a..a51406ca85 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -1,8 +1,9 @@
 import { lib as emojilib } from 'emojilib';
 import { JSDOM } from 'jsdom';
 import config from '../config';
+import { INote } from '../models/note';
 
-const handlers = {
+const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: INote["mentionedRemoteUsers"]) => void} = {
 	bold({ document }, { bold }) {
 		const b = document.createElement('b');
 		b.textContent = bold;
@@ -44,9 +45,10 @@ const handlers = {
 		document.body.appendChild(a);
 	},
 
-	mention({ document }, { content }) {
+	mention({ document }, { content, username, host }, mentionedRemoteUsers) {
 		const a = document.createElement('a');
-		a.href = `${config.url}/${content}`;
+		const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host);
+		a.href = remoteUserInfo ? remoteUserInfo.uri : `${config.url}/${content}`;
 		a.textContent = content;
 		document.body.appendChild(a);
 	},
@@ -88,11 +90,11 @@ const handlers = {
 	}
 };
 
-export default tokens => {
+export default (tokens, mentionedRemoteUsers: INote["mentionedRemoteUsers"] = []) => {
 	const { window } = new JSDOM('');
 
 	for (const token of tokens) {
-		handlers[token.type](window, token);
+		handlers[token.type](window, token, mentionedRemoteUsers);
 	}
 
 	return `<p>${window.document.body.innerHTML}</p>`;

From d692bb3c523ce237d240177efc471170bbe1b3a4 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 16:40:18 +0900
Subject: [PATCH 354/369] Improve user search

---
 src/server/api/endpoints/users/search.ts       |  1 +
 .../api/endpoints/users/search_by_username.ts  | 18 +++++++++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts
index cfbdc337bf..95b9e4f4bb 100644
--- a/src/server/api/endpoints/users/search.ts
+++ b/src/server/api/endpoints/users/search.ts
@@ -40,6 +40,7 @@ async function byNative(res, rej, me, query, offset, max) {
 	// Search users
 	const users = await User
 		.find({
+			host: null,
 			$or: [{
 				usernameLower: new RegExp(escapedQuery.replace('@', '').toLowerCase())
 			}, {
diff --git a/src/server/api/endpoints/users/search_by_username.ts b/src/server/api/endpoints/users/search_by_username.ts
index 5927d00faf..7c9fbba0fa 100644
--- a/src/server/api/endpoints/users/search_by_username.ts
+++ b/src/server/api/endpoints/users/search_by_username.ts
@@ -20,15 +20,27 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
 
-	const users = await User
+	let users = await User
 		.find({
+			host: null,
 			usernameLower: new RegExp(query.toLowerCase())
 		}, {
 			limit: limit,
 			skip: offset
 		});
 
+	if (users.length < limit) {
+		const remoteUsers = await User
+			.find({
+				host: { $ne: null },
+				usernameLower: new RegExp(query.toLowerCase())
+			}, {
+				limit: limit - users.length
+			});
+
+		users = users.concat(remoteUsers);
+	}
+
 	// Serialize
-	res(await Promise.all(users.map(async user =>
-		await pack(user, me, { detail: true }))));
+	res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
 });

From 20549bfdf0a5214dfb627a4ec07ef042e43f263b Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 16:45:01 +0900
Subject: [PATCH 355/369] Fix #1729

---
 src/remote/activitypub/renderer/mention.ts | 13 ++++++-------
 src/remote/activitypub/renderer/note.ts    | 13 +++++++++++--
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/remote/activitypub/renderer/mention.ts b/src/remote/activitypub/renderer/mention.ts
index 4cba7d6a94..95cae52aa2 100644
--- a/src/remote/activitypub/renderer/mention.ts
+++ b/src/remote/activitypub/renderer/mention.ts
@@ -1,9 +1,8 @@
-export default (mention: {
-	uri: string;
-	username: string;
-	host: string;
-}) => ({
+import { IUser, isRemoteUser } from "../../../models/user";
+import config from "../../../config";
+
+export default (mention: IUser) => ({
 	type: 'Mention',
-	href: mention.uri,
-	name: `@${mention.username}@${mention.host}`
+	href: isRemoteUser(mention) ? mention.uri : `${config.url}/@${mention.username}`,
+	name: isRemoteUser(mention) ? `@${mention.username}@${mention.host}` : `@${mention.username}`,
 });
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index aba0dc809a..f9e559d307 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -54,9 +54,18 @@ export default async function renderNote(note: INote, dive = true) {
 		? [`${attributedTo}/followers`].concat(mentions)
 		: [];
 
+	const mentionUsers = await User.find({
+		_id: {
+			$in: note.mentions
+		}
+	});
+
 	const hashtagTags = (note.tags || []).map(renderHashtag);
-	const mentionTags = (note.mentionedRemoteUsers || []).map(renderMention);
-	const tag = hashtagTags.concat(mentionTags);
+	const mentionTags = mentionUsers.map(renderMention);
+	const tag = [
+		...hashtagTags,
+		...mentionTags,
+	];
 
 	return {
 		id: `${config.url}/notes/${note._id}`,

From 0ca5237139cc24797a91df09d82bab788d4cf160 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 16:47:37 +0900
Subject: [PATCH 356/369] Send servicewroker script

---
 src/server/web/index.ts | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index 5ce040d083..d38d9165d4 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -66,9 +66,11 @@ router.get('/apple-touch-icon.png', async ctx => {
 });
 
 // ServiceWroker
-//router.get(/^\/sw\.(.+?)\.js$/, async ctx => {
-//	await send(ctx, `${client}/assets/sw.${ctx.params[0]}.js`);
-//});
+router.get(/^\/sw\.(.+?)\.js$/, async ctx => {
+	await send(ctx, `/assets/sw.${ctx.params[0]}.js`, {
+		root: client
+	});
+});
 
 // Manifest
 router.get('/manifest.json', async ctx => {

From 8f84dd610c385ada33c1b2e1b1696fb5da47250c Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 16:55:55 +0900
Subject: [PATCH 357/369] Use '

---
 src/text/html.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/text/html.ts b/src/text/html.ts
index a51406ca85..b55d9b80a7 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -90,7 +90,7 @@ const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers:
 	}
 };
 
-export default (tokens, mentionedRemoteUsers: INote["mentionedRemoteUsers"] = []) => {
+export default (tokens, mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) => {
 	const { window } = new JSDOM('');
 
 	for (const token of tokens) {

From 7275a48102503f007bb38a9bd69812247fb7bf30 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 17:11:05 +0900
Subject: [PATCH 358/369] Fix #1731

---
 src/server/activitypub.ts | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts
index c846e28c07..f406328dcb 100644
--- a/src/server/activitypub.ts
+++ b/src/server/activitypub.ts
@@ -7,7 +7,7 @@ const httpSignature = require('http-signature');
 import { createHttp } from '../queue';
 import pack from '../remote/activitypub/renderer';
 import Note from '../models/note';
-import User, { isLocalUser, ILocalUser } from '../models/user';
+import User, { isLocalUser, ILocalUser, IUser } from '../models/user';
 import renderNote from '../remote/activitypub/renderer/note';
 import renderKey from '../remote/activitypub/renderer/key';
 import renderPerson from '../remote/activitypub/renderer/person';
@@ -41,17 +41,18 @@ function inbox(ctx: Koa.Context) {
 	ctx.status = 202;
 }
 
+function isActivityPubReq(ctx: Router.IRouterContext) {
+	const accepted = ctx.accepts('html', 'application/activity+json', 'application/ld+json');
+	return ['application/activity+json', 'application/ld+json'].includes(accepted as string);
+}
+
 // inbox
 router.post('/inbox', json(), inbox);
 router.post('/users/:user/inbox', json(), inbox);
 
 // note
 router.get('/notes/:note', async (ctx, next) => {
-	const accepted = ctx.accepts('html', 'application/activity+json', 'application/ld+json');
-	if (!['application/activity+json', 'application/ld+json'].includes(accepted as string)) {
-		await next();
-		return;
-	}
+	if (!isActivityPubReq(ctx)) return await next();
 
 	const note = await Note.findOne({
 		_id: new mongo.ObjectID(ctx.params.note)
@@ -112,6 +113,15 @@ router.get('/users/:user/publickey', async ctx => {
 });
 
 // user
+function userInfo(ctx: Router.IRouterContext, user: IUser) {
+	if (user === null) {
+		ctx.status = 404;
+		return;
+	}
+
+	ctx.body = pack(renderPerson(user as ILocalUser));
+}
+
 router.get('/users/:user', async ctx => {
 	const userId = new mongo.ObjectID(ctx.params.user);
 
@@ -120,12 +130,18 @@ router.get('/users/:user', async ctx => {
 		host: null
 	});
 
-	if (user === null) {
-		ctx.status = 404;
-		return;
-	}
+	userInfo(ctx, user);
+});
 
-	ctx.body = pack(renderPerson(user as ILocalUser));
+router.get('/@:user', async (ctx, next) => {
+	if (!isActivityPubReq(ctx)) return await next();
+
+	const user = await User.findOne({
+		usernameLower: ctx.params.user.toLowerCase(),
+		host: null
+	});
+
+	userInfo(ctx, user);
 });
 
 // follow form

From 5773a5bfa6fd167dc3d4ce594647687488b8680d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sun, 17 Jun 2018 17:15:03 +0900
Subject: [PATCH 359/369] Refactor

---
 src/remote/activitypub/renderer/note.ts | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index f9e559d307..556054fa93 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -54,14 +54,14 @@ export default async function renderNote(note: INote, dive = true) {
 		? [`${attributedTo}/followers`].concat(mentions)
 		: [];
 
-	const mentionUsers = await User.find({
+	const mentionedUsers = await User.find({
 		_id: {
 			$in: note.mentions
 		}
 	});
 
-	const hashtagTags = (note.tags || []).map(renderHashtag);
-	const mentionTags = mentionUsers.map(renderMention);
+	const hashtagTags = (note.tags || []).map(tag => renderHashtag(tag));
+	const mentionTags = mentionedUsers.map(u => renderMention(u));
 	const tag = [
 		...hashtagTags,
 		...mentionTags,

From 1f1ed2da4c87120fc0018d47c51e6571e4ad3b84 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 17:21:16 +0900
Subject: [PATCH 360/369] minor fix

---
 src/server/activitypub.ts | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts
index f406328dcb..1fbc621e91 100644
--- a/src/server/activitypub.ts
+++ b/src/server/activitypub.ts
@@ -1,5 +1,4 @@
 import * as mongo from 'mongodb';
-import * as Koa from 'koa';
 import * as Router from 'koa-router';
 const json = require('koa-json-body');
 const httpSignature = require('http-signature');
@@ -20,7 +19,7 @@ const router = new Router();
 
 //#region Routing
 
-function inbox(ctx: Koa.Context) {
+function inbox(ctx: Router.IRouterContext) {
 	let signature;
 
 	ctx.req.headers.authorization = 'Signature ' + ctx.req.headers.signature;

From a34cc47a11d5fffa4e4e4817d9d8f4d741cc3ead Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 17:43:54 +0900
Subject: [PATCH 361/369] tsconfig.json noImplicitAny: true

---
 tsconfig.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tsconfig.json b/tsconfig.json
index c407d554ee..125a0c0943 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,7 +2,7 @@
   "compilerOptions": {
     "allowJs": true,
     "noEmitOnError": false,
-    "noImplicitAny": false,
+    "noImplicitAny": true,
     "noImplicitReturns": true,
     "noUnusedParameters": false,
     "noUnusedLocals": true,
@@ -14,7 +14,7 @@
     "removeComments": false,
     "noLib": false,
     "strict": true,
-    "strictNullChecks": false
+		"strictNullChecks": false
   },
   "compileOnSave": false,
   "include": [

From 71da205ab781bca3ef0d2a6ddfdcdb2a2eca2817 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 17:45:59 +0900
Subject: [PATCH 362/369] fix

---
 tsconfig.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tsconfig.json b/tsconfig.json
index 125a0c0943..76221c282a 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,7 +14,7 @@
     "removeComments": false,
     "noLib": false,
     "strict": true,
-		"strictNullChecks": false
+    "strictNullChecks": false
   },
   "compileOnSave": false,
   "include": [

From f19075c50a4247d234b9e28ba48d35ac8d6316d2 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 17:57:50 +0900
Subject: [PATCH 363/369] upgrade font-awesome packages

---
 package.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/package.json b/package.json
index 9cbbab1984..bf49a6599f 100644
--- a/package.json
+++ b/package.json
@@ -23,10 +23,10 @@
 		"format": "gulp format"
 	},
 	"dependencies": {
-		"@fortawesome/fontawesome": "1.0.1",
-		"@fortawesome/fontawesome-free-brands": "5.0.2",
-		"@fortawesome/fontawesome-free-regular": "5.0.2",
-		"@fortawesome/fontawesome-free-solid": "5.0.2",
+		"@fortawesome/fontawesome": "1.1.8",
+		"@fortawesome/fontawesome-free-brands": "5.0.13",
+		"@fortawesome/fontawesome-free-regular": "5.0.13",
+		"@fortawesome/fontawesome-free-solid": "5.0.13",
 		"@koa/cors": "2.2.1",
 		"@prezzemolo/rap": "0.1.2",
 		"@prezzemolo/zip": "0.0.3",

From 871f8867023804e8685f405c95cebae76b955e24 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 19:09:24 +0900
Subject: [PATCH 364/369] build:ts success

---
 gulpfile.ts                     |  4 ++--
 locales/index.ts                | 14 ++++++++++---
 src/build/fa.ts                 | 16 +++++++--------
 src/build/i18n.ts               | 21 ++++++++++---------
 src/client/docs/api/gulpfile.ts | 19 ++++++++++-------
 src/client/docs/gulpfile.ts     |  4 ++--
 src/client/docs/vars.ts         |  2 +-
 yarn.lock                       | 36 ++++++++++++++++++++++-----------
 8 files changed, 72 insertions(+), 44 deletions(-)

diff --git a/gulpfile.ts b/gulpfile.ts
index fa1155878c..49a80879d2 100644
--- a/gulpfile.ts
+++ b/gulpfile.ts
@@ -8,12 +8,12 @@ import * as gutil from 'gulp-util';
 import * as ts from 'gulp-typescript';
 const sourcemaps = require('gulp-sourcemaps');
 import tslint from 'gulp-tslint';
-import cssnano = require('gulp-cssnano');
+const cssnano = require('gulp-cssnano');
 import * as uglifyComposer from 'gulp-uglify/composer';
 import pug = require('gulp-pug');
 import * as rimraf from 'rimraf';
 import chalk from 'chalk';
-import imagemin = require('gulp-imagemin');
+const imagemin = require('gulp-imagemin');
 import * as rename from 'gulp-rename';
 import * as mocha from 'gulp-mocha';
 import * as replace from 'gulp-replace';
diff --git a/locales/index.ts b/locales/index.ts
index 319d178e0a..3b4f76b06a 100644
--- a/locales/index.ts
+++ b/locales/index.ts
@@ -5,12 +5,16 @@
 import * as fs from 'fs';
 import * as yaml from 'js-yaml';
 
-const loadLang = lang => yaml.safeLoad(
-	fs.readFileSync(`./locales/${lang}.yml`, 'utf-8'));
+export type LangKey = 'de' | 'en' | 'fr' | 'ja' | 'pl';
+export type LocaleObjectChildren = LocaleObject | string | undefined;
+export type LocaleObject = {[key: string]: LocaleObjectChildren };
+
+const loadLang = (lang: LangKey) => yaml.safeLoad(
+	fs.readFileSync(`./locales/${lang}.yml`, 'utf-8')) as LocaleObject;
 
 const native = loadLang('ja');
 
-const langs = {
+const langs: {[key in LangKey]: LocaleObject} = {
 	'de': loadLang('de'),
 	'en': loadLang('en'),
 	'fr': loadLang('fr'),
@@ -23,4 +27,8 @@ Object.entries(langs).map(([, locale]) => {
 	locale = Object.assign({}, native, locale);
 });
 
+export function isAvailableLanguage(lang: string): lang is LangKey {
+	return lang in langs;
+}
+
 export default langs;
diff --git a/src/build/fa.ts b/src/build/fa.ts
index 111c19ae66..077bb51e6d 100644
--- a/src/build/fa.ts
+++ b/src/build/fa.ts
@@ -3,18 +3,18 @@
  */
 
 import * as fontawesome from '@fortawesome/fontawesome';
-import * as regular from '@fortawesome/fontawesome-free-regular';
-import * as solid from '@fortawesome/fontawesome-free-solid';
-import * as brands from '@fortawesome/fontawesome-free-brands';
+import regular from '@fortawesome/fontawesome-free-regular';
+import solid from '@fortawesome/fontawesome-free-solid';
+import brands from '@fortawesome/fontawesome-free-brands';
 
 fontawesome.library.add(regular, solid, brands);
 
 export const pattern = /%fa:(.+?)%/g;
 
-export const replacement = (match, key) => {
+export const replacement = (match: string, key: string) => {
 	const args = key.split(' ');
 	let prefix = 'fas';
-	const classes = [];
+	const classes: string[] = [];
 	let transform = '';
 	let name;
 
@@ -34,12 +34,12 @@ export const replacement = (match, key) => {
 		}
 	});
 
-	const icon = fontawesome.icon({ prefix, iconName: name }, {
-		classes: classes
+	const icon = fontawesome.icon({ prefix, iconName: name } as fontawesome.IconLookup, {
+		classes: classes,
+		transform: fontawesome.parse.transform(transform)
 	});
 
 	if (icon) {
-		icon.transform = fontawesome.parse.transform(transform);
 		return `<i data-fa class="${name}">${icon.html[0]}</i>`;
 	} else {
 		console.warn(`'${name}' not found in fa`);
diff --git a/src/build/i18n.ts b/src/build/i18n.ts
index 35854055d0..308ff0da00 100644
--- a/src/build/i18n.ts
+++ b/src/build/i18n.ts
@@ -2,7 +2,7 @@
  * Replace i18n texts
  */
 
-import locale from '../../locales';
+import locale, { isAvailableLanguage, LocaleObject, LocaleObjectChildren } from '../../locales';
 
 export default class Replacer {
 	private lang: string;
@@ -16,19 +16,19 @@ export default class Replacer {
 		this.replacement = this.replacement.bind(this);
 	}
 
-	private get(path: string, key: string) {
-		const texts = locale[this.lang];
-
-		if (texts == null) {
+	private get(path: string, key: string): string {
+		if (!isAvailableLanguage(this.lang)) {
 			console.warn(`lang '${this.lang}' is not supported`);
 			return key; // Fallback
 		}
 
-		let text = texts;
+		const texts = locale[this.lang];
+
+		let text: LocaleObjectChildren = texts;
 
 		if (path) {
 			if (text.hasOwnProperty(path)) {
-				text = text[path];
+				text = text[path] as LocaleObject;
 			} else {
 				console.warn(`path '${path}' not found in '${this.lang}'`);
 				return key; // Fallback
@@ -38,7 +38,7 @@ export default class Replacer {
 		// Check the key existance
 		const error = key.split('.').some(k => {
 			if (text.hasOwnProperty(k)) {
-				text = text[k];
+				text = (text as LocaleObject)[k];
 				return false;
 			} else {
 				return true;
@@ -48,12 +48,15 @@ export default class Replacer {
 		if (error) {
 			console.warn(`key '${key}' not found in '${path}' of '${this.lang}'`);
 			return key; // Fallback
+		} else if (typeof text !== "string") {
+			console.warn(`key '${key}' is not string in '${path}' of '${this.lang}'`);
+			return key; // Fallback
 		} else {
 			return text;
 		}
 	}
 
-	public replacement(match, key) {
+	public replacement(match: string, key: string) {
 		let path = null;
 
 		if (key.indexOf('|') != -1) {
diff --git a/src/client/docs/api/gulpfile.ts b/src/client/docs/api/gulpfile.ts
index 9980ede231..0eb8b88287 100644
--- a/src/client/docs/api/gulpfile.ts
+++ b/src/client/docs/api/gulpfile.ts
@@ -19,9 +19,10 @@ import generateVars from '../vars';
 
 const langs = Object.keys(locales);
 
-const kebab = string => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
+const kebab = (string: string) => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
 
-const parseParam = param => {
+// WIP type
+const parseParam = (param: any) => {
 	const id = param.type.match(/^id\((.+?)\)|^id/);
 	const entity = param.type.match(/^entity\((.+?)\)/);
 	const isObject = /^object/.test(param.type);
@@ -57,7 +58,7 @@ const parseParam = param => {
 	return param;
 };
 
-const sortParams = params => {
+const sortParams = (params: Array<{name: string}>) => {
 	params.sort((a, b) => {
 		if (a.name < b.name)
 			return -1;
@@ -68,14 +69,15 @@ const sortParams = params => {
 	return params;
 };
 
-const extractDefs = params => {
-	let defs = [];
+// WIP type
+const extractDefs = (params: any[]) => {
+	let defs: any[] = [];
 
 	params.forEach(param => {
 		if (param.def) {
 			defs.push({
 				name: param.defName,
-				params: sortParams(param.def.map(p => parseParam(p)))
+				params: sortParams(param.def.map((p: any) => parseParam(p)))
 			});
 
 			const childDefs = extractDefs(param.def);
@@ -109,8 +111,10 @@ gulp.task('doc:api:endpoints', async () => {
 					path: ep.endpoint
 				},
 				desc: ep.desc,
+				// @ts-ignore
 				params: sortParams(ep.params.map(p => parseParam(p))),
 				paramDefs: extractDefs(ep.params),
+				// @ts-ignore
 				res: ep.res ? sortParams(ep.res.map(p => parseParam(p))) : null,
 				resDefs: ep.res ? extractDefs(ep.res) : null,
 			};
@@ -155,7 +159,8 @@ gulp.task('doc:api:entities', async () => {
 			const vars = {
 				name: entity.name,
 				desc: entity.desc,
-				props: sortParams(entity.props.map(p => parseParam(p))),
+				// WIP type
+				props: sortParams(entity.props.map((p: any) => parseParam(p))),
 				propDefs: extractDefs(entity.props),
 			};
 			langs.forEach(lang => {
diff --git a/src/client/docs/gulpfile.ts b/src/client/docs/gulpfile.ts
index 56bf6188c8..4683a04659 100644
--- a/src/client/docs/gulpfile.ts
+++ b/src/client/docs/gulpfile.ts
@@ -8,8 +8,8 @@ import * as glob from 'glob';
 import * as gulp from 'gulp';
 import * as pug from 'pug';
 import * as mkdirp from 'mkdirp';
-import stylus = require('gulp-stylus');
-import cssnano = require('gulp-cssnano');
+const stylus = require('gulp-stylus');
+const cssnano = require('gulp-cssnano');
 
 import I18nReplacer from '../../build/i18n';
 import fa from '../../build/fa';
diff --git a/src/client/docs/vars.ts b/src/client/docs/vars.ts
index 32b961aaa9..93082767e3 100644
--- a/src/client/docs/vars.ts
+++ b/src/client/docs/vars.ts
@@ -38,7 +38,7 @@ export default async function(): Promise<{ [key: string]: any }> {
 		vars['docs'][name]['title'][lang] = fs.readFileSync(x, 'utf-8').match(/^h1 (.+?)\r?\n/)[1];
 	});
 
-	vars['kebab'] = string => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
+	vars['kebab'] = (string: string) => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
 
 	vars['config'] = config;
 
diff --git a/yarn.lock b/yarn.lock
index a99e498628..8b12a99c95 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,21 +2,33 @@
 # yarn lockfile v1
 
 
-"@fortawesome/fontawesome-free-brands@5.0.2":
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3"
+"@fortawesome/fontawesome-common-types@^0.1.7":
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.1.7.tgz#4336c4b06d0b5608ff1215464b66fcf9f4795284"
 
-"@fortawesome/fontawesome-free-regular@5.0.2":
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017"
+"@fortawesome/fontawesome-free-brands@5.0.13":
+  version "5.0.13"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.13.tgz#4d15ff4e1e862d5e4a4df3654f8e8acbd47e9c09"
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.1.7"
 
-"@fortawesome/fontawesome-free-solid@5.0.2":
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5"
+"@fortawesome/fontawesome-free-regular@5.0.13":
+  version "5.0.13"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.13.tgz#eb78c30184e3f456a423a1dcfa0f682f7b50de4a"
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.1.7"
 
-"@fortawesome/fontawesome@1.0.1":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d"
+"@fortawesome/fontawesome-free-solid@5.0.13":
+  version "5.0.13"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.13.tgz#24b61aaf471a9d34a5364b052d64a516285ba894"
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.1.7"
+
+"@fortawesome/fontawesome@1.1.8":
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.1.8.tgz#75fe66a60f95508160bb16bd781ad7d89b280f5b"
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.1.7"
 
 "@gulp-sourcemaps/identity-map@1.X":
   version "1.0.1"

From 8c40917cc2762a498cd2d35a4f4f69b01de3d672 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 19:55:39 +0900
Subject: [PATCH 365/369] [noImplicitAny: true] src/text

---
 package.json                              |  3 ++
 src/text/html.ts                          |  5 +--
 src/text/parse/core/syntax-highlighter.ts | 13 ++++++--
 src/text/parse/elements/bold.ts           | 12 +++++--
 src/text/parse/elements/code.ts           | 13 ++++++--
 src/text/parse/elements/emoji.ts          | 12 +++++--
 src/text/parse/elements/hashtag.ts        | 12 +++++--
 src/text/parse/elements/inline-code.ts    | 13 ++++++--
 src/text/parse/elements/link.ts           | 14 ++++++--
 src/text/parse/elements/mention.ts        | 13 ++++++--
 src/text/parse/elements/quote.ts          | 12 +++++--
 src/text/parse/elements/search.ts         | 10 ++++--
 src/text/parse/elements/title.ts          | 12 +++++--
 src/text/parse/elements/url.ts            | 12 +++++--
 src/text/parse/index.ts                   | 39 +++++++++++++++++++----
 yarn.lock                                 | 15 +++++++++
 16 files changed, 166 insertions(+), 44 deletions(-)

diff --git a/package.json b/package.json
index bf49a6599f..2b81b03693 100644
--- a/package.json
+++ b/package.json
@@ -216,5 +216,8 @@
 		"websocket": "1.0.26",
 		"ws": "5.2.0",
 		"xev": "2.0.1"
+	},
+	"devDependencies": {
+		"@types/jsdom": "11.0.5"
 	}
 }
diff --git a/src/text/html.ts b/src/text/html.ts
index b55d9b80a7..41adb2e7f7 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -1,7 +1,8 @@
-import { lib as emojilib } from 'emojilib';
+const { lib: emojilib } = require('emojilib');
 import { JSDOM } from 'jsdom';
 import config from '../config';
 import { INote } from '../models/note';
+import { TextElement } from './parse';
 
 const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: INote["mentionedRemoteUsers"]) => void} = {
 	bold({ document }, { bold }) {
@@ -90,7 +91,7 @@ const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers:
 	}
 };
 
-export default (tokens, mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) => {
+export default (tokens: TextElement[], mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) => {
 	const { window } = new JSDOM('');
 
 	for (const token of tokens) {
diff --git a/src/text/parse/core/syntax-highlighter.ts b/src/text/parse/core/syntax-highlighter.ts
index c0396b1fc6..3fb7a3b73d 100644
--- a/src/text/parse/core/syntax-highlighter.ts
+++ b/src/text/parse/core/syntax-highlighter.ts
@@ -1,4 +1,4 @@
-function escape(text) {
+function escape(text: string) {
 	return text
 		.replace(/>/g, '&gt;')
 		.replace(/</g, '&lt;');
@@ -110,7 +110,14 @@ const symbols = [
 	'?'
 ];
 
-const elements = [
+type Token = {
+	html: string
+	next: number
+};
+
+type Element = (code: string, i: number, source: string) => (Token | null);
+
+const elements: Element[] = [
 	// comment
 	code => {
 		if (code.substr(0, 2) != '//') return null;
@@ -305,7 +312,7 @@ export default (source: string, lang?: string) => {
 
 	let i = 0;
 
-	function push(token) {
+	function push(token: Token) {
 		html += token.html;
 		code = code.substr(token.next);
 		i += token.next;
diff --git a/src/text/parse/elements/bold.ts b/src/text/parse/elements/bold.ts
index ce25764457..0566ace8b7 100644
--- a/src/text/parse/elements/bold.ts
+++ b/src/text/parse/elements/bold.ts
@@ -2,7 +2,13 @@
  * Bold
  */
 
-module.exports = text => {
+export type TextElementBold = {
+	type: "bold"
+	content: string
+	bold: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^\*\*(.+?)\*\*/);
 	if (!match) return null;
 	const bold = match[0];
@@ -10,5 +16,5 @@ module.exports = text => {
 		type: 'bold',
 		content: bold,
 		bold: bold.substr(2, bold.length - 4)
-	};
-};
+	} as TextElementBold;
+}
diff --git a/src/text/parse/elements/code.ts b/src/text/parse/elements/code.ts
index 4821e95fe2..de87aa410b 100644
--- a/src/text/parse/elements/code.ts
+++ b/src/text/parse/elements/code.ts
@@ -4,7 +4,14 @@
 
 import genHtml from '../core/syntax-highlighter';
 
-module.exports = text => {
+export type TextElementCode = {
+	type: "code"
+	content: string
+	code: string
+	html: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^```([\s\S]+?)```/);
 	if (!match) return null;
 	const code = match[0];
@@ -13,5 +20,5 @@ module.exports = text => {
 		content: code,
 		code: code.substr(3, code.length - 6).trim(),
 		html: genHtml(code.substr(3, code.length - 6).trim())
-	};
-};
+	} as TextElementCode;
+}
diff --git a/src/text/parse/elements/emoji.ts b/src/text/parse/elements/emoji.ts
index e24231a223..d0eed88965 100644
--- a/src/text/parse/elements/emoji.ts
+++ b/src/text/parse/elements/emoji.ts
@@ -2,7 +2,13 @@
  * Emoji
  */
 
-module.exports = text => {
+export type TextElementEmoji = {
+	type: "emoji"
+	content: string
+	emoji: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^:[a-zA-Z0-9+-_]+:/);
 	if (!match) return null;
 	const emoji = match[0];
@@ -10,5 +16,5 @@ module.exports = text => {
 		type: 'emoji',
 		content: emoji,
 		emoji: emoji.substr(1, emoji.length - 2)
-	};
-};
+	} as TextElementEmoji;
+}
diff --git a/src/text/parse/elements/hashtag.ts b/src/text/parse/elements/hashtag.ts
index ee57b140b8..cde0c2b224 100644
--- a/src/text/parse/elements/hashtag.ts
+++ b/src/text/parse/elements/hashtag.ts
@@ -2,7 +2,13 @@
  * Hashtag
  */
 
-module.exports = (text, i) => {
+export type TextElementHashtag = {
+	type: "hashtag"
+	content: string
+	hashtag: string
+};
+
+export default function(text: string, i: number) {
 	if (!(/^\s#[^\s]+/.test(text) || (i == 0 && /^#[^\s]+/.test(text)))) return null;
 	const isHead = text[0] == '#';
 	const hashtag = text.match(/^\s?#[^\s]+/)[0];
@@ -15,5 +21,5 @@ module.exports = (text, i) => {
 		content: isHead ? hashtag : hashtag.substr(1),
 		hashtag: isHead ? hashtag.substr(1) : hashtag.substr(2)
 	});
-	return res;
-};
+	return res as TextElementHashtag[];
+}
diff --git a/src/text/parse/elements/inline-code.ts b/src/text/parse/elements/inline-code.ts
index 9f9ef51a2b..bcb0bca0ad 100644
--- a/src/text/parse/elements/inline-code.ts
+++ b/src/text/parse/elements/inline-code.ts
@@ -4,7 +4,14 @@
 
 import genHtml from '../core/syntax-highlighter';
 
-module.exports = text => {
+export type TextElementInlineCode = {
+	type: "inline-code"
+	content: string
+	code: string
+	html: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^`(.+?)`/);
 	if (!match) return null;
 	const code = match[0];
@@ -13,5 +20,5 @@ module.exports = text => {
 		content: code,
 		code: code.substr(1, code.length - 2).trim(),
 		html: genHtml(code.substr(1, code.length - 2).trim())
-	};
-};
+	} as TextElementInlineCode;
+}
diff --git a/src/text/parse/elements/link.ts b/src/text/parse/elements/link.ts
index 35563ddc3d..7e0d6f5cf8 100644
--- a/src/text/parse/elements/link.ts
+++ b/src/text/parse/elements/link.ts
@@ -2,7 +2,15 @@
  * Link
  */
 
-module.exports = text => {
+export type TextElementLink = {
+	type: "link"
+	content: string
+	title: string
+	url: string
+	silent: boolean
+};
+
+export default function(text: string) {
 	const match = text.match(/^\??\[([^\[\]]+?)\]\((https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+?)\)/);
 	if (!match) return null;
 	const silent = text[0] == '?';
@@ -15,5 +23,5 @@ module.exports = text => {
 		title: title,
 		url: url,
 		silent: silent
-	};
-};
+	} as TextElementLink;
+}
diff --git a/src/text/parse/elements/mention.ts b/src/text/parse/elements/mention.ts
index 2ad2788300..a4140458d4 100644
--- a/src/text/parse/elements/mention.ts
+++ b/src/text/parse/elements/mention.ts
@@ -3,7 +3,14 @@
  */
 import parseAcct from '../../../acct/parse';
 
-module.exports = text => {
+export type TextElementMention = {
+	type: "mention"
+	content: string
+	username: string
+	host: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^@[a-z0-9_]+(?:@[a-z0-9\.\-]+[a-z0-9])?/i);
 	if (!match) return null;
 	const mention = match[0];
@@ -13,5 +20,5 @@ module.exports = text => {
 		content: mention,
 		username,
 		host
-	};
-};
+	} as TextElementMention;
+}
diff --git a/src/text/parse/elements/quote.ts b/src/text/parse/elements/quote.ts
index cc8cfffdc4..56de561f3f 100644
--- a/src/text/parse/elements/quote.ts
+++ b/src/text/parse/elements/quote.ts
@@ -2,7 +2,13 @@
  * Quoted text
  */
 
-module.exports = text => {
+export type TextElementQuote = {
+	type: "quote"
+	content: string
+	quote: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^"([\s\S]+?)\n"/);
 	if (!match) return null;
 	const quote = match[0];
@@ -10,5 +16,5 @@ module.exports = text => {
 		type: 'quote',
 		content: quote,
 		quote: quote.substr(1, quote.length - 2).trim(),
-	};
-};
+	} as TextElementQuote;
+}
diff --git a/src/text/parse/elements/search.ts b/src/text/parse/elements/search.ts
index 12ee8ecbb8..4bd19ee3fa 100644
--- a/src/text/parse/elements/search.ts
+++ b/src/text/parse/elements/search.ts
@@ -2,7 +2,13 @@
  * Search
  */
 
-module.exports = text => {
+export type TextElementSearch = {
+	type: "search"
+	content: string
+	query: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^(.+?) 検索(\n|$)/);
 	if (!match) return null;
 	return {
@@ -10,4 +16,4 @@ module.exports = text => {
 		content: match[0],
 		query: match[1]
 	};
-};
+}
diff --git a/src/text/parse/elements/title.ts b/src/text/parse/elements/title.ts
index 9f4708f5d6..11b3abc61b 100644
--- a/src/text/parse/elements/title.ts
+++ b/src/text/parse/elements/title.ts
@@ -2,7 +2,13 @@
  * Title
  */
 
-module.exports = text => {
+export type TextElementTitle = {
+	type: "title"
+	content: string
+	title: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^【(.+?)】\n/);
 	if (!match) return null;
 	const title = match[0];
@@ -10,5 +16,5 @@ module.exports = text => {
 		type: 'title',
 		content: title,
 		title: title.substr(1, title.length - 3)
-	};
-};
+	} as TextElementTitle;
+}
diff --git a/src/text/parse/elements/url.ts b/src/text/parse/elements/url.ts
index 1003aff9c3..bbc27b4fd7 100644
--- a/src/text/parse/elements/url.ts
+++ b/src/text/parse/elements/url.ts
@@ -2,7 +2,13 @@
  * URL
  */
 
-module.exports = text => {
+export type TextElementUrl = {
+	type: "url"
+	content: string
+	url: string
+};
+
+export default function(text: string) {
 	const match = text.match(/^https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+/);
 	if (!match) return null;
 	const url = match[0];
@@ -10,5 +16,5 @@ module.exports = text => {
 		type: 'url',
 		content: url,
 		url: url
-	};
-};
+	} as TextElementUrl;
+}
diff --git a/src/text/parse/index.ts b/src/text/parse/index.ts
index cfddd9f615..ccfef44591 100644
--- a/src/text/parse/index.ts
+++ b/src/text/parse/index.ts
@@ -2,6 +2,18 @@
  * Misskey Text Analyzer
  */
 
+import { TextElementBold } from "./elements/bold";
+import { TextElementCode } from "./elements/code";
+import { TextElementEmoji } from "./elements/emoji";
+import { TextElementHashtag } from "./elements/hashtag";
+import { TextElementInlineCode } from "./elements/inline-code";
+import { TextElementLink } from "./elements/link";
+import { TextElementMention } from "./elements/mention";
+import { TextElementQuote } from "./elements/quote";
+import { TextElementSearch } from "./elements/search";
+import { TextElementTitle } from "./elements/title";
+import { TextElementUrl } from "./elements/url";
+
 const elements = [
 	require('./elements/bold'),
 	require('./elements/title'),
@@ -14,17 +26,31 @@ const elements = [
 	require('./elements/quote'),
 	require('./elements/emoji'),
 	require('./elements/search')
-];
+].map(element => element.default as TextElementProcessor);
 
-export default (source: string): any[] => {
+export type TextElement = {type: "text", content: string}
+	| TextElementBold
+	| TextElementCode
+	| TextElementEmoji
+	| TextElementHashtag
+	| TextElementInlineCode
+	| TextElementLink
+	| TextElementMention
+	| TextElementQuote
+	| TextElementSearch
+	| TextElementTitle
+	| TextElementUrl;
+export type TextElementProcessor = (text: string, i: number) => TextElement | TextElement[];
+
+export default (source: string): TextElement[] => {
 
 	if (source == '') {
 		return null;
 	}
 
-	const tokens = [];
+	const tokens: TextElement[] = [];
 
-	function push(token) {
+	function push(token: TextElement) {
 		if (token != null) {
 			tokens.push(token);
 			source = source.substr(token.content.length);
@@ -59,9 +85,8 @@ export default (source: string): any[] => {
 	}
 
 	// テキストを纏める
-	tokens[0] = [tokens[0]];
 	return tokens.reduce((a, b) => {
-		if (a[a.length - 1].type == 'text' && b.type == 'text') {
+		if (a.length && a[a.length - 1].type == 'text' && b.type == 'text') {
 			const tail = a.pop();
 			return a.concat({
 				type: 'text',
@@ -70,5 +95,5 @@ export default (source: string): any[] => {
 		} else {
 			return a.concat(b);
 		}
-	});
+	}, [] as TextElement[]);
 };
diff --git a/yarn.lock b/yarn.lock
index 8b12a99c95..e4a53091e5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -277,6 +277,15 @@
   version "3.11.1"
   resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40"
 
+"@types/jsdom@11.0.5":
+  version "11.0.5"
+  resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-11.0.5.tgz#b12fffc73eb3731b218e9665a50f023b6b84b5cb"
+  dependencies:
+    "@types/events" "*"
+    "@types/node" "*"
+    "@types/tough-cookie" "*"
+    parse5 "^3.0.2"
+
 "@types/keygrip@*":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878"
@@ -8221,6 +8230,12 @@ parse5@4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
 
+parse5@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+  dependencies:
+    "@types/node" "*"
+
 parseurl@^1.3.0, parseurl@~1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"

From 9d65415fdc4cab84945040f59cae3047077d8fc7 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 19:59:02 +0900
Subject: [PATCH 366/369] [noImplicitAny: true] src/services/note

---
 src/services/note/create.ts          | 4 ++--
 src/services/note/reaction/create.ts | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 98415b8971..ef03c4e044 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -33,7 +33,7 @@ class NotificationManager {
 		reason: Reason;
 	}> = [];
 
-	constructor(user, note) {
+	constructor(user: IUser, note: any) {
 		this.user = user;
 		this.note = note;
 	}
@@ -451,7 +451,7 @@ export default async (user: IUser, data: {
 		//		$ne: note._id
 		//	}
 		//});
-		const existRenote = null;
+		const existRenote: INote | null = null;
 		//#endregion
 
 		if (!existRenote) {
diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts
index 123c091c85..5b30bb5e15 100644
--- a/src/services/note/reaction/create.ts
+++ b/src/services/note/reaction/create.ts
@@ -36,7 +36,7 @@ export default async (user: IUser, note: INote, reaction: string) => new Promise
 
 	res();
 
-	const inc = {};
+	const inc: {[key: string]: number} = {};
 	inc[`reactionCounts.${reaction}`] = 1;
 
 	// Increment reactions count

From daa409cd8285633427ffb3a89d3296824365e918 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 17 Jun 2018 20:04:19 +0900
Subject: [PATCH 367/369] [noImplicitAny: true] src/services/drive

---
 package.json                          | 1 +
 src/services/drive/add-file.ts        | 8 ++++----
 src/services/drive/upload-from-url.ts | 4 +++-
 yarn.lock                             | 6 ++++++
 4 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/package.json b/package.json
index 2b81b03693..6691723386 100644
--- a/package.json
+++ b/package.json
@@ -218,6 +218,7 @@
 		"xev": "2.0.1"
 	},
 	"devDependencies": {
+		"@types/file-type": "5.2.1",
 		"@types/jsdom": "11.0.5"
 	}
 }
diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index d7f71e8665..4167df0662 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -7,7 +7,7 @@ import * as crypto from 'crypto';
 import * as _gm from 'gm';
 import * as debug from 'debug';
 import fileType = require('file-type');
-import prominence = require('prominence');
+const prominence = require('prominence');
 
 import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file';
 import DriveFolder from '../../models/drive-folder';
@@ -33,7 +33,7 @@ const writeChunks = (name: string, readable: stream.Readable, type: string, meta
 			readable.pipe(writeStream);
 		}));
 
-const writeThumbnailChunks = (name: string, readable: stream.Readable, originalId) =>
+const writeThumbnailChunks = (name: string, readable: stream.Readable, originalId: mongodb.ObjectID) =>
 	getDriveFileThumbnailBucket()
 		.then(bucket => new Promise((resolve, reject) => {
 			const writeStream = bucket.openUploadStream(name, {
@@ -89,7 +89,7 @@ export default async function(
 	const calcHash = new Promise<string>((res, rej) => {
 		const readable = fs.createReadStream(path);
 		const hash = crypto.createHash('md5');
-		const chunks = [];
+		const chunks: Buffer[] = [];
 		readable
 			.on('error', rej)
 			.pipe(hash)
@@ -201,7 +201,7 @@ export default async function(
 		return driveFolder;
 	};
 
-	const properties = {};
+	const properties: {[key: string]: any} = {};
 
 	let propPromises: Array<Promise<void>> = [];
 
diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts
index e216ca603d..f83d57d415 100644
--- a/src/services/drive/upload-from-url.ts
+++ b/src/services/drive/upload-from-url.ts
@@ -8,10 +8,12 @@ import * as request from 'request';
 import { IDriveFile, validateFileName } from '../../models/drive-file';
 import create from './add-file';
 import config from '../../config';
+import { IUser } from '../../models/user';
+import * as mongodb from "mongodb";
 
 const log = debug('misskey:drive:upload-from-url');
 
-export default async (url: string, user, folderId = null, uri: string = null): Promise<IDriveFile> => {
+export default async (url: string, user: IUser, folderId: mongodb.ObjectID = null, uri: string = null): Promise<IDriveFile> => {
 	log(`REQUESTED: ${url}`);
 
 	let name = URL.parse(url).pathname.split('/').pop();
diff --git a/yarn.lock b/yarn.lock
index e4a53091e5..cb6a4a6221 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -176,6 +176,12 @@
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0"
 
+"@types/file-type@5.2.1":
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/@types/file-type/-/file-type-5.2.1.tgz#e7af49e08187b6b7598509c5e416669d25fa3461"
+  dependencies:
+    "@types/node" "*"
+
 "@types/form-data@*":
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e"

From 80e5645a84cc60d76f79c48a3d565fb66ad88643 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 18 Jun 2018 09:54:53 +0900
Subject: [PATCH 368/369] wip

---
 locales/index.ts                              |   5 +-
 src/acct/parse.ts                             |   2 +-
 src/acct/render.ts                            |   4 +-
 src/build/i18n.ts                             |   4 +-
 src/cafy-id.ts                                |   4 +-
 src/daemons/hashtags-stats-child.ts           |  60 ---
 src/daemons/hashtags-stats.ts                 |  20 -
 src/daemons/notes-stats.ts                    |   2 +-
 src/daemons/server-stats.ts                   |   4 +-
 src/db/mongodb.ts                             |   2 +-
 src/index.ts                                  |   4 +-
 src/models/app.ts                             |   2 +-
 src/models/auth-session.ts                    |   2 +-
 src/models/drive-file.ts                      |   2 +-
 src/models/drive-folder.ts                    |   2 +-
 src/models/favorite.ts                        |   2 +-
 src/models/follow-request.ts                  |   2 +-
 src/models/messaging-message.ts               |   2 +-
 src/models/note-reaction.ts                   |   2 +-
 src/models/note.ts                            |  10 +-
 src/models/notification.ts                    |   2 +-
 src/models/reversi-game.ts                    |   2 +-
 src/models/reversi-matching.ts                |   2 +-
 src/models/signin.ts                          |   2 +-
 src/models/user-list.ts                       |   2 +-
 src/models/user.ts                            |  10 +-
 .../renderer/ordered-collection.ts            |   2 +-
 src/remote/activitypub/renderer/reject.ts     |   2 +-
 src/remote/activitypub/request.ts             |   4 +-
 src/remote/webfinger.ts                       |   4 +-
 src/reversi/ai/back.ts                        | 377 ---------------
 src/reversi/ai/front.ts                       | 233 ----------
 src/reversi/ai/index.ts                       |   1 -
 src/reversi/core.ts                           |   4 +-
 src/server/api/bot/core.ts                    | 439 ------------------
 src/server/api/bot/interfaces/line.ts         | 238 ----------
 src/server/api/common/get-host-lower.ts       |   2 +-
 src/server/api/endpoints/aggregation/posts.ts |   5 +-
 src/server/api/endpoints/aggregation/users.ts |   5 +-
 .../endpoints/aggregation/users/activity.ts   |  15 +-
 .../endpoints/aggregation/users/followers.ts  |   2 +-
 .../endpoints/aggregation/users/following.ts  |   2 +-
 .../api/endpoints/aggregation/users/post.ts   |  15 +-
 .../endpoints/aggregation/users/reaction.ts   |  12 +-
 src/server/api/endpoints/app/create.ts        |  10 +-
 .../api/endpoints/app/name_id/available.ts    |   2 +-
 src/server/api/endpoints/app/show.ts          |   8 +-
 src/server/api/endpoints/auth/accept.ts       |  10 +-
 .../api/endpoints/auth/session/generate.ts    |   2 +-
 src/server/api/endpoints/auth/session/show.ts |  10 +-
 .../api/endpoints/auth/session/userkey.ts     |   2 +-
 src/server/api/endpoints/drive.ts             |   3 +-
 src/server/api/endpoints/drive/files.ts       |   6 +-
 .../api/endpoints/drive/files/create.ts       |   6 +-
 .../api/endpoints/drive/files/delete.ts       |   3 +-
 src/server/api/endpoints/drive/files/find.ts  |   6 +-
 src/server/api/endpoints/drive/files/show.ts  |   6 +-
 .../api/endpoints/drive/files/update.ts       |   6 +-
 src/server/api/endpoints/drive/folders.ts     |   2 +-
 .../api/endpoints/drive/folders/create.ts     |   6 +-
 .../api/endpoints/drive/folders/find.ts       |   6 +-
 .../api/endpoints/drive/folders/show.ts       |   6 +-
 .../api/endpoints/drive/folders/update.ts     |   8 +-
 src/server/api/endpoints/drive/stream.ts      |   6 +-
 src/server/api/endpoints/following/create.ts  |   7 +-
 src/server/api/endpoints/following/delete.ts  |   7 +-
 .../endpoints/following/requests/accept.ts    |   4 +-
 .../endpoints/following/requests/cancel.ts    |   4 +-
 .../api/endpoints/following/requests/list.ts  |   3 +-
 .../endpoints/following/requests/reject.ts    |   4 +-
 src/server/api/endpoints/following/stalk.ts   |   3 +-
 src/server/api/endpoints/following/unstalk.ts |   3 +-
 src/server/api/endpoints/hashtags/trend.ts    |   5 +-
 src/server/api/endpoints/i.ts                 |   8 +-
 src/server/api/endpoints/i/2fa/done.ts        |   7 +-
 src/server/api/endpoints/i/2fa/register.ts    |   7 +-
 src/server/api/endpoints/i/2fa/unregister.ts  |   7 +-
 src/server/api/endpoints/i/authorized_apps.ts |   6 +-
 src/server/api/endpoints/i/change_password.ts |   7 +-
 src/server/api/endpoints/i/favorites.ts       |   6 +-
 src/server/api/endpoints/i/notifications.ts   |   6 +-
 src/server/api/endpoints/i/pin.ts             |   7 +-
 .../api/endpoints/i/regenerate_token.ts       |   7 +-
 src/server/api/endpoints/i/signin_history.ts  |   6 +-
 src/server/api/endpoints/i/update.ts          |   8 +-
 .../api/endpoints/i/update_client_setting.ts  |   9 +-
 src/server/api/endpoints/i/update_home.ts     |   4 +-
 .../api/endpoints/i/update_mobile_home.ts     |   4 +-
 src/server/api/endpoints/i/update_widget.ts   |  12 +-
 src/server/api/endpoints/messaging/history.ts |   6 +-
 .../api/endpoints/messaging/messages.ts       |   4 +-
 .../endpoints/messaging/messages/create.ts    |   7 +-
 src/server/api/endpoints/meta.ts              |   2 +-
 src/server/api/endpoints/mute/create.ts       |   7 +-
 src/server/api/endpoints/mute/delete.ts       |   7 +-
 src/server/api/endpoints/mute/list.ts         |   7 +-
 src/server/api/endpoints/my/apps.ts           |   6 +-
 src/server/api/endpoints/notes.ts             |   2 +-
 .../api/endpoints/notes/conversation.ts       |  12 +-
 src/server/api/endpoints/notes/create.ts      |  11 +-
 src/server/api/endpoints/notes/delete.ts      |   3 +-
 .../api/endpoints/notes/favorites/create.ts   |   6 +-
 .../api/endpoints/notes/favorites/delete.ts   |   6 +-
 .../api/endpoints/notes/global-timeline.ts    |   6 +-
 .../api/endpoints/notes/local-timeline.ts     |   6 +-
 src/server/api/endpoints/notes/mentions.ts    |  10 +-
 .../endpoints/notes/polls/recommendation.ts   |   6 +-
 src/server/api/endpoints/notes/polls/vote.ts  |  19 +-
 src/server/api/endpoints/notes/reactions.ts   |  10 +-
 .../api/endpoints/notes/reactions/create.ts   |   6 +-
 .../api/endpoints/notes/reactions/delete.ts   |   8 +-
 src/server/api/endpoints/notes/replies.ts     |   3 +-
 src/server/api/endpoints/notes/reposts.ts     |  10 +-
 src/server/api/endpoints/notes/search.ts      | 364 ---------------
 .../api/endpoints/notes/search_by_tag.ts      |  26 +-
 src/server/api/endpoints/notes/show.ts        |  10 +-
 src/server/api/endpoints/notes/timeline.ts    |   6 +-
 src/server/api/endpoints/notes/trend.ts       |  10 +-
 .../api/endpoints/notes/user-list-timeline.ts |   6 +-
 .../notifications/mark_as_read_all.ts         |   4 +-
 src/server/api/endpoints/reversi/games.ts     |   3 +-
 .../api/endpoints/reversi/games/show.ts       |   3 +-
 .../api/endpoints/reversi/invitations.ts      |   3 +-
 src/server/api/endpoints/reversi/match.ts     |   4 +-
 .../api/endpoints/reversi/match/cancel.ts     |   3 +-
 src/server/api/endpoints/sw/register.ts       |   6 +-
 .../api/endpoints/username/available.ts       |   8 +-
 src/server/api/endpoints/users.ts             |   7 +-
 src/server/api/endpoints/users/followers.ts   |   7 +-
 src/server/api/endpoints/users/following.ts   |  11 +-
 .../users/get_frequently_replied_users.ts     |   9 +-
 .../api/endpoints/users/lists/create.ts       |   6 +-
 src/server/api/endpoints/users/lists/list.ts  |   3 +-
 src/server/api/endpoints/users/lists/push.ts  |   4 +-
 src/server/api/endpoints/users/lists/show.ts  |   3 +-
 src/server/api/endpoints/users/notes.ts       |   7 +-
 .../api/endpoints/users/recommendation.ts     |  11 +-
 src/server/api/endpoints/users/search.ts      |  73 +--
 .../api/endpoints/users/search_by_username.ts |   7 +-
 src/server/api/endpoints/users/show.ts        |   9 +-
 src/server/api/private/signup.ts              |   2 +-
 src/server/api/service/github.ts              |   4 +-
 src/server/api/stream/notes-stats.ts          |   2 +-
 src/server/api/stream/requests.ts             |  19 -
 src/server/api/stream/reversi-game.ts         |  14 +-
 src/server/api/stream/server-stats.ts         |   2 +-
 src/server/api/streaming.ts                   |   6 -
 src/server/index.ts                           |   2 +-
 webpack.config.ts                             |  19 +-
 webpack/i18n.ts                               |   2 +-
 150 files changed, 305 insertions(+), 2334 deletions(-)
 delete mode 100644 src/daemons/hashtags-stats-child.ts
 delete mode 100644 src/daemons/hashtags-stats.ts
 delete mode 100644 src/reversi/ai/back.ts
 delete mode 100644 src/reversi/ai/front.ts
 delete mode 100644 src/reversi/ai/index.ts
 delete mode 100644 src/server/api/bot/core.ts
 delete mode 100644 src/server/api/bot/interfaces/line.ts
 delete mode 100644 src/server/api/endpoints/notes/search.ts
 delete mode 100644 src/server/api/stream/requests.ts

diff --git a/locales/index.ts b/locales/index.ts
index 3b4f76b06a..2ae84f30ae 100644
--- a/locales/index.ts
+++ b/locales/index.ts
@@ -6,15 +6,14 @@ import * as fs from 'fs';
 import * as yaml from 'js-yaml';
 
 export type LangKey = 'de' | 'en' | 'fr' | 'ja' | 'pl';
-export type LocaleObjectChildren = LocaleObject | string | undefined;
-export type LocaleObject = {[key: string]: LocaleObjectChildren };
+export type LocaleObject = { [key: string]: any };
 
 const loadLang = (lang: LangKey) => yaml.safeLoad(
 	fs.readFileSync(`./locales/${lang}.yml`, 'utf-8')) as LocaleObject;
 
 const native = loadLang('ja');
 
-const langs: {[key in LangKey]: LocaleObject} = {
+const langs: { [key: string]: LocaleObject } = {
 	'de': loadLang('de'),
 	'en': loadLang('en'),
 	'fr': loadLang('fr'),
diff --git a/src/acct/parse.ts b/src/acct/parse.ts
index ef1f55405d..0c00fccef6 100644
--- a/src/acct/parse.ts
+++ b/src/acct/parse.ts
@@ -1,4 +1,4 @@
-export default acct => {
+export default (acct: string) => {
 	const splitted = acct.split('@', 2);
 	return { username: splitted[0], host: splitted[1] || null };
 };
diff --git a/src/acct/render.ts b/src/acct/render.ts
index 9afb03d88b..191034361d 100644
--- a/src/acct/render.ts
+++ b/src/acct/render.ts
@@ -1,3 +1,5 @@
-export default user => {
+import { IUser } from "../models/user";
+
+export default (user: IUser) => {
 	return user.host === null ? user.username : `${user.username}@${user.host}`;
 };
diff --git a/src/build/i18n.ts b/src/build/i18n.ts
index 308ff0da00..f7602dfd17 100644
--- a/src/build/i18n.ts
+++ b/src/build/i18n.ts
@@ -2,7 +2,7 @@
  * Replace i18n texts
  */
 
-import locale, { isAvailableLanguage, LocaleObject, LocaleObjectChildren } from '../../locales';
+import locale, { isAvailableLanguage, LocaleObject } from '../../locales';
 
 export default class Replacer {
 	private lang: string;
@@ -24,7 +24,7 @@ export default class Replacer {
 
 		const texts = locale[this.lang];
 
-		let text: LocaleObjectChildren = texts;
+		let text = texts;
 
 		if (path) {
 			if (text.hasOwnProperty(path)) {
diff --git a/src/cafy-id.ts b/src/cafy-id.ts
index 310b1eb20b..dac0f97bd2 100644
--- a/src/cafy-id.ts
+++ b/src/cafy-id.ts
@@ -1,8 +1,8 @@
 import * as mongo from 'mongodb';
 import { Query } from 'cafy';
 
-export const isAnId = x => mongo.ObjectID.isValid(x);
-export const isNotAnId = x => !isAnId(x);
+export const isAnId = (x: any) => mongo.ObjectID.isValid(x);
+export const isNotAnId = (x: any) => !isAnId(x);
 
 /**
  * ID
diff --git a/src/daemons/hashtags-stats-child.ts b/src/daemons/hashtags-stats-child.ts
deleted file mode 100644
index 3f7f4d6e9e..0000000000
--- a/src/daemons/hashtags-stats-child.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import Note from '../models/note';
-
-// 10分
-const interval = 1000 * 60 * 10;
-
-async function tick() {
-	const res = await Note.aggregate([{
-		$match: {
-			createdAt: {
-				$gt: new Date(Date.now() - interval)
-			},
-			tags: {
-				$exists: true,
-				$ne: []
-			}
-		}
-	}, {
-		$unwind: '$tags'
-	}, {
-		$group: {
-			_id: '$tags',
-			count: {
-				$sum: 1
-			}
-		}
-	}, {
-		$group: {
-			_id: null,
-			tags: {
-				$push: {
-					tag: '$_id',
-					count: '$count'
-				}
-			}
-		}
-	}, {
-		$project: {
-			_id: false,
-			tags: true
-		}
-	}]) as {
-		tags: Array<{
-			tag: string;
-			count: number;
-		}>
-	};
-
-	const stats = res.tags
-		.sort((a, b) => a.count - b.count)
-		.map(tag => [tag.tag, tag.count])
-		.slice(0, 10);
-
-	console.log(stats);
-
-	process.send(stats);
-}
-
-tick();
-
-setInterval(tick, interval);
diff --git a/src/daemons/hashtags-stats.ts b/src/daemons/hashtags-stats.ts
deleted file mode 100644
index 5ed028ac33..0000000000
--- a/src/daemons/hashtags-stats.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import * as childProcess from 'child_process';
-import Xev from 'xev';
-
-const ev = new Xev();
-
-export default function() {
-	const log = [];
-
-	const p = childProcess.fork(__dirname + '/hashtags-stats-child.js');
-
-	p.on('message', stats => {
-		ev.emit('hashtagsStats', stats);
-		log.push(stats);
-		if (log.length > 30) log.shift();
-	});
-
-	ev.on('requestHashTagsStatsLog', id => {
-		ev.emit('hashtagsStatsLog:' + id, log);
-	});
-}
diff --git a/src/daemons/notes-stats.ts b/src/daemons/notes-stats.ts
index 3094c34af0..021e6d64a7 100644
--- a/src/daemons/notes-stats.ts
+++ b/src/daemons/notes-stats.ts
@@ -4,7 +4,7 @@ import Xev from 'xev';
 const ev = new Xev();
 
 export default function() {
-	const log = [];
+	const log: any[] = [];
 
 	const p = childProcess.fork(__dirname + '/notes-stats-child.js');
 
diff --git a/src/daemons/server-stats.ts b/src/daemons/server-stats.ts
index 1403402508..5c793c6624 100644
--- a/src/daemons/server-stats.ts
+++ b/src/daemons/server-stats.ts
@@ -11,14 +11,14 @@ const interval = 1000;
  * Report server stats regularly
  */
 export default function() {
-	const log = [];
+	const log: any[] = [];
 
 	ev.on('requestServerStatsLog', id => {
 		ev.emit('serverStatsLog:' + id, log);
 	});
 
 	async function tick() {
-		osUtils.cpuUsage(cpuUsage => {
+		osUtils.cpuUsage((cpuUsage: number) => {
 			const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/');
 			const stats = {
 				cpu_usage: cpuUsage,
diff --git a/src/db/mongodb.ts b/src/db/mongodb.ts
index 05bb72bfde..0df87ea3a4 100644
--- a/src/db/mongodb.ts
+++ b/src/db/mongodb.ts
@@ -27,7 +27,7 @@ const nativeDbConn = async (): Promise<mongodb.Db> => {
 	if (mdb) return mdb;
 
 	const db = await ((): Promise<mongodb.Db> => new Promise((resolve, reject) => {
-		(mongodb as any).MongoClient.connect(uri, (e, client) => {
+		(mongodb as any).MongoClient.connect(uri, (e: Error, client: any) => {
 			if (e) return reject(e);
 			resolve(client.db(config.mongodb.db));
 		});
diff --git a/src/index.ts b/src/index.ts
index 35cf5a243b..c89252dfc2 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -60,7 +60,7 @@ function main() {
 /**
  * Init master process
  */
-async function masterMain(opt) {
+async function masterMain(opt: any) {
 	let config: Config;
 
 	try {
@@ -91,7 +91,7 @@ async function masterMain(opt) {
 /**
  * Init worker process
  */
-async function workerMain(opt) {
+async function workerMain(opt: any) {
 	if (!opt['only-processor']) {
 		// start server
 		await require('./server').default();
diff --git a/src/models/app.ts b/src/models/app.ts
index 7926f2fac2..8dc7fe01d9 100644
--- a/src/models/app.ts
+++ b/src/models/app.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import AccessToken from './access-token';
 import db from '../db/mongodb';
 import config from '../config';
diff --git a/src/models/auth-session.ts b/src/models/auth-session.ts
index 219b1a4c8b..3d2c9ee3c1 100644
--- a/src/models/auth-session.ts
+++ b/src/models/auth-session.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import { pack as packApp } from './app';
 
diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts
index bb98c11a93..2bdf38f484 100644
--- a/src/models/drive-file.ts
+++ b/src/models/drive-file.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import { pack as packFolder } from './drive-folder';
 import config from '../config';
 import monkDb, { nativeDbConn } from '../db/mongodb';
diff --git a/src/models/drive-folder.ts b/src/models/drive-folder.ts
index cafb9cdf13..def519fade 100644
--- a/src/models/drive-folder.ts
+++ b/src/models/drive-folder.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import DriveFile from './drive-file';
 
diff --git a/src/models/favorite.ts b/src/models/favorite.ts
index 45417212e3..b2d2fc93e8 100644
--- a/src/models/favorite.ts
+++ b/src/models/favorite.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import { pack as packNote } from './note';
 
diff --git a/src/models/follow-request.ts b/src/models/follow-request.ts
index eea5d1c535..fdb20011f4 100644
--- a/src/models/follow-request.ts
+++ b/src/models/follow-request.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import { pack as packUser } from './user';
 
diff --git a/src/models/messaging-message.ts b/src/models/messaging-message.ts
index ad2d1657e6..f46abd506d 100644
--- a/src/models/messaging-message.ts
+++ b/src/models/messaging-message.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import { pack as packUser } from './user';
 import { pack as packFile } from './drive-file';
 import db from '../db/mongodb';
diff --git a/src/models/note-reaction.ts b/src/models/note-reaction.ts
index e5e108c017..915dc0cf91 100644
--- a/src/models/note-reaction.ts
+++ b/src/models/note-reaction.ts
@@ -1,6 +1,6 @@
 import * as mongo from 'mongodb';
 import $ from 'cafy';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import Reaction from './note-reaction';
 import { pack as packUser } from './user';
diff --git a/src/models/note.ts b/src/models/note.ts
index 83e85f8498..83cd93353b 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import rap from '@prezzemolo/rap';
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
@@ -37,7 +37,11 @@ export type INote = {
 	mediaIds: mongo.ObjectID[];
 	replyId: mongo.ObjectID;
 	renoteId: mongo.ObjectID;
-	poll: any; // todo
+	poll: {
+		choices: Array<{
+			id: number;
+		}>
+	};
 	text: string;
 	tags: string[];
 	tagsLower: string[];
@@ -304,7 +308,7 @@ export const pack = async (
 
 				if (vote != null) {
 					const myChoice = poll.choices
-						.filter(c => c.id == vote.choice)[0];
+						.filter((c: any) => c.id == vote.choice)[0];
 
 					myChoice.isVoted = true;
 				}
diff --git a/src/models/notification.ts b/src/models/notification.ts
index 875c6952b5..097e3e691f 100644
--- a/src/models/notification.ts
+++ b/src/models/notification.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 import { pack as packNote } from './note';
diff --git a/src/models/reversi-game.ts b/src/models/reversi-game.ts
index 16b9ab0d4e..cf497f0568 100644
--- a/src/models/reversi-game.ts
+++ b/src/models/reversi-game.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 
diff --git a/src/models/reversi-matching.ts b/src/models/reversi-matching.ts
index 5efa5d76ad..90227bd121 100644
--- a/src/models/reversi-matching.ts
+++ b/src/models/reversi-matching.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 
diff --git a/src/models/signin.ts b/src/models/signin.ts
index d8b05c0e30..55485d8667 100644
--- a/src/models/signin.ts
+++ b/src/models/signin.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 
 const Signin = db.get<ISignin>('signin');
diff --git a/src/models/user-list.ts b/src/models/user-list.ts
index 4cf1de61a4..5cfa7e4dfc 100644
--- a/src/models/user-list.ts
+++ b/src/models/user-list.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import db from '../db/mongodb';
 
 const UserList = db.get<IUserList>('userList');
diff --git a/src/models/user.ts b/src/models/user.ts
index f0620a6cfd..942faeeff4 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as deepcopy from 'deepcopy';
+const deepcopy = require('deepcopy');
 import sequential = require('promise-sequential');
 import rap from '@prezzemolo/rap';
 import db from '../db/mongodb';
@@ -153,14 +153,6 @@ export function isValidBirthday(birthday: string): boolean {
 }
 //#endregion
 
-export function init(user): IUser {
-	user._id = new mongo.ObjectID(user._id);
-	user.avatarId = new mongo.ObjectID(user.avatarId);
-	user.bannerId = new mongo.ObjectID(user.bannerId);
-	user.pinnedNoteId = new mongo.ObjectID(user.pinnedNoteId);
-	return user;
-}
-
 /**
  * Userを物理削除します
  */
diff --git a/src/remote/activitypub/renderer/ordered-collection.ts b/src/remote/activitypub/renderer/ordered-collection.ts
index 2ca0f77354..9d543b1e1b 100644
--- a/src/remote/activitypub/renderer/ordered-collection.ts
+++ b/src/remote/activitypub/renderer/ordered-collection.ts
@@ -1,4 +1,4 @@
-export default (id, totalItems, orderedItems) => ({
+export default (id: string, totalItems: any, orderedItems: any) => ({
 	id,
 	type: 'OrderedCollection',
 	totalItems,
diff --git a/src/remote/activitypub/renderer/reject.ts b/src/remote/activitypub/renderer/reject.ts
index 29c998a6b4..2464486c2f 100644
--- a/src/remote/activitypub/renderer/reject.ts
+++ b/src/remote/activitypub/renderer/reject.ts
@@ -1,4 +1,4 @@
-export default object => ({
+export default (object: any) => ({
 	type: 'Reject',
 	object
 });
diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts
index e6861fdb3e..e2b600ae2e 100644
--- a/src/remote/activitypub/request.ts
+++ b/src/remote/activitypub/request.ts
@@ -1,5 +1,5 @@
 import { request } from 'https';
-import { sign } from 'http-signature';
+const { sign } = require('http-signature');
 import { URL } from 'url';
 import * as debug from 'debug';
 
@@ -8,7 +8,7 @@ import { ILocalUser } from '../../models/user';
 
 const log = debug('misskey:activitypub:deliver');
 
-export default (user: ILocalUser, url: string, object) => new Promise((resolve, reject) => {
+export default (user: ILocalUser, url: string, object: any) => new Promise((resolve, reject) => {
 	log(`--> ${url}`);
 
 	const { protocol, hostname, port, pathname, search } = new URL(url);
diff --git a/src/remote/webfinger.ts b/src/remote/webfinger.ts
index 4f1ff231c0..cba09379a1 100644
--- a/src/remote/webfinger.ts
+++ b/src/remote/webfinger.ts
@@ -12,8 +12,8 @@ type IWebFinger = {
 	subject: string;
 };
 
-export default async function resolve(query): Promise<IWebFinger> {
-	return await new Promise((res, rej) => webFinger.lookup(query, (error, result) => {
+export default async function resolve(query: any): Promise<IWebFinger> {
+	return await new Promise((res, rej) => webFinger.lookup(query, (error: Error, result: any) => {
 		if (error) {
 			return rej(error);
 		}
diff --git a/src/reversi/ai/back.ts b/src/reversi/ai/back.ts
deleted file mode 100644
index 42f1a0f4b8..0000000000
--- a/src/reversi/ai/back.ts
+++ /dev/null
@@ -1,377 +0,0 @@
-/**
- * -AI-
- * Botのバックエンド(思考を担当)
- *
- * 対話と思考を同じプロセスで行うと、思考時間が長引いたときにストリームから
- * 切断されてしまうので、別々のプロセスで行うようにします
- */
-
-import * as request from 'request-promise-native';
-import Reversi, { Color } from '../core';
-import conf from '../../config';
-import getUserName from '../../renderers/get-user-name';
-
-let game;
-let form;
-
-/**
- * BotアカウントのユーザーID
- */
-const id = conf.reversi_ai.id;
-
-/**
- * BotアカウントのAPIキー
- */
-const i = conf.reversi_ai.i;
-
-let note;
-
-process.on('message', async msg => {
-	// 親プロセスからデータをもらう
-	if (msg.type == '_init_') {
-		game = msg.game;
-		form = msg.form;
-	}
-
-	// フォームが更新されたとき
-	if (msg.type == 'update-form') {
-		form.find(i => i.id == msg.body.id).value = msg.body.value;
-	}
-
-	// ゲームが始まったとき
-	if (msg.type == 'started') {
-		onGameStarted(msg.body);
-
-		//#region TLに投稿する
-		const game = msg.body;
-		const url = `${conf.url}/reversi/${game.id}`;
-		const user = game.user1Id == id ? game.user2 : game.user1;
-		const isSettai = form[0].value === 0;
-		const text = isSettai
-			? `?[${getUserName(user)}](${conf.url}/@${user.username})さんの接待を始めました!`
-			: `対局を?[${getUserName(user)}](${conf.url}/@${user.username})さんと始めました! (強さ${form[0].value})`;
-
-		const res = await request.post(`${conf.api_url}/notes/create`, {
-			json: { i,
-				text: `${text}\n→[観戦する](${url})`
-			}
-		});
-
-		note = res.createdNote;
-		//#endregion
-	}
-
-	// ゲームが終了したとき
-	if (msg.type == 'ended') {
-		// ストリームから切断
-		process.send({
-			type: 'close'
-		});
-
-		//#region TLに投稿する
-		const user = game.user1Id == id ? game.user2 : game.user1;
-		const isSettai = form[0].value === 0;
-		const text = isSettai
-			? msg.body.winnerId === null
-				? `?[${getUserName(user)}](${conf.url}/@${user.username})さんに接待で引き分けました...`
-				: msg.body.winnerId == id
-					? `?[${getUserName(user)}](${conf.url}/@${user.username})さんに接待で勝ってしまいました...`
-					: `?[${getUserName(user)}](${conf.url}/@${user.username})さんに接待で負けてあげました♪`
-			: msg.body.winnerId === null
-				? `?[${getUserName(user)}](${conf.url}/@${user.username})さんと引き分けました~`
-				: msg.body.winnerId == id
-					? `?[${getUserName(user)}](${conf.url}/@${user.username})さんに勝ちました♪`
-					: `?[${getUserName(user)}](${conf.url}/@${user.username})さんに負けました...`;
-
-		await request.post(`${conf.api_url}/notes/create`, {
-			json: { i,
-				renoteId: note.id,
-				text: text
-			}
-		});
-		//#endregion
-
-		process.exit();
-	}
-
-	// 打たれたとき
-	if (msg.type == 'set') {
-		onSet(msg.body);
-	}
-});
-
-let o: Reversi;
-let botColor: Color;
-
-// 各マスの強さ
-let cellWeights;
-
-/**
- * ゲーム開始時
- * @param g ゲーム情報
- */
-function onGameStarted(g) {
-	game = g;
-
-	// リバーシエンジン初期化
-	o = new Reversi(game.settings.map, {
-		isLlotheo: game.settings.isLlotheo,
-		canPutEverywhere: game.settings.canPutEverywhere,
-		loopedBoard: game.settings.loopedBoard
-	});
-
-	// 各マスの価値を計算しておく
-	cellWeights = o.map.map((pix, i) => {
-		if (pix == 'null') return 0;
-		const [x, y] = o.transformPosToXy(i);
-		let count = 0;
-		const get = (x, y) => {
-			if (x < 0 || y < 0 || x >= o.mapWidth || y >= o.mapHeight) return 'null';
-			return o.mapDataGet(o.transformXyToPos(x, y));
-		};
-
-		if (get(x    , y - 1) == 'null') count++;
-		if (get(x + 1, y - 1) == 'null') count++;
-		if (get(x + 1, y    ) == 'null') count++;
-		if (get(x + 1, y + 1) == 'null') count++;
-		if (get(x    , y + 1) == 'null') count++;
-		if (get(x - 1, y + 1) == 'null') count++;
-		if (get(x - 1, y    ) == 'null') count++;
-		if (get(x - 1, y - 1) == 'null') count++;
-		//return Math.pow(count, 3);
-		return count >= 4 ? 1 : 0;
-	});
-
-	botColor = game.user1Id == id && game.black == 1 || game.user2Id == id && game.black == 2;
-
-	if (botColor) {
-		think();
-	}
-}
-
-function onSet(x) {
-	o.put(x.color, x.pos);
-
-	if (x.next === botColor) {
-		think();
-	}
-}
-
-const db = {};
-
-function think() {
-	console.log('Thinking...');
-	console.time('think');
-
-	const isSettai = form[0].value === 0;
-
-	// 接待モードのときは、全力(5手先読みくらい)で負けるようにする
-	const maxDepth = isSettai ? 5 : form[0].value;
-
-	/**
-	 * Botにとってある局面がどれだけ有利か取得する
-	 */
-	function staticEval() {
-		let score = o.canPutSomewhere(botColor).length;
-
-		cellWeights.forEach((weight, i) => {
-			// 係数
-			const coefficient = 30;
-			weight = weight * coefficient;
-
-			const stone = o.board[i];
-			if (stone === botColor) {
-				// TODO: 価値のあるマスに設置されている自分の石に縦か横に接するマスは価値があると判断する
-				score += weight;
-			} else if (stone !== null) {
-				score -= weight;
-			}
-		});
-
-		// ロセオならスコアを反転
-		if (game.settings.isLlotheo) score = -score;
-
-		// 接待ならスコアを反転
-		if (isSettai) score = -score;
-
-		return score;
-	}
-
-	/**
-	 * αβ法での探索
-	 */
-	const dive = (pos: number, alpha = -Infinity, beta = Infinity, depth = 0): number => {
-		// 試し打ち
-		o.put(o.turn, pos);
-
-		const key = o.board.toString();
-		let cache = db[key];
-		if (cache) {
-			if (alpha >= cache.upper) {
-				o.undo();
-				return cache.upper;
-			}
-			if (beta <= cache.lower) {
-				o.undo();
-				return cache.lower;
-			}
-			alpha = Math.max(alpha, cache.lower);
-			beta = Math.min(beta, cache.upper);
-		} else {
-			cache = {
-				upper: Infinity,
-				lower: -Infinity
-			};
-		}
-
-		const isBotTurn = o.turn === botColor;
-
-		// 勝った
-		if (o.turn === null) {
-			const winner = o.winner;
-
-			// 勝つことによる基本スコア
-			const base = 10000;
-
-			let score;
-
-			if (game.settings.isLlotheo) {
-				// 勝ちは勝ちでも、より自分の石を少なくした方が美しい勝ちだと判定する
-				score = o.winner ? base - (o.blackCount * 100) : base - (o.whiteCount * 100);
-			} else {
-				// 勝ちは勝ちでも、より相手の石を少なくした方が美しい勝ちだと判定する
-				score = o.winner ? base + (o.blackCount * 100) : base + (o.whiteCount * 100);
-			}
-
-			// 巻き戻し
-			o.undo();
-
-			// 接待なら自分が負けた方が高スコア
-			return isSettai
-				? winner !== botColor ? score : -score
-				: winner === botColor ? score : -score;
-		}
-
-		if (depth === maxDepth) {
-			// 静的に評価
-			const score = staticEval();
-
-			// 巻き戻し
-			o.undo();
-
-			return score;
-		} else {
-			const cans = o.canPutSomewhere(o.turn);
-
-			let value = isBotTurn ? -Infinity : Infinity;
-			let a = alpha;
-			let b = beta;
-
-			// 次のターンのプレイヤーにとって最も良い手を取得
-			for (const p of cans) {
-				if (isBotTurn) {
-					const score = dive(p, a, beta, depth + 1);
-					value = Math.max(value, score);
-					a = Math.max(a, value);
-					if (value >= beta) break;
-				} else {
-					const score = dive(p, alpha, b, depth + 1);
-					value = Math.min(value, score);
-					b = Math.min(b, value);
-					if (value <= alpha) break;
-				}
-			}
-
-			// 巻き戻し
-			o.undo();
-
-			if (value <= alpha) {
-				cache.upper = value;
-			} else if (value >= beta) {
-				cache.lower = value;
-			} else {
-				cache.upper = value;
-				cache.lower = value;
-			}
-
-			db[key] = cache;
-
-			return value;
-		}
-	};
-
-	/**
-	 * αβ法での探索(キャッシュ無し)(デバッグ用)
-	 */
-	const dive2 = (pos: number, alpha = -Infinity, beta = Infinity, depth = 0): number => {
-		// 試し打ち
-		o.put(o.turn, pos);
-
-		const isBotTurn = o.turn === botColor;
-
-		// 勝った
-		if (o.turn === null) {
-			const winner = o.winner;
-
-			// 勝つことによる基本スコア
-			const base = 10000;
-
-			let score;
-
-			if (game.settings.isLlotheo) {
-				// 勝ちは勝ちでも、より自分の石を少なくした方が美しい勝ちだと判定する
-				score = o.winner ? base - (o.blackCount * 100) : base - (o.whiteCount * 100);
-			} else {
-				// 勝ちは勝ちでも、より相手の石を少なくした方が美しい勝ちだと判定する
-				score = o.winner ? base + (o.blackCount * 100) : base + (o.whiteCount * 100);
-			}
-
-			// 巻き戻し
-			o.undo();
-
-			// 接待なら自分が負けた方が高スコア
-			return isSettai
-				? winner !== botColor ? score : -score
-				: winner === botColor ? score : -score;
-		}
-
-		if (depth === maxDepth) {
-			// 静的に評価
-			const score = staticEval();
-
-			// 巻き戻し
-			o.undo();
-
-			return score;
-		} else {
-			const cans = o.canPutSomewhere(o.turn);
-
-			// 次のターンのプレイヤーにとって最も良い手を取得
-			for (const p of cans) {
-				if (isBotTurn) {
-					alpha = Math.max(alpha, dive2(p, alpha, beta, depth + 1));
-				} else {
-					beta = Math.min(beta, dive2(p, alpha, beta, depth + 1));
-				}
-				if (alpha >= beta) break;
-			}
-
-			// 巻き戻し
-			o.undo();
-
-			return isBotTurn ? alpha : beta;
-		}
-	};
-
-	const cans = o.canPutSomewhere(botColor);
-	const scores = cans.map(p => dive(p));
-	const pos = cans[scores.indexOf(Math.max(...scores))];
-
-	console.log('Thinked:', pos);
-	console.timeEnd('think');
-
-	process.send({
-		type: 'put',
-		pos
-	});
-}
diff --git a/src/reversi/ai/front.ts b/src/reversi/ai/front.ts
deleted file mode 100644
index 25ee43225a..0000000000
--- a/src/reversi/ai/front.ts
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * -AI-
- * Botのフロントエンド(ストリームとの対話を担当)
- *
- * 対話と思考を同じプロセスで行うと、思考時間が長引いたときにストリームから
- * 切断されてしまうので、別々のプロセスで行うようにします
- */
-
-import * as childProcess from 'child_process';
-const WebSocket = require('ws');
-import * as ReconnectingWebSocket from 'reconnecting-websocket';
-import * as request from 'request-promise-native';
-import conf from '../../config';
-
-// 設定 ////////////////////////////////////////////////////////
-
-/**
- * BotアカウントのAPIキー
- */
-const i = conf.reversi_ai.i;
-
-/**
- * BotアカウントのユーザーID
- */
-const id = conf.reversi_ai.id;
-
-////////////////////////////////////////////////////////////////
-
-/**
- * ホームストリーム
- */
-const homeStream = new ReconnectingWebSocket(`${conf.ws_url}/?i=${i}`, undefined, {
-	constructor: WebSocket
-});
-
-homeStream.on('open', () => {
-	console.log('home stream opened');
-});
-
-homeStream.on('close', () => {
-	console.log('home stream closed');
-});
-
-homeStream.on('message', message => {
-	const msg = JSON.parse(message.toString());
-
-	// タイムライン上でなんか言われたまたは返信されたとき
-	if (msg.type == 'mention' || msg.type == 'reply') {
-		const note = msg.body;
-
-		if (note.userId == id) return;
-
-		// リアクションする
-		request.post(`${conf.api_url}/notes/reactions/create`, {
-			json: { i,
-				noteId: note.id,
-				reaction: 'love'
-			}
-		});
-
-		if (note.text) {
-			if (note.text.indexOf('リバーシ') > -1) {
-				request.post(`${conf.api_url}/notes/create`, {
-					json: { i,
-						replyId: note.id,
-						text: '良いですよ~'
-					}
-				});
-
-				invite(note.userId);
-			}
-		}
-	}
-
-	// メッセージでなんか言われたとき
-	if (msg.type == 'messaging_message') {
-		const message = msg.body;
-		if (message.text) {
-			if (message.text.indexOf('リバーシ') > -1) {
-				request.post(`${conf.api_url}/messaging/messages/create`, {
-					json: { i,
-						userId: message.userId,
-						text: '良いですよ~'
-					}
-				});
-
-				invite(message.userId);
-			}
-		}
-	}
-});
-
-// ユーザーを対局に誘う
-function invite(userId) {
-	request.post(`${conf.api_url}/reversi/match`, {
-		json: { i,
-			userId: userId
-		}
-	});
-}
-
-/**
- * リバーシストリーム
- */
-const reversiStream = new ReconnectingWebSocket(`${conf.ws_url}/reversi?i=${i}`, undefined, {
-	constructor: WebSocket
-});
-
-reversiStream.on('open', () => {
-	console.log('reversi stream opened');
-});
-
-reversiStream.on('close', () => {
-	console.log('reversi stream closed');
-});
-
-reversiStream.on('message', message => {
-	const msg = JSON.parse(message.toString());
-
-	// 招待されたとき
-	if (msg.type == 'invited') {
-		onInviteMe(msg.body.parent);
-	}
-
-	// マッチしたとき
-	if (msg.type == 'matched') {
-		gameStart(msg.body);
-	}
-});
-
-/**
- * ゲーム開始
- * @param game ゲーム情報
- */
-function gameStart(game) {
-	// ゲームストリームに接続
-	const gw = new ReconnectingWebSocket(`${conf.ws_url}/reversi-game?i=${i}&game=${game.id}`, undefined, {
-		constructor: WebSocket
-	});
-
-	gw.on('open', () => {
-		console.log('reversi game stream opened');
-
-		// フォーム
-		const form = [{
-			id: 'strength',
-			type: 'radio',
-			label: '強さ',
-			value: 2,
-			items: [{
-				label: '接待',
-				value: 0
-			}, {
-				label: '弱',
-				value: 1
-			}, {
-				label: '中',
-				value: 2
-			}, {
-				label: '強',
-				value: 3
-			}, {
-				label: '最強',
-				value: 5
-			}]
-		}];
-
-		//#region バックエンドプロセス開始
-		const ai = childProcess.fork(__dirname + '/back.js');
-
-		// バックエンドプロセスに情報を渡す
-		ai.send({
-			type: '_init_',
-			game,
-			form
-		});
-
-		ai.on('message', msg => {
-			if (msg.type == 'put') {
-				gw.send(JSON.stringify({
-					type: 'set',
-					pos: msg.pos
-				}));
-			} else if (msg.type == 'close') {
-				gw.close();
-			}
-		});
-
-		// ゲームストリームから情報が流れてきたらそのままバックエンドプロセスに伝える
-		gw.on('message', message => {
-			const msg = JSON.parse(message.toString());
-			ai.send(msg);
-		});
-		//#endregion
-
-		// フォーム初期化
-		setTimeout(() => {
-			gw.send(JSON.stringify({
-				type: 'init-form',
-				body: form
-			}));
-		}, 1000);
-
-		// どんな設定内容の対局でも受け入れる
-		setTimeout(() => {
-			gw.send(JSON.stringify({
-				type: 'accept'
-			}));
-		}, 2000);
-	});
-
-	gw.on('close', () => {
-		console.log('reversi game stream closed');
-	});
-}
-
-/**
- * リバーシの対局に招待されたとき
- * @param inviter 誘ってきたユーザー
- */
-async function onInviteMe(inviter) {
-	console.log(`Someone invited me: @${inviter.username}`);
-
-	// 承認
-	const game = await request.post(`${conf.api_url}/reversi/match`, {
-		json: {
-			i,
-			userId: inviter.id
-		}
-	});
-
-	gameStart(game);
-}
diff --git a/src/reversi/ai/index.ts b/src/reversi/ai/index.ts
deleted file mode 100644
index 5cd1db82da..0000000000
--- a/src/reversi/ai/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-require('./front');
diff --git a/src/reversi/core.ts b/src/reversi/core.ts
index f1f9de1486..37f62a43d5 100644
--- a/src/reversi/core.ts
+++ b/src/reversi/core.ts
@@ -203,7 +203,7 @@ export default class Reversi {
 	 * 打つことができる場所を取得します
 	 */
 	public canPutSomewhere(color: Color): number[] {
-		const result = [];
+		const result: number[] = [];
 
 		this.board.forEach((x, i) => {
 			if (this.canPut(color, i)) result.push(i);
@@ -239,7 +239,7 @@ export default class Reversi {
 		const enemyColor = !color;
 
 		// ひっくり返せる石(の位置)リスト
-		let stones = [];
+		let stones: number[] = [];
 
 		const initPos = pos;
 
diff --git a/src/server/api/bot/core.ts b/src/server/api/bot/core.ts
deleted file mode 100644
index d41af48057..0000000000
--- a/src/server/api/bot/core.ts
+++ /dev/null
@@ -1,439 +0,0 @@
-import * as EventEmitter from 'events';
-import * as bcrypt from 'bcryptjs';
-
-import User, { IUser, init as initUser, ILocalUser } from '../../../models/user';
-
-import getNoteSummary from '../../../renderers/get-note-summary';
-import getUserName from '../../../renderers/get-user-name';
-import getUserSummary from '../../../renderers/get-user-summary';
-import parseAcct from '../../../acct/parse';
-import getNotificationSummary from '../../../renderers/get-notification-summary';
-
-const hmm = [
-	'?',
-	'ふぅ~む...?',
-	'ちょっと何言ってるかわからないです',
-	'「ヘルプ」と言うと利用可能な操作が確認できますよ'
-];
-
-/**
- * Botの頭脳
- */
-export default class BotCore extends EventEmitter {
-	public user: IUser = null;
-
-	private context: Context = null;
-
-	constructor(user?: IUser) {
-		super();
-
-		this.user = user;
-	}
-
-	public clearContext() {
-		this.setContext(null);
-	}
-
-	public setContext(context: Context) {
-		this.context = context;
-		this.emit('updated');
-
-		if (context) {
-			context.on('updated', () => {
-				this.emit('updated');
-			});
-		}
-	}
-
-	public export() {
-		return {
-			user: this.user,
-			context: this.context ? this.context.export() : null
-		};
-	}
-
-	protected _import(data) {
-		this.user = data.user ? initUser(data.user) : null;
-		this.setContext(data.context ? Context.import(this, data.context) : null);
-	}
-
-	public static import(data) {
-		const bot = new BotCore();
-		bot._import(data);
-		return bot;
-	}
-
-	public async q(query: string): Promise<string> {
-		if (this.context != null) {
-			return await this.context.q(query);
-		}
-
-		if (/^@[a-zA-Z0-9_]+$/.test(query)) {
-			return await this.showUserCommand(query);
-		}
-
-		switch (query) {
-			case 'ping':
-				return 'PONG';
-
-			case 'help':
-			case 'ヘルプ':
-				return '利用可能なコマンド一覧です:\n' +
-					'help: これです\n' +
-					'me: アカウント情報を見ます\n' +
-					'login, signin: サインインします\n' +
-					'logout, signout: サインアウトします\n' +
-					'note: 投稿します\n' +
-					'tl: タイムラインを見ます\n' +
-					'no: 通知を見ます\n' +
-					'@<ユーザー名>: ユーザーを表示します\n' +
-					'\n' +
-					'タイムラインや通知を見た後、「次」というとさらに遡ることができます。';
-
-			case 'me':
-				return this.user ? `${getUserName(this.user)}としてサインインしています。\n\n${getUserSummary(this.user)}` : 'サインインしていません';
-
-			case 'login':
-			case 'signin':
-			case 'ログイン':
-			case 'サインイン':
-				if (this.user != null) return '既にサインインしていますよ!';
-				this.setContext(new SigninContext(this));
-				return await this.context.greet();
-
-			case 'logout':
-			case 'signout':
-			case 'ログアウト':
-			case 'サインアウト':
-				if (this.user == null) return '今はサインインしてないですよ!';
-				this.signout();
-				return 'ご利用ありがとうございました <3';
-
-			case 'note':
-			case '投稿':
-				if (this.user == null) return 'まずサインインしてください。';
-				this.setContext(new NoteContext(this));
-				return await this.context.greet();
-
-			case 'tl':
-			case 'タイムライン':
-				if (this.user == null) return 'まずサインインしてください。';
-				this.setContext(new TlContext(this));
-				return await this.context.greet();
-
-			case 'no':
-			case 'notifications':
-			case '通知':
-				if (this.user == null) return 'まずサインインしてください。';
-				this.setContext(new NotificationsContext(this));
-				return await this.context.greet();
-
-			case 'guessing-game':
-			case '数当てゲーム':
-				this.setContext(new GuessingGameContext(this));
-				return await this.context.greet();
-
-			default:
-				return hmm[Math.floor(Math.random() * hmm.length)];
-		}
-	}
-
-	public signin(user: IUser) {
-		this.user = user;
-		this.emit('signin', user);
-		this.emit('updated');
-	}
-
-	public signout() {
-		const user = this.user;
-		this.user = null;
-		this.emit('signout', user);
-		this.emit('updated');
-	}
-
-	public async refreshUser() {
-		this.user = await User.findOne({
-			_id: this.user._id
-		}, {
-			fields: {
-				data: false
-			}
-		});
-
-		this.emit('updated');
-	}
-
-	public async showUserCommand(q: string): Promise<string> {
-		try {
-			const user = await require('../endpoints/users/show')(parseAcct(q.substr(1)), this.user);
-
-			const text = getUserSummary(user);
-
-			return text;
-		} catch (e) {
-			return `問題が発生したようです...: ${e}`;
-		}
-	}
-}
-
-abstract class Context extends EventEmitter {
-	protected bot: BotCore;
-
-	public abstract async greet(): Promise<string>;
-	public abstract async q(query: string): Promise<string>;
-	public abstract export(): any;
-
-	constructor(bot: BotCore) {
-		super();
-		this.bot = bot;
-	}
-
-	public static import(bot: BotCore, data: any) {
-		if (data.type == 'guessing-game') return GuessingGameContext.import(bot, data.content);
-		if (data.type == 'note') return NoteContext.import(bot, data.content);
-		if (data.type == 'tl') return TlContext.import(bot, data.content);
-		if (data.type == 'notifications') return NotificationsContext.import(bot, data.content);
-		if (data.type == 'signin') return SigninContext.import(bot, data.content);
-		return null;
-	}
-}
-
-class SigninContext extends Context {
-	private temporaryUser: ILocalUser = null;
-
-	public async greet(): Promise<string> {
-		return 'まずユーザー名を教えてください:';
-	}
-
-	public async q(query: string): Promise<string> {
-		if (this.temporaryUser == null) {
-			// Fetch user
-			const user = await User.findOne({
-				usernameLower: query.toLowerCase(),
-				host: null
-			}, {
-				fields: {
-					data: false
-				}
-			}) as ILocalUser;
-
-			if (user === null) {
-				return `${query}というユーザーは存在しませんでした... もう一度教えてください:`;
-			} else {
-				this.temporaryUser = user;
-				this.emit('updated');
-				return `パスワードを教えてください:`;
-			}
-		} else {
-			// Compare password
-			const same = await bcrypt.compare(query, this.temporaryUser.password);
-
-			if (same) {
-				this.bot.signin(this.temporaryUser);
-				this.bot.clearContext();
-				return `${getUserName(this.temporaryUser)}さん、おかえりなさい!`;
-			} else {
-				return `パスワードが違います... もう一度教えてください:`;
-			}
-		}
-	}
-
-	public export() {
-		return {
-			type: 'signin',
-			content: {
-				temporaryUser: this.temporaryUser
-			}
-		};
-	}
-
-	public static import(bot: BotCore, data: any) {
-		const context = new SigninContext(bot);
-		context.temporaryUser = data.temporaryUser;
-		return context;
-	}
-}
-
-class NoteContext extends Context {
-	public async greet(): Promise<string> {
-		return '内容:';
-	}
-
-	public async q(query: string): Promise<string> {
-		await require('../endpoints/notes/create')({
-			text: query
-		}, this.bot.user);
-		this.bot.clearContext();
-		return '投稿しましたよ!';
-	}
-
-	public export() {
-		return {
-			type: 'note'
-		};
-	}
-
-	public static import(bot: BotCore, data: any) {
-		const context = new NoteContext(bot);
-		return context;
-	}
-}
-
-class TlContext extends Context {
-	private next: string = null;
-
-	public async greet(): Promise<string> {
-		return await this.getTl();
-	}
-
-	public async q(query: string): Promise<string> {
-		if (query == '次') {
-			return await this.getTl();
-		} else {
-			this.bot.clearContext();
-			return await this.bot.q(query);
-		}
-	}
-
-	private async getTl() {
-		const tl = await require('../endpoints/notes/timeline')({
-			limit: 5,
-			untilId: this.next ? this.next : undefined
-		}, this.bot.user);
-
-		if (tl.length > 0) {
-			this.next = tl[tl.length - 1].id;
-			this.emit('updated');
-
-			const text = tl
-				.map(note => `${getUserName(note.user)}\n「${getNoteSummary(note)}」`)
-				.join('\n-----\n');
-
-			return text;
-		} else {
-			return 'タイムラインに表示するものがありません...';
-		}
-	}
-
-	public export() {
-		return {
-			type: 'tl',
-			content: {
-				next: this.next,
-			}
-		};
-	}
-
-	public static import(bot: BotCore, data: any) {
-		const context = new TlContext(bot);
-		context.next = data.next;
-		return context;
-	}
-}
-
-class NotificationsContext extends Context {
-	private next: string = null;
-
-	public async greet(): Promise<string> {
-		return await this.getNotifications();
-	}
-
-	public async q(query: string): Promise<string> {
-		if (query == '次') {
-			return await this.getNotifications();
-		} else {
-			this.bot.clearContext();
-			return await this.bot.q(query);
-		}
-	}
-
-	private async getNotifications() {
-		const notifications = await require('../endpoints/i/notifications')({
-			limit: 5,
-			untilId: this.next ? this.next : undefined
-		}, this.bot.user);
-
-		if (notifications.length > 0) {
-			this.next = notifications[notifications.length - 1].id;
-			this.emit('updated');
-
-			const text = notifications
-				.map(notification => getNotificationSummary(notification))
-				.join('\n-----\n');
-
-			return text;
-		} else {
-			return '通知はありません';
-		}
-	}
-
-	public export() {
-		return {
-			type: 'notifications',
-			content: {
-				next: this.next,
-			}
-		};
-	}
-
-	public static import(bot: BotCore, data: any) {
-		const context = new NotificationsContext(bot);
-		context.next = data.next;
-		return context;
-	}
-}
-
-class GuessingGameContext extends Context {
-	private secret: number;
-	private history: number[] = [];
-
-	public async greet(): Promise<string> {
-		this.secret = Math.floor(Math.random() * 100);
-		this.emit('updated');
-		return '0~100の秘密の数を当ててみてください:';
-	}
-
-	public async q(query: string): Promise<string> {
-		if (query == 'やめる') {
-			this.bot.clearContext();
-			return 'やめました。';
-		}
-
-		const guess = parseInt(query, 10);
-
-		if (isNaN(guess)) {
-			return '整数で推測してください。「やめる」と言うとゲームをやめます。';
-		}
-
-		const firsttime = this.history.indexOf(guess) === -1;
-
-		this.history.push(guess);
-		this.emit('updated');
-
-		if (this.secret < guess) {
-			return firsttime ? `${guess}よりも小さいですね` : `もう一度言いますが${guess}より小さいですよ`;
-		} else if (this.secret > guess) {
-			return firsttime ? `${guess}よりも大きいですね` : `もう一度言いますが${guess}より大きいですよ`;
-		} else {
-			this.bot.clearContext();
-			return `正解です🎉 (${this.history.length}回目で当てました)`;
-		}
-	}
-
-	public export() {
-		return {
-			type: 'guessing-game',
-			content: {
-				secret: this.secret,
-				history: this.history
-			}
-		};
-	}
-
-	public static import(bot: BotCore, data: any) {
-		const context = new GuessingGameContext(bot);
-		context.secret = data.secret;
-		context.history = data.history;
-		return context;
-	}
-}
diff --git a/src/server/api/bot/interfaces/line.ts b/src/server/api/bot/interfaces/line.ts
deleted file mode 100644
index 733315391d..0000000000
--- a/src/server/api/bot/interfaces/line.ts
+++ /dev/null
@@ -1,238 +0,0 @@
-import * as EventEmitter from 'events';
-import * as Router from 'koa-router';
-import * as request from 'request';
-import * as crypto from 'crypto';
-import User from '../../../../models/user';
-import config from '../../../../config';
-import BotCore from '../core';
-import _redis from '../../../../db/redis';
-import prominence = require('prominence');
-import getAcct from '../../../../acct/render';
-import parseAcct from '../../../../acct/parse';
-import getNoteSummary from '../../../../renderers/get-note-summary';
-import getUserName from '../../../../renderers/get-user-name';
-
-const redis = prominence(_redis);
-
-// SEE: https://developers.line.me/media/messaging-api/messages/sticker_list.pdf
-const stickers = [
-	'297',
-	'298',
-	'299',
-	'300',
-	'301',
-	'302',
-	'303',
-	'304',
-	'305',
-	'306',
-	'307'
-];
-
-class LineBot extends BotCore {
-	private replyToken: string;
-
-	private reply(messages: any[]) {
-		request.post({
-			url: 'https://api.line.me/v2/bot/message/reply',
-			headers: {
-				'Authorization': `Bearer ${config.line_bot.channel_access_token}`
-			},
-			json: {
-				replyToken: this.replyToken,
-				messages: messages
-			}
-		}, (err, res, body) => {
-			if (err) {
-				console.error(err);
-				return;
-			}
-		});
-	}
-
-	public async react(ev: any): Promise<void> {
-		this.replyToken = ev.replyToken;
-
-		switch (ev.type) {
-			// メッセージ
-			case 'message':
-				switch (ev.message.type) {
-					// テキスト
-					case 'text':
-						const res = await this.q(ev.message.text);
-						if (res == null) return;
-						// 返信
-						this.reply([{
-							type: 'text',
-							text: res
-						}]);
-						break;
-
-					// スタンプ
-					case 'sticker':
-						// スタンプで返信
-						this.reply([{
-							type: 'sticker',
-							packageId: '4',
-							stickerId: stickers[Math.floor(Math.random() * stickers.length)]
-						}]);
-						break;
-				}
-				break;
-
-			// noteback
-			case 'noteback':
-				const data = ev.noteback.data;
-				const cmd = data.split('|')[0];
-				const arg = data.split('|')[1];
-				switch (cmd) {
-					case 'showtl':
-						this.showUserTimelineNoteback(arg);
-						break;
-				}
-				break;
-		}
-	}
-
-	public static import(data) {
-		const bot = new LineBot();
-		bot._import(data);
-		return bot;
-	}
-
-	public async showUserCommand(q: string) {
-		const user = await require('../../endpoints/users/show')(parseAcct(q.substr(1)), this.user);
-
-		const acct = getAcct(user);
-		const actions = [];
-
-		actions.push({
-			type: 'noteback',
-			label: 'タイムラインを見る',
-			data: `showtl|${user.id}`
-		});
-
-		if (user.twitter) {
-			actions.push({
-				type: 'uri',
-				label: 'Twitterアカウントを見る',
-				uri: `https://twitter.com/${user.twitter.screenName}`
-			});
-		}
-
-		actions.push({
-			type: 'uri',
-			label: 'Webで見る',
-			uri: `${config.url}/@${acct}`
-		});
-
-		this.reply([{
-			type: 'template',
-			altText: await super.showUserCommand(q),
-			template: {
-				type: 'buttons',
-				thumbnailImageUrl: `${user.avatarUrl}?thumbnail&size=1024`,
-				title: `${getUserName(user)} (@${acct})`,
-				text: user.description || '(no description)',
-				actions: actions
-			}
-		}]);
-
-		return null;
-	}
-
-	public async showUserTimelineNoteback(userId: string) {
-		const tl = await require('../../endpoints/users/notes')({
-			userId: userId,
-			limit: 5
-		}, this.user);
-
-		const text = `${getUserName(tl[0].user)}さんのタイムラインはこちらです:\n\n` + tl
-			.map(note => getNoteSummary(note))
-			.join('\n-----\n');
-
-		this.reply([{
-			type: 'text',
-			text: text
-		}]);
-	}
-}
-
-const handler = new EventEmitter();
-
-handler.on('event', async (ev) => {
-
-	const sourceId = ev.source.userId;
-	const sessionId = `line-bot-sessions:${sourceId}`;
-
-	const session = await redis.get(sessionId);
-	let bot: LineBot;
-
-	if (session == null) {
-		const user = await User.findOne({
-			host: null,
-			'line': {
-				userId: sourceId
-			}
-		});
-
-		bot = new LineBot(user);
-
-		bot.on('signin', user => {
-			User.update(user._id, {
-				$set: {
-					'line': {
-						userId: sourceId
-					}
-				}
-			});
-		});
-
-		bot.on('signout', user => {
-			User.update(user._id, {
-				$set: {
-					'line': {
-						userId: null
-					}
-				}
-			});
-		});
-
-		redis.set(sessionId, JSON.stringify(bot.export()));
-	} else {
-		bot = LineBot.import(JSON.parse(session));
-	}
-
-	bot.on('updated', () => {
-		redis.set(sessionId, JSON.stringify(bot.export()));
-	});
-
-	if (session != null) bot.refreshUser();
-
-	bot.react(ev);
-});
-
-// Init router
-const router = new Router();
-
-if (config.line_bot) {
-	router.post('/hooks/line', ctx => {
-		const sig1 = ctx.headers['x-line-signature'];
-
-		const hash = crypto.createHmac('SHA256', config.line_bot.channel_secret)
-			.update(ctx.request.rawBody);
-
-		const sig2 = hash.digest('base64');
-
-		// シグネチャ比較
-		if (sig1 === sig2) {
-			ctx.request.body.events.forEach(ev => {
-				handler.emit('event', ev);
-			});
-		} else {
-			ctx.status = 400;
-		}
-	});
-}
-
-module.exports = router;
diff --git a/src/server/api/common/get-host-lower.ts b/src/server/api/common/get-host-lower.ts
index 550c233001..92704b4aa9 100644
--- a/src/server/api/common/get-host-lower.ts
+++ b/src/server/api/common/get-host-lower.ts
@@ -1,5 +1,5 @@
 import { toUnicode } from 'punycode';
 
-export default host => {
+export default (host: string) => {
 	return toUnicode(host).toLowerCase();
 };
diff --git a/src/server/api/endpoints/aggregation/posts.ts b/src/server/api/endpoints/aggregation/posts.ts
index d348cadae9..9ada9cd3f5 100644
--- a/src/server/api/endpoints/aggregation/posts.ts
+++ b/src/server/api/endpoints/aggregation/posts.ts
@@ -1,13 +1,10 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import Note from '../../../../models/note';
 
 /**
  * Aggregate notes
  */
-module.exports = params => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 365, limitErr] = $.num.optional().range(1, 365).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/aggregation/users.ts b/src/server/api/endpoints/aggregation/users.ts
index b116c1454b..c084404d0a 100644
--- a/src/server/api/endpoints/aggregation/users.ts
+++ b/src/server/api/endpoints/aggregation/users.ts
@@ -1,13 +1,10 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import User from '../../../../models/user';
 
 /**
  * Aggregate users
  */
-module.exports = params => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 365, limitErr] = $.num.optional().range(1, 365).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/aggregation/users/activity.ts b/src/server/api/endpoints/aggregation/users/activity.ts
index 9109487ac6..d4c716d65b 100644
--- a/src/server/api/endpoints/aggregation/users/activity.ts
+++ b/src/server/api/endpoints/aggregation/users/activity.ts
@@ -1,6 +1,3 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import User from '../../../../../models/user';
 import Note from '../../../../../models/note';
@@ -10,7 +7,7 @@ import Note from '../../../../../models/note';
 /**
  * Aggregate activity of a user
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 365, limitErr] = $.num.optional().range(1, 365).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
@@ -73,13 +70,13 @@ module.exports = (params) => new Promise(async (res, rej) => {
 			} }
 		]);
 
-	datas.forEach(data => {
+	datas.forEach((data: any) => {
 		data.date = data._id;
 		delete data._id;
 
-		data.notes = (data.data.filter(x => x.type == 'note')[0] || { count: 0 }).count;
-		data.renotes = (data.data.filter(x => x.type == 'renote')[0] || { count: 0 }).count;
-		data.replies = (data.data.filter(x => x.type == 'reply')[0] || { count: 0 }).count;
+		data.notes = (data.data.filter((x: any) => x.type == 'note')[0] || { count: 0 }).count;
+		data.renotes = (data.data.filter((x: any) => x.type == 'renote')[0] || { count: 0 }).count;
+		data.replies = (data.data.filter((x: any) => x.type == 'reply')[0] || { count: 0 }).count;
 
 		delete data.data;
 	});
@@ -89,7 +86,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	for (let i = 0; i < limit; i++) {
 		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
-		const data = datas.filter(d =>
+		const data = datas.filter((d: any) =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
 		)[0];
 
diff --git a/src/server/api/endpoints/aggregation/users/followers.ts b/src/server/api/endpoints/aggregation/users/followers.ts
index dfcaf8462f..847f376079 100644
--- a/src/server/api/endpoints/aggregation/users/followers.ts
+++ b/src/server/api/endpoints/aggregation/users/followers.ts
@@ -8,7 +8,7 @@ import FollowedLog from '../../../../../models/followed-log';
 /**
  * Aggregate followers of a user
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/aggregation/users/following.ts b/src/server/api/endpoints/aggregation/users/following.ts
index 5f826fd71c..6c52752f98 100644
--- a/src/server/api/endpoints/aggregation/users/following.ts
+++ b/src/server/api/endpoints/aggregation/users/following.ts
@@ -8,7 +8,7 @@ import FollowingLog from '../../../../../models/following-log';
 /**
  * Aggregate following of a user
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/aggregation/users/post.ts b/src/server/api/endpoints/aggregation/users/post.ts
index 11f9ef14cd..28ba1482bf 100644
--- a/src/server/api/endpoints/aggregation/users/post.ts
+++ b/src/server/api/endpoints/aggregation/users/post.ts
@@ -1,6 +1,3 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import User from '../../../../../models/user';
 import Note from '../../../../../models/note';
@@ -8,7 +5,7 @@ import Note from '../../../../../models/note';
 /**
  * Aggregate note of a user
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
@@ -67,13 +64,13 @@ module.exports = (params) => new Promise(async (res, rej) => {
 			} }
 		]);
 
-	datas.forEach(data => {
+	datas.forEach((data: any) => {
 		data.date = data._id;
 		delete data._id;
 
-		data.notes = (data.data.filter(x => x.type == 'note')[0] || { count: 0 }).count;
-		data.renotes = (data.data.filter(x => x.type == 'renote')[0] || { count: 0 }).count;
-		data.replies = (data.data.filter(x => x.type == 'reply')[0] || { count: 0 }).count;
+		data.notes = (data.data.filter((x: any) => x.type == 'note')[0] || { count: 0 }).count;
+		data.renotes = (data.data.filter((x: any) => x.type == 'renote')[0] || { count: 0 }).count;
+		data.replies = (data.data.filter((x: any) => x.type == 'reply')[0] || { count: 0 }).count;
 
 		delete data.data;
 	});
@@ -83,7 +80,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	for (let i = 0; i < 30; i++) {
 		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
-		const data = datas.filter(d =>
+		const data = datas.filter((d: any) =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
 		)[0];
 
diff --git a/src/server/api/endpoints/aggregation/users/reaction.ts b/src/server/api/endpoints/aggregation/users/reaction.ts
index 2de2840258..adb5acfb4e 100644
--- a/src/server/api/endpoints/aggregation/users/reaction.ts
+++ b/src/server/api/endpoints/aggregation/users/reaction.ts
@@ -1,17 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import User from '../../../../../models/user';
 import Reaction from '../../../../../models/note-reaction';
 
 /**
  * Aggregate reaction of a user
- *
- * @param {any} params
- * @return {Promise<any>}
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
@@ -48,7 +42,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 			}}
 		]);
 
-	datas.forEach(data => {
+	datas.forEach((data: any) => {
 		data.date = data._id;
 		delete data._id;
 	});
@@ -58,7 +52,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	for (let i = 0; i < 30; i++) {
 		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
-		const data = datas.filter(d =>
+		const data = datas.filter((d: any) =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
 		)[0];
 
diff --git a/src/server/api/endpoints/app/create.ts b/src/server/api/endpoints/app/create.ts
index 553bd2381a..c7bc91a079 100644
--- a/src/server/api/endpoints/app/create.ts
+++ b/src/server/api/endpoints/app/create.ts
@@ -1,9 +1,7 @@
-/**
- * Module dependencies
- */
 import rndstr from 'rndstr';
 import $ from 'cafy';
 import App, { isValidNameId, pack } from '../../../../models/app';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * @swagger
@@ -60,12 +58,8 @@ import App, { isValidNameId, pack } from '../../../../models/app';
 
 /**
  * Create an app
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'nameId' parameter
 	const [nameId, nameIdErr] = $.str.pipe(isValidNameId).get(params.nameId);
 	if (nameIdErr) return rej('invalid nameId param');
diff --git a/src/server/api/endpoints/app/name_id/available.ts b/src/server/api/endpoints/app/name_id/available.ts
index 135bb7d2b4..58101a7e6a 100644
--- a/src/server/api/endpoints/app/name_id/available.ts
+++ b/src/server/api/endpoints/app/name_id/available.ts
@@ -40,7 +40,7 @@ import { isValidNameId } from '../../../../../models/app';
  * @param {any} params
  * @return {Promise<any>}
  */
-module.exports = async (params) => new Promise(async (res, rej) => {
+module.exports = async (params: any) => new Promise(async (res, rej) => {
 	// Get 'nameId' parameter
 	const [nameId, nameIdErr] = $.str.pipe(isValidNameId).get(params.nameId);
 	if (nameIdErr) return rej('invalid nameId param');
diff --git a/src/server/api/endpoints/app/show.ts b/src/server/api/endpoints/app/show.ts
index 8d742ab182..2b98a3f142 100644
--- a/src/server/api/endpoints/app/show.ts
+++ b/src/server/api/endpoints/app/show.ts
@@ -1,8 +1,6 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import App, { pack } from '../../../../models/app';
+import App, { pack, IApp } from '../../../../models/app';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * @swagger
@@ -37,7 +35,7 @@ import App, { pack } from '../../../../models/app';
 /**
  * Show an app
  */
-module.exports = (params, user, app) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
 	const isSecure = user != null && app == null;
 
 	// Get 'appId' parameter
diff --git a/src/server/api/endpoints/auth/accept.ts b/src/server/api/endpoints/auth/accept.ts
index 695fbb0803..fc6cbc473d 100644
--- a/src/server/api/endpoints/auth/accept.ts
+++ b/src/server/api/endpoints/auth/accept.ts
@@ -1,12 +1,10 @@
-/**
- * Module dependencies
- */
 import rndstr from 'rndstr';
 const crypto = require('crypto');
 import $ from 'cafy';
 import App from '../../../../models/app';
 import AuthSess from '../../../../models/auth-session';
 import AccessToken from '../../../../models/access-token';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * @swagger
@@ -33,12 +31,8 @@ import AccessToken from '../../../../models/access-token';
 
 /**
  * Accept
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'token' parameter
 	const [token, tokenErr] = $.str.get(params.token);
 	if (tokenErr) return rej('invalid token param');
diff --git a/src/server/api/endpoints/auth/session/generate.ts b/src/server/api/endpoints/auth/session/generate.ts
index d649a8d902..5a4d99ff3b 100644
--- a/src/server/api/endpoints/auth/session/generate.ts
+++ b/src/server/api/endpoints/auth/session/generate.ts
@@ -44,7 +44,7 @@ import config from '../../../../../config';
  * @param {any} params
  * @return {Promise<any>}
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'appSecret' parameter
 	const [appSecret, appSecretErr] = $.str.get(params.appSecret);
 	if (appSecretErr) return rej('invalid appSecret param');
diff --git a/src/server/api/endpoints/auth/session/show.ts b/src/server/api/endpoints/auth/session/show.ts
index 434cc264a0..3d3b6bbf61 100644
--- a/src/server/api/endpoints/auth/session/show.ts
+++ b/src/server/api/endpoints/auth/session/show.ts
@@ -1,8 +1,6 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import AuthSess, { pack } from '../../../../../models/auth-session';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * @swagger
@@ -46,12 +44,8 @@ import AuthSess, { pack } from '../../../../../models/auth-session';
 
 /**
  * Show a session
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'token' parameter
 	const [token, tokenErr] = $.str.get(params.token);
 	if (tokenErr) return rej('invalid token param');
diff --git a/src/server/api/endpoints/auth/session/userkey.ts b/src/server/api/endpoints/auth/session/userkey.ts
index 3026b477f1..3ea48fbe34 100644
--- a/src/server/api/endpoints/auth/session/userkey.ts
+++ b/src/server/api/endpoints/auth/session/userkey.ts
@@ -49,7 +49,7 @@ import { pack } from '../../../../../models/user';
  * @param {any} params
  * @return {Promise<any>}
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'appSecret' parameter
 	const [appSecret, appSecretErr] = $.str.get(params.appSecret);
 	if (appSecretErr) return rej('invalid appSecret param');
diff --git a/src/server/api/endpoints/drive.ts b/src/server/api/endpoints/drive.ts
index 26944dbc15..9caad273c8 100644
--- a/src/server/api/endpoints/drive.ts
+++ b/src/server/api/endpoints/drive.ts
@@ -1,9 +1,10 @@
 import DriveFile from '../../../models/drive-file';
+import { ILocalUser } from '../../../models/user';
 
 /**
  * Get drive information
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Calculate drive usage
 	const usage = await DriveFile
 		.aggregate([{
diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts
index 0f0e3d65a8..efce750747 100644
--- a/src/server/api/endpoints/drive/files.ts
+++ b/src/server/api/endpoints/drive/files.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import DriveFile, { pack } from '../../../../models/drive-file';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get drive files
  */
-module.exports = async (params, user, app) => {
+module.exports = async (params: any, user: ILocalUser) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts
index dd748d6bba..db2626af09 100644
--- a/src/server/api/endpoints/drive/files/create.ts
+++ b/src/server/api/endpoints/drive/files/create.ts
@@ -1,15 +1,13 @@
-/**
- * Module dependencies
- */
 import * as fs from 'fs';
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import { validateFileName, pack } from '../../../../../models/drive-file';
 import create from '../../../../../services/drive/add-file';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Create a file
  */
-module.exports = async (file, params, user): Promise<any> => {
+module.exports = async (file: any, params: any, user: ILocalUser): Promise<any> => {
 	if (file == null) {
 		throw 'file is required';
 	}
diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts
index a722b4e825..17eb0eb4b9 100644
--- a/src/server/api/endpoints/drive/files/delete.ts
+++ b/src/server/api/endpoints/drive/files/delete.ts
@@ -2,11 +2,12 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFile from '../../../../../models/drive-file';
 import del from '../../../../../services/drive/delete-file';
 import { publishDriveStream } from '../../../../../publishers/stream';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Delete a file
  */
-module.exports = async (params, user) => {
+module.exports = async (params: any, user: ILocalUser) => {
 	// Get 'fileId' parameter
 	const [fileId, fileIdErr] = $.type(ID).get(params.fileId);
 	if (fileIdErr) throw 'invalid fileId param';
diff --git a/src/server/api/endpoints/drive/files/find.ts b/src/server/api/endpoints/drive/files/find.ts
index 98165990fe..75ab91f0a1 100644
--- a/src/server/api/endpoints/drive/files/find.ts
+++ b/src/server/api/endpoints/drive/files/find.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFile, { pack } from '../../../../../models/drive-file';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Find a file(s)
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'name' parameter
 	const [name, nameErr] = $.str.get(params.name);
 	if (nameErr) return rej('invalid name param');
diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts
index c7efda7ab0..e7dca486c5 100644
--- a/src/server/api/endpoints/drive/files/show.ts
+++ b/src/server/api/endpoints/drive/files/show.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFile, { pack } from '../../../../../models/drive-file';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Show a file
  */
-module.exports = async (params, user) => {
+module.exports = async (params: any, user: ILocalUser) => {
 	// Get 'fileId' parameter
 	const [fileId, fileIdErr] = $.type(ID).get(params.fileId);
 	if (fileIdErr) throw 'invalid fileId param';
diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts
index 12fa8e025d..825683b214 100644
--- a/src/server/api/endpoints/drive/files/update.ts
+++ b/src/server/api/endpoints/drive/files/update.ts
@@ -1,15 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFolder from '../../../../../models/drive-folder';
 import DriveFile, { validateFileName, pack } from '../../../../../models/drive-file';
 import { publishDriveStream } from '../../../../../publishers/stream';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Update a file
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'fileId' parameter
 	const [fileId, fileIdErr] = $.type(ID).get(params.fileId);
 	if (fileIdErr) return rej('invalid fileId param');
diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts
index bc6c50eb99..fac9780325 100644
--- a/src/server/api/endpoints/drive/folders.ts
+++ b/src/server/api/endpoints/drive/folders.ts
@@ -7,7 +7,7 @@ import DriveFolder, { pack } from '../../../../models/drive-folder';
 /**
  * Get drive folders
  */
-module.exports = (params, user, app) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/drive/folders/create.ts b/src/server/api/endpoints/drive/folders/create.ts
index 62e3b6f6e8..8f06b0f668 100644
--- a/src/server/api/endpoints/drive/folders/create.ts
+++ b/src/server/api/endpoints/drive/folders/create.ts
@@ -1,14 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder';
 import { publishDriveStream } from '../../../../../publishers/stream';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Create drive folder
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'name' parameter
 	const [name = '無題のフォルダー', nameErr] = $.str.optional().pipe(isValidFolderName).get(params.name);
 	if (nameErr) return rej('invalid name param');
diff --git a/src/server/api/endpoints/drive/folders/find.ts b/src/server/api/endpoints/drive/folders/find.ts
index 9703d9e99d..b3238b5c32 100644
--- a/src/server/api/endpoints/drive/folders/find.ts
+++ b/src/server/api/endpoints/drive/folders/find.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFolder, { pack } from '../../../../../models/drive-folder';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Find a folder(s)
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'name' parameter
 	const [name, nameErr] = $.str.get(params.name);
 	if (nameErr) return rej('invalid name param');
diff --git a/src/server/api/endpoints/drive/folders/show.ts b/src/server/api/endpoints/drive/folders/show.ts
index 44f1889001..c9b4930a76 100644
--- a/src/server/api/endpoints/drive/folders/show.ts
+++ b/src/server/api/endpoints/drive/folders/show.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFolder, { pack } from '../../../../../models/drive-folder';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Show a folder
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'folderId' parameter
 	const [folderId, folderIdErr] = $.type(ID).get(params.folderId);
 	if (folderIdErr) return rej('invalid folderId param');
diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts
index e24d8a14cd..f126c09f5b 100644
--- a/src/server/api/endpoints/drive/folders/update.ts
+++ b/src/server/api/endpoints/drive/folders/update.ts
@@ -1,14 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder';
 import { publishDriveStream } from '../../../../../publishers/stream';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Update a folder
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'folderId' parameter
 	const [folderId, folderIdErr] = $.type(ID).get(params.folderId);
 	if (folderIdErr) return rej('invalid folderId param');
@@ -48,7 +46,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 			}
 
 			// Check if the circular reference will occur
-			async function checkCircle(folderId) {
+			async function checkCircle(folderId: any): Promise<boolean> {
 				// Fetch folder
 				const folder2 = await DriveFolder.findOne({
 					_id: folderId
diff --git a/src/server/api/endpoints/drive/stream.ts b/src/server/api/endpoints/drive/stream.ts
index 8cb3a99b42..515f74645a 100644
--- a/src/server/api/endpoints/drive/stream.ts
+++ b/src/server/api/endpoints/drive/stream.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import DriveFile, { pack } from '../../../../models/drive-file';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get drive stream
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts
index b9610658d1..3e45b8da53 100644
--- a/src/server/api/endpoints/following/create.ts
+++ b/src/server/api/endpoints/following/create.ts
@@ -1,15 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User, { pack } from '../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../models/user';
 import Following from '../../../../models/following';
 import create from '../../../../services/following/create';
 
 /**
  * Follow a user
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	const follower = user;
 
 	// Get 'userId' parameter
diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts
index 4fcdaf5a82..0af8813cf9 100644
--- a/src/server/api/endpoints/following/delete.ts
+++ b/src/server/api/endpoints/following/delete.ts
@@ -1,15 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User, { pack } from '../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../models/user';
 import Following from '../../../../models/following';
 import deleteFollowing from '../../../../services/following/delete';
 
 /**
  * Unfollow a user
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	const follower = user;
 
 	// Get 'userId' parameter
diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts
index 705d3b161a..a09e32e4d9 100644
--- a/src/server/api/endpoints/following/requests/accept.ts
+++ b/src/server/api/endpoints/following/requests/accept.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import acceptFollowRequest from '../../../../../services/following/requests/accept';
-import User from '../../../../../models/user';
+import User, { ILocalUser } from '../../../../../models/user';
 
 /**
  * Accept a follow request
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [followerId, followerIdErr] = $.type(ID).get(params.userId);
 	if (followerIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts
index 388a54890b..f2a40854c2 100644
--- a/src/server/api/endpoints/following/requests/cancel.ts
+++ b/src/server/api/endpoints/following/requests/cancel.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import cancelFollowRequest from '../../../../../services/following/requests/cancel';
-import User, { pack } from '../../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../../models/user';
 
 /**
  * Cancel a follow request
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [followeeId, followeeIdErr] = $.type(ID).get(params.userId);
 	if (followeeIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/following/requests/list.ts b/src/server/api/endpoints/following/requests/list.ts
index e8364335d1..287c5a8e46 100644
--- a/src/server/api/endpoints/following/requests/list.ts
+++ b/src/server/api/endpoints/following/requests/list.ts
@@ -1,10 +1,11 @@
 //import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import FollowRequest, { pack } from '../../../../../models/follow-request';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Get all pending received follow requests
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	const reqs = await FollowRequest.find({
 		followeeId: user._id
 	});
diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts
index 1cfb562b55..69dddf1355 100644
--- a/src/server/api/endpoints/following/requests/reject.ts
+++ b/src/server/api/endpoints/following/requests/reject.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import rejectFollowRequest from '../../../../../services/following/requests/reject';
-import User from '../../../../../models/user';
+import User, { ILocalUser } from '../../../../../models/user';
 
 /**
  * Reject a follow request
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [followerId, followerIdErr] = $.type(ID).get(params.userId);
 	if (followerIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/following/stalk.ts b/src/server/api/endpoints/following/stalk.ts
index f0bc8cbdfc..b9d19d57b4 100644
--- a/src/server/api/endpoints/following/stalk.ts
+++ b/src/server/api/endpoints/following/stalk.ts
@@ -1,10 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Following from '../../../../models/following';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Stalk a user
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	const follower = user;
 
 	// Get 'userId' parameter
diff --git a/src/server/api/endpoints/following/unstalk.ts b/src/server/api/endpoints/following/unstalk.ts
index 0d0a018c34..255f22ca1f 100644
--- a/src/server/api/endpoints/following/unstalk.ts
+++ b/src/server/api/endpoints/following/unstalk.ts
@@ -1,10 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Following from '../../../../models/following';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Unstalk a user
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	const follower = user;
 
 	// Get 'userId' parameter
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 947dd6e448..17af9d6a9a 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -45,7 +45,10 @@ module.exports = () => new Promise(async (res, rej) => {
 		return res([]);
 	}
 
-	const tags = [];
+	const tags: Array<{
+		name: string;
+		count: number;
+	}> = [];
 
 	// カウント
 	data.map(x => x._id).forEach(x => {
diff --git a/src/server/api/endpoints/i.ts b/src/server/api/endpoints/i.ts
index 379c3c4d88..5c769a02fd 100644
--- a/src/server/api/endpoints/i.ts
+++ b/src/server/api/endpoints/i.ts
@@ -1,12 +1,10 @@
-/**
- * Module dependencies
- */
-import User, { pack } from '../../../models/user';
+import User, { pack, ILocalUser } from '../../../models/user';
+import { IApp } from '../../../models/app';
 
 /**
  * Show myself
  */
-module.exports = (params, user, app) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
 	const isSecure = user != null && app == null;
 
 	// Serialize
diff --git a/src/server/api/endpoints/i/2fa/done.ts b/src/server/api/endpoints/i/2fa/done.ts
index 1a2706aa84..61f13c4c61 100644
--- a/src/server/api/endpoints/i/2fa/done.ts
+++ b/src/server/api/endpoints/i/2fa/done.ts
@@ -1,11 +1,8 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import * as speakeasy from 'speakeasy';
-import User from '../../../../../models/user';
+import User, { ILocalUser } from '../../../../../models/user';
 
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'token' parameter
 	const [token, tokenErr] = $.str.get(params.token);
 	if (tokenErr) return rej('invalid token param');
diff --git a/src/server/api/endpoints/i/2fa/register.ts b/src/server/api/endpoints/i/2fa/register.ts
index d314e1a280..d05892c84b 100644
--- a/src/server/api/endpoints/i/2fa/register.ts
+++ b/src/server/api/endpoints/i/2fa/register.ts
@@ -1,14 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import * as bcrypt from 'bcryptjs';
 import * as speakeasy from 'speakeasy';
 import * as QRCode from 'qrcode';
-import User from '../../../../../models/user';
+import User, { ILocalUser } from '../../../../../models/user';
 import config from '../../../../../config';
 
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'password' parameter
 	const [password, passwordErr] = $.str.get(params.password);
 	if (passwordErr) return rej('invalid password param');
diff --git a/src/server/api/endpoints/i/2fa/unregister.ts b/src/server/api/endpoints/i/2fa/unregister.ts
index 336a3564ab..fc197cb1e4 100644
--- a/src/server/api/endpoints/i/2fa/unregister.ts
+++ b/src/server/api/endpoints/i/2fa/unregister.ts
@@ -1,11 +1,8 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import * as bcrypt from 'bcryptjs';
-import User from '../../../../../models/user';
+import User, { ILocalUser } from '../../../../../models/user';
 
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'password' parameter
 	const [password, passwordErr] = $.str.get(params.password);
 	if (passwordErr) return rej('invalid password param');
diff --git a/src/server/api/endpoints/i/authorized_apps.ts b/src/server/api/endpoints/i/authorized_apps.ts
index d15bd67bf2..cfc93c1518 100644
--- a/src/server/api/endpoints/i/authorized_apps.ts
+++ b/src/server/api/endpoints/i/authorized_apps.ts
@@ -1,14 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import AccessToken from '../../../../models/access-token';
 import { pack } from '../../../../models/app';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get authorized apps of my account
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/i/change_password.ts b/src/server/api/endpoints/i/change_password.ts
index a1a1a43406..9851fa895a 100644
--- a/src/server/api/endpoints/i/change_password.ts
+++ b/src/server/api/endpoints/i/change_password.ts
@@ -1,14 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import * as bcrypt from 'bcryptjs';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 
 /**
  * Change password
  */
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'currentPasword' parameter
 	const [currentPassword, currentPasswordErr] = $.str.get(params.currentPasword);
 	if (currentPasswordErr) return rej('invalid currentPasword param');
diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts
index 23517baaff..dc343afaed 100644
--- a/src/server/api/endpoints/i/favorites.ts
+++ b/src/server/api/endpoints/i/favorites.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Favorite, { pack } from '../../../../models/favorite';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get favorited notes
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/i/notifications.ts b/src/server/api/endpoints/i/notifications.ts
index ba9c47508c..ce283fe48f 100644
--- a/src/server/api/endpoints/i/notifications.ts
+++ b/src/server/api/endpoints/i/notifications.ts
@@ -1,17 +1,15 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Notification from '../../../../models/notification';
 import Mute from '../../../../models/mute';
 import { pack } from '../../../../models/notification';
 import { getFriendIds } from '../../common/get-friends';
 import read from '../../common/read-notification';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get notifications
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'following' parameter
 	const [following = false, followingError] =
 		$.bool.optional().get(params.following);
diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts
index 423f0ac4ae..7f4a45e1f5 100644
--- a/src/server/api/endpoints/i/pin.ts
+++ b/src/server/api/endpoints/i/pin.ts
@@ -1,15 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import Note from '../../../../models/note';
 import { pack } from '../../../../models/user';
 
 /**
  * Pin note
  */
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/i/regenerate_token.ts b/src/server/api/endpoints/i/regenerate_token.ts
index 6e1e571297..3ffab5428e 100644
--- a/src/server/api/endpoints/i/regenerate_token.ts
+++ b/src/server/api/endpoints/i/regenerate_token.ts
@@ -1,16 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import * as bcrypt from 'bcryptjs';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 import generateUserToken from '../../common/generate-native-user-token';
 
 /**
  * Regenerate native token
  */
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'password' parameter
 	const [password, passwordErr] = $.str.get(params.password);
 	if (passwordErr) return rej('invalid password param');
diff --git a/src/server/api/endpoints/i/signin_history.ts b/src/server/api/endpoints/i/signin_history.ts
index 63a74b41b1..4ab9881f34 100644
--- a/src/server/api/endpoints/i/signin_history.ts
+++ b/src/server/api/endpoints/i/signin_history.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Signin, { pack } from '../../../../models/signin';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get signin history of my account
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 1a1da997c9..57b050ebc4 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -1,16 +1,14 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user';
+import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack, ILocalUser } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 import DriveFile from '../../../../models/drive-file';
 import acceptAllFollowRequests from '../../../../services/following/requests/accept-all';
+import { IApp } from '../../../../models/app';
 
 /**
  * Update myself
  */
-module.exports = async (params, user, app) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
 	const isSecure = user != null && app == null;
 
 	const updates = {} as any;
diff --git a/src/server/api/endpoints/i/update_client_setting.ts b/src/server/api/endpoints/i/update_client_setting.ts
index e91d7565fd..6d6e8ed24a 100644
--- a/src/server/api/endpoints/i/update_client_setting.ts
+++ b/src/server/api/endpoints/i/update_client_setting.ts
@@ -1,14 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 
 /**
  * Update myself
  */
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'name' parameter
 	const [name, nameErr] = $.str.get(params.name);
 	if (nameErr) return rej('invalid name param');
@@ -17,7 +14,7 @@ module.exports = async (params, user) => new Promise(async (res, rej) => {
 	const [value, valueErr] = $.any.nullable().get(params.value);
 	if (valueErr) return rej('invalid value param');
 
-	const x = {};
+	const x: any = {};
 	x[`clientSettings.${name}`] = value;
 
 	await User.update(user._id, {
diff --git a/src/server/api/endpoints/i/update_home.ts b/src/server/api/endpoints/i/update_home.ts
index 48f6dbbb7a..511a647d88 100644
--- a/src/server/api/endpoints/i/update_home.ts
+++ b/src/server/api/endpoints/i/update_home.ts
@@ -1,8 +1,8 @@
 import $ from 'cafy';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'home' parameter
 	const [home, homeErr] = $.arr(
 		$.obj.strict()
diff --git a/src/server/api/endpoints/i/update_mobile_home.ts b/src/server/api/endpoints/i/update_mobile_home.ts
index d285a0a72d..b1f25624fd 100644
--- a/src/server/api/endpoints/i/update_mobile_home.ts
+++ b/src/server/api/endpoints/i/update_mobile_home.ts
@@ -1,8 +1,8 @@
 import $ from 'cafy';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'home' parameter
 	const [home, homeErr] = $.arr(
 		$.obj.strict()
diff --git a/src/server/api/endpoints/i/update_widget.ts b/src/server/api/endpoints/i/update_widget.ts
index b37761bde1..82bb04d1f4 100644
--- a/src/server/api/endpoints/i/update_widget.ts
+++ b/src/server/api/endpoints/i/update_widget.ts
@@ -1,8 +1,8 @@
 import $ from 'cafy';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import event from '../../../../publishers/stream';
 
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'id' parameter
 	const [id, idErr] = $.str.get(params.id);
 	if (idErr) return rej('invalid id param');
@@ -18,7 +18,7 @@ module.exports = async (params, user) => new Promise(async (res, rej) => {
 	//#region Desktop home
 	if (widget == null && user.clientSettings.home) {
 		const desktopHome = user.clientSettings.home;
-		widget = desktopHome.find(w => w.id == id);
+		widget = desktopHome.find((w: any) => w.id == id);
 		if (widget) {
 				widget.data = data;
 
@@ -34,7 +34,7 @@ module.exports = async (params, user) => new Promise(async (res, rej) => {
 	//#region Mobile home
 	if (widget == null && user.clientSettings.mobileHome) {
 		const mobileHome = user.clientSettings.mobileHome;
-		widget = mobileHome.find(w => w.id == id);
+		widget = mobileHome.find((w: any) => w.id == id);
 		if (widget) {
 				widget.data = data;
 
@@ -50,8 +50,8 @@ module.exports = async (params, user) => new Promise(async (res, rej) => {
 	//#region Deck
 	if (widget == null && user.clientSettings.deck && user.clientSettings.deck.columns) {
 		const deck = user.clientSettings.deck;
-		deck.columns.filter(c => c.type == 'widgets').forEach(c => {
-			c.widgets.forEach(w => {
+		deck.columns.filter((c: any) => c.type == 'widgets').forEach((c: any) => {
+			c.widgets.forEach((w: any) => {
 				if (w.id == id) widget = w;
 			});
 		});
diff --git a/src/server/api/endpoints/messaging/history.ts b/src/server/api/endpoints/messaging/history.ts
index ec97642f17..713ba9dd7f 100644
--- a/src/server/api/endpoints/messaging/history.ts
+++ b/src/server/api/endpoints/messaging/history.ts
@@ -1,15 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import History from '../../../../models/messaging-history';
 import Mute from '../../../../models/mute';
 import { pack } from '../../../../models/messaging-message';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Show messaging history
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts
index 9c3a48334b..3eb20ec06b 100644
--- a/src/server/api/endpoints/messaging/messages.ts
+++ b/src/server/api/endpoints/messaging/messages.ts
@@ -1,13 +1,13 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Message from '../../../../models/messaging-message';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import { pack } from '../../../../models/messaging-message';
 import read from '../../common/read-messaging-message';
 
 /**
  * Get messages
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [recipientId, recipientIdErr] = $.type(ID).get(params.userId);
 	if (recipientIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts
index 41238de1e1..b3e4f6a8cd 100644
--- a/src/server/api/endpoints/messaging/messages/create.ts
+++ b/src/server/api/endpoints/messaging/messages/create.ts
@@ -1,11 +1,8 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import Message from '../../../../../models/messaging-message';
 import { isValidText } from '../../../../../models/messaging-message';
 import History from '../../../../../models/messaging-history';
-import User from '../../../../../models/user';
+import User, { ILocalUser } from '../../../../../models/user';
 import Mute from '../../../../../models/mute';
 import DriveFile from '../../../../../models/drive-file';
 import { pack } from '../../../../../models/messaging-message';
@@ -17,7 +14,7 @@ import config from '../../../../../config';
 /**
  * Create a message
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [recipientId, recipientIdErr] = $.type(ID).get(params.userId);
 	if (recipientIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts
index 0e9ecf47df..ce460d0b8b 100644
--- a/src/server/api/endpoints/meta.ts
+++ b/src/server/api/endpoints/meta.ts
@@ -38,7 +38,7 @@ const client = require('../../../../built/client/meta.json');
 /**
  * Show core info
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	const meta: any = (await Meta.findOne()) || {};
 
 	res({
diff --git a/src/server/api/endpoints/mute/create.ts b/src/server/api/endpoints/mute/create.ts
index 534020c671..415745e2c3 100644
--- a/src/server/api/endpoints/mute/create.ts
+++ b/src/server/api/endpoints/mute/create.ts
@@ -1,14 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import Mute from '../../../../models/mute';
 
 /**
  * Mute a user
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	const muter = user;
 
 	// Get 'userId' parameter
diff --git a/src/server/api/endpoints/mute/delete.ts b/src/server/api/endpoints/mute/delete.ts
index 949aff64ba..2d1d286585 100644
--- a/src/server/api/endpoints/mute/delete.ts
+++ b/src/server/api/endpoints/mute/delete.ts
@@ -1,14 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import Mute from '../../../../models/mute';
 
 /**
  * Unmute a user
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	const muter = user;
 
 	// Get 'userId' parameter
diff --git a/src/server/api/endpoints/mute/list.ts b/src/server/api/endpoints/mute/list.ts
index cf89f7e959..8b0171be33 100644
--- a/src/server/api/endpoints/mute/list.ts
+++ b/src/server/api/endpoints/mute/list.ts
@@ -1,15 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Mute from '../../../../models/mute';
-import { pack } from '../../../../models/user';
+import { pack, ILocalUser } from '../../../../models/user';
 import { getFriendIds } from '../../common/get-friends';
 
 /**
  * Get muted users of a user
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'iknow' parameter
 	const [iknow = false, iknowErr] = $.bool.optional().get(params.iknow);
 	if (iknowErr) return rej('invalid iknow param');
diff --git a/src/server/api/endpoints/my/apps.ts b/src/server/api/endpoints/my/apps.ts
index 086e0b8965..7687afd0c7 100644
--- a/src/server/api/endpoints/my/apps.ts
+++ b/src/server/api/endpoints/my/apps.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import App, { pack } from '../../../../models/app';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get my apps
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts
index e6fe80ac8a..5554e53aa4 100644
--- a/src/server/api/endpoints/notes.ts
+++ b/src/server/api/endpoints/notes.ts
@@ -7,7 +7,7 @@ import Note, { pack } from '../../../models/note';
 /**
  * Get all notes
  */
-module.exports = (params) => new Promise(async (res, rej) => {
+module.exports = (params: any) => new Promise(async (res, rej) => {
 	// Get 'local' parameter
 	const [local, localErr] = $.bool.optional().get(params.local);
 	if (localErr) return rej('invalid local param');
diff --git a/src/server/api/endpoints/notes/conversation.ts b/src/server/api/endpoints/notes/conversation.ts
index 02f7229ccf..b2bc6a2e72 100644
--- a/src/server/api/endpoints/notes/conversation.ts
+++ b/src/server/api/endpoints/notes/conversation.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import Note, { pack } from '../../../../models/note';
+import Note, { pack, INote } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Show conversation of a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
@@ -29,10 +27,10 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		return rej('note not found');
 	}
 
-	const conversation = [];
+	const conversation: INote[] = [];
 	let i = 0;
 
-	async function get(id) {
+	async function get(id: any) {
 		i++;
 		const p = await Note.findOne({ _id: id });
 
diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts
index 446764e1d6..64f3b5ce26 100644
--- a/src/server/api/endpoints/notes/create.ts
+++ b/src/server/api/endpoints/notes/create.ts
@@ -1,9 +1,6 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note, { INote, isValidText, isValidCw, pack } from '../../../../models/note';
-import User, { ILocalUser } from '../../../../models/user';
+import User, { ILocalUser, IUser } from '../../../../models/user';
 import DriveFile from '../../../../models/drive-file';
 import create from '../../../../services/note/create';
 import { IApp } from '../../../../models/app';
@@ -11,7 +8,7 @@ import { IApp } from '../../../../models/app';
 /**
  * Create a note
  */
-module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
 	// Get 'visibility' parameter
 	const [visibility = 'public', visibilityErr] = $.str.optional().or(['public', 'home', 'followers', 'specified', 'private']).get(params.visibility);
 	if (visibilityErr) return rej('invalid visibility');
@@ -20,7 +17,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res
 	const [visibleUserIds, visibleUserIdsErr] = $.arr($.type(ID)).optional().unique().min(1).get(params.visibleUserIds);
 	if (visibleUserIdsErr) return rej('invalid visibleUserIds');
 
-	let visibleUsers = [];
+	let visibleUsers: IUser[] = [];
 	if (visibleUserIds !== undefined) {
 		visibleUsers = await Promise.all(visibleUserIds.map(id => User.findOne({
 			_id: id
@@ -132,7 +129,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res
 	if (pollErr) return rej('invalid poll');
 
 	if (poll) {
-		(poll as any).choices = (poll as any).choices.map((choice, i) => ({
+		(poll as any).choices = (poll as any).choices.map((choice: string, i: number) => ({
 			id: i, // IDを付与
 			text: choice.trim(),
 			votes: 0
diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts
index 9bbb1541d6..70bcdbaab9 100644
--- a/src/server/api/endpoints/notes/delete.ts
+++ b/src/server/api/endpoints/notes/delete.ts
@@ -1,11 +1,12 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
 import deleteNote from '../../../../services/note/delete';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Delete a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/favorites/create.ts b/src/server/api/endpoints/notes/favorites/create.ts
index 6832b52f75..23f7ac5f8d 100644
--- a/src/server/api/endpoints/notes/favorites/create.ts
+++ b/src/server/api/endpoints/notes/favorites/create.ts
@@ -1,14 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import Favorite from '../../../../../models/favorite';
 import Note from '../../../../../models/note';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Favorite a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/favorites/delete.ts b/src/server/api/endpoints/notes/favorites/delete.ts
index 07112dae15..7d2d2b4cb5 100644
--- a/src/server/api/endpoints/notes/favorites/delete.ts
+++ b/src/server/api/endpoints/notes/favorites/delete.ts
@@ -1,14 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import Favorite from '../../../../../models/favorite';
 import Note from '../../../../../models/note';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Unfavorite a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index 2d4f2b6368..24ffdbcba7 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -1,15 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
 import Mute from '../../../../models/mute';
 import { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get timeline of global
  */
-module.exports = async (params, user) => {
+module.exports = async (params: any, user: ILocalUser) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index 734cc9af0a..48490638d2 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -1,15 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
 import Mute from '../../../../models/mute';
 import { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get timeline of local
  */
-module.exports = async (params, user) => {
+module.exports = async (params: any, user: ILocalUser) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts
index 163a6b4866..45511603af 100644
--- a/src/server/api/endpoints/notes/mentions.ts
+++ b/src/server/api/endpoints/notes/mentions.ts
@@ -1,19 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
 import { getFriendIds } from '../../common/get-friends';
 import { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get mentions of myself
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'following' parameter
 	const [following = false, followingError] =
 		$.bool.optional().get(params.following);
diff --git a/src/server/api/endpoints/notes/polls/recommendation.ts b/src/server/api/endpoints/notes/polls/recommendation.ts
index a272378d19..640140c3d1 100644
--- a/src/server/api/endpoints/notes/polls/recommendation.ts
+++ b/src/server/api/endpoints/notes/polls/recommendation.ts
@@ -1,14 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import Vote from '../../../../../models/poll-vote';
 import Note, { pack } from '../../../../../models/note';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Get recommended polls
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts
index f8f4515308..72ac6bb202 100644
--- a/src/server/api/endpoints/notes/polls/vote.ts
+++ b/src/server/api/endpoints/notes/polls/vote.ts
@@ -1,6 +1,3 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import Vote from '../../../../../models/poll-vote';
 import Note from '../../../../../models/note';
@@ -8,11 +5,12 @@ import Watching from '../../../../../models/note-watching';
 import watch from '../../../../../services/note/watch';
 import { publishNoteStream } from '../../../../../publishers/stream';
 import notify from '../../../../../publishers/notify';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Vote poll of a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
@@ -58,8 +56,8 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Send response
 	res();
 
-	const inc = {};
-	inc[`poll.choices.${findWithAttr(note.poll.choices, 'id', choice)}.votes`] = 1;
+	const inc: any = {};
+	inc[`poll.choices.${note.poll.choices.findIndex(c => c.id == choice)}.votes`] = 1;
 
 	// Increment votes count
 	await Note.update({ _id: note._id }, {
@@ -100,12 +98,3 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		watch(user._id, note);
 	}
 });
-
-function findWithAttr(array, attr, value) {
-	for (let i = 0; i < array.length; i += 1) {
-		if (array[i][attr] === value) {
-			return i;
-		}
-	}
-	return -1;
-}
diff --git a/src/server/api/endpoints/notes/reactions.ts b/src/server/api/endpoints/notes/reactions.ts
index 4ad952a7a1..d3b2d43432 100644
--- a/src/server/api/endpoints/notes/reactions.ts
+++ b/src/server/api/endpoints/notes/reactions.ts
@@ -1,18 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
 import Reaction, { pack } from '../../../../models/note-reaction';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Show reactions of a note
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/reactions/create.ts b/src/server/api/endpoints/notes/reactions/create.ts
index 21757cb427..33e457e308 100644
--- a/src/server/api/endpoints/notes/reactions/create.ts
+++ b/src/server/api/endpoints/notes/reactions/create.ts
@@ -1,15 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import Note from '../../../../../models/note';
 import create from '../../../../../services/note/reaction/create';
 import { validateReaction } from '../../../../../models/note-reaction';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * React to a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/reactions/delete.ts b/src/server/api/endpoints/notes/reactions/delete.ts
index afb8629112..1f2d662511 100644
--- a/src/server/api/endpoints/notes/reactions/delete.ts
+++ b/src/server/api/endpoints/notes/reactions/delete.ts
@@ -1,14 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import Reaction from '../../../../../models/note-reaction';
 import Note from '../../../../../models/note';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Unreact to a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
@@ -45,7 +43,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	// Send response
 	res();
 
-	const dec = {};
+	const dec: any = {};
 	dec[`reactionCounts.${exist.reaction}`] = -1;
 
 	// Decrement reactions count
diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts
index 608027f6b1..4aaf1d322b 100644
--- a/src/server/api/endpoints/notes/replies.ts
+++ b/src/server/api/endpoints/notes/replies.ts
@@ -1,10 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note, { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get replies of a note
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/reposts.ts b/src/server/api/endpoints/notes/reposts.ts
index 3098211b61..ea3f174e1a 100644
--- a/src/server/api/endpoints/notes/reposts.ts
+++ b/src/server/api/endpoints/notes/reposts.ts
@@ -1,17 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note, { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Show a renotes of a note
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/search.ts b/src/server/api/endpoints/notes/search.ts
deleted file mode 100644
index 9705dcfd6e..0000000000
--- a/src/server/api/endpoints/notes/search.ts
+++ /dev/null
@@ -1,364 +0,0 @@
-/**
- * Module dependencies
- */
-import $ from 'cafy'; import ID from '../../../../cafy-id';
-const escapeRegexp = require('escape-regexp');
-import Note from '../../../../models/note';
-import User from '../../../../models/user';
-import Mute from '../../../../models/mute';
-import { getFriendIds } from '../../common/get-friends';
-import { pack } from '../../../../models/note';
-
-/**
- * Search a note
- *
- * @param {any} params
- * @param {any} me
- * @return {Promise<any>}
- */
-module.exports = (params, me) => new Promise(async (res, rej) => {
-	// Get 'text' parameter
-	const [text, textError] = $.str.optional().get(params.text);
-	if (textError) return rej('invalid text param');
-
-	// Get 'includeUserIds' parameter
-	const [includeUserIds = [], includeUserIdsErr] = $.arr($.type(ID)).optional().get(params.includeUserIds);
-	if (includeUserIdsErr) return rej('invalid includeUserIds param');
-
-	// Get 'excludeUserIds' parameter
-	const [excludeUserIds = [], excludeUserIdsErr] = $.arr($.type(ID)).optional().get(params.excludeUserIds);
-	if (excludeUserIdsErr) return rej('invalid excludeUserIds param');
-
-	// Get 'includeUserUsernames' parameter
-	const [includeUserUsernames = [], includeUserUsernamesErr] = $.arr($.str).optional().get(params.includeUserUsernames);
-	if (includeUserUsernamesErr) return rej('invalid includeUserUsernames param');
-
-	// Get 'excludeUserUsernames' parameter
-	const [excludeUserUsernames = [], excludeUserUsernamesErr] = $.arr($.str).optional().get(params.excludeUserUsernames);
-	if (excludeUserUsernamesErr) return rej('invalid excludeUserUsernames param');
-
-	// Get 'following' parameter
-	const [following = null, followingErr] = $.bool.optional().nullable().get(params.following);
-	if (followingErr) return rej('invalid following param');
-
-	// Get 'mute' parameter
-	const [mute = 'mute_all', muteErr] = $.str.optional().get(params.mute);
-	if (muteErr) return rej('invalid mute param');
-
-	// Get 'reply' parameter
-	const [reply = null, replyErr] = $.bool.optional().nullable().get(params.reply);
-	if (replyErr) return rej('invalid reply param');
-
-	// Get 'renote' parameter
-	const [renote = null, renoteErr] = $.bool.optional().nullable().get(params.renote);
-	if (renoteErr) return rej('invalid renote param');
-
-	// Get 'media' parameter
-	const [media = null, mediaErr] = $.bool.optional().nullable().get(params.media);
-	if (mediaErr) return rej('invalid media param');
-
-	// Get 'poll' parameter
-	const [poll = null, pollErr] = $.bool.optional().nullable().get(params.poll);
-	if (pollErr) return rej('invalid poll param');
-
-	// Get 'sinceDate' parameter
-	const [sinceDate, sinceDateErr] = $.num.optional().get(params.sinceDate);
-	if (sinceDateErr) throw 'invalid sinceDate param';
-
-	// Get 'untilDate' parameter
-	const [untilDate, untilDateErr] = $.num.optional().get(params.untilDate);
-	if (untilDateErr) throw 'invalid untilDate param';
-
-	// Get 'offset' parameter
-	const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset);
-	if (offsetErr) return rej('invalid offset param');
-
-	// Get 'limit' parameter
-	const [limit = 10, limitErr] = $.num.optional().range(1, 30).get(params.limit);
-	if (limitErr) return rej('invalid limit param');
-
-	let includeUsers = includeUserIds;
-	if (includeUserUsernames != null) {
-		const ids = (await Promise.all(includeUserUsernames.map(async (username) => {
-			const _user = await User.findOne({
-				usernameLower: username.toLowerCase()
-			});
-			return _user ? _user._id : null;
-		}))).filter(id => id != null);
-		includeUsers = includeUsers.concat(ids);
-	}
-
-	let excludeUsers = excludeUserIds;
-	if (excludeUserUsernames != null) {
-		const ids = (await Promise.all(excludeUserUsernames.map(async (username) => {
-			const _user = await User.findOne({
-				usernameLower: username.toLowerCase()
-			});
-			return _user ? _user._id : null;
-		}))).filter(id => id != null);
-		excludeUsers = excludeUsers.concat(ids);
-	}
-
-	search(res, rej, me, text, includeUsers, excludeUsers, following,
-			mute, reply, renote, media, poll, sinceDate, untilDate, offset, limit);
-});
-
-async function search(
-	res, rej, me, text, includeUserIds, excludeUserIds, following,
-	mute, reply, renote, media, poll, sinceDate, untilDate, offset, max) {
-
-	let q: any = {
-		$and: []
-	};
-
-	const push = x => q.$and.push(x);
-
-	if (text) {
-		// 完全一致検索
-		if (/"""(.+?)"""/.test(text)) {
-			const x = text.match(/"""(.+?)"""/)[1];
-			push({
-				text: x
-			});
-		} else {
-			const tags = text.split(' ').filter(x => x[0] == '#');
-			if (tags) {
-				push({
-					$and: tags.map(x => ({
-						tags: x
-					}))
-				});
-			}
-
-			push({
-				$and: text.split(' ').map(x => ({
-					// キーワードが-で始まる場合そのキーワードを除外する
-					text: x[0] == '-' ? {
-						$not: new RegExp(escapeRegexp(x.substr(1)))
-					} : new RegExp(escapeRegexp(x))
-				}))
-			});
-		}
-	}
-
-	if (includeUserIds && includeUserIds.length != 0) {
-		push({
-			userId: {
-				$in: includeUserIds
-			}
-		});
-	} else if (excludeUserIds && excludeUserIds.length != 0) {
-		push({
-			userId: {
-				$nin: excludeUserIds
-			}
-		});
-	}
-
-	if (following != null && me != null) {
-		const ids = await getFriendIds(me._id, false);
-		push({
-			userId: following ? {
-				$in: ids
-			} : {
-				$nin: ids.concat(me._id)
-			}
-		});
-	}
-
-	if (me != null) {
-		const mutes = await Mute.find({
-			muterId: me._id,
-			deletedAt: { $exists: false }
-		});
-		const mutedUserIds = mutes.map(m => m.muteeId);
-
-		switch (mute) {
-			case 'mute_all':
-				push({
-					userId: {
-						$nin: mutedUserIds
-					},
-					'_reply.userId': {
-						$nin: mutedUserIds
-					},
-					'_renote.userId': {
-						$nin: mutedUserIds
-					}
-				});
-				break;
-			case 'mute_related':
-				push({
-					'_reply.userId': {
-						$nin: mutedUserIds
-					},
-					'_renote.userId': {
-						$nin: mutedUserIds
-					}
-				});
-				break;
-			case 'mute_direct':
-				push({
-					userId: {
-						$nin: mutedUserIds
-					}
-				});
-				break;
-			case 'direct_only':
-				push({
-					userId: {
-						$in: mutedUserIds
-					}
-				});
-				break;
-			case 'related_only':
-				push({
-					$or: [{
-						'_reply.userId': {
-							$in: mutedUserIds
-						}
-					}, {
-						'_renote.userId': {
-							$in: mutedUserIds
-						}
-					}]
-				});
-				break;
-			case 'all_only':
-				push({
-					$or: [{
-						userId: {
-							$in: mutedUserIds
-						}
-					}, {
-						'_reply.userId': {
-							$in: mutedUserIds
-						}
-					}, {
-						'_renote.userId': {
-							$in: mutedUserIds
-						}
-					}]
-				});
-				break;
-		}
-	}
-
-	if (reply != null) {
-		if (reply) {
-			push({
-				replyId: {
-					$exists: true,
-					$ne: null
-				}
-			});
-		} else {
-			push({
-				$or: [{
-					replyId: {
-						$exists: false
-					}
-				}, {
-					replyId: null
-				}]
-			});
-		}
-	}
-
-	if (renote != null) {
-		if (renote) {
-			push({
-				renoteId: {
-					$exists: true,
-					$ne: null
-				}
-			});
-		} else {
-			push({
-				$or: [{
-					renoteId: {
-						$exists: false
-					}
-				}, {
-					renoteId: null
-				}]
-			});
-		}
-	}
-
-	if (media != null) {
-		if (media) {
-			push({
-				mediaIds: {
-					$exists: true,
-					$ne: null
-				}
-			});
-		} else {
-			push({
-				$or: [{
-					mediaIds: {
-						$exists: false
-					}
-				}, {
-					mediaIds: null
-				}]
-			});
-		}
-	}
-
-	if (poll != null) {
-		if (poll) {
-			push({
-				poll: {
-					$exists: true,
-					$ne: null
-				}
-			});
-		} else {
-			push({
-				$or: [{
-					poll: {
-						$exists: false
-					}
-				}, {
-					poll: null
-				}]
-			});
-		}
-	}
-
-	if (sinceDate) {
-		push({
-			createdAt: {
-				$gt: new Date(sinceDate)
-			}
-		});
-	}
-
-	if (untilDate) {
-		push({
-			createdAt: {
-				$lt: new Date(untilDate)
-			}
-		});
-	}
-
-	if (q.$and.length == 0) {
-		q = {};
-	}
-
-	// Search notes
-	const notes = await Note
-		.find(q, {
-			sort: {
-				_id: -1
-			},
-			limit: max,
-			skip: offset
-		});
-
-	// Serialize
-	res(await Promise.all(notes.map(async note =>
-		await pack(note, me))));
-}
diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts
index 1eb4cde49c..9be7cfffb6 100644
--- a/src/server/api/endpoints/notes/search_by_tag.ts
+++ b/src/server/api/endpoints/notes/search_by_tag.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import Mute from '../../../../models/mute';
 import { getFriendIds } from '../../common/get-friends';
 import { pack } from '../../../../models/note';
@@ -8,7 +8,7 @@ import { pack } from '../../../../models/note';
 /**
  * Search notes by tag
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'tag' parameter
 	const [tag, tagError] = $.str.get(params.tag);
 	if (tagError) return rej('invalid tag param');
@@ -69,7 +69,6 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
 	const [limit = 10, limitErr] = $.num.optional().range(1, 30).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
 
-	let includeUsers = includeUserIds;
 	if (includeUserUsernames != null) {
 		const ids = (await Promise.all(includeUserUsernames.map(async (username) => {
 			const _user = await User.findOne({
@@ -77,10 +76,10 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
 			});
 			return _user ? _user._id : null;
 		}))).filter(id => id != null);
-		includeUsers = includeUsers.concat(ids);
+
+		ids.forEach(id => includeUserIds.push(id));
 	}
 
-	let excludeUsers = excludeUserIds;
 	if (excludeUserUsernames != null) {
 		const ids = (await Promise.all(excludeUserUsernames.map(async (username) => {
 			const _user = await User.findOne({
@@ -88,24 +87,17 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
 			});
 			return _user ? _user._id : null;
 		}))).filter(id => id != null);
-		excludeUsers = excludeUsers.concat(ids);
+
+		ids.forEach(id => excludeUserIds.push(id));
 	}
 
-	search(res, rej, me, tag, includeUsers, excludeUsers, following,
-			mute, reply, renote, media, poll, sinceDate, untilDate, offset, limit);
-});
-
-async function search(
-	res, rej, me, tag, includeUserIds, excludeUserIds, following,
-	mute, reply, renote, media, poll, sinceDate, untilDate, offset, max) {
-
 	let q: any = {
 		$and: [{
 			tagsLower: tag.toLowerCase()
 		}]
 	};
 
-	const push = x => q.$and.push(x);
+	const push = (x: any) => q.$and.push(x);
 
 	if (includeUserIds && includeUserIds.length != 0) {
 		push({
@@ -320,10 +312,10 @@ async function search(
 			sort: {
 				_id: -1
 			},
-			limit: max,
+			limit: limit,
 			skip: offset
 		});
 
 	// Serialize
 	res(await Promise.all(notes.map(note => pack(note, me))));
-}
+});
diff --git a/src/server/api/endpoints/notes/show.ts b/src/server/api/endpoints/notes/show.ts
index 78dc55a703..1ba7145996 100644
--- a/src/server/api/endpoints/notes/show.ts
+++ b/src/server/api/endpoints/notes/show.ts
@@ -1,17 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note, { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Show a note
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'noteId' parameter
 	const [noteId, noteIdErr] = $.type(ID).get(params.noteId);
 	if (noteIdErr) return rej('invalid noteId param');
diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts
index f1d741d5ee..18c0acd379 100644
--- a/src/server/api/endpoints/notes/timeline.ts
+++ b/src/server/api/endpoints/notes/timeline.ts
@@ -1,16 +1,14 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
 import Mute from '../../../../models/mute';
 import { getFriends } from '../../common/get-friends';
 import { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get timeline of myself
  */
-module.exports = async (params, user, app) => {
+module.exports = async (params: any, user: ILocalUser) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
diff --git a/src/server/api/endpoints/notes/trend.ts b/src/server/api/endpoints/notes/trend.ts
index 4735bec51e..9c0a1bb112 100644
--- a/src/server/api/endpoints/notes/trend.ts
+++ b/src/server/api/endpoints/notes/trend.ts
@@ -1,18 +1,12 @@
-/**
- * Module dependencies
- */
 const ms = require('ms');
 import $ from 'cafy';
 import Note, { pack } from '../../../../models/note';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get trend notes
- *
- * @param {any} params
- * @param {any} user
- * @return {Promise<any>}
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts
index a74a5141f9..8aa800b712 100644
--- a/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -1,16 +1,14 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
 import Mute from '../../../../models/mute';
 import { pack } from '../../../../models/note';
 import UserList from '../../../../models/user-list';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get timeline of a user list
  */
-module.exports = async (params, user, app) => {
+module.exports = async (params: any, user: ILocalUser) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
diff --git a/src/server/api/endpoints/notifications/mark_as_read_all.ts b/src/server/api/endpoints/notifications/mark_as_read_all.ts
index 7a48ca3e62..faaaf65a2d 100644
--- a/src/server/api/endpoints/notifications/mark_as_read_all.ts
+++ b/src/server/api/endpoints/notifications/mark_as_read_all.ts
@@ -1,11 +1,11 @@
 import Notification from '../../../../models/notification';
 import event from '../../../../publishers/stream';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 
 /**
  * Mark as read all notifications
  */
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Update documents
 	await Notification.update({
 		notifieeId: user._id,
diff --git a/src/server/api/endpoints/reversi/games.ts b/src/server/api/endpoints/reversi/games.ts
index 9d879ecf23..1455f191f7 100644
--- a/src/server/api/endpoints/reversi/games.ts
+++ b/src/server/api/endpoints/reversi/games.ts
@@ -1,7 +1,8 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import ReversiGame, { pack } from '../../../../models/reversi-game';
+import { ILocalUser } from '../../../../models/user';
 
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'my' parameter
 	const [my = false, myErr] = $.bool.optional().get(params.my);
 	if (myErr) return rej('invalid my param');
diff --git a/src/server/api/endpoints/reversi/games/show.ts b/src/server/api/endpoints/reversi/games/show.ts
index f32eb23513..d70ee547a2 100644
--- a/src/server/api/endpoints/reversi/games/show.ts
+++ b/src/server/api/endpoints/reversi/games/show.ts
@@ -1,8 +1,9 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import ReversiGame, { pack } from '../../../../../models/reversi-game';
 import Reversi from '../../../../../reversi/core';
+import { ILocalUser } from '../../../../../models/user';
 
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'gameId' parameter
 	const [gameId, gameIdErr] = $.type(ID).get(params.gameId);
 	if (gameIdErr) return rej('invalid gameId param');
diff --git a/src/server/api/endpoints/reversi/invitations.ts b/src/server/api/endpoints/reversi/invitations.ts
index fc487205a9..d7727071ae 100644
--- a/src/server/api/endpoints/reversi/invitations.ts
+++ b/src/server/api/endpoints/reversi/invitations.ts
@@ -1,6 +1,7 @@
 import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
+import { ILocalUser } from '../../../../models/user';
 
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Find session
 	const invitations = await Matching.find({
 		childId: user._id
diff --git a/src/server/api/endpoints/reversi/match.ts b/src/server/api/endpoints/reversi/match.ts
index 5a699ddbae..907df7cf43 100644
--- a/src/server/api/endpoints/reversi/match.ts
+++ b/src/server/api/endpoints/reversi/match.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
 import ReversiGame, { pack as packGame } from '../../../../models/reversi-game';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import publishUserStream, { publishReversiStream } from '../../../../publishers/stream';
 import { eighteight } from '../../../../reversi/maps';
 
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [childId, childIdErr] = $.type(ID).get(params.userId);
 	if (childIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/reversi/match/cancel.ts b/src/server/api/endpoints/reversi/match/cancel.ts
index bc8a4cd640..1c9c799dbe 100644
--- a/src/server/api/endpoints/reversi/match/cancel.ts
+++ b/src/server/api/endpoints/reversi/match/cancel.ts
@@ -1,6 +1,7 @@
 import Matching from '../../../../../models/reversi-matching';
+import { ILocalUser } from '../../../../../models/user';
 
-module.exports = (params, user) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	await Matching.remove({
 		parentId: user._id
 	});
diff --git a/src/server/api/endpoints/sw/register.ts b/src/server/api/endpoints/sw/register.ts
index b22a8b08ef..f04a77fa4d 100644
--- a/src/server/api/endpoints/sw/register.ts
+++ b/src/server/api/endpoints/sw/register.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import Subscription from '../../../../models/sw-subscription';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * subscribe service worker
  */
-module.exports = async (params, user, app) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'endpoint' parameter
 	const [endpoint, endpointErr] = $.str.get(params.endpoint);
 	if (endpointErr) return rej('invalid endpoint param');
diff --git a/src/server/api/endpoints/username/available.ts b/src/server/api/endpoints/username/available.ts
index b11bec4e58..aad3adc514 100644
--- a/src/server/api/endpoints/username/available.ts
+++ b/src/server/api/endpoints/username/available.ts
@@ -1,17 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import User from '../../../../models/user';
 import { validateUsername } from '../../../../models/user';
 
 /**
  * Check available username
- *
- * @param {any} params
- * @return {Promise<any>}
  */
-module.exports = async (params) => new Promise(async (res, rej) => {
+module.exports = async (params: any) => new Promise(async (res, rej) => {
 	// Get 'username' parameter
 	const [username, usernameError] = $.str.pipe(validateUsername).get(params.username);
 	if (usernameError) return rej('invalid username param');
diff --git a/src/server/api/endpoints/users.ts b/src/server/api/endpoints/users.ts
index eb581cb7e6..b8df6f3ecf 100644
--- a/src/server/api/endpoints/users.ts
+++ b/src/server/api/endpoints/users.ts
@@ -1,13 +1,10 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
-import User, { pack } from '../../../models/user';
+import User, { pack, ILocalUser } from '../../../models/user';
 
 /**
  * Lists all users
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts
index 810cd7341b..53133ee969 100644
--- a/src/server/api/endpoints/users/followers.ts
+++ b/src/server/api/endpoints/users/followers.ts
@@ -1,8 +1,5 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import Following from '../../../../models/following';
 import { pack } from '../../../../models/user';
 import { getFriendIds } from '../../common/get-friends';
@@ -10,7 +7,7 @@ import { getFriendIds } from '../../common/get-friends';
 /**
  * Get followers of a user
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/users/following.ts b/src/server/api/endpoints/users/following.ts
index 3373b9d632..2061200198 100644
--- a/src/server/api/endpoints/users/following.ts
+++ b/src/server/api/endpoints/users/following.ts
@@ -1,20 +1,13 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 import Following from '../../../../models/following';
 import { pack } from '../../../../models/user';
 import { getFriendIds } from '../../common/get-friends';
 
 /**
  * Get following users of a user
- *
- * @param {any} params
- * @param {any} me
- * @return {Promise<any>}
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/users/get_frequently_replied_users.ts b/src/server/api/endpoints/users/get_frequently_replied_users.ts
index 64d737a06b..ba8779d334 100644
--- a/src/server/api/endpoints/users/get_frequently_replied_users.ts
+++ b/src/server/api/endpoints/users/get_frequently_replied_users.ts
@@ -1,11 +1,8 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import Note from '../../../../models/note';
-import User, { pack } from '../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../models/user';
 
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
@@ -64,7 +61,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
 		}
 	});
 
-	const repliedUsers = {};
+	const repliedUsers: any = {};
 
 	// Extract replies from recent notes
 	replyTargetNotes.forEach(note => {
diff --git a/src/server/api/endpoints/users/lists/create.ts b/src/server/api/endpoints/users/lists/create.ts
index 100a78b872..cdd1a0d813 100644
--- a/src/server/api/endpoints/users/lists/create.ts
+++ b/src/server/api/endpoints/users/lists/create.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
 import UserList, { pack } from '../../../../../models/user-list';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Create a user list
  */
-module.exports = async (params, user) => new Promise(async (res, rej) => {
+module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'title' parameter
 	const [title, titleErr] = $.str.range(1, 100).get(params.title);
 	if (titleErr) return rej('invalid title param');
diff --git a/src/server/api/endpoints/users/lists/list.ts b/src/server/api/endpoints/users/lists/list.ts
index d19339a1f5..bf8391d863 100644
--- a/src/server/api/endpoints/users/lists/list.ts
+++ b/src/server/api/endpoints/users/lists/list.ts
@@ -1,9 +1,10 @@
 import UserList, { pack } from '../../../../../models/user-list';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Add a user to a user list
  */
-module.exports = async (params, me) => new Promise(async (res, rej) => {
+module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Fetch lists
 	const userLists = await UserList.find({
 		userId: me._id,
diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts
index da5a9a134c..d8a3b3c9aa 100644
--- a/src/server/api/endpoints/users/lists/push.ts
+++ b/src/server/api/endpoints/users/lists/push.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import UserList from '../../../../../models/user-list';
-import User, { pack as packUser, isRemoteUser, getGhost } from '../../../../../models/user';
+import User, { pack as packUser, isRemoteUser, getGhost, ILocalUser } from '../../../../../models/user';
 import { publishUserListStream } from '../../../../../publishers/stream';
 import ap from '../../../../../remote/activitypub/renderer';
 import renderFollow from '../../../../../remote/activitypub/renderer/follow';
@@ -9,7 +9,7 @@ import { deliver } from '../../../../../queue';
 /**
  * Add a user to a user list
  */
-module.exports = async (params, me) => new Promise(async (res, rej) => {
+module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'listId' parameter
 	const [listId, listIdErr] = $.type(ID).get(params.listId);
 	if (listIdErr) return rej('invalid listId param');
diff --git a/src/server/api/endpoints/users/lists/show.ts b/src/server/api/endpoints/users/lists/show.ts
index 16cb3382fd..e4ae239613 100644
--- a/src/server/api/endpoints/users/lists/show.ts
+++ b/src/server/api/endpoints/users/lists/show.ts
@@ -1,10 +1,11 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import UserList, { pack } from '../../../../../models/user-list';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Show a user list
  */
-module.exports = async (params, me) => new Promise(async (res, rej) => {
+module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'listId' parameter
 	const [listId, listIdErr] = $.type(ID).get(params.listId);
 	if (listIdErr) return rej('invalid listId param');
diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts
index 061c363d0f..222a8d950a 100644
--- a/src/server/api/endpoints/users/notes.ts
+++ b/src/server/api/endpoints/users/notes.ts
@@ -1,15 +1,12 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import getHostLower from '../../common/get-host-lower';
 import Note, { pack } from '../../../../models/note';
-import User from '../../../../models/user';
+import User, { ILocalUser } from '../../../../models/user';
 
 /**
  * Get notes of a user
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'userId' parameter
 	const [userId, userIdErr] = $.type(ID).optional().get(params.userId);
 	if (userIdErr) return rej('invalid userId param');
diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts
index 23821a552f..1d0d889f11 100644
--- a/src/server/api/endpoints/users/recommendation.ts
+++ b/src/server/api/endpoints/users/recommendation.ts
@@ -1,20 +1,13 @@
-/**
- * Module dependencies
- */
 const ms = require('ms');
 import $ from 'cafy';
-import User, { pack } from '../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../models/user';
 import { getFriendIds } from '../../common/get-friends';
 import Mute from '../../../../models/mute';
 
 /**
  * Get recommended users
- *
- * @param {any} params
- * @param {any} me
- * @return {Promise<any>}
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts
index 95b9e4f4bb..e29c8d32f1 100644
--- a/src/server/api/endpoints/users/search.ts
+++ b/src/server/api/endpoints/users/search.ts
@@ -1,40 +1,19 @@
-/**
- * Module dependencies
- */
-import * as mongo from 'mongodb';
 import $ from 'cafy';
-import User, { pack } from '../../../../models/user';
-import config from '../../../../config';
+import User, { pack, ILocalUser } from '../../../../models/user';
 const escapeRegexp = require('escape-regexp');
 
 /**
  * Search a user
- *
- * @param {any} params
- * @param {any} me
- * @return {Promise<any>}
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'query' parameter
 	const [query, queryError] = $.str.pipe(x => x != '').get(params.query);
 	if (queryError) return rej('invalid query param');
 
-	// Get 'offset' parameter
-	const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset);
-	if (offsetErr) return rej('invalid offset param');
-
 	// Get 'max' parameter
 	const [max = 10, maxErr] = $.num.optional().range(1, 30).get(params.max);
 	if (maxErr) return rej('invalid max param');
 
-	// If Elasticsearch is available, search by $
-	// If not, search by MongoDB
-	(config.elasticsearch.enable ? byElasticsearch : byNative)
-		(res, rej, me, query, offset, max);
-});
-
-// Search by MongoDB
-async function byNative(res, rej, me, query, offset, max) {
 	const escapedQuery = escapeRegexp(query);
 
 	// Search users
@@ -51,49 +30,5 @@ async function byNative(res, rej, me, query, offset, max) {
 		});
 
 	// Serialize
-	res(await Promise.all(users.map(async user =>
-		await pack(user, me, { detail: true }))));
-}
-
-// Search by Elasticsearch
-async function byElasticsearch(res, rej, me, query, offset, max) {
-	const es = require('../../db/elasticsearch');
-
-	es.search({
-		index: 'misskey',
-		type: 'user',
-		body: {
-			size: max,
-			from: offset,
-			query: {
-				simple_query_string: {
-					fields: ['username', 'name', 'bio'],
-					query: query,
-					default_operator: 'and'
-				}
-			}
-		}
-	}, async (error, response) => {
-		if (error) {
-			console.error(error);
-			return res(500);
-		}
-
-		if (response.hits.total === 0) {
-			return res([]);
-		}
-
-		const hits = response.hits.hits.map(hit => new mongo.ObjectID(hit._id));
-
-		const users = await User
-			.find({
-				_id: {
-					$in: hits
-				}
-			});
-
-		// Serialize
-		res(await Promise.all(users.map(async user =>
-			await pack(user, me, { detail: true }))));
-	});
-}
+	res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
+});
diff --git a/src/server/api/endpoints/users/search_by_username.ts b/src/server/api/endpoints/users/search_by_username.ts
index 7c9fbba0fa..937f9af589 100644
--- a/src/server/api/endpoints/users/search_by_username.ts
+++ b/src/server/api/endpoints/users/search_by_username.ts
@@ -1,13 +1,10 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy';
-import User, { pack } from '../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../models/user';
 
 /**
  * Search a user by username
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'query' parameter
 	const [query, queryError] = $.str.get(params.query);
 	if (queryError) return rej('invalid query param');
diff --git a/src/server/api/endpoints/users/show.ts b/src/server/api/endpoints/users/show.ts
index b8c6ff25c4..bf7e2a2312 100644
--- a/src/server/api/endpoints/users/show.ts
+++ b/src/server/api/endpoints/users/show.ts
@@ -1,8 +1,5 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
-import User, { pack } from '../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../models/user';
 import resolveRemoteUser from '../../../../remote/resolve-user';
 
 const cursorOption = { fields: { data: false } };
@@ -10,7 +7,7 @@ const cursorOption = { fields: { data: false } };
 /**
  * Show user(s)
  */
-module.exports = (params, me) => new Promise(async (res, rej) => {
+module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 	let user;
 
 	// Get 'userId' parameter
@@ -49,7 +46,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
 				return rej('failed to resolve remote user');
 			}
 		} else {
-			const q = userId !== undefined
+			const q: any = userId !== undefined
 				? { _id: userId }
 				: { usernameLower: username.toLowerCase(), host: null };
 
diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts
index fee899b374..cb47d400b0 100644
--- a/src/server/api/private/signup.ts
+++ b/src/server/api/private/signup.ts
@@ -1,7 +1,7 @@
 import * as Koa from 'koa';
 import * as bcrypt from 'bcryptjs';
 import { generate as generateKeypair } from '../../../crypto_key';
-import recaptcha = require('recaptcha-promise');
+const recaptcha = require('recaptcha-promise');
 import User, { IUser, validateUsername, validatePassword, pack } from '../../../models/user';
 import generateUserToken from '../common/generate-native-user-token';
 import config from '../../../config';
diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts
index da33648a16..9024740a96 100644
--- a/src/server/api/service/github.ts
+++ b/src/server/api/service/github.ts
@@ -11,7 +11,7 @@ const handler = new EventEmitter();
 
 let bot: IUser;
 
-const post = async text => {
+const post = async (text: string) => {
 	if (bot == null) {
 		const account = await User.findOne({
 			usernameLower: config.github_bot.username.toLowerCase()
@@ -90,7 +90,7 @@ handler.on('push', event => {
 		case 'refs/heads/master':
 			const pusher = event.pusher;
 			const compare = event.compare;
-			const commits = event.commits;
+			const commits: any[] = event.commits;
 			post([
 				`Pushed by **${pusher.name}** with ?[${commits.length} commit${commits.length > 1 ? 's' : ''}](${compare}):`,
 				commits.reverse().map(commit => `・[?[${commit.id.substr(0, 7)}](${commit.url})] ${commit.message.split('\n')[0]}`).join('\n'),
diff --git a/src/server/api/stream/notes-stats.ts b/src/server/api/stream/notes-stats.ts
index 739b325848..ab00620018 100644
--- a/src/server/api/stream/notes-stats.ts
+++ b/src/server/api/stream/notes-stats.ts
@@ -4,7 +4,7 @@ import Xev from 'xev';
 const ev = new Xev();
 
 export default function(request: websocket.request, connection: websocket.connection): void {
-	const onStats = stats => {
+	const onStats = (stats: any) => {
 		connection.send(JSON.stringify({
 			type: 'stats',
 			body: stats
diff --git a/src/server/api/stream/requests.ts b/src/server/api/stream/requests.ts
deleted file mode 100644
index d7bb5e6c5c..0000000000
--- a/src/server/api/stream/requests.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as websocket from 'websocket';
-import Xev from 'xev';
-
-const ev = new Xev();
-
-export default function(request: websocket.request, connection: websocket.connection): void {
-	const onRequest = request => {
-		connection.send(JSON.stringify({
-			type: 'request',
-			body: request
-		}));
-	};
-
-	ev.addListener('request', onRequest);
-
-	connection.on('close', () => {
-		ev.removeListener('request', onRequest);
-	});
-}
diff --git a/src/server/api/stream/reversi-game.ts b/src/server/api/stream/reversi-game.ts
index 63d9b220b0..ea8a9741d2 100644
--- a/src/server/api/stream/reversi-game.ts
+++ b/src/server/api/stream/reversi-game.ts
@@ -61,7 +61,7 @@ export default function(request: websocket.request, connection: websocket.connec
 		}
 	});
 
-	async function updateSettings(settings) {
+	async function updateSettings(settings: any) {
 		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (game.isStarted) return;
@@ -78,7 +78,7 @@ export default function(request: websocket.request, connection: websocket.connec
 		publishReversiGameStream(gameId, 'update-settings', settings);
 	}
 
-	async function initForm(form) {
+	async function initForm(form: any) {
 		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (game.isStarted) return;
@@ -100,7 +100,7 @@ export default function(request: websocket.request, connection: websocket.connec
 		});
 	}
 
-	async function updateForm(id, value) {
+	async function updateForm(id: string, value: any) {
 		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (game.isStarted) return;
@@ -108,7 +108,7 @@ export default function(request: websocket.request, connection: websocket.connec
 
 		const form = game.user1Id.equals(user._id) ? game.form2 : game.form1;
 
-		const item = form.find(i => i.id == id);
+		const item = form.find((i: any) => i.id == id);
 
 		if (item == null) return;
 
@@ -131,7 +131,7 @@ export default function(request: websocket.request, connection: websocket.connec
 		});
 	}
 
-	async function message(message) {
+	async function message(message: any) {
 		message.id = Math.random();
 		publishReversiGameStream(gameId, 'message', {
 			userId: user._id,
@@ -246,7 +246,7 @@ export default function(request: websocket.request, connection: websocket.connec
 	}
 
 	// 石を打つ
-	async function set(pos) {
+	async function set(pos: number) {
 		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (!game.isStarted) return;
@@ -315,7 +315,7 @@ export default function(request: websocket.request, connection: websocket.connec
 		}
 	}
 
-	async function check(crc32) {
+	async function check(crc32: string) {
 		const game = await ReversiGame.findOne({ _id: gameId });
 
 		if (!game.isStarted) return;
diff --git a/src/server/api/stream/server-stats.ts b/src/server/api/stream/server-stats.ts
index 342170a21e..2a058de6c3 100644
--- a/src/server/api/stream/server-stats.ts
+++ b/src/server/api/stream/server-stats.ts
@@ -4,7 +4,7 @@ import Xev from 'xev';
 const ev = new Xev();
 
 export default function(request: websocket.request, connection: websocket.connection): void {
-	const onStats = stats => {
+	const onStats = (stats: any) => {
 		connection.send(JSON.stringify({
 			type: 'stats',
 			body: stats
diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts
index a3e4ed6f85..81adff0b58 100644
--- a/src/server/api/streaming.ts
+++ b/src/server/api/streaming.ts
@@ -14,7 +14,6 @@ import reversiGameStream from './stream/reversi-game';
 import reversiStream from './stream/reversi';
 import serverStatsStream from './stream/server-stats';
 import notesStatsStream from './stream/notes-stats';
-import requestsStream from './stream/requests';
 import { ParsedUrlQuery } from 'querystring';
 import authenticate from './authenticate';
 
@@ -39,11 +38,6 @@ module.exports = (server: http.Server) => {
 			return;
 		}
 
-		if (request.resourceURL.pathname === '/requests') {
-			requestsStream(request, connection);
-			return;
-		}
-
 		// Connect to Redis
 		const subscriber = redis.createClient(
 			config.redis.port, config.redis.host);
diff --git a/src/server/index.ts b/src/server/index.ts
index fc3d252e10..f1fcf58c8d 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -62,7 +62,7 @@ app.use(mount(require('./web')));
 
 function createServer() {
 	if (config.https) {
-		const certs = {};
+		const certs: any = {};
 		Object.keys(config.https).forEach(k => {
 			certs[k] = fs.readFileSync(config.https[k]);
 		});
diff --git a/webpack.config.ts b/webpack.config.ts
index 480f5d4a7a..3c426ebb49 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -6,7 +6,7 @@ import * as fs from 'fs';
 import * as webpack from 'webpack';
 import chalk from 'chalk';
 const { VueLoaderPlugin } = require('vue-loader');
-import jsonImporter from 'node-sass-json-importer';
+const jsonImporter = require('node-sass-json-importer');
 const minifyHtml = require('html-minifier').minify;
 const WebpackOnBuildPlugin = require('on-build-webpack');
 //const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
@@ -24,10 +24,17 @@ const meta = require('./package.json');
 const version = meta.clientVersion;
 const codename = meta.codename;
 
+declare var global: {
+	faReplacement: typeof faReplacement;
+	collapseSpacesReplacement: any;
+	base64replacement: any;
+	i18nReplacement: typeof i18nReplacement;
+};
+
 //#region Replacer definitions
 global['faReplacement'] = faReplacement;
 
-global['collapseSpacesReplacement'] = html => {
+global['collapseSpacesReplacement'] = (html: string) => {
 	return minifyHtml(html, {
 		collapseWhitespace: true,
 		collapseInlineTagWhitespace: true,
@@ -35,7 +42,7 @@ global['collapseSpacesReplacement'] = html => {
 	}).replace(/\t/g, '');
 };
 
-global['base64replacement'] = (_, key) => {
+global['base64replacement'] = (_: any, key: string) => {
 	return fs.readFileSync(__dirname + '/src/client/' + key, 'base64');
 };
 
@@ -89,10 +96,10 @@ const consts = {
 	_WELCOME_BG_URL_: config.welcome_bg_url
 };
 
-const _consts = {};
+const _consts: { [ key: string ]: any } = {};
 
 Object.keys(consts).forEach(key => {
-	_consts[key] = JSON.stringify(consts[key]);
+	_consts[key] = JSON.stringify((consts as any)[key]);
 });
 //#endregion
 
@@ -106,7 +113,7 @@ const plugins = [
 	new webpack.DefinePlugin({
 		'process.env.NODE_ENV': JSON.stringify(isProduction ? 'production' : 'development')
 	}),
-	new WebpackOnBuildPlugin(stats => {
+	new WebpackOnBuildPlugin((stats: any) => {
 		fs.writeFileSync('./built/client/meta.json', JSON.stringify({
 			version
 		}), 'utf-8');
diff --git a/webpack/i18n.ts b/webpack/i18n.ts
index e2cce060e8..f73af72584 100644
--- a/webpack/i18n.ts
+++ b/webpack/i18n.ts
@@ -4,7 +4,7 @@
 
 export const pattern = /%i18n:([a-z0-9_\-@\.]+?)%/g;
 
-export const replacement = (ctx, match, key) => {
+export const replacement = (ctx: any, _: any, key: string) => {
 	const client = '/src/client/app/';
 	let name = null;
 

From e66d7babc5ae477d7a60628e5599f9c390426c81 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 18 Jun 2018 14:28:43 +0900
Subject: [PATCH 369/369] yatta

---
 src/acct/render.ts                            |  2 +-
 src/build/i18n.ts                             |  2 +-
 src/models/note.ts                            |  4 ++--
 src/models/user.ts                            |  2 +-
 src/parse-opt.ts                              |  2 +-
 src/publishers/push-sw.ts                     |  4 ++--
 src/queue/index.ts                            |  4 ++--
 src/queue/processors/http/deliver.ts          |  2 +-
 src/queue/processors/http/index.ts            |  4 ++--
 src/queue/processors/http/process-inbox.ts    |  8 +++----
 src/remote/activitypub/kernel/accept/index.ts |  4 ++--
 .../activitypub/kernel/announce/index.ts      |  4 ++--
 .../activitypub/kernel/announce/note.ts       |  4 ++--
 src/remote/activitypub/kernel/create/image.ts |  2 +-
 src/remote/activitypub/kernel/create/note.ts  |  2 +-
 src/remote/activitypub/kernel/delete/index.ts |  3 ++-
 src/remote/activitypub/kernel/reject/index.ts |  4 ++--
 src/remote/activitypub/kernel/undo/index.ts   |  4 ++--
 src/remote/activitypub/misc/get-note-html.ts  |  2 +-
 src/remote/activitypub/models/image.ts        |  2 +-
 src/remote/activitypub/models/note.ts         | 24 +++++++++----------
 src/remote/activitypub/renderer/accept.ts     |  2 +-
 src/remote/activitypub/renderer/announce.ts   |  2 +-
 src/remote/activitypub/renderer/create.ts     |  2 +-
 src/remote/activitypub/renderer/delete.ts     |  2 +-
 src/remote/activitypub/renderer/document.ts   |  7 +++---
 src/remote/activitypub/renderer/image.ts      |  5 ++--
 src/remote/activitypub/renderer/like.ts       |  3 ++-
 src/remote/activitypub/renderer/mention.ts    |  4 ++--
 src/remote/activitypub/renderer/note.ts       |  6 ++---
 src/remote/activitypub/renderer/person.ts     |  4 ++--
 src/remote/activitypub/renderer/undo.ts       |  2 +-
 src/remote/activitypub/resolver.ts            |  4 ++--
 src/remote/resolve-user.ts                    |  2 +-
 src/server/api/endpoints/aggregation/posts.ts | 10 ++++----
 .../endpoints/drive/files/upload_from_url.ts  |  3 ++-
 src/server/api/endpoints/drive/folders.ts     |  6 ++---
 src/services/drive/delete-file.ts             |  2 +-
 src/services/drive/upload-from-url.ts         |  2 +-
 src/services/following/requests/accept-all.ts |  4 ++--
 src/services/following/requests/accept.ts     | 10 ++++----
 src/services/following/requests/cancel.ts     |  4 ++--
 src/services/following/requests/reject.ts     |  4 ++--
 src/text/html.ts                              |  2 +-
 src/text/parse/elements/bold.ts               |  2 +-
 src/text/parse/elements/code.ts               |  2 +-
 src/text/parse/elements/emoji.ts              |  2 +-
 src/text/parse/elements/hashtag.ts            |  2 +-
 src/text/parse/elements/inline-code.ts        |  2 +-
 src/text/parse/elements/link.ts               |  2 +-
 src/text/parse/elements/mention.ts            |  2 +-
 src/text/parse/elements/quote.ts              |  2 +-
 src/text/parse/elements/search.ts             |  2 +-
 src/text/parse/elements/title.ts              |  2 +-
 src/text/parse/elements/url.ts                |  2 +-
 src/text/parse/index.ts                       | 24 +++++++++----------
 56 files changed, 115 insertions(+), 112 deletions(-)

diff --git a/src/acct/render.ts b/src/acct/render.ts
index 191034361d..c29bfb4764 100644
--- a/src/acct/render.ts
+++ b/src/acct/render.ts
@@ -1,4 +1,4 @@
-import { IUser } from "../models/user";
+import { IUser } from '../models/user';
 
 export default (user: IUser) => {
 	return user.host === null ? user.username : `${user.username}@${user.host}`;
diff --git a/src/build/i18n.ts b/src/build/i18n.ts
index f7602dfd17..dc48251c95 100644
--- a/src/build/i18n.ts
+++ b/src/build/i18n.ts
@@ -48,7 +48,7 @@ export default class Replacer {
 		if (error) {
 			console.warn(`key '${key}' not found in '${path}' of '${this.lang}'`);
 			return key; // Fallback
-		} else if (typeof text !== "string") {
+		} else if (typeof text !== 'string') {
 			console.warn(`key '${key}' is not string in '${path}' of '${this.lang}'`);
 			return key; // Fallback
 		} else {
diff --git a/src/models/note.ts b/src/models/note.ts
index 83cd93353b..af6f6f7c01 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -220,7 +220,7 @@ export const pack = async (
 			hide = false;
 		} else {
 			// 指定されているかどうか
-			const specified = _note.visibleUserIds.some(id => id.equals(meId));
+			const specified = _note.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId));
 
 			if (specified) {
 				hide = false;
@@ -272,7 +272,7 @@ export const pack = async (
 	}
 
 	// Populate media
-	_note.media = hide ? [] : Promise.all(_note.mediaIds.map(fileId =>
+	_note.media = hide ? [] : Promise.all(_note.mediaIds.map((fileId: mongo.ObjectID) =>
 		packFile(fileId)
 	));
 
diff --git a/src/models/user.ts b/src/models/user.ts
index 942faeeff4..0d1be439e9 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -1,6 +1,6 @@
 import * as mongo from 'mongodb';
 const deepcopy = require('deepcopy');
-import sequential = require('promise-sequential');
+const sequential = require('promise-sequential');
 import rap from '@prezzemolo/rap';
 import db from '../db/mongodb';
 import Note, { pack as packNote, deleteNote } from './note';
diff --git a/src/parse-opt.ts b/src/parse-opt.ts
index 031b1a6fe2..29e5959c3e 100644
--- a/src/parse-opt.ts
+++ b/src/parse-opt.ts
@@ -1,6 +1,6 @@
 import * as nopt from 'nopt';
 
-export default (vector, index) => {
+export default (vector: any, index: any) => {
 	const parsed = nopt({
 		'only-processor': Boolean,
 		'only-server': Boolean
diff --git a/src/publishers/push-sw.ts b/src/publishers/push-sw.ts
index aab91df62f..b0b4701155 100644
--- a/src/publishers/push-sw.ts
+++ b/src/publishers/push-sw.ts
@@ -11,7 +11,7 @@ if (config.sw) {
 		config.sw.private_key);
 }
 
-export default async function(userId: mongo.ObjectID | string, type, body?) {
+export default async function(userId: mongo.ObjectID | string, type: string, body?: any) {
 	if (!config.sw) return;
 
 	if (typeof userId === 'string') {
@@ -34,7 +34,7 @@ export default async function(userId: mongo.ObjectID | string, type, body?) {
 
 		push.sendNotification(pushSubscription, JSON.stringify({
 			type, body
-		})).catch(err => {
+		})).catch((err: any) => {
 			//console.log(err.statusCode);
 			//console.log(err.headers);
 			//console.log(err.body);
diff --git a/src/queue/index.ts b/src/queue/index.ts
index 3f82b30b35..1efd6e54ef 100644
--- a/src/queue/index.ts
+++ b/src/queue/index.ts
@@ -12,7 +12,7 @@ const queue = createQueue({
 	}
 });
 
-export function createHttp(data) {
+export function createHttp(data: any) {
 	return queue
 		.create('http', data)
 		.removeOnComplete(true)
@@ -21,7 +21,7 @@ export function createHttp(data) {
 		.backoff({ delay: 16384, type: 'exponential' });
 }
 
-export function deliver(user: ILocalUser, content, to) {
+export function deliver(user: ILocalUser, content: any, to: any) {
 	createHttp({
 		title: 'deliver',
 		type: 'deliver',
diff --git a/src/queue/processors/http/deliver.ts b/src/queue/processors/http/deliver.ts
index 2c4bbe9bf0..946d2f65bd 100644
--- a/src/queue/processors/http/deliver.ts
+++ b/src/queue/processors/http/deliver.ts
@@ -2,7 +2,7 @@ import * as kue from 'kue';
 
 import request from '../../../remote/activitypub/request';
 
-export default async (job: kue.Job, done): Promise<void> => {
+export default async (job: kue.Job, done: any): Promise<void> => {
 	try {
 		await request(job.data.user, job.data.to, job.data.content);
 		done();
diff --git a/src/queue/processors/http/index.ts b/src/queue/processors/http/index.ts
index 6f8d1dbc2b..156be42250 100644
--- a/src/queue/processors/http/index.ts
+++ b/src/queue/processors/http/index.ts
@@ -1,12 +1,12 @@
 import deliver from './deliver';
 import processInbox from './process-inbox';
 
-const handlers = {
+const handlers: any = {
 	deliver,
 	processInbox,
 };
 
-export default (job, done) => {
+export default (job: any, done: any) => {
 	const handler = handlers[job.data.type];
 
 	if (handler) {
diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts
index dfafe64a78..0da442aefb 100644
--- a/src/queue/processors/http/process-inbox.ts
+++ b/src/queue/processors/http/process-inbox.ts
@@ -10,7 +10,7 @@ import { resolvePerson } from '../../../remote/activitypub/models/person';
 const log = debug('misskey:queue:inbox');
 
 // ユーザーのinboxにアクティビティが届いた時の処理
-export default async (job: kue.Job, done): Promise<void> => {
+export default async (job: kue.Job, done: any): Promise<void> => {
 	const signature = job.data.signature;
 	const activity = job.data.activity;
 
@@ -22,7 +22,7 @@ export default async (job: kue.Job, done): Promise<void> => {
 	//#endregion
 
 	const keyIdLower = signature.keyId.toLowerCase();
-	let user;
+	let user: IRemoteUser;
 
 	if (keyIdLower.startsWith('acct:')) {
 		const { username, host } = parseAcct(keyIdLower.slice('acct:'.length));
@@ -36,7 +36,7 @@ export default async (job: kue.Job, done): Promise<void> => {
 
 		// アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する
 		if (user === null) {
-			user = await resolvePerson(activity.actor);
+			user = await resolvePerson(activity.actor) as IRemoteUser;
 		}
 	} else {
 		user = await User.findOne({
@@ -46,7 +46,7 @@ export default async (job: kue.Job, done): Promise<void> => {
 
 		// アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する
 		if (user === null) {
-			user = await resolvePerson(signature.keyId);
+			user = await resolvePerson(signature.keyId) as IRemoteUser;
 		}
 	}
 
diff --git a/src/remote/activitypub/kernel/accept/index.ts b/src/remote/activitypub/kernel/accept/index.ts
index 2f9d646d14..572a254d9a 100644
--- a/src/remote/activitypub/kernel/accept/index.ts
+++ b/src/remote/activitypub/kernel/accept/index.ts
@@ -3,7 +3,7 @@ import * as debug from 'debug';
 import Resolver from '../../resolver';
 import { IRemoteUser } from '../../../../models/user';
 import acceptFollow from './follow';
-import { IAccept } from '../../type';
+import { IAccept, IFollow } from '../../type';
 
 const log = debug('misskey:activitypub');
 
@@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => {
 
 	switch (object.type) {
 	case 'Follow':
-		acceptFollow(actor, object);
+		acceptFollow(actor, object as IFollow);
 		break;
 
 	default:
diff --git a/src/remote/activitypub/kernel/announce/index.ts b/src/remote/activitypub/kernel/announce/index.ts
index a2cf2d5762..612b5dee84 100644
--- a/src/remote/activitypub/kernel/announce/index.ts
+++ b/src/remote/activitypub/kernel/announce/index.ts
@@ -3,7 +3,7 @@ import * as debug from 'debug';
 import Resolver from '../../resolver';
 import { IRemoteUser } from '../../../../models/user';
 import announceNote from './note';
-import { IAnnounce } from '../../type';
+import { IAnnounce, INote } from '../../type';
 
 const log = debug('misskey:activitypub');
 
@@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAnnounce): Promise<void> =>
 
 	switch (object.type) {
 	case 'Note':
-		announceNote(resolver, actor, activity, object);
+		announceNote(resolver, actor, activity, object as INote);
 		break;
 
 	default:
diff --git a/src/remote/activitypub/kernel/announce/note.ts b/src/remote/activitypub/kernel/announce/note.ts
index e258567389..7aa6aa5707 100644
--- a/src/remote/activitypub/kernel/announce/note.ts
+++ b/src/remote/activitypub/kernel/announce/note.ts
@@ -2,7 +2,7 @@ import * as debug from 'debug';
 
 import Resolver from '../../resolver';
 import post from '../../../../services/note/create';
-import { IRemoteUser } from '../../../../models/user';
+import { IRemoteUser, IUser } from '../../../../models/user';
 import { IAnnounce, INote } from '../../type';
 import { fetchNote, resolveNote } from '../../models/note';
 import { resolvePerson } from '../../models/person';
@@ -36,7 +36,7 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity:
 
 	//#region Visibility
 	let visibility = 'public';
-	let visibleUsers = [];
+	let visibleUsers: IUser[] = [];
 	if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
 		if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
 			visibility = 'home';
diff --git a/src/remote/activitypub/kernel/create/image.ts b/src/remote/activitypub/kernel/create/image.ts
index 2a55522220..9c19abbcc4 100644
--- a/src/remote/activitypub/kernel/create/image.ts
+++ b/src/remote/activitypub/kernel/create/image.ts
@@ -1,6 +1,6 @@
 import { IRemoteUser } from '../../../../models/user';
 import { createImage } from '../../models/image';
 
-export default async function(actor: IRemoteUser, image): Promise<void> {
+export default async function(actor: IRemoteUser, image: any): Promise<void> {
 	await createImage(image.url, actor);
 }
diff --git a/src/remote/activitypub/kernel/create/note.ts b/src/remote/activitypub/kernel/create/note.ts
index ed9fb6e54c..0f874b9fbf 100644
--- a/src/remote/activitypub/kernel/create/note.ts
+++ b/src/remote/activitypub/kernel/create/note.ts
@@ -5,7 +5,7 @@ import { createNote, fetchNote } from '../../models/note';
 /**
  * 投稿作成アクティビティを捌きます
  */
-export default async function(resolver: Resolver, actor: IRemoteUser, note, silent = false): Promise<void> {
+export default async function(resolver: Resolver, actor: IRemoteUser, note: any, silent = false): Promise<void> {
 	const exist = await fetchNote(note);
 	if (exist == null) {
 		await createNote(note);
diff --git a/src/remote/activitypub/kernel/delete/index.ts b/src/remote/activitypub/kernel/delete/index.ts
index 10b47dc4ca..5d7a23584f 100644
--- a/src/remote/activitypub/kernel/delete/index.ts
+++ b/src/remote/activitypub/kernel/delete/index.ts
@@ -2,11 +2,12 @@ import Resolver from '../../resolver';
 import deleteNote from './note';
 import Note from '../../../../models/note';
 import { IRemoteUser } from '../../../../models/user';
+import { IDelete } from '../../type';
 
 /**
  * 削除アクティビティを捌きます
  */
-export default async (actor: IRemoteUser, activity): Promise<void> => {
+export default async (actor: IRemoteUser, activity: IDelete): Promise<void> => {
 	if ('actor' in activity && actor.uri !== activity.actor) {
 		throw new Error('invalid actor');
 	}
diff --git a/src/remote/activitypub/kernel/reject/index.ts b/src/remote/activitypub/kernel/reject/index.ts
index a82c3fd61e..d89985c238 100644
--- a/src/remote/activitypub/kernel/reject/index.ts
+++ b/src/remote/activitypub/kernel/reject/index.ts
@@ -3,7 +3,7 @@ import * as debug from 'debug';
 import Resolver from '../../resolver';
 import { IRemoteUser } from '../../../../models/user';
 import rejectFollow from './follow';
-import { IReject } from '../../type';
+import { IReject, IFollow } from '../../type';
 
 const log = debug('misskey:activitypub');
 
@@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IReject): Promise<void> => {
 
 	switch (object.type) {
 	case 'Follow':
-		rejectFollow(actor, object);
+		rejectFollow(actor, object as IFollow);
 		break;
 
 	default:
diff --git a/src/remote/activitypub/kernel/undo/index.ts b/src/remote/activitypub/kernel/undo/index.ts
index 71f547aeb9..5d9535403b 100644
--- a/src/remote/activitypub/kernel/undo/index.ts
+++ b/src/remote/activitypub/kernel/undo/index.ts
@@ -1,7 +1,7 @@
 import * as debug from 'debug';
 
 import { IRemoteUser } from '../../../../models/user';
-import { IUndo } from '../../type';
+import { IUndo, IFollow } from '../../type';
 import unfollow from './follow';
 import Resolver from '../../resolver';
 
@@ -29,7 +29,7 @@ export default async (actor: IRemoteUser, activity: IUndo): Promise<void> => {
 
 	switch (object.type) {
 		case 'Follow':
-			unfollow(actor, object);
+			unfollow(actor, object as IFollow);
 			break;
 	}
 
diff --git a/src/remote/activitypub/misc/get-note-html.ts b/src/remote/activitypub/misc/get-note-html.ts
index 33dd381689..0ceecdd00b 100644
--- a/src/remote/activitypub/misc/get-note-html.ts
+++ b/src/remote/activitypub/misc/get-note-html.ts
@@ -1,4 +1,4 @@
-import { INote } from "../../../models/note";
+import { INote } from '../../../models/note';
 import toHtml from '../../../text/html';
 import parse from '../../../text/parse';
 import config from '../../../config';
diff --git a/src/remote/activitypub/models/image.ts b/src/remote/activitypub/models/image.ts
index 0d5a690c6c..fb17a7c9e5 100644
--- a/src/remote/activitypub/models/image.ts
+++ b/src/remote/activitypub/models/image.ts
@@ -10,7 +10,7 @@ const log = debug('misskey:activitypub');
 /**
  * Imageを作成します。
  */
-export async function createImage(actor: IRemoteUser, value): Promise<IDriveFile> {
+export async function createImage(actor: IRemoteUser, value: any): Promise<IDriveFile> {
 	// 投稿者が凍結されていたらスキップ
 	if (actor.isSuspended) {
 		return null;
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index 974fce433b..b0fe045e6d 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import * as parse5 from 'parse5';
+const parse5 = require('parse5');
 import * as debug from 'debug';
 
 import config from '../../../config';
@@ -9,30 +9,30 @@ import post from '../../../services/note/create';
 import { INote as INoteActivityStreamsObject, IObject } from '../type';
 import { resolvePerson, updatePerson } from './person';
 import { resolveImage } from './image';
-import { IRemoteUser } from '../../../models/user';
+import { IRemoteUser, IUser } from '../../../models/user';
 
 const log = debug('misskey:activitypub');
 
 function parse(html: string): string {
-	const dom = parse5.parseFragment(html) as parse5.AST.Default.Document;
+	const dom = parse5.parseFragment(html);
 
 	let text = '';
 
-	dom.childNodes.forEach(n => analyze(n));
+	dom.childNodes.forEach((n: any) => analyze(n));
 
 	return text.trim();
 
-	function getText(node) {
+	function getText(node: any) {
 		if (node.nodeName == '#text') return node.value;
 
 		if (node.childNodes) {
-			return node.childNodes.map(n => getText(n)).join('');
+			return node.childNodes.map((n: any) => getText(n)).join('');
 		}
 
 		return '';
 	}
 
-	function analyze(node) {
+	function analyze(node: any) {
 		switch (node.nodeName) {
 			case '#text':
 				text += node.value;
@@ -51,7 +51,7 @@ function parse(html: string): string {
 
 					if (part.length == 2) {
 						//#region ホスト名部分が省略されているので復元する
-						const href = new URL(node.attrs.find(x => x.name == 'href').value);
+						const href = new URL(node.attrs.find((x: any) => x.name == 'href').value);
 						const acct = txt + '@' + href.hostname;
 						text += acct;
 						break;
@@ -63,20 +63,20 @@ function parse(html: string): string {
 				}
 
 				if (node.childNodes) {
-					node.childNodes.forEach(n => analyze(n));
+					node.childNodes.forEach((n: any) => analyze(n));
 				}
 				break;
 
 			case 'p':
 				text += '\n\n';
 				if (node.childNodes) {
-					node.childNodes.forEach(n => analyze(n));
+					node.childNodes.forEach((n: any) => analyze(n));
 				}
 				break;
 
 			default:
 				if (node.childNodes) {
-					node.childNodes.forEach(n => analyze(n));
+					node.childNodes.forEach((n: any) => analyze(n));
 				}
 				break;
 		}
@@ -135,7 +135,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
 
 	//#region Visibility
 	let visibility = 'public';
-	let visibleUsers = [];
+	let visibleUsers: IUser[] = [];
 	if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
 		if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
 			visibility = 'home';
diff --git a/src/remote/activitypub/renderer/accept.ts b/src/remote/activitypub/renderer/accept.ts
index 00c76883a9..76326285fd 100644
--- a/src/remote/activitypub/renderer/accept.ts
+++ b/src/remote/activitypub/renderer/accept.ts
@@ -1,4 +1,4 @@
-export default object => ({
+export default (object: any) => ({
 	type: 'Accept',
 	object
 });
diff --git a/src/remote/activitypub/renderer/announce.ts b/src/remote/activitypub/renderer/announce.ts
index 8e4b3d26a6..8c3ff9f113 100644
--- a/src/remote/activitypub/renderer/announce.ts
+++ b/src/remote/activitypub/renderer/announce.ts
@@ -1,4 +1,4 @@
-export default object => ({
+export default (object: any) => ({
 	type: 'Announce',
 	object
 });
diff --git a/src/remote/activitypub/renderer/create.ts b/src/remote/activitypub/renderer/create.ts
index de411e1951..b8bf98a655 100644
--- a/src/remote/activitypub/renderer/create.ts
+++ b/src/remote/activitypub/renderer/create.ts
@@ -1,4 +1,4 @@
-export default object => ({
+export default (object: any) => ({
 	type: 'Create',
 	object
 });
diff --git a/src/remote/activitypub/renderer/delete.ts b/src/remote/activitypub/renderer/delete.ts
index d15cb447e6..f468a22e24 100644
--- a/src/remote/activitypub/renderer/delete.ts
+++ b/src/remote/activitypub/renderer/delete.ts
@@ -1,4 +1,4 @@
-export default object => ({
+export default (object: any) => ({
 	type: 'Delete',
 	object
 });
diff --git a/src/remote/activitypub/renderer/document.ts b/src/remote/activitypub/renderer/document.ts
index 91a9f7df38..1985c6bc8b 100644
--- a/src/remote/activitypub/renderer/document.ts
+++ b/src/remote/activitypub/renderer/document.ts
@@ -1,7 +1,8 @@
 import config from '../../../config';
+import { IDriveFile } from '../../../models/drive-file';
 
-export default ({ _id, contentType }) => ({
+export default (file: IDriveFile) => ({
 	type: 'Document',
-	mediaType: contentType,
-	url: `${config.drive_url}/${_id}`
+	mediaType: file.contentType,
+	url: `${config.drive_url}/${file._id}`
 });
diff --git a/src/remote/activitypub/renderer/image.ts b/src/remote/activitypub/renderer/image.ts
index d671a57e7c..cf91ce3a0c 100644
--- a/src/remote/activitypub/renderer/image.ts
+++ b/src/remote/activitypub/renderer/image.ts
@@ -1,6 +1,7 @@
 import config from '../../../config';
+import { IDriveFile } from '../../../models/drive-file';
 
-export default ({ _id }) => ({
+export default (fileId: IDriveFile['_id']) => ({
 	type: 'Image',
-	url: `${config.drive_url}/${_id}`
+	url: `${config.drive_url}/${fileId}`
 });
diff --git a/src/remote/activitypub/renderer/like.ts b/src/remote/activitypub/renderer/like.ts
index 33e1341a20..523cb4f1ad 100644
--- a/src/remote/activitypub/renderer/like.ts
+++ b/src/remote/activitypub/renderer/like.ts
@@ -1,7 +1,8 @@
 import config from '../../../config';
 import { ILocalUser } from '../../../models/user';
+import { INote } from '../../../models/note';
 
-export default (user: ILocalUser, note, reaction: string) => ({
+export default (user: ILocalUser, note: INote, reaction: string) => ({
 	type: 'Like',
 	actor: `${config.url}/users/${user._id}`,
 	object: note.uri ? note.uri : `${config.url}/notes/${note._id}`,
diff --git a/src/remote/activitypub/renderer/mention.ts b/src/remote/activitypub/renderer/mention.ts
index 95cae52aa2..8d12e6d8bf 100644
--- a/src/remote/activitypub/renderer/mention.ts
+++ b/src/remote/activitypub/renderer/mention.ts
@@ -1,5 +1,5 @@
-import { IUser, isRemoteUser } from "../../../models/user";
-import config from "../../../config";
+import { IUser, isRemoteUser } from '../../../models/user';
+import config from '../../../config';
 
 export default (mention: IUser) => ({
 	type: 'Mention',
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index 556054fa93..b908f8bb1e 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -2,13 +2,13 @@ import renderDocument from './document';
 import renderHashtag from './hashtag';
 import renderMention from './mention';
 import config from '../../../config';
-import DriveFile from '../../../models/drive-file';
+import DriveFile, { IDriveFile } from '../../../models/drive-file';
 import Note, { INote } from '../../../models/note';
 import User from '../../../models/user';
 import toHtml from '../misc/get-note-html';
 
-export default async function renderNote(note: INote, dive = true) {
-	const promisedFiles = note.mediaIds
+export default async function renderNote(note: INote, dive = true): Promise<any> {
+	const promisedFiles: Promise<IDriveFile[]> = note.mediaIds
 		? DriveFile.find({ _id: { $in: note.mediaIds } })
 		: Promise.resolve([]);
 
diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts
index b2ac885f46..8825c56c25 100644
--- a/src/remote/activitypub/renderer/person.ts
+++ b/src/remote/activitypub/renderer/person.ts
@@ -16,8 +16,8 @@ export default (user: ILocalUser) => {
 		preferredUsername: user.username,
 		name: user.name,
 		summary: user.description,
-		icon: user.avatarId && renderImage({ _id: user.avatarId }),
-		image: user.bannerId && renderImage({ _id: user.bannerId }),
+		icon: user.avatarId && renderImage(user.avatarId),
+		image: user.bannerId && renderImage(user.bannerId),
 		manuallyApprovesFollowers: user.isLocked,
 		publicKey: renderKey(user)
 	};
diff --git a/src/remote/activitypub/renderer/undo.ts b/src/remote/activitypub/renderer/undo.ts
index f38e224b60..4498409a57 100644
--- a/src/remote/activitypub/renderer/undo.ts
+++ b/src/remote/activitypub/renderer/undo.ts
@@ -1,4 +1,4 @@
-export default object => ({
+export default (object: any) => ({
 	type: 'Undo',
 	object
 });
diff --git a/src/remote/activitypub/resolver.ts b/src/remote/activitypub/resolver.ts
index f405ff10c3..0b053ca774 100644
--- a/src/remote/activitypub/resolver.ts
+++ b/src/remote/activitypub/resolver.ts
@@ -12,7 +12,7 @@ export default class Resolver {
 		this.history = new Set();
 	}
 
-	public async resolveCollection(value) {
+	public async resolveCollection(value: any) {
 		const collection = typeof value === 'string'
 			? await this.resolve(value)
 			: value;
@@ -33,7 +33,7 @@ export default class Resolver {
 		return collection;
 	}
 
-	public async resolve(value): Promise<IObject> {
+	public async resolve(value: any): Promise<IObject> {
 		if (value == null) {
 			throw new Error('resolvee is null (or undefined)');
 		}
diff --git a/src/remote/resolve-user.ts b/src/remote/resolve-user.ts
index c612a8c949..1e8fc5d750 100644
--- a/src/remote/resolve-user.ts
+++ b/src/remote/resolve-user.ts
@@ -4,7 +4,7 @@ import webFinger from './webfinger';
 import config from '../config';
 import { createPerson } from './activitypub/models/person';
 
-export default async (username, _host, option?): Promise<IUser> => {
+export default async (username: string, _host: string, option?: any): Promise<IUser> => {
 	const usernameLower = username.toLowerCase();
 
 	if (_host == null) {
diff --git a/src/server/api/endpoints/aggregation/posts.ts b/src/server/api/endpoints/aggregation/posts.ts
index 9ada9cd3f5..48e344312d 100644
--- a/src/server/api/endpoints/aggregation/posts.ts
+++ b/src/server/api/endpoints/aggregation/posts.ts
@@ -49,13 +49,13 @@ module.exports = (params: any) => new Promise(async (res, rej) => {
 			} }
 		]);
 
-	datas.forEach(data => {
+	datas.forEach((data: any) => {
 		data.date = data._id;
 		delete data._id;
 
-		data.notes = (data.data.filter(x => x.type == 'note')[0] || { count: 0 }).count;
-		data.renotes = (data.data.filter(x => x.type == 'renote')[0] || { count: 0 }).count;
-		data.replies = (data.data.filter(x => x.type == 'reply')[0] || { count: 0 }).count;
+		data.notes = (data.data.filter((x: any) => x.type == 'note')[0] || { count: 0 }).count;
+		data.renotes = (data.data.filter((x: any) => x.type == 'renote')[0] || { count: 0 }).count;
+		data.replies = (data.data.filter((x: any) => x.type == 'reply')[0] || { count: 0 }).count;
 
 		delete data.data;
 	});
@@ -65,7 +65,7 @@ module.exports = (params: any) => new Promise(async (res, rej) => {
 	for (let i = 0; i < limit; i++) {
 		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
-		const data = datas.filter(d =>
+		const data = datas.filter((d: any) =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
 		)[0];
 
diff --git a/src/server/api/endpoints/drive/files/upload_from_url.ts b/src/server/api/endpoints/drive/files/upload_from_url.ts
index c012f0d3c9..cb617d851f 100644
--- a/src/server/api/endpoints/drive/files/upload_from_url.ts
+++ b/src/server/api/endpoints/drive/files/upload_from_url.ts
@@ -4,11 +4,12 @@
 import $ from 'cafy'; import ID from '../../../../../cafy-id';
 import { pack } from '../../../../../models/drive-file';
 import uploadFromUrl from '../../../../../services/drive/upload-from-url';
+import { ILocalUser } from '../../../../../models/user';
 
 /**
  * Create a file from a URL
  */
-module.exports = async (params, user): Promise<any> => {
+module.exports = async (params: any, user: ILocalUser): Promise<any> => {
 	// Get 'url' parameter
 	// TODO: Validate this url
 	const [url, urlErr] = $.str.get(params.url);
diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts
index fac9780325..3413778950 100644
--- a/src/server/api/endpoints/drive/folders.ts
+++ b/src/server/api/endpoints/drive/folders.ts
@@ -1,13 +1,11 @@
-/**
- * Module dependencies
- */
 import $ from 'cafy'; import ID from '../../../../cafy-id';
 import DriveFolder, { pack } from '../../../../models/drive-folder';
+import { ILocalUser } from '../../../../models/user';
 
 /**
  * Get drive folders
  */
-module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
+module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) return rej('invalid limit param');
diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts
index a8ed13bd77..4ac60439b7 100644
--- a/src/services/drive/delete-file.ts
+++ b/src/services/drive/delete-file.ts
@@ -1,4 +1,4 @@
-import DriveFile, { DriveFileChunk, IDriveFile } from "../../models/drive-file";
+import DriveFile, { DriveFileChunk, IDriveFile } from '../../models/drive-file';
 import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail';
 
 export default async function(file: IDriveFile, isExpired = false) {
diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts
index f83d57d415..73d9b1123a 100644
--- a/src/services/drive/upload-from-url.ts
+++ b/src/services/drive/upload-from-url.ts
@@ -9,7 +9,7 @@ import { IDriveFile, validateFileName } from '../../models/drive-file';
 import create from './add-file';
 import config from '../../config';
 import { IUser } from '../../models/user';
-import * as mongodb from "mongodb";
+import * as mongodb from 'mongodb';
 
 const log = debug('misskey:drive:upload-from-url');
 
diff --git a/src/services/following/requests/accept-all.ts b/src/services/following/requests/accept-all.ts
index 9708d9e658..45da004988 100644
--- a/src/services/following/requests/accept-all.ts
+++ b/src/services/following/requests/accept-all.ts
@@ -1,5 +1,5 @@
-import User, { IUser } from "../../../models/user";
-import FollowRequest from "../../../models/follow-request";
+import User, { IUser } from '../../../models/user';
+import FollowRequest from '../../../models/follow-request';
 import accept from './accept';
 
 /**
diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts
index 1b89cdb981..2eaccbbd36 100644
--- a/src/services/following/requests/accept.ts
+++ b/src/services/following/requests/accept.ts
@@ -1,12 +1,12 @@
-import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user";
-import FollowRequest from "../../../models/follow-request";
+import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from '../../../models/user';
+import FollowRequest from '../../../models/follow-request';
 import pack from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderAccept from '../../../remote/activitypub/renderer/accept';
 import { deliver } from '../../../queue';
-import Following from "../../../models/following";
-import FollowingLog from "../../../models/following-log";
-import FollowedLog from "../../../models/followed-log";
+import Following from '../../../models/following';
+import FollowingLog from '../../../models/following-log';
+import FollowedLog from '../../../models/followed-log';
 import event from '../../../publishers/stream';
 
 export default async function(followee: IUser, follower: IUser) {
diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts
index 50c95de0eb..7e9dc5630f 100644
--- a/src/services/following/requests/cancel.ts
+++ b/src/services/following/requests/cancel.ts
@@ -1,5 +1,5 @@
-import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user";
-import FollowRequest from "../../../models/follow-request";
+import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from '../../../models/user';
+import FollowRequest from '../../../models/follow-request';
 import pack from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderUndo from '../../../remote/activitypub/renderer/undo';
diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts
index acd419d0ee..affcd2ef5a 100644
--- a/src/services/following/requests/reject.ts
+++ b/src/services/following/requests/reject.ts
@@ -1,5 +1,5 @@
-import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user";
-import FollowRequest from "../../../models/follow-request";
+import User, { IUser, isRemoteUser, ILocalUser } from '../../../models/user';
+import FollowRequest from '../../../models/follow-request';
 import pack from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderReject from '../../../remote/activitypub/renderer/reject';
diff --git a/src/text/html.ts b/src/text/html.ts
index 41adb2e7f7..64208af88b 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -4,7 +4,7 @@ import config from '../config';
 import { INote } from '../models/note';
 import { TextElement } from './parse';
 
-const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: INote["mentionedRemoteUsers"]) => void} = {
+const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: INote['mentionedRemoteUsers']) => void } = {
 	bold({ document }, { bold }) {
 		const b = document.createElement('b');
 		b.textContent = bold;
diff --git a/src/text/parse/elements/bold.ts b/src/text/parse/elements/bold.ts
index 0566ace8b7..cf615cd3cc 100644
--- a/src/text/parse/elements/bold.ts
+++ b/src/text/parse/elements/bold.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementBold = {
-	type: "bold"
+	type: 'bold'
 	content: string
 	bold: string
 };
diff --git a/src/text/parse/elements/code.ts b/src/text/parse/elements/code.ts
index de87aa410b..f48e945048 100644
--- a/src/text/parse/elements/code.ts
+++ b/src/text/parse/elements/code.ts
@@ -5,7 +5,7 @@
 import genHtml from '../core/syntax-highlighter';
 
 export type TextElementCode = {
-	type: "code"
+	type: 'code'
 	content: string
 	code: string
 	html: string
diff --git a/src/text/parse/elements/emoji.ts b/src/text/parse/elements/emoji.ts
index d0eed88965..83d3effef5 100644
--- a/src/text/parse/elements/emoji.ts
+++ b/src/text/parse/elements/emoji.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementEmoji = {
-	type: "emoji"
+	type: 'emoji'
 	content: string
 	emoji: string
 };
diff --git a/src/text/parse/elements/hashtag.ts b/src/text/parse/elements/hashtag.ts
index cde0c2b224..129041774f 100644
--- a/src/text/parse/elements/hashtag.ts
+++ b/src/text/parse/elements/hashtag.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementHashtag = {
-	type: "hashtag"
+	type: 'hashtag'
 	content: string
 	hashtag: string
 };
diff --git a/src/text/parse/elements/inline-code.ts b/src/text/parse/elements/inline-code.ts
index bcb0bca0ad..1dd5affa51 100644
--- a/src/text/parse/elements/inline-code.ts
+++ b/src/text/parse/elements/inline-code.ts
@@ -5,7 +5,7 @@
 import genHtml from '../core/syntax-highlighter';
 
 export type TextElementInlineCode = {
-	type: "inline-code"
+	type: 'inline-code'
 	content: string
 	code: string
 	html: string
diff --git a/src/text/parse/elements/link.ts b/src/text/parse/elements/link.ts
index 7e0d6f5cf8..b353aebc5c 100644
--- a/src/text/parse/elements/link.ts
+++ b/src/text/parse/elements/link.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementLink = {
-	type: "link"
+	type: 'link'
 	content: string
 	title: string
 	url: string
diff --git a/src/text/parse/elements/mention.ts b/src/text/parse/elements/mention.ts
index a4140458d4..eda60b530a 100644
--- a/src/text/parse/elements/mention.ts
+++ b/src/text/parse/elements/mention.ts
@@ -4,7 +4,7 @@
 import parseAcct from '../../../acct/parse';
 
 export type TextElementMention = {
-	type: "mention"
+	type: 'mention'
 	content: string
 	username: string
 	host: string
diff --git a/src/text/parse/elements/quote.ts b/src/text/parse/elements/quote.ts
index 56de561f3f..bef9ad4988 100644
--- a/src/text/parse/elements/quote.ts
+++ b/src/text/parse/elements/quote.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementQuote = {
-	type: "quote"
+	type: 'quote'
 	content: string
 	quote: string
 };
diff --git a/src/text/parse/elements/search.ts b/src/text/parse/elements/search.ts
index 4bd19ee3fa..e5d9b9f0c2 100644
--- a/src/text/parse/elements/search.ts
+++ b/src/text/parse/elements/search.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementSearch = {
-	type: "search"
+	type: 'search'
 	content: string
 	query: string
 };
diff --git a/src/text/parse/elements/title.ts b/src/text/parse/elements/title.ts
index 11b3abc61b..b89739a7c5 100644
--- a/src/text/parse/elements/title.ts
+++ b/src/text/parse/elements/title.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementTitle = {
-	type: "title"
+	type: 'title'
 	content: string
 	title: string
 };
diff --git a/src/text/parse/elements/url.ts b/src/text/parse/elements/url.ts
index bbc27b4fd7..78b9b1f2f1 100644
--- a/src/text/parse/elements/url.ts
+++ b/src/text/parse/elements/url.ts
@@ -3,7 +3,7 @@
  */
 
 export type TextElementUrl = {
-	type: "url"
+	type: 'url'
 	content: string
 	url: string
 };
diff --git a/src/text/parse/index.ts b/src/text/parse/index.ts
index ccfef44591..2b6a459b1e 100644
--- a/src/text/parse/index.ts
+++ b/src/text/parse/index.ts
@@ -2,17 +2,17 @@
  * Misskey Text Analyzer
  */
 
-import { TextElementBold } from "./elements/bold";
-import { TextElementCode } from "./elements/code";
-import { TextElementEmoji } from "./elements/emoji";
-import { TextElementHashtag } from "./elements/hashtag";
-import { TextElementInlineCode } from "./elements/inline-code";
-import { TextElementLink } from "./elements/link";
-import { TextElementMention } from "./elements/mention";
-import { TextElementQuote } from "./elements/quote";
-import { TextElementSearch } from "./elements/search";
-import { TextElementTitle } from "./elements/title";
-import { TextElementUrl } from "./elements/url";
+import { TextElementBold } from './elements/bold';
+import { TextElementCode } from './elements/code';
+import { TextElementEmoji } from './elements/emoji';
+import { TextElementHashtag } from './elements/hashtag';
+import { TextElementInlineCode } from './elements/inline-code';
+import { TextElementLink } from './elements/link';
+import { TextElementMention } from './elements/mention';
+import { TextElementQuote } from './elements/quote';
+import { TextElementSearch } from './elements/search';
+import { TextElementTitle } from './elements/title';
+import { TextElementUrl } from './elements/url';
 
 const elements = [
 	require('./elements/bold'),
@@ -28,7 +28,7 @@ const elements = [
 	require('./elements/search')
 ].map(element => element.default as TextElementProcessor);
 
-export type TextElement = {type: "text", content: string}
+export type TextElement = { type: 'text', content: string }
 	| TextElementBold
 	| TextElementCode
 	| TextElementEmoji