From 4951ef4f1196d9e5ea77310954831fc9f1c36f42 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Thu, 1 Oct 2020 00:49:49 +0900 Subject: [PATCH 01/45] add: webpack-tampermonkey template --- README.md | 134 +- dist/good-monkey.user.js | 95 + gulpfile.js | 50 + header.json | 11 + monkey.config.js | 29 + monkey.dev.config.js | 35 + package-lock.json | 7514 ++++++++++++++++++++++++++++++++++ package.json | 37 +- postcss.config.js | 6 + src/index.js | 2 + src/resource/style/style.css | 8 + src/utils/logger.js | 12 + webpack.config.js | 46 + webpack.dev.config.js | 45 + 14 files changed, 7895 insertions(+), 129 deletions(-) create mode 100644 dist/good-monkey.user.js create mode 100644 gulpfile.js create mode 100644 header.json create mode 100644 monkey.config.js create mode 100644 monkey.dev.config.js create mode 100644 package-lock.json create mode 100644 postcss.config.js create mode 100644 src/index.js create mode 100644 src/resource/style/style.css create mode 100644 src/utils/logger.js create mode 100644 webpack.config.js create mode 100644 webpack.dev.config.js diff --git a/README.md b/README.md index 783282d..7c045cc 100644 --- a/README.md +++ b/README.md @@ -1,123 +1,29 @@ -# 🎮 PSN中文网功能增强插件 +## Require +- Node +- npm +- Git -![psnine](https://img.shields.io/badge/-PSNINE-black?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAMFBMVEVHcEw0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNuEOyNSAAAAD3RSTlMAQMAQ4PCApCBQcDBg0JD74B98AAABN0lEQVRIx+2WQRaDIAxECSACWLn/bdsCIkNQ2XXT2bTyHEx+glGIv4STU3KNRccp6dNh4qTM4VDLrGVRxbLGaa3ZQSVQulVJl5JFlh3cLdNyk/xe2IXz4DqYLhZ4mWtHd4/SLY/QQwKmWmGcmUfHb4O1mu8BIPGw4Hg1TEvySQGWoBcItgxndmsbhtJd6baukIKnt525W4anygNECVc1UD8uVbRNbumZNl6UmkagHeRJfX0BdM5NXgA+ZKESpiJ9tRFftZEvue2cS6cKOrGk/IOLTLUcaXuZHrZDq3FB2IonOBCHIy8Bs1Zzo1MxVH+m8fQ+nFeCQM3MWwEsWsy8e8Di7meA5Bb5MDYCt4SnUbP3lv1xOuWuOi3j5kJ5tPiZKahbi54anNRaaG7YElFKQBHR/9PjN3oD6fkt9WKF9rgAAAAASUVORK5CYII=&link=https://www.psnine.com/) -![install](https://img.shields.io/badge/dynamic/json?url=https://raw.githubusercontent.com/swsoyee/swsoyee/master/public/data.json&label=installs&query=$.psnine_enhance_install[0]&color=orange&style=flat-square) -![Last commit](https://img.shields.io/github/last-commit/swsoyee/psnine-enhanced-version.svg?style=flat-square) -![license](https://img.shields.io/github/license/swsoyee/psnine-enhanced-version.svg?style=flat-square) +## Usage - +- `git clone https://github.com/SettingDust/webpack-tampermonkey.git` +- `npm i` +- `npm run dev` +- Copy the content of `./test/header.js` to the TamperMonkey script editor. +- Open a webpage. -## 🔧 功能介绍 +## Features -### ⏫ 全局优化 +- Test without `Ctrl+V` +- Build a public version easily. -- 🌙 增加`黑夜模式`主题选择4。 -- ⚙️ `自动黑夜模式`2。 -- 👮 红色高亮特定`用户ID`(默认高亮管理员)1。 -- 🚫 增加`黑名单`和`屏蔽词过滤`功能,屏蔽不想看到的一切发言。 -- ⏬ 增加`回到底部`按钮,快速跳转**回复框**或者**翻页**处。 -- 🈲 `刮刮条文字`鼠标悬浮显示。 -- ✅ 每日打开页面即可**自动签到**。 -- 🤼‍♂️ [`约战`](https://psnine.com/battle)页面可以选择不显示发起用户头像。 -- 🔧 点击P9页面的右上角`我的` ➡ `插件设置` 可进行插件具体设置1。 +## Thanks ---- - +- [webpack-tampermonkey](https://github.com/momocow/webpack-tampermonkey) -### 📜 帖子浏览强化 +## Example +- [biliplus-material](https://github.com/SettingDust/biliplus-material) +- [RSSHelper](https://github.com/BangumiSystem/RSSHelper) -- 🗣 增加蓝色`楼主`标识,更易区分`楼主`与`回帖者`1。 -- 🖼 鼠标悬浮预览`-插图-`内容,无需点击打开查看图片。 -- 💬 帖子中被`@用户`的发言内容显示于同层,内容过长则截取部分内容,鼠标悬浮即可完整查看。 -- 🏗 增加回帖`楼层数`信息。 -- 🈵 创建机因时实时**显示字数**,无字数被截后需重新修改的担忧。 -- 📝 发表主题帖时`BBCode`转换结果**实时预览**(仅支持部分),所见即所得。 -- 🙋‍♂️ [`问答`](https://psnine.com/qa)中根据解决状态使用**图标**表示以便快速识别。 -- 🔍 鼠标**悬浮头像**显示用户**个人主页**主要信息。 -- 🏆 攻略贴中显示自己的奖杯获得情况。 +**This is just a template. Please clone this project and edit the name** ---- - - -### 💸 数折查看强化 - -- 📉 [`数折`](https://psnine.com/dd/HP9000-CUSA08392_00-ASIAPLACEHOLDER1)中增加`价格走势图`,快速了解**走势**和**史低**。 -- 💱 [`数折`](https://psnine.com/dd)增加人民币价格换算,无需自己进行价格换算3。 -- 🈹 根据**降价幅度**变更游戏标题颜色`💚<20%` `💛<50%` `🧡<80%` `💖>80%`,快速区分最大优惠。 -- 🈹 [`数折`](https://psnine.com/dd)和`活动`页面增加`只看史低`功能按键~~不花任何一分冤枉钱~~。 - ---- - - -### 🏆 奖杯信息强化 - -- 📈 [`游戏`](https://psnine.com/psngame/15295)界面**奖杯类型比例**,**获得时间**等汇总图表。 -- 🔖 [`游戏`](https://psnine.com/psngame)界面降低**无白金**的游戏图标可适度,方便区分有无白金。 -- 🗃 `奖杯`界面增加`奖杯汇总列表`,无需滚屏迅速识别**未获得奖杯**和**Tips**有无。 -- ↪ 进入**游戏页**默认`跳转`到自己主页下的该游戏页面1。 -- 📝 `奖杯心得`页面输入框可缩放大小1。 -- 🈚 `奖杯`界面增加`尚未获得`奖杯筛选按钮。 -- 💯 `测评评分`界面增加`均分`信息2。 -- 📈 [`奖杯心得`](https://psnine.com/trophy/12518001)界面增加**根据顶数排序**功能3。 - ---- - -## 💻 可用平台 -||Chrome|FireFox|Edge|Maxthon|QQ浏览器|360浏览器| -| ---- | ---- | ---- | ---- | ---- | ---- | ---- | -| | | | |
|
|
-|
Tampermonkey
|
🉑
|
🉑
|
🉑
||
🉑
|
🉑
| -|
Violentmonkey
|
🉑
|
🉑
||
🉑
||
🉑
| - -若启用了脚本后无明显效果请确认**浏览器**和**插件**都处于最新版状态。如无法成功使用请到[`提issue`](https://github.com/swsoyee/psnine-night-mode-CSS/issues/new)报告。 - -## 📥 安装地址 - -详情参照[`Greasy Fork`](https://greasyfork.org/zh-CN/scripts/375985-psn%E4%B8%AD%E6%96%87%E7%BD%91%E5%8A%9F%E8%83%BD%E5%A2%9E%E5%BC%BA)。 - -## ❕ 附注 - -1. 功能由[`@mordom0404`](https://psnine.com/psnid/mordom0404)提供。 -2. 功能由[`@Nathaniel_Wu`](https://github.com/Nathaniel-Wu)提供。 -3. 功能由[`@JayusTree`](https://github.com/Jiangyu-Wang)提供。 -4. 由于没有合适的外汇API,汇率为定值,可以自行在脚本中更改。 -5. 如果使用插件内的**黑夜模式**时存在瞬时白转黑的情况,建议关闭插件中的**黑夜模式**,使用`Stylus`或者`Stylish`扩展安装[`CSS`](https://userstyles.org/styles/167244/p9)版`黑夜模式`,或者在[`Greasy Fork`](https://greasyfork.org/zh-CN/scripts/376181-p9%E5%A4%9C%E9%97%B4%E6%A8%A1%E5%BC%8F)上安装独立插件版**黑夜模式**。 - -## 👥 项目贡献者 - - - - - -Made with [contributors-img](https://contributors-img.web.app). - -## 🌙夜间模式CSS版 - -
-点击查看详情 - -[![Install with Stylish](https://img.shields.io/badge/Install%20with-Stylish-00adad.svg)](https://userstyles.org/styles/167244/p9) - ---- - - -本CSS样式为[`P9`](https://psnine.com/)的夜间模式,为了方便夜间使用而编写的。 -由于自己日常使用界面有限,可能并不是所有元素都进行了合适的更改,如有发现希望得到各位的反馈以便后期更新。 - -⭐全站启用护眼黑色调显示 -⭐支持帖子的隐藏文字[musk]鼠标划过显示(可选) - -### 更新记录 - -- v1.9 🐞修复样式细节 -- v1.8 🐞修复已知问题 -- v1.7 ➕新增多项配色 -- v1.6 🐞修复奖杯tips页面文字颜色过淡的问题 -- v1.5 🐞修复直接安装js版本时无法使用的问题 -- v1.4 🐞修复主题帖中的表格背景色 -- v1.3 🐞修复直接安装js版本时无法使用的问题 -- v1.2 🐞修复d7vg.com下的使用问题 -- v1.1 🐞修改奖杯底色,部分页面的高亮颜色 -- v1.0 👑发布 - -
+[Chinese Version](https://settingdust.github.io/2018/10/06/TamperMonkey+Webpack编译实现/) diff --git a/dist/good-monkey.user.js b/dist/good-monkey.user.js new file mode 100644 index 0000000..14407e0 --- /dev/null +++ b/dist/good-monkey.user.js @@ -0,0 +1,95 @@ +// ==UserScript== +// @name Good Monkey +// @version 0.0.1 +// @description This is a good monkey +// @author SettingDust +// +// @include http*://tampermonkey.net/* +// +// @require https://cdn.bootcss.com/jquery/3.3.1/jquery.js +// +// @grant GM_addStyle +// ==/UserScript== + +!function(modules) { + var installedModules = {}; + function __webpack_require__(moduleId) { + if (installedModules[moduleId]) return installedModules[moduleId].exports; + var module = installedModules[moduleId] = { + i: moduleId, + l: !1, + exports: {} + }; + return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), + module.l = !0, module.exports; + } + __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) { + __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, { + enumerable: !0, + get: getter + }); + }, __webpack_require__.r = function(exports) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(exports, "__esModule", { + value: !0 + }); + }, __webpack_require__.t = function(value, mode) { + if (1 & mode && (value = __webpack_require__(value)), 8 & mode) return value; + if (4 & mode && "object" == typeof value && value && value.__esModule) return value; + var ns = Object.create(null); + if (__webpack_require__.r(ns), Object.defineProperty(ns, "default", { + enumerable: !0, + value: value + }), 2 & mode && "string" != typeof value) for (var key in value) __webpack_require__.d(ns, key, function(key) { + return value[key]; + }.bind(null, key)); + return ns; + }, __webpack_require__.n = function(module) { + var getter = module && module.__esModule ? function() { + return module.default; + } : function() { + return module; + }; + return __webpack_require__.d(getter, "a", getter), getter; + }, __webpack_require__.o = function(object, property) { + return Object.prototype.hasOwnProperty.call(object, property); + }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 0); +}([ function(module, exports, __webpack_require__) { + $("body").css("background", "#212121"), GM_addStyle(__webpack_require__(1).toString()); +}, function(module, exports, __webpack_require__) { + (module.exports = __webpack_require__(2)(!1)).push([ module.i, "body{font-size:2rem;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex}div{background-color:#fff}", "" ]); +}, function(module, exports, __webpack_require__) { + "use strict"; + module.exports = function(useSourceMap) { + var list = []; + return list.toString = function() { + return this.map(function(item) { + var content = function(item, useSourceMap) { + var content = item[1] || "", cssMapping = item[3]; + if (!cssMapping) return content; + if (useSourceMap && "function" == typeof btoa) { + var sourceMapping = (sourceMap = cssMapping, "/*# sourceMappingURL=data:application/json;charset=utf-8;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */"), sourceURLs = cssMapping.sources.map(function(source) { + return "/*# sourceURL=" + cssMapping.sourceRoot + source + " */"; + }); + return [ content ].concat(sourceURLs).concat([ sourceMapping ]).join("\n"); + } + var sourceMap; + return [ content ].join("\n"); + }(item, useSourceMap); + return item[2] ? "@media " + item[2] + "{" + content + "}" : content; + }).join(""); + }, list.i = function(modules, mediaQuery) { + "string" == typeof modules && (modules = [ [ null, modules, "" ] ]); + for (var alreadyImportedModules = {}, i = 0; i < this.length; i++) { + var id = this[i][0]; + null != id && (alreadyImportedModules[id] = !0); + } + for (i = 0; i < modules.length; i++) { + var item = modules[i]; + null != item[0] && alreadyImportedModules[item[0]] || (mediaQuery && !item[2] ? item[2] = mediaQuery : mediaQuery && (item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"), + list.push(item)); + } + }, list; + }; +} ]); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..4915933 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,50 @@ +const gulp = require('gulp'), + prettier = require('gulp-prettier'), + webpack = require('webpack'), + moment = require('moment'); +const colors = require('colors'); + +const paths = { + js: { + all: ['./javascript/**/*.js', './*.js'] + } +}; + +gulp.task('format:js', () => { + return gulp + .src(paths.js.all) + .pipe(prettier()) + .pipe(gulp.dest((file) => file.base)); +}); + +gulp.task('format', gulp.series('format:js')); + +gulp.task('webpack', (callback) => + webpack(require('./webpack.config'), (err, stats) => { + callback(); + if (err) console.log(err); + console.log( + `[${colors.grey(`${moment().format('HH:mm:ss')}`)}][${colors.grey( + 'Webpack' + )}] Build '${colors.cyan(stats.hash)}' after ${colors.magenta( + `${moment(stats.endTime).diff(moment(stats.startTime))}ms` + )}` + ); + }) +); +gulp.task('webpack:dev', () => + webpack(require('./webpack.dev.config'), (err, stats) => { + if (err) console.log(err); + console.log( + `[${colors.grey(`${moment().format('HH:mm:ss')}`)}][${colors.grey( + 'Webpack' + )}] Build '${colors.cyan(stats.hash)}' after ${colors.magenta( + `${moment(stats.endTime).diff(moment(stats.startTime))}ms` + )}` + ); + }) +); + +gulp.task('build', gulp.series('webpack', 'format')); + +gulp.task('default', gulp.series(gulp.parallel('webpack:dev'))); diff --git a/header.json b/header.json new file mode 100644 index 0000000..612ee2b --- /dev/null +++ b/header.json @@ -0,0 +1,11 @@ +{ + "name": "Good Monkey", + "version": "0.0.1", + "description": "This is a good monkey", + "author": "SettingDust", + "include": ["http*://tampermonkey.net/*"], + "require": ["https://cdn.bootcss.com/jquery/3.3.1/jquery.js"], + "grant": [ + "GM_addStyle" + ] +} \ No newline at end of file diff --git a/monkey.config.js b/monkey.config.js new file mode 100644 index 0000000..50f6a8d --- /dev/null +++ b/monkey.config.js @@ -0,0 +1,29 @@ +const header = require('./header'); + +const config = { + entry: './src/index.js' +}; + +module.exports.config = config; +module.exports.header = header; +module.exports.buildedHeader = () => { + const headerString = []; + headerString.push('// ==UserScript=='); + for (let headerKey in header) { + if (Array.isArray(header[headerKey])) { + if (header[headerKey].length > 0) headerString.push('//'); + for (let p in header[headerKey]) { + headerString.push( + '// @' + headerKey.padEnd(13) + header[headerKey][p] + ); + } + } else { + headerString.push( + '// @' + headerKey.padEnd(13) + header[headerKey] + ); + } + } + headerString.push('// ==/UserScript=='); + headerString.push(''); + return headerString.join('\n'); +}; diff --git a/monkey.dev.config.js b/monkey.dev.config.js new file mode 100644 index 0000000..b182f1c --- /dev/null +++ b/monkey.dev.config.js @@ -0,0 +1,35 @@ +const monkey = require('./monkey.config'); +const header = monkey.header; + +//The test path. +header.require.push( + 'file://' + + __dirname + + '\\test\\' + + monkey.header.name.toLowerCase().replace(' ', '-') + + '.js' +); + +module.exports.config = monkey.config; +module.exports.header = header; +module.exports.buildedHeader = () => { + const headerString = []; + headerString.push('// ==UserScript=='); + for (let headerKey in header) { + if (Array.isArray(header[headerKey])) { + if (header[headerKey].length > 0) headerString.push('//'); + for (let p in header[headerKey]) { + headerString.push( + '// @' + headerKey.padEnd(13) + header[headerKey][p] + ); + } + } else { + headerString.push( + '// @' + headerKey.padEnd(13) + header[headerKey] + ); + } + } + headerString.push('// ==/UserScript=='); + headerString.push(''); + return headerString.join('\n'); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..20bd5ed --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7514 @@ +{ + "name": "webpack-tampermonkey", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", + "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", + "dev": true, + "requires": { + "browserslist": "^4.11.0", + "caniuse-lite": "^1.0.30001036", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001036", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz", + "integrity": "sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w==", + "dev": true + } + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", + "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "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" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", + "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "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": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + } + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz", + "integrity": "sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "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" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "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-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "gulp-cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + } + } + }, + "gulp-prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-prettier/-/gulp-prettier-3.0.0.tgz", + "integrity": "sha512-vZFyC1F+7EjuI2WDUOcbPt9o3ZjdqjFMjr8a9Yk2K8EmNhP1w6X01QAkv5Ym3dsHCBsBA4AEFcYds2vOTSgx0A==", + "dev": true, + "requires": { + "plugin-error": "^1.0.1", + "prettier": "^2.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "prettier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.1.tgz", + "integrity": "sha512-piXGBcY1zoFOG0MvHpNE5reAGseLmaCRifQ/fmfF49BcYkInEs/naD/unxGNAeOKFA5+JxVrPyMvMlpzcd20UA==", + "dev": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.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" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "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": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "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": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "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-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" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "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": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "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.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node-releases": { + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", + "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "dev": true, + "requires": { + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", + "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.5.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "dev": true + }, + "prettier": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-string-loader": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.6.tgz", + "integrity": "sha512-VNg62//PS1WfNwrK3n7t6wtK5Vdtx/qeYLLEioW46VMlYUwAYT6wnfB+OwS2FMTCalIHu0tk79D3RXX8ttmZTQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.0.0.tgz", + "integrity": "sha512-sPsoBs8NkSJt9k/2zLUMDAf0rYaG00EtrFQpHRIphKrR6stGsO92LUJf/uUeQNKEoxqoJ4R4qDLqHl+AOEqolA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.26", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "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" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "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": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index 6ee8827..818eb9f 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,26 @@ { - "name": "psnine-enhanced-version", - "version": "0.9.37", - "description": "数折价格走势图,显示人民币价格,奖杯统计和筛选,发帖字数统计和即时预览,楼主高亮,自动翻页,屏蔽黑名单用户发言,被@用户的发言内容显示等多项功能优化P9体验", - "main": "night-mode-css.js", + "name": "webpack-tampermonkey", + "version": "0.0.1", + "private": true, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "gulp build --color", + "dev": "gulp --color", + "format": "gulp --color format" }, - "repository": { - "type": "git", - "url": "git+https://github.com/swsoyee/psnine-night-mode-CSS.git" - }, - "author": "InfinityLoop", - "license": "MIT", - "bugs": { - "url": "https://github.com/swsoyee/psnine-night-mode-CSS/issues" - }, - "homepage": "https://github.com/swsoyee/psnine-night-mode-CSS#readme" + "devDependencies": { + "autoprefixer": "^9.7.5", + "colors": "^1.4.0", + "css-loader": "^3.4.2", + "cssnano": "^4.1.10", + "gulp": "^4.0.2", + "gulp-prettier": "^3.0.0", + "moment": "^2.24.0", + "postcss-loader": "^3.0.0", + "prettier": "^2.0.2", + "terser-webpack-plugin": "^2.3.5", + "to-string-loader": "^1.1.6", + "url-loader": "^4.0.0", + "webpack": "^4.42.0", + "webpack-cli": "^3.3.11" + } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..08fa5af --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + autoprefixer: { browsers: 'cover 95%' }, + cssnano: {} + } +}; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..b3a5aef --- /dev/null +++ b/src/index.js @@ -0,0 +1,2 @@ +$('body').css('background', '#212121'); +GM_addStyle(require('./resource/style/style.css').toString()); \ No newline at end of file diff --git a/src/resource/style/style.css b/src/resource/style/style.css new file mode 100644 index 0000000..9599aaf --- /dev/null +++ b/src/resource/style/style.css @@ -0,0 +1,8 @@ +body { + font-size: 2rem; + display: flex; +} + +div { + background-color: #fff; +} \ No newline at end of file diff --git a/src/utils/logger.js b/src/utils/logger.js new file mode 100644 index 0000000..58e75e5 --- /dev/null +++ b/src/utils/logger.js @@ -0,0 +1,12 @@ +const monkey = require('../../../monkey.config'); +module.exports = { + info: (message) => { + console.info(`[${monkey.header.name}]`, message); + }, + debug: (message) => { + console.debug(`[${monkey.header.name}]`, message); + }, + warn: (message) => { + console.warn(`[${monkey.header.name}]`, message); + } +}; diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..ac4f767 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,46 @@ +const path = require('path'); +const monkey = require('./monkey.config'); +const webpack = require('webpack'); + +const Terser = require('terser-webpack-plugin'); +const BannerPlugin = require('webpack/lib/BannerPlugin'); + +module.exports = { + entry: monkey.config.entry, + output: { + path: path.resolve(__dirname, 'dist'), + filename: + monkey.header.name.toLowerCase().replace(' ', '-') + '.user.js' + }, + mode: 'none', + module: { + rules: [ + { + test: /\.css$/, + exclude: /(node_modules)/, + use: [{ loader: 'css-loader' }, { loader: 'postcss-loader' }] + }, + { + test: /\.(png|jpg|gif)$/, + use: ['url-loader'] + } + ] + }, + plugins: [ + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1 + }), + new Terser({ + terserOptions: { + mangle: false, + output: { + beautify: true + } + } + }), + new BannerPlugin({ + banner: monkey.buildedHeader(), + raw: true + }) + ] +}; diff --git a/webpack.dev.config.js b/webpack.dev.config.js new file mode 100644 index 0000000..b15a390 --- /dev/null +++ b/webpack.dev.config.js @@ -0,0 +1,45 @@ +const path = require('path'); +const monkey = require('./monkey.dev.config'); +const fs = require('fs'); +const moment = require('moment'); + +const colors = require('colors'); + +if (!fs.existsSync('test')) fs.mkdirSync('test'); +fs.writeFileSync('./test/header.js', monkey.buildedHeader()); + +console.log( + `[${colors.grey(`${moment().format('HH:mm:ss')}`)}][${colors.grey( + 'Webpack' + )}] ${colors.green( + 'Copy the content of test/header.js to your TamperMonkey plugin' + )}` +); + +module.exports = { + entry: monkey.config.entry, + output: { + path: path.resolve(__dirname, 'test'), + filename: monkey.header.name.toLowerCase().replace(' ', '-') + '.js' + }, + watch: true, + mode: 'none', + module: { + rules: [ + { + test: /\.css$/, + exclude: /(node_modules)/, + use: [{ loader: 'css-loader' }, { loader: 'postcss-loader' }] + }, + { + test: /\.(png|jpg|gif)$/, + use: ['url-loader'] + } + ] + }, + plugins: [ + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1 + }) + ] +}; From c2b91250dbe300ffc0fc5a47802d1224c6b33676 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Thu, 1 Oct 2020 14:50:02 +0900 Subject: [PATCH 02/45] add: .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules From 45d8c001ecc1ec1a8aee84fd0d9cd32abd9a5efd Mon Sep 17 00:00:00 2001 From: swsoyee Date: Thu, 1 Oct 2020 15:03:55 +0900 Subject: [PATCH 03/45] fix: webpack import error --- webpack.dev.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.dev.config.js b/webpack.dev.config.js index b15a390..8ac0c58 100644 --- a/webpack.dev.config.js +++ b/webpack.dev.config.js @@ -2,6 +2,7 @@ const path = require('path'); const monkey = require('./monkey.dev.config'); const fs = require('fs'); const moment = require('moment'); +const webpack = require('webpack'); const colors = require('colors'); From 6bea570dffc06738a3974c7fe9821b147bd8dd10 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Thu, 1 Oct 2020 15:04:25 +0900 Subject: [PATCH 04/45] update: header.js --- header.json | 29 +++++++++++++++++++---------- test/header.js | 26 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 test/header.js diff --git a/header.json b/header.json index 612ee2b..337e4d4 100644 --- a/header.json +++ b/header.json @@ -1,11 +1,20 @@ { - "name": "Good Monkey", - "version": "0.0.1", - "description": "This is a good monkey", - "author": "SettingDust", - "include": ["http*://tampermonkey.net/*"], - "require": ["https://cdn.bootcss.com/jquery/3.3.1/jquery.js"], - "grant": [ - "GM_addStyle" - ] -} \ No newline at end of file + "name": "PSN中文网功能增强", + "namespace": "https://github.com/swsoyee/psnine-enhanced-version", + "version": "1.0.0", + "description": "数折价格走势图,显示人民币价格,奖杯统计和筛选,发帖字数统计和即时预览,楼主高亮,自动翻页,屏蔽黑名单用户发言,被@用户的发言内容显示等多项功能优化P9体验", + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAMFBMVEVHcEw0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNuEOyNSAAAAD3RSTlMAQMAQ4PCApCBQcDBg0JD74B98AAABN0lEQVRIx+2WQRaDIAxECSACWLn/bdsCIkNQ2XXT2bTyHEx+glGIv4STU3KNRccp6dNh4qTM4VDLrGVRxbLGaa3ZQSVQulVJl5JFlh3cLdNyk/xe2IXz4DqYLhZ4mWtHd4/SLY/QQwKmWmGcmUfHb4O1mu8BIPGw4Hg1TEvySQGWoBcItgxndmsbhtJd6baukIKnt525W4anygNECVc1UD8uVbRNbumZNl6UmkagHeRJfX0BdM5NXgA+ZKESpiJ9tRFftZEvue2cS6cKOrGk/IOLTLUcaXuZHrZDq3FB2IonOBCHIy8Bs1Zzo1MxVH+m8fQ+nFeCQM3MWwEsWsy8e8Di7meA5Bb5MDYCt4SnUbP3lv1xOuWuOi3j5kJ5tPiZKahbi54anNRaaG7YElFKQBHR/9PjN3oD6fkt9WKF9rgAAAAASUVORK5CYII=", + "author": "InfinityLoop, mordom0404, Nathaniel_Wu, JayusTree", + "include": ["*psnine.com/*", "*d7vg.com/*"], + "require": [ + "http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js", + "https://code.highcharts.com/highcharts.js", + "https://code.highcharts.com/modules/histogram-bellcurve.js", + "https://unpkg.com/tippy.js@3/dist/tippy.all.min.js" + ], + "license": "MIT", + "supportURL": "https://github.com/swsoyee/psnine-enhanced-version/issues/new", + "compatible": ["chrome", "firefox", "edge"], + "grant": ["GM_addStyle"], + "run-at": "document-start" +} diff --git a/test/header.js b/test/header.js new file mode 100644 index 0000000..5c94cb8 --- /dev/null +++ b/test/header.js @@ -0,0 +1,26 @@ +// ==UserScript== +// @name PSN中文网功能增强 +// @namespace https://github.com/swsoyee/psnine-enhanced-version +// @version 1.0.0 +// @description 数折价格走势图,显示人民币价格,奖杯统计和筛选,发帖字数统计和即时预览,楼主高亮,自动翻页,屏蔽黑名单用户发言,被@用户的发言内容显示等多项功能优化P9体验 +// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAMFBMVEVHcEw0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNuEOyNSAAAAD3RSTlMAQMAQ4PCApCBQcDBg0JD74B98AAABN0lEQVRIx+2WQRaDIAxECSACWLn/bdsCIkNQ2XXT2bTyHEx+glGIv4STU3KNRccp6dNh4qTM4VDLrGVRxbLGaa3ZQSVQulVJl5JFlh3cLdNyk/xe2IXz4DqYLhZ4mWtHd4/SLY/QQwKmWmGcmUfHb4O1mu8BIPGw4Hg1TEvySQGWoBcItgxndmsbhtJd6baukIKnt525W4anygNECVc1UD8uVbRNbumZNl6UmkagHeRJfX0BdM5NXgA+ZKESpiJ9tRFftZEvue2cS6cKOrGk/IOLTLUcaXuZHrZDq3FB2IonOBCHIy8Bs1Zzo1MxVH+m8fQ+nFeCQM3MWwEsWsy8e8Di7meA5Bb5MDYCt4SnUbP3lv1xOuWuOi3j5kJ5tPiZKahbi54anNRaaG7YElFKQBHR/9PjN3oD6fkt9WKF9rgAAAAASUVORK5CYII= +// @author InfinityLoop, mordom0404, Nathaniel_Wu, JayusTree +// +// @include *psnine.com/* +// @include *d7vg.com/* +// +// @require http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js +// @require https://code.highcharts.com/highcharts.js +// @require https://code.highcharts.com/modules/histogram-bellcurve.js +// @require https://unpkg.com/tippy.js@3/dist/tippy.all.min.js +// @require file:///Users/wsu/Desktop/personal-project/psnine-enhanced-version\test\psn中文网功能增强.js +// @license MIT +// @supportURL https://github.com/swsoyee/psnine-enhanced-version/issues/new +// +// @compatible chrome +// @compatible firefox +// @compatible edge +// +// @grant GM_addStyle +// @run-at document-start +// ==/UserScript== From 2d1c633567df0962b28b9cf29080974d7a1641c0 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 12:50:45 +0900 Subject: [PATCH 05/45] refactor: PageBottom function --- package-lock.json | 4 +- .../PageBottomButton/PageBottomButton.js | 17 +++ src/index.js | 5 +- ...37\350\203\275\345\242\236\345\274\272.js" | 123 ++++++++++++++++++ 4 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 src/components/PageBottomButton/PageBottomButton.js create mode 100644 "test/psn\344\270\255\346\226\207\347\275\221\345\212\237\350\203\275\345\242\236\345\274\272.js" diff --git a/package-lock.json b/package-lock.json index 20bd5ed..ef2a8f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { - "name": "webpack-tampermonkey", - "version": "0.0.1", + "name": "psnine-enhanced-version", + "version": "0.9.40", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/components/PageBottomButton/PageBottomButton.js b/src/components/PageBottomButton/PageBottomButton.js new file mode 100644 index 0000000..1b3417e --- /dev/null +++ b/src/components/PageBottomButton/PageBottomButton.js @@ -0,0 +1,17 @@ +/* + * 页面右下角追加点击跳转到页面底部按钮 + */ +const PageBottom = () => { + $('.bottombar').append("B"); + $('#scrollbottom').click(() => { + $('body,html').animate({ + scrollTop: document.body.clientHeight, + }, + 500 + ); + }).css({ + cursor: 'pointer' + }); +} + +export default PageBottom; \ No newline at end of file diff --git a/src/index.js b/src/index.js index b3a5aef..11b91f0 100644 --- a/src/index.js +++ b/src/index.js @@ -1,2 +1,3 @@ -$('body').css('background', '#212121'); -GM_addStyle(require('./resource/style/style.css').toString()); \ No newline at end of file +import PageBottom from './components/PageBottomButton/PageBottomButton'; + +PageBottom(); \ No newline at end of file diff --git "a/test/psn\344\270\255\346\226\207\347\275\221\345\212\237\350\203\275\345\242\236\345\274\272.js" "b/test/psn\344\270\255\346\226\207\347\275\221\345\212\237\350\203\275\345\242\236\345\274\272.js" new file mode 100644 index 0000000..e3d35cf --- /dev/null +++ "b/test/psn\344\270\255\346\226\207\347\275\221\345\212\237\350\203\275\345\242\236\345\274\272.js" @@ -0,0 +1,123 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _components_PageBottomButton_PageBottomButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); + + +Object(_components_PageBottomButton_PageBottomButton__WEBPACK_IMPORTED_MODULE_0__["default"])(); + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * 页面右下角追加点击跳转到页面底部按钮 + */ +const PageBottom = () => { + $('.bottombar').append("B"); + $('#scrollbottom').click(() => { + $('body,html').animate({ + scrollTop: document.body.clientHeight, + }, + 500 + ); + }).css({ + cursor: 'pointer' + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (PageBottom); + +/***/ }) +/******/ ]); \ No newline at end of file From 28bbe841d974ac9e74355b16d98517c082df2c51 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 14:41:16 +0900 Subject: [PATCH 06/45] chore: rename pageBottom function name --- .../PageBottomButton/{PageBottomButton.js => index.js} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/components/PageBottomButton/{PageBottomButton.js => index.js} (86%) diff --git a/src/components/PageBottomButton/PageBottomButton.js b/src/components/PageBottomButton/index.js similarity index 86% rename from src/components/PageBottomButton/PageBottomButton.js rename to src/components/PageBottomButton/index.js index 1b3417e..4324243 100644 --- a/src/components/PageBottomButton/PageBottomButton.js +++ b/src/components/PageBottomButton/index.js @@ -1,7 +1,7 @@ /* * 页面右下角追加点击跳转到页面底部按钮 */ -const PageBottom = () => { +const pageBottom = () => { $('.bottombar').append("B"); $('#scrollbottom').click(() => { $('body,html').animate({ @@ -14,4 +14,4 @@ const PageBottom = () => { }); } -export default PageBottom; \ No newline at end of file +export default pageBottom; From a3ea5522724e6a4c1b8e57dde2164c651634ea3a Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 14:42:48 +0900 Subject: [PATCH 07/45] add: beautifyQaIndex function --- src/components/BeautifyQaIndex/index.js | 33 +++++++++++++++++++++++++ src/index.js | 14 +++++++++-- src/resource/style/icon.css | 33 +++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 src/components/BeautifyQaIndex/index.js create mode 100644 src/resource/style/icon.css diff --git a/src/components/BeautifyQaIndex/index.js b/src/components/BeautifyQaIndex/index.js new file mode 100644 index 0000000..f3fda6d --- /dev/null +++ b/src/components/BeautifyQaIndex/index.js @@ -0,0 +1,33 @@ +/* + * 问答标题根据回答状况着色 + * @param isOn 是否开启功能 + */ +const beautifyQaIndex = (isOn) => { + if (isOn) { + // 替换文字状态为图标形式 + $('.list>li').map((i, node) => { + const el = $(node).find("div.meta > .r > span:nth-child(2)"); + const status = $(el).text(); + // 替换文字状态为图标形式 + const selector = 'div.ml64>p.title.font16>a'; + switch (status) { + case "已解决": $(node).find(selector).append('
'); break; + case "未回答": $(node).find(selector).append('
'); break; + case "解决中": $(node).find(selector).append('
'); break; + default: return; + } + const el_reward = $(node).find("div.meta > .r > span:nth-child(1)"); + const reward_num = $(el_reward).text(); + // 替换文字状态为图标形式 + const reward = reward_num.match(/悬赏(\d+)铜/); + if (reward && reward.length > 0) { + const number = Number(reward[1]); + $(el_reward).replaceWith(`
 ${number}`); + } + }); + } else { + return; + } +} + +export default beautifyQaIndex; diff --git a/src/index.js b/src/index.js index 11b91f0..ea7cd9d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,13 @@ -import PageBottom from './components/PageBottomButton/PageBottomButton'; +GM_addStyle(require('./resource/style/icon.css').toString()); -PageBottom(); \ No newline at end of file +import pageBottom from './components/PageBottomButton'; +import beautifyQaIndex from './components/BeautifyQaIndex'; + +const page = window.location.href; + +// 导航 > 问答 +if (/\/qa/.test(page)) { + beautifyQaIndex(true); // TODO 设置面板 +} + +pageBottom(); diff --git a/src/resource/style/icon.css b/src/resource/style/icon.css new file mode 100644 index 0000000..729d157 --- /dev/null +++ b/src/resource/style/icon.css @@ -0,0 +1,33 @@ +.fa-check-circle { + width: 15px; + height: 15px; + float: left; + margin-top: 3px; + margin-right: 3px; + background: url('data:image/svg+xml;utf8,') no-repeat center; +} + +.fa-question-circle { + width: 15px; + height: 15px; + float: left; + margin-top: 3px; + margin-right: 3px; + background: url('data:image/svg+xml;utf8,') no-repeat center; +} + +.fa-comments { + width: 15px; + height: 15px; + float: left; + margin-top: 3px; + margin-right: 3px; + background: url('data:image/svg+xml;utf8,') no-repeat center; +} + +.fa-coins { + width: 15px; + height: 15px; + float: left; + background: url('data:image/svg+xml;utf8,') no-repeat center; +} \ No newline at end of file From fb5164aaae475951a635e107676caf7ff25a3f5d Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 14:55:00 +0900 Subject: [PATCH 08/45] add: showMarkMessage function --- src/components/showMarkMessage/index.js | 20 ++++++++++++++++++++ src/index.js | 6 +++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/components/showMarkMessage/index.js diff --git a/src/components/showMarkMessage/index.js b/src/components/showMarkMessage/index.js new file mode 100644 index 0000000..fd8ff04 --- /dev/null +++ b/src/components/showMarkMessage/index.js @@ -0,0 +1,20 @@ +/* + * 功能:黑条文字鼠标悬浮显示 + * param: isOn 是否开启功能 + */ +const showMarkMessage = (isOn) => { + if (isOn) { + window.addEventListener('load', () => { + $('.mark').hover( + function () { + $(this).css({ color: "rgb(255,255,255)" }); + }, + function () { + $(this).css({ color: $(this).css('background-color') }); + } + ); + }) + } +} + +export default showMarkMessage; diff --git a/src/index.js b/src/index.js index ea7cd9d..bf60283 100644 --- a/src/index.js +++ b/src/index.js @@ -2,12 +2,16 @@ GM_addStyle(require('./resource/style/icon.css').toString()); import pageBottom from './components/PageBottomButton'; import beautifyQaIndex from './components/BeautifyQaIndex'; +import showMarkMessage from './components/showMarkMessage'; const page = window.location.href; +// 全局 +pageBottom(); +showMarkMessage(true); // TODO 设置面板 + // 导航 > 问答 if (/\/qa/.test(page)) { beautifyQaIndex(true); // TODO 设置面板 } -pageBottom(); From c98a0140229b53d6365fe32c95c8ffe11798343f Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 15:36:19 +0900 Subject: [PATCH 09/45] add: OpBadge function --- src/components/OpBadge/index.js | 14 ++++++++++++++ src/index.js | 6 ++++++ 2 files changed, 20 insertions(+) create mode 100644 src/components/OpBadge/index.js diff --git a/src/components/OpBadge/index.js b/src/components/OpBadge/index.js new file mode 100644 index 0000000..3d86bd5 --- /dev/null +++ b/src/components/OpBadge/index.js @@ -0,0 +1,14 @@ +/* + * 功能:对发帖楼主增加“楼主”标志 + */ +const OpBadge = () => { + const userId = document.querySelector('.psnnode').text; + $('.psnnode').map((index, node) => { + // 匹配楼主ID,变更CSS + if ($(node).text() == userId) { + $(node).after('楼主'); + } + }); +} + +export default OpBadge; diff --git a/src/index.js b/src/index.js index bf60283..255ef9a 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ GM_addStyle(require('./resource/style/icon.css').toString()); import pageBottom from './components/PageBottomButton'; import beautifyQaIndex from './components/BeautifyQaIndex'; import showMarkMessage from './components/showMarkMessage'; +import OpBadge from './components/OpBadge'; const page = window.location.href; @@ -10,6 +11,11 @@ const page = window.location.href; pageBottom(); showMarkMessage(true); // TODO 设置面板 +// TODO Router refactor +if (/(gene|trade|topic)\//.test(page) & !/comment/.test(page)) { + OpBadge(); +} + // 导航 > 问答 if (/\/qa/.test(page)) { beautifyQaIndex(true); // TODO 设置面板 From 1f515ab8343d48de43458ac4af76f6343e94d573 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 15:40:55 +0900 Subject: [PATCH 10/45] rename: directory --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 255ef9a..d7cedce 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,7 @@ GM_addStyle(require('./resource/style/icon.css').toString()); import pageBottom from './components/PageBottomButton'; import beautifyQaIndex from './components/BeautifyQaIndex'; -import showMarkMessage from './components/showMarkMessage'; +import showMarkMessage from './components/ShowMarkMessage'; import OpBadge from './components/OpBadge'; const page = window.location.href; From cf3b5145d66fd200179b7dd32d73e2de0fbe03b2 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 15:46:45 +0900 Subject: [PATCH 11/45] add: hotTag function --- src/components/HotTag/index.js | 23 +++++++++++++++++++++++ src/index.js | 2 ++ 2 files changed, 25 insertions(+) create mode 100644 src/components/HotTag/index.js diff --git a/src/components/HotTag/index.js b/src/components/HotTag/index.js new file mode 100644 index 0000000..79cc871 --- /dev/null +++ b/src/components/HotTag/index.js @@ -0,0 +1,23 @@ +/* + * 功能:热门帖子增加 热门 标签 + * param hotTagThreshold 设置热门阈值 + */ +const hotTag = (hotTagThreshold) => { + $('div.meta').map((index, element) => { + const replyCount = $(element).text().split(/(\d+)/); + if (Number(replyCount[replyCount.length - 2]) > hotTagThreshold + && replyCount[replyCount.length - 1].match('评论|答案|回复') + && replyCount[replyCount.length - 1].match('评论|答案|回复').index > -1 + && $(element).children('a#hot').length === 0 + ) { + const tagBackgroundColor = $('body.bg').css('background-color'); + $(element) + .append(` 🔥热门 `); + } + }) +} + +export default hotTag; diff --git a/src/index.js b/src/index.js index d7cedce..503b2d3 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ GM_addStyle(require('./resource/style/icon.css').toString()); import pageBottom from './components/PageBottomButton'; +import hotTag from './components/HotTag'; import beautifyQaIndex from './components/BeautifyQaIndex'; import showMarkMessage from './components/ShowMarkMessage'; import OpBadge from './components/OpBadge'; @@ -9,6 +10,7 @@ const page = window.location.href; // 全局 pageBottom(); +hotTag(30); // TODO 设置面板 showMarkMessage(true); // TODO 设置面板 // TODO Router refactor From 4aa034d013c6efbf147793dc75e4b932da452664 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 15:53:56 +0900 Subject: [PATCH 12/45] add: inputCounter function --- src/components/InputCounter/index.js | 29 ++++++++++++++++++++++++++++ src/index.js | 6 ++++++ 2 files changed, 35 insertions(+) create mode 100644 src/components/InputCounter/index.js diff --git a/src/components/InputCounter/index.js b/src/components/InputCounter/index.js new file mode 100644 index 0000000..0486265 --- /dev/null +++ b/src/components/InputCounter/index.js @@ -0,0 +1,29 @@ +/* + * 功能:实时统计创建机因时候的文字数 + */ +const inputCounter = () => { + $(".pr20 > textarea[name='content']").before( + `
+

字数:0/600

+
` + ); + $(".pr20 > textarea[name='content']").keyup(function () { + const wordCount = $('.wordCount').text( + $("textarea[name='content']").val().replace(/\n|\r/gi, '').length + ); + if (Number($(".wordCount").text()) > 600) { + $("button.btn.btn-large.btn-banner") + .prop("disabled", true) + .css("background-color", "#aaa") + .text("内容字数超过上限!"); + } else { + $("button.btn.btn-large.btn-banner") + .prop("disabled", false) + .css("background-color", "#3890ff") + .text("提交"); + } + return (wordCount); + }); +} + +export default inputCounter; diff --git a/src/index.js b/src/index.js index 503b2d3..1b66bce 100644 --- a/src/index.js +++ b/src/index.js @@ -5,6 +5,7 @@ import hotTag from './components/HotTag'; import beautifyQaIndex from './components/BeautifyQaIndex'; import showMarkMessage from './components/ShowMarkMessage'; import OpBadge from './components/OpBadge'; +import inputCounter from './components/InputCounter'; const page = window.location.href; @@ -23,3 +24,8 @@ if (/\/qa/.test(page)) { beautifyQaIndex(true); // TODO 设置面板 } +// 导航 > 机因 > 发机因 +if (/set\/gene/.test(page)) { + // 实时统计创建机因时候的文字数 + inputCounter(); +} From 1f34eace81e1b51c4af4478d99db1a2c9ffc50fe Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 15:54:48 +0900 Subject: [PATCH 13/45] rename: opBadge --- src/components/OpBadge/index.js | 4 ++-- src/index.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/OpBadge/index.js b/src/components/OpBadge/index.js index 3d86bd5..5f968e4 100644 --- a/src/components/OpBadge/index.js +++ b/src/components/OpBadge/index.js @@ -1,7 +1,7 @@ /* * 功能:对发帖楼主增加“楼主”标志 */ -const OpBadge = () => { +const opBadge = () => { const userId = document.querySelector('.psnnode').text; $('.psnnode').map((index, node) => { // 匹配楼主ID,变更CSS @@ -11,4 +11,4 @@ const OpBadge = () => { }); } -export default OpBadge; +export default opBadge; diff --git a/src/index.js b/src/index.js index 1b66bce..42d2bc4 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ import pageBottom from './components/PageBottomButton'; import hotTag from './components/HotTag'; import beautifyQaIndex from './components/BeautifyQaIndex'; import showMarkMessage from './components/ShowMarkMessage'; -import OpBadge from './components/OpBadge'; +import opBadge from './components/OpBadge'; import inputCounter from './components/InputCounter'; const page = window.location.href; @@ -16,7 +16,7 @@ showMarkMessage(true); // TODO 设置面板 // TODO Router refactor if (/(gene|trade|topic)\//.test(page) & !/comment/.test(page)) { - OpBadge(); + opBadge(); } // 导航 > 问答 From 960fd6ad8e55187d17301cc3d7b87021486dda98 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 16:18:14 +0900 Subject: [PATCH 14/45] add: inputPreview function --- src/components/InputPreview/index.js | 48 ++++++++++++++++++++++++++++ src/index.js | 3 ++ 2 files changed, 51 insertions(+) create mode 100644 src/components/InputPreview/index.js diff --git a/src/components/InputPreview/index.js b/src/components/InputPreview/index.js new file mode 100644 index 0000000..dbbb979 --- /dev/null +++ b/src/components/InputPreview/index.js @@ -0,0 +1,48 @@ +/* + * BBCode和html标签对应表 + */ +const bbcode = { + '\\[quote\\](.+?)\\[\/quote\\]': '
$1
', + '\\[mark\\](.+?)\\[\/mark\\]': '$1', + '\\[img\\](.+?)\\[\/img\\]': '', + '\\[b\\](.+?)\\[\/b\\]': '$1', + '\\[s\\](.+?)\\[\/s\\]': '$1', + '\\[center\\](.+?)\\[\/center\\]': '
$1
', + '\\[\\](.+?)\\[\/b\\]': '$1', + '\\[color=(.+?)\\](.+?)\\[\/color\\]': '$2', + '\\[url\\](.+)\\[/url\\]': '$1', + '\\[url=(.+)\\](.+)\\[/url\\]': '$2', + //'\\[trophy=(.+)\\]\\[/trophy\\]': '$2', + //'\\[trophy=(.+)\\](.+)\\[/trophy\\]': '$2', + '\\n': '
', +}; + +/* 将BBCode替换成对应html代码 + * @param str 原始BBCode输入 + * + * @return str 转换后的html代码 + */ +const replaceAll = (str, mapObj) => { + for (let i in mapObj) { + let re = new RegExp(i, 'g'); + str = str.replace(re, mapObj[i]); + } + return str; +} + +const style = `padding: 0px 10px;word-break: break-all;` + +/* + * 功能:在输入框下方追加输入内容预览框 + */ +const inputPreview = () => { + const tag = "textarea[name='content']"; + $(tag).after( + `
` + ); + $(tag).keyup(() => { + $('#preview').html(replaceAll($(tag).val(), bbcode)); + }); +} + +export default inputPreview; diff --git a/src/index.js b/src/index.js index 42d2bc4..a0f74e5 100644 --- a/src/index.js +++ b/src/index.js @@ -6,6 +6,7 @@ import beautifyQaIndex from './components/BeautifyQaIndex'; import showMarkMessage from './components/ShowMarkMessage'; import opBadge from './components/OpBadge'; import inputCounter from './components/InputCounter'; +import inputPreview from './components/InputPreview'; const page = window.location.href; @@ -28,4 +29,6 @@ if (/\/qa/.test(page)) { if (/set\/gene/.test(page)) { // 实时统计创建机因时候的文字数 inputCounter(); + // 发基因时可实时预览结果内容 + inputPreview(); } From 848eeeb91536cd790bc5c425b1feff05817043fb Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 17:22:40 +0900 Subject: [PATCH 15/45] add: sortTipsByLikes function --- src/components/SortTipsByLikes/index.js | 66 +++++++++++++++++++++++++ src/index.js | 5 ++ 2 files changed, 71 insertions(+) create mode 100644 src/components/SortTipsByLikes/index.js diff --git a/src/components/SortTipsByLikes/index.js b/src/components/SortTipsByLikes/index.js new file mode 100644 index 0000000..782e815 --- /dev/null +++ b/src/components/SortTipsByLikes/index.js @@ -0,0 +1,66 @@ +const sortTips = (isSorted) => { + // 检测是否为老页面 + const containerName = $('.post').length > 0 ? '.mt20' : '.list'; + $(containerName).css({ + display: 'flex', + flexDirection: 'column' + }); + // 遍历tips容器下面的每一个子元素 + $(containerName + '>*').each((index, ele) => { + // 获取顶元素 + let $likeEle = $(ele).find('.text-success')[0]; + let likeStr = ""; + if ($likeEle) { + // 获取顶数 + likeStr = $likeEle.innerHTML; + likeStr = likeStr.replace(/[^0-9]/ig, ""); + } + isSorted + ? $(ele).css({ order: 0 }) + : $(ele).css({ order: likeStr ? 99999 - likeStr : 99999 }); + }); + // 把警告信息和排序按钮写死为第一位 + $('.alert-error, #sortTipsByLikes').css({ + order: 0 + }); +} + +/* +* 功能:奖杯心得按“顶”的数量排序功能 +*/ +const sortTipsByLikes = () => { + GM_addStyle( + `#sortTipsByLikes { + padding : 8px 16px; + margin : 10px; + border-radius : 2px; + display : inline-block; + color : white; + background-color : #3498db; + cursor : pointer; + line-height : 24px; + }` + ); + let isSorted = false; + $("根据顶数排序Tips") + .insertAfter($('div.box.mt20>div.pd10.alert-error').get(0)).css({ + width: '111px', + textAlign: 'center', + textDecoration: 'none', + }) + .click((event) => { + sortTips(isSorted); + isSorted + ? $(event.target).text('根据顶数排序Tips').css({ + "background-color": "#3498db", + "color": "#FFFFFF" + }) + : $(event.target).text('恢复默认排序').css({ + "background-color": "#E7EBEE", + "color": "#99A1A7" + }); + isSorted = !isSorted; + }); +} + +export default sortTipsByLikes; diff --git a/src/index.js b/src/index.js index a0f74e5..9cf3fa9 100644 --- a/src/index.js +++ b/src/index.js @@ -7,6 +7,7 @@ import showMarkMessage from './components/ShowMarkMessage'; import opBadge from './components/OpBadge'; import inputCounter from './components/InputCounter'; import inputPreview from './components/InputPreview'; +import sortTipsByLikes from './components/SortTipsByLikes'; const page = window.location.href; @@ -32,3 +33,7 @@ if (/set\/gene/.test(page)) { // 发基因时可实时预览结果内容 inputPreview(); } + +if (/trophy\/\d+($|\/$)/.test(page)) { + sortTipsByLikes(); +} From 524ed718579082e8cce4cbd5c0865e3d9a87d6f8 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 17:25:55 +0900 Subject: [PATCH 16/45] add: switch button style --- src/index.js | 1 + src/resource/style/style.css | 61 +++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index 9cf3fa9..7b583ed 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,5 @@ GM_addStyle(require('./resource/style/icon.css').toString()); +GM_addStyle(require('./resource/style/style.css').toString()); import pageBottom from './components/PageBottomButton'; import hotTag from './components/HotTag'; diff --git a/src/resource/style/style.css b/src/resource/style/style.css index 9599aaf..5e4a5f6 100644 --- a/src/resource/style/style.css +++ b/src/resource/style/style.css @@ -1,8 +1,59 @@ -body { - font-size: 2rem; - display: flex; +.switch { + position: relative; + display: inline-block; + margin-left: 10px; + width: 40px; + height: 18px; } -div { - background-color: #fff; +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 2px; + bottom: 1px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked+.slider { + background-color: #2196F3; +} + +input:focus+.slider { + box-shadow: 0 0 1px #2196F3; +} + +input:checked+.slider:before { + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); +} + +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; } \ No newline at end of file From b9afa4479087400f19ec1c10e5682d61d9761372 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 17:35:52 +0900 Subject: [PATCH 17/45] add: showTrophyNotEarned function --- src/components/ShowTrophyNotEarned/index.js | 13 +++++++++++++ src/index.js | 7 +++++++ 2 files changed, 20 insertions(+) create mode 100644 src/components/ShowTrophyNotEarned/index.js diff --git a/src/components/ShowTrophyNotEarned/index.js b/src/components/ShowTrophyNotEarned/index.js new file mode 100644 index 0000000..dd28d1c --- /dev/null +++ b/src/components/ShowTrophyNotEarned/index.js @@ -0,0 +1,13 @@ +/* + * 功能:奖杯筛选功能 + */ +const showTrophyNotEarned = () => { + $('.dropmenu').append('
  • 只显示未获得
  • '); + let toggle = $('#filterEarned'); + toggle[0].checked = false; + toggle.change(() => { + $('.lh180.alert-success.pd5.r').parent().parent().toggle('slow'); + }); +} + +export default showTrophyNotEarned; diff --git a/src/index.js b/src/index.js index 7b583ed..2c1f732 100644 --- a/src/index.js +++ b/src/index.js @@ -9,6 +9,7 @@ import opBadge from './components/OpBadge'; import inputCounter from './components/InputCounter'; import inputPreview from './components/InputPreview'; import sortTipsByLikes from './components/SortTipsByLikes'; +import showTrophyNotEarned from './components/ShowTrophyNotEarned'; const page = window.location.href; @@ -38,3 +39,9 @@ if (/set\/gene/.test(page)) { if (/trophy\/\d+($|\/$)/.test(page)) { sortTipsByLikes(); } + +// TODO Router refactor +if (/psngame\//.test(page) && /^(?!.*comment|.*rank|.*battle|.*gamelist|.*topic|.*qa)/.test(page)) { + // 只显示为获得 + showTrophyNotEarned(); +} From 22a2bfdc150d4dbfe5847b6935f876a06627ac29 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 17:57:20 +0900 Subject: [PATCH 18/45] add: trophyPieChart function --- src/components/TrophyPieChart/index.js | 125 +++++++++++++++++++++++++ src/index.js | 3 + 2 files changed, 128 insertions(+) create mode 100644 src/components/TrophyPieChart/index.js diff --git a/src/components/TrophyPieChart/index.js b/src/components/TrophyPieChart/index.js new file mode 100644 index 0000000..58557d4 --- /dev/null +++ b/src/components/TrophyPieChart/index.js @@ -0,0 +1,125 @@ +/* + * 获取奖杯各稀有度个数 + * @return {object} 用于绘扇形图的数据块 + */ +const getTrophyRarity = () => { + let rareArray = [0, 0, 0, 0, 0]; // 个数统计 + const rareStandard = [0, 5, 10, 20, 50]; // 区间定义 + for (let rareIndex of [1, 2, 3, 4]) { + $(`.twoge.t${rareIndex}.h-p`).map((i, ev) => { + // 获取稀有度 + const rarity = Number($(ev).eq(0).text().split('%')[0] + .replace('%', '')); + // 计算该稀有度的奖杯数量 + rareArray[[...rareStandard, rarity] + .sort((a, b) => a - b) + .indexOf(rarity) - 1]++; + }); + } + return rareArray; +} + +/* + * 获取奖杯各种类个数 + * @param className 用于识别的类名 + * @param name 奖杯种类名 + * @param color 色块所用颜色码 + * + * @return {object} 用于绘扇形图的单个数据块 + */ +const getTrophyCategory = (className, name, color) => { + const trophyCount = $(className).eq(0).text().replace(name, ''); + return { name: name, y: Number(trophyCount), color: color }; +} + +/* + * 功能:在单独游戏页面上方追加奖杯统计扇形图 + */ +const trophyPieChart = () => { + // 奖杯稀有度统计数据 + const rareArray = getTrophyRarity(); + const trophyRatioSeriesRarityData = [ + { name: '极度珍贵', y: rareArray[0], color: 'rgb(160, 217, 255)' }, + { name: '非常珍贵', y: rareArray[1], color: 'rgb(124, 181, 236)' }, + { name: '珍贵', y: rareArray[2], color: 'rgb(88, 145, 200)' }, + { name: '罕见', y: rareArray[3], color: 'rgb(52, 109, 164)' }, + { name: '一般', y: rareArray[4], color: 'rgb(40, 97, 152)' }, + ]; + // 奖杯个数统计数据 + const trophyRatioSeriesCategoryData = [ + getTrophyCategory('.text-platinum', '白', '#7a96d1'), + getTrophyCategory('.text-gold', '金', '#cd9a46'), + getTrophyCategory('.text-silver', '银', '#a6a6a6'), + getTrophyCategory('.text-bronze', '铜', '#bf6a3a'), + ]; + // 背景设置 + const trophyRatioChart = { + backgroundColor: 'rgba(0,0,0,0)', + }; + // 悬浮内容设置 + const trophyRatioTooltip = { + pointFormat: '{series.name}: {point.percentage:.1f}%', + }; + // 绘图设置 + const trophyRatioPlotOptions = { + pie: { + allowPointSelect: true, + cursor: 'pointer', + dataLabels: { + enabled: true, + distance: -20, + style: { + fontWeight: 'bold', + color: 'white', + textOutline: '0px contrast', + }, + formatter: function () { + return this.point.y; + }, + }, + }, + }; + // 绘图数据 + const trophyRatioSeries = [{ + type: 'pie', + name: '比例', + data: trophyRatioSeriesCategoryData, + center: [50, 30], + size: 130, + }, { + type: 'pie', + name: '比例', + data: trophyRatioSeriesRarityData, + center: [200, 30], + size: 130, + }]; + // 标题设置 + const trophyRatioTitle = { + text: '奖杯统计', + style: { + color: '#808080', + }, + }; + // 构建绘图对象 + const trophyRatio = { + chart: trophyRatioChart, + tooltip: trophyRatioTooltip, + title: trophyRatioTitle, + series: trophyRatioSeries, + plotOptions: trophyRatioPlotOptions, + credits: { enabled: false }, + }; + // 插入页面 + GM_addStyle( + `#trophyRatioChart { + width : 320px; + height : 200px; + margin : 0 0; + display : inline-block; + }` + ); + $('.box.pd10').append('
    '); + Highcharts.chart('trophyRatioChart', trophyRatio) +} + +export default trophyPieChart; diff --git a/src/index.js b/src/index.js index 2c1f732..b929687 100644 --- a/src/index.js +++ b/src/index.js @@ -10,6 +10,7 @@ import inputCounter from './components/InputCounter'; import inputPreview from './components/InputPreview'; import sortTipsByLikes from './components/SortTipsByLikes'; import showTrophyNotEarned from './components/ShowTrophyNotEarned'; +import trophyPieChart from './components/TrophyPieChart'; const page = window.location.href; @@ -42,6 +43,8 @@ if (/trophy\/\d+($|\/$)/.test(page)) { // TODO Router refactor if (/psngame\//.test(page) && /^(?!.*comment|.*rank|.*battle|.*gamelist|.*topic|.*qa)/.test(page)) { + // 奖杯统计扇形图 + trophyPieChart(); // 只显示为获得 showTrophyNotEarned(); } From afd27493d171b54835193f075210ee94e8b34271 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 18:11:58 +0900 Subject: [PATCH 19/45] add: trophyEarnedLineChart function --- src/components/TrophyEarnedLineChart/index.js | 110 ++++++++++++++++++ src/index.js | 3 + src/utils/trophyData.js | 46 ++++++++ 3 files changed, 159 insertions(+) create mode 100644 src/components/TrophyEarnedLineChart/index.js create mode 100644 src/utils/trophyData.js diff --git a/src/components/TrophyEarnedLineChart/index.js b/src/components/TrophyEarnedLineChart/index.js new file mode 100644 index 0000000..c377d80 --- /dev/null +++ b/src/components/TrophyEarnedLineChart/index.js @@ -0,0 +1,110 @@ +import createTrophyEarnedTimeData from '../../utils/trophyData'; +/* + * 功能:在单独游戏页面上方追加奖杯获得时间线形图 + */ +const trophyEarnedLineChart = () => { + // 奖杯获得时间年月统计 + let trophyGetTimeData = createTrophyEarnedTimeData('em.lh180.alert-success.pd5.r'); + const data = trophyGetTimeData.data; + const totalTrophyCount = Number($('div.main>.box.pd10>em>.text-strong') + .text().replace('总', '')); + const receivedTrophyCount = data.length; + + // 悬浮内容设置 + const trophyGetTimeTooltip = { + pointFormat: '{series.name}{point.y}个奖杯', + }; + // 日期格式设置 + const trophyGetTimeXaxis = { + type: 'datetime', + dateTimeLabelFormats: { + second: '%Y-%m-%d
    %H:%M:%S', + minute: '%Y-%m-%d
    %H:%M', + hour: '%Y-%m-%d
    %H:%M', + day: '%Y
    %m-%d', + week: '%Y
    %m-%d', + month: '%Y-%m', + year: '%Y', + }, + title: { + display: false, + }, + }; + // 绘图数据 + const trophyGetTimeSeries = [ + { + name: '第', + data: data, + showInLegend: false, + }, + ]; + // 标题设置 + const trophyGetRatio = ((receivedTrophyCount / totalTrophyCount) * 100).toFixed(2); + const trophyGetTimeTitleText = `奖杯获得时间(完成率:${trophyGetRatio}%)`; + const trophyGetTimeTitle = { + text: trophyGetTimeTitleText, + style: { + color: '#808080', + }, + }; + const trophyGetTimeSubtitle = { + text: $('div.ml100>p').eq(0).text(), // 游戏名称 + } + // Y轴设置 + const trophyGetTimeYAxis = { + title: { + text: '获得个数', + }, + min: 0, + max: totalTrophyCount, + endOnTick: false, + tickInterval: Math.floor(totalTrophyCount / 4), + }; + // 绘图设置 + const trophyGetTimeChart = { + backgroundColor: 'rgba(0,0,0,0)', + type: 'area', + }; + // 图形设置 + const trophyGetTimePlotOptions = { + areaspline: { + fillOpacity: 0.5 + } + }; + // Credits设置 + const trophyGetTimeCreditsText = [] + $('div.main>.box.pd10>em:eq(0)>span').map((i, el) => { + trophyGetTimeCreditsText.push($(el).text()); + }) + const trophyGetTimeCredits = { + text: trophyGetTimeCreditsText.join(' '), + href: undefined, + } + const trophyGetTime = { + chart: trophyGetTimeChart, + tooltip: trophyGetTimeTooltip, + xAxis: trophyGetTimeXaxis, + yAxis: trophyGetTimeYAxis, + title: trophyGetTimeTitle, + subtitle: trophyGetTimeSubtitle, + series: trophyGetTimeSeries, + plotOptions: trophyGetTimePlotOptions, + credits: trophyGetTimeCredits, + }; + // 插入页面 + // 插入页面 + GM_addStyle( + `#trophyGetTimeChart { + width : 460px; + height : 200px; + margin : 0 0; + display : inline-block; + }` + ); + $('.box.pd10').append( + `
    ` + ); + Highcharts.chart('trophyGetTimeChart', trophyGetTime); +} + +export default trophyEarnedLineChart; diff --git a/src/index.js b/src/index.js index b929687..0543d57 100644 --- a/src/index.js +++ b/src/index.js @@ -11,6 +11,7 @@ import inputPreview from './components/InputPreview'; import sortTipsByLikes from './components/SortTipsByLikes'; import showTrophyNotEarned from './components/ShowTrophyNotEarned'; import trophyPieChart from './components/TrophyPieChart'; +import trophyEarnedLineChart from './components/TrophyEarnedLineChart'; const page = window.location.href; @@ -45,6 +46,8 @@ if (/trophy\/\d+($|\/$)/.test(page)) { if (/psngame\//.test(page) && /^(?!.*comment|.*rank|.*battle|.*gamelist|.*topic|.*qa)/.test(page)) { // 奖杯统计扇形图 trophyPieChart(); + // 奖杯获得时间线形图 + trophyEarnedLineChart(); // 只显示为获得 showTrophyNotEarned(); } diff --git a/src/utils/trophyData.js b/src/utils/trophyData.js new file mode 100644 index 0000000..ce4962e --- /dev/null +++ b/src/utils/trophyData.js @@ -0,0 +1,46 @@ +/* + * 构建奖杯获得时间绘图数据集 + * @param className 用于识别的类名 + * + * @return {object} 用于绘线形图的数据集 + */ +const trophyEarnedTimeElementParser = (timeElement) => { + // 奖杯时间丢失部分处理 + const dayTime = $(timeElement).text().trim(); + if (dayTime === '时间丢失') + return 0; + // 从页面上获取奖杯时间,生成时间对象并且放入数组中保存 + const timeArray = [ + $(timeElement).attr('tips').replace('年', ''), // 年 + Number(dayTime.substr(0, 2)) - 1, // 月 + dayTime.substr(3, 2), // 日 + dayTime.substr(5, 2), // 时 + dayTime.substr(8, 2), // 分 + ].map((x) => Number(x)); + return Date.UTC(...timeArray); +}; + +const createTrophyEarnedTimeData = (className) => { + const timeElements = $(className); + const getTimeArray = []; + timeElements.map((i, el) => { + const xTime = trophyEarnedTimeElementParser(el); + getTimeArray.push([xTime, el.parentElement.parentElement]); + }) + getTimeArray.sort((t1, t2) => t1[0] - t2[0]); + let earliestValidTimeIndex = getTimeArray.findIndex(t => t[0] != 0); + if (earliestValidTimeIndex >= 0) + getTimeArray.forEach(t => { + if (t[0] == 0) + t[0] = getTimeArray[earliestValidTimeIndex][0] + }); + else + getTimeArray.forEach(t => t[0] = Number.NaN); + const data = getTimeArray.map((x, y) => [x[0], y + 1]); + // 调整最终数据点 + // data[data.length - 1][1] -= 1; + const trophyElements = getTimeArray.map((x) => x[1]); + return { 'data': data, 'trophyElements': trophyElements }; +} + +export default createTrophyEarnedTimeData; From 8c33bd47377ebf39f3bf95686fd9b0a43b185526 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 18:27:45 +0900 Subject: [PATCH 20/45] add: hoverProfile function --- src/components/HoverProfile/index.js | 44 ++++++++++++++++++++++++++++ src/index.js | 2 ++ src/utils/tippy.js | 38 ++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 src/components/HoverProfile/index.js create mode 100644 src/utils/tippy.js diff --git a/src/components/HoverProfile/index.js b/src/components/HoverProfile/index.js new file mode 100644 index 0000000..0737008 --- /dev/null +++ b/src/components/HoverProfile/index.js @@ -0,0 +1,44 @@ +import tippyOnShow from '../../utils/tippy'; + +/* + * 通过Ajax获取用户名片 + * @param data Ajax获取的数据 + * @param tip Tippy对象 + */ +const getUserCardByAjax = (data, tip) => { + const reg = /[\s\S]*<\/body>/g; + const html = reg.exec(data)[0]; + const inner = $(html).find('.psnzz').parent().get(0); + $(inner).find('.inner').css('max-width', '400px'); + tip.setContent(inner); +} + +/* + * 功能:悬浮于头像显示个人界面 + * @param isOn 是否启用功能 + */ +const hoverProfile = (isOn) => { + if (isOn) { + $("a[href*='psnid/'] > img").parent().map(function (i, v) { + var url = $(this).attr('href'); + $(this).attr('id', 'profile' + i); + tippy(`#profile${i}`, { + content: '加载中...', + delay: 700, + maxWidth: '500px', + animateFill: false, + interactive: true, + placement: 'left', + async onShow(tip) { + tippyOnShow(url, tip, getUserCardByAjax); + }, + onHidden(tip) { + tip.state.ajax.canFetch = true; + tip.setContent('加载中...'); + }, + }); + }); + } +} + +export default hoverProfile; diff --git a/src/index.js b/src/index.js index 0543d57..bdfc926 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,7 @@ GM_addStyle(require('./resource/style/icon.css').toString()); GM_addStyle(require('./resource/style/style.css').toString()); import pageBottom from './components/PageBottomButton'; +import hoverProfile from './components/HoverProfile'; import hotTag from './components/HotTag'; import beautifyQaIndex from './components/BeautifyQaIndex'; import showMarkMessage from './components/ShowMarkMessage'; @@ -19,6 +20,7 @@ const page = window.location.href; pageBottom(); hotTag(30); // TODO 设置面板 showMarkMessage(true); // TODO 设置面板 +hoverProfile(true); // TODO 设置面板 // TODO Router refactor if (/(gene|trade|topic)\//.test(page) & !/comment/.test(page)) { diff --git a/src/utils/tippy.js b/src/utils/tippy.js new file mode 100644 index 0000000..8777593 --- /dev/null +++ b/src/utils/tippy.js @@ -0,0 +1,38 @@ +/* + * 使用Tippy的OnShow部分函数 + * @param url Ajax获取目标地址 + * @param tip Tippy对象 + * @param successFunction 获取数据时调用函数 + */ +const tippyOnShow = (url, tip, successFunction) => { + if (!tip.state.ajax) { + tip.state.ajax = { + isFetching: false, + canFetch: true, + }; + } + if (tip.state.ajax.isFetching || !tip.state.ajax.canFetch) { + return; + } + tip.state.ajax.isFetching = true; + tip.state.ajax.canFetch = false; + try { + $.ajax({ + type: 'GET', + url: url, + dataType: 'html', + success: (data) => { + successFunction(data, tip); + }, + error: () => { + tip.setContent('无法获取页面信息'); + }, + }) + } catch (e) { + tip.setContent(`获取失败:${e}`); + } finally { + tip.state.ajax.isFetching = false; + } +} + +export default tippyOnShow; From 0727e64f118dcf8b215ea00c885dc2383a4ceba4 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 18:40:45 +0900 Subject: [PATCH 21/45] add: earnedStatusInGuide function --- src/components/EarnedStatusInGuide/index.js | 65 +++++++++++++++++++++ src/index.js | 7 +++ 2 files changed, 72 insertions(+) create mode 100644 src/components/EarnedStatusInGuide/index.js diff --git a/src/components/EarnedStatusInGuide/index.js b/src/components/EarnedStatusInGuide/index.js new file mode 100644 index 0000000..12389df --- /dev/null +++ b/src/components/EarnedStatusInGuide/index.js @@ -0,0 +1,65 @@ +/* + * AJAX获取页面 + */ +const fetchOtherPage = (url, successFunction) => { + let resultSet; + $.ajax({ + type: 'GET', + url: url, + dataType: 'html', + async: false, + success: function (data, status) { + if (status == "success") { + resultSet = successFunction(data); + } + }, + error: () => { + console.log('无法获取页面信息'); + }, + }) + return resultSet; +} + +/* + * AJAX获取页面成功回调函数 + */ +const getEarnedTrophiesInfo = (data) => { + const reg = /[\s\S]*<\/body>/g; + const html = reg.exec(data)[0]; + let resultSet = []; + $(html).find('tbody>tr[id]').find('.imgbg.earned').parent().parent().parent().map((index, el) => { + const earnedTime = $(el).find('em.lh180.alert-success.pd5.r'); + const earnedTimeCopy = earnedTime.clone(); + earnedTimeCopy.find("br").replaceWith(" "); + resultSet.push({ + trophy: $(el).find('a').attr('href'), + earned: earnedTime.attr('tips').trim() + ' ' + earnedTimeCopy.text().trim(), + }); + }) + return resultSet; +}; + +/* + * 在攻略页面增加自己奖杯的获得状况 + * @param psnidCookie cookie中提取的用户id + */ +const earnedStatusInGuide = (psnidCookie) => { + let games = {}; + $('.imgbgnb').parent().map((index, el) => { + const href = $(el).attr('href'); + const gameId = href.slice(href.lastIndexOf('/') + 1, -3); + // 根据具体游戏获取对应自己页面的信息 + if (!games.hasOwnProperty(gameId)) { + const gamePageUrl = document.URL.match(/^.+?\.com/)[0] + '/psngame/' + gameId + '?psnid=' + psnidCookie[1]; + const resultSet = fetchOtherPage(gamePageUrl, getEarnedTrophiesInfo); + games[gameId] = resultSet; + } + games[gameId].map(element => { + if (element.trophy === $(el).attr('href')) { + $(el).next().find('a').slice(0, 1).append(`
     ${element.earned}`); + } + }) + }); +} + +export default earnedStatusInGuide; diff --git a/src/index.js b/src/index.js index bdfc926..3de934b 100644 --- a/src/index.js +++ b/src/index.js @@ -13,8 +13,10 @@ import sortTipsByLikes from './components/SortTipsByLikes'; import showTrophyNotEarned from './components/ShowTrophyNotEarned'; import trophyPieChart from './components/TrophyPieChart'; import trophyEarnedLineChart from './components/TrophyEarnedLineChart'; +import earnedStatusInGuide from './components/EarnedStatusInGuide'; const page = window.location.href; +const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); // 全局 pageBottom(); @@ -53,3 +55,8 @@ if (/psngame\//.test(page) && /^(?!.*comment|.*rank|.*battle|.*gamelist|.*topic| // 只显示为获得 showTrophyNotEarned(); } + +if (/topic\//.test(page) && psnidCookie) { + // 在攻略页面增加自己奖杯的获得状况 + earnedStatusInGuide(psnidCookie); +} From adc3a751e50e5879d32e2b9f419b3a0b9061fe1e Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 20:16:16 +0900 Subject: [PATCH 22/45] add: gameCompletion function --- src/components/EarnedStatusInGuide/index.js | 4 +- src/components/GameCompletion/index.js | 46 +++++++++++++++++++++ src/index.js | 6 +++ 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/components/GameCompletion/index.js diff --git a/src/components/EarnedStatusInGuide/index.js b/src/components/EarnedStatusInGuide/index.js index 12389df..3895b59 100644 --- a/src/components/EarnedStatusInGuide/index.js +++ b/src/components/EarnedStatusInGuide/index.js @@ -23,7 +23,7 @@ const fetchOtherPage = (url, successFunction) => { /* * AJAX获取页面成功回调函数 */ -const getEarnedTrophiesInfo = (data) => { +const parser = (data) => { const reg = /[\s\S]*<\/body>/g; const html = reg.exec(data)[0]; let resultSet = []; @@ -51,7 +51,7 @@ const earnedStatusInGuide = (psnidCookie) => { // 根据具体游戏获取对应自己页面的信息 if (!games.hasOwnProperty(gameId)) { const gamePageUrl = document.URL.match(/^.+?\.com/)[0] + '/psngame/' + gameId + '?psnid=' + psnidCookie[1]; - const resultSet = fetchOtherPage(gamePageUrl, getEarnedTrophiesInfo); + const resultSet = fetchOtherPage(gamePageUrl, parser); games[gameId] = resultSet; } games[gameId].map(element => { diff --git a/src/components/GameCompletion/index.js b/src/components/GameCompletion/index.js new file mode 100644 index 0000000..d015719 --- /dev/null +++ b/src/components/GameCompletion/index.js @@ -0,0 +1,46 @@ +import tippyOnShow from '../../utils/tippy'; + +/* + * 通过Ajax获取自己的该游戏页面的奖杯数目 + * @param data Ajax获取的数据 + * @param tip Tippy对象 + */ +const parser = (data, tip) => { + const reg = /[\s\S]*<\/body>/g; + const html = reg.exec(data)[0]; + const inner = $(html).find('td>em>.text-strong'); + tip.setContent(inner.length > 0 + ? `你的奖杯完成度:${inner.text()}` + : '你还没有获得该游戏的任何奖杯' + ); +} + +/* + * 功能:悬浮图标显示自己的游戏的完成度 + */ +const gameCompletion = (psnidCookie) => { + $('.imgbgnb').map((i, el) => { + $(el).attr('id', 'game' + i); + if (psnidCookie) { + let myGameUrl = $(el).parent().attr('href'); + if (myGameUrl !== undefined) { + myGameUrl += `?psnid=${psnidCookie[1]}`; + tippy(`#game${i}`, { + content: '加载中...', + animateFill: false, + placement: 'left', + delay: 500, + async onShow(tip) { + tippyOnShow(myGameUrl, tip, parser); + }, + onHidden(tip) { + tip.state.ajax.canFetch = true; + tip.setContent('加载中...'); + }, + }); + } + } + }); +} + +export default gameCompletion; diff --git a/src/index.js b/src/index.js index 3de934b..f3328af 100644 --- a/src/index.js +++ b/src/index.js @@ -14,6 +14,7 @@ import showTrophyNotEarned from './components/ShowTrophyNotEarned'; import trophyPieChart from './components/TrophyPieChart'; import trophyEarnedLineChart from './components/TrophyEarnedLineChart'; import earnedStatusInGuide from './components/EarnedStatusInGuide'; +import gameCompletion from './components/GameCompletion'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -60,3 +61,8 @@ if (/topic\//.test(page) && psnidCookie) { // 在攻略页面增加自己奖杯的获得状况 earnedStatusInGuide(psnidCookie); } + +if (/psngame/.test(window.location.href) & !/psnid/.test(window.location.href)) { + // 悬浮图标显示自己的游戏的完成度 + gameCompletion(psnidCookie); +} From a6331e947461ad1d844cd235621d97328bdc3b2f Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 20:21:10 +0900 Subject: [PATCH 23/45] add: autoCheckIn function --- src/components/AutoCheckIn/index.js | 12 ++++++++++++ src/index.js | 2 ++ 2 files changed, 14 insertions(+) create mode 100644 src/components/AutoCheckIn/index.js diff --git a/src/components/AutoCheckIn/index.js b/src/components/AutoCheckIn/index.js new file mode 100644 index 0000000..3fcf3f4 --- /dev/null +++ b/src/components/AutoCheckIn/index.js @@ -0,0 +1,12 @@ +/* + * 自动签到功能 + * @param isOn 是否开启功能 + */ +const autoCheckIn = (isOn) => { + // 如果签到按钮存在页面上 + if (isOn && $('[class$=yuan]').length > 0) { + $('[class$=yuan]').click(); + } +} + +export default autoCheckIn; diff --git a/src/index.js b/src/index.js index f3328af..72fa65e 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,7 @@ GM_addStyle(require('./resource/style/icon.css').toString()); GM_addStyle(require('./resource/style/style.css').toString()); import pageBottom from './components/PageBottomButton'; +import autoCheckIn from './components/AutoCheckIn'; import hoverProfile from './components/HoverProfile'; import hotTag from './components/HotTag'; import beautifyQaIndex from './components/BeautifyQaIndex'; @@ -20,6 +21,7 @@ const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); // 全局 +autoCheckIn(true); // TODO 设置面板 pageBottom(); hotTag(30); // TODO 设置面板 showMarkMessage(true); // TODO 设置面板 From 8b8a88f4161864446547b9994ab1b01b467412d0 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 20:27:09 +0900 Subject: [PATCH 24/45] add: replyContent function --- src/components/ReplyContent/index.js | 94 ++++++++++++++++++++++++++++ src/index.js | 8 ++- 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 src/components/ReplyContent/index.js diff --git a/src/components/ReplyContent/index.js b/src/components/ReplyContent/index.js new file mode 100644 index 0000000..e024384 --- /dev/null +++ b/src/components/ReplyContent/index.js @@ -0,0 +1,94 @@ +/* + * 功能:回复内容回溯,仅支持机因、主题 + * @param isOn 是否开启功能 + */ +const replyContent = (isOn) => { + if (isOn) { + GM_addStyle( + `.replyTraceback { + background-color: rgb(0, 0, 0, 0.05) !important; + padding: 10px !important; + color: rgb(160, 160, 160, 1) !important; + border-bottom: 1px solid !important; + }` + ); + // 悬浮框内容左对齐样式 + GM_addStyle(` + .tippy-content { + text-align: left; + ` + ); + // 每一层楼的回复框 + const allSource = $('.post .ml64 > .content'); + // 每一层楼的回复者用户名 + const userId = $('.post > .ml64 > [class$=meta]'); + // 每一层的头像 + const avator = $('.post > a.l'); + for (let floor = allSource.length - 1; floor > 0; floor--) { + // 层内内容里包含链接(B的发言中是否有A) + const content = allSource.eq(floor).find('a'); + if (content.length > 0) { + for (let userNum = 0; userNum < content.length; userNum++) { + // 对每一个链接的文本内容判断 + const linkContent = content.eq(userNum).text().match('@(.+)'); + // 链接里是@用户生成的链接, linkContent为用户名(B的发言中有A) + if (linkContent !== null) { + // 从本层的上一层开始,回溯所@的用户的最近回复(找最近的一条A的发言) + let traceIdFirst = -1; + let traceIdTrue = -1; + for (let traceId = floor - 1; traceId >= 0; traceId--) { + // 如果回溯到了的话,选取内容 + // 回溯层用户名 + const thisUserID = userId.eq(traceId).find('.psnnode:eq(0)').text(); + if (thisUserID.toLowerCase() === linkContent[1].toLowerCase()) { + // 判断回溯中的@(A的发言中有是否有B) + if ( + allSource.eq(traceId).text() === userId.eq(floor).find('.psnnode:eq(0)').text() + ) { + traceIdTrue = traceId; + break; + } else if (traceIdFirst == -1) { + traceIdFirst = traceId; + } + } + } + let outputID = -1; + if (traceIdTrue !== -1) { + outputID = traceIdTrue; + } else if (traceIdFirst != -1) { + outputID = traceIdFirst; + } + // 输出 + if (outputID !== -1) { + const replyContentsText = allSource.eq(outputID).text(); + const replyContents = replyContentsText.length > 45 + ? `${replyContentsText.substring(0, 45)}......` + : replyContentsText; + const avatorImg = avator.eq(outputID).find('img:eq(0)').attr('src'); + allSource.eq(floor).before(` +
    + + + ${linkContent[1]} + + + ${replyContents} + +
    `); + // 如果内容超过45个字符,则增加悬浮显示全文内容功能 + replyContentsText.length > 45 + ? tippy(`.responserContent_${floor}_${outputID}`, { + content: replyContentsText, + animateFill: false, + maxWidth: '500px', + }) + : null; + } + } + } + } + } + } +} + +export default replyContent; diff --git a/src/index.js b/src/index.js index 72fa65e..c4b83fa 100644 --- a/src/index.js +++ b/src/index.js @@ -16,6 +16,7 @@ import trophyPieChart from './components/TrophyPieChart'; import trophyEarnedLineChart from './components/TrophyEarnedLineChart'; import earnedStatusInGuide from './components/EarnedStatusInGuide'; import gameCompletion from './components/GameCompletion'; +import replyContent from './components/ReplyContent'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -64,7 +65,12 @@ if (/topic\//.test(page) && psnidCookie) { earnedStatusInGuide(psnidCookie); } -if (/psngame/.test(window.location.href) & !/psnid/.test(window.location.href)) { +if (/psngame/.test(page) & !/psnid/.test(page)) { // 悬浮图标显示自己的游戏的完成度 gameCompletion(psnidCookie); } + +// 页面:机因、主题 +if (/(gene|topic|trade|battle)\//.test(page)) { + replyContent(true); // TODO 设置面板 +} From 1af4efe68c7c6868a9b805ff519022f64d9b0c40 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 20:55:03 +0900 Subject: [PATCH 25/45] add: allGame function --- src/components/AllGame/index.js | 46 +++++++++++++++++++++++++++++++++ src/index.js | 5 ++++ src/resource/style/style.css | 9 +++++++ 3 files changed, 60 insertions(+) create mode 100644 src/components/AllGame/index.js diff --git a/src/components/AllGame/index.js b/src/components/AllGame/index.js new file mode 100644 index 0000000..04e02ee --- /dev/null +++ b/src/components/AllGame/index.js @@ -0,0 +1,46 @@ +/* + * 个人主页下显示所有游戏 + * @param isOn 是否启用功能 + */ +const allGame = (isOn) => { + if (isOn) { + let isbool2 = true; //触发开关,防止多次调用事件 + // 插入加载提示信息 + $('body').append("
    "); + let gamePageIndex = 2; + $(window).scroll(function () { + if ( + $(this).scrollTop() + $(window).height() + 700 >= + $(document).height() && + $(this).scrollTop() > 700 && + isbool2 == true + ) { + isbool2 = false; + let gamePage = + window.location.href + '/psngame?page=' + gamePageIndex; + // 加载页面并且插入 + $('#loadingMessage').text(`加载第${gamePageIndex}页...`).show(); + $.get( + gamePage, + {}, + (data) => { + const nextGameContent = $('
    ').html(data).find('tbody > tr'); + if (nextGameContent.length > 0) { + $('tbody > tr:last').after(nextGameContent); + isbool2 = true; + gamePageIndex++; + } else { + $('#loadingMessage').text('没有更多游戏了...'); + } + }, + 'html' + ); + setTimeout(() => { + $('#loadingMessage').fadeOut(); + }, 2000); + } + }); + } +} + +export default allGame; diff --git a/src/index.js b/src/index.js index c4b83fa..3d52299 100644 --- a/src/index.js +++ b/src/index.js @@ -17,6 +17,7 @@ import trophyEarnedLineChart from './components/TrophyEarnedLineChart'; import earnedStatusInGuide from './components/EarnedStatusInGuide'; import gameCompletion from './components/GameCompletion'; import replyContent from './components/ReplyContent'; +import allGame from './components/AllGame'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -74,3 +75,7 @@ if (/psngame/.test(page) & !/psnid/.test(page)) { if (/(gene|topic|trade|battle)\//.test(page)) { replyContent(true); // TODO 设置面板 } + +if (/psnid\/[A-Za-z0-9_-]+$/.test(page) && $('tbody').length > 2) { + allGame(true); // TODO 设置面板 +} diff --git a/src/resource/style/style.css b/src/resource/style/style.css index 5e4a5f6..d2524af 100644 --- a/src/resource/style/style.css +++ b/src/resource/style/style.css @@ -56,4 +56,13 @@ input:checked+.slider:before { .slider.round:before { border-radius: 50%; +} + +#loadingMessage { + position: absolute; + bottom: 0px; + position: fixed; + right: 1px !important; + display: none; + color: white; } \ No newline at end of file From 1f7baea8c2925645c1446c809ad597d7bef83029 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 21:09:30 +0900 Subject: [PATCH 26/45] add: autoPaging function --- src/components/AutoPaging/index.js | 69 ++++++++++++++++++++++++++++++ src/index.js | 6 +++ 2 files changed, 75 insertions(+) create mode 100644 src/components/AutoPaging/index.js diff --git a/src/components/AutoPaging/index.js b/src/components/AutoPaging/index.js new file mode 100644 index 0000000..d5a1533 --- /dev/null +++ b/src/components/AutoPaging/index.js @@ -0,0 +1,69 @@ +import hoverProfile from '../HoverProfile'; + +/* 获取当前页面的后一页页码和链接 + * @return nextPage 后一页页码 + * @return nextPageLink 后一页的链接 + */ +const getNextPageInfo = () => { + const page = window.location.href; + // 获取下一页页码 + const nextPage = Number($('.page > ul > .current:last').text()) + 1; + // 如果地址已经有地址信息 + const nextPageLink = /page/.test(page) + ? page.replace(/page=.+/, `page=${nextPage}`) + : `${page}&page=${nextPage}`; + + return { nextPage, nextPageLink } +} + +/* + * 功能:自动翻页 + * @param pagingSetting 自动翻页的页数 + */ +const autoPaging = (pagingSetting) => { + if (pagingSetting > 0) { + let isbool = true; //触发开关,防止多次调用事件 + let autoPagingLimitCount = 0; + // 插入加载提示信息 + $('body').append("
    "); + $(window).scroll(function () { + //当内容滚动到底部时加载新的内容 + if ( + $(this).scrollTop() + $(window).height() + 700 >= + $(document).height() && + $(this).scrollTop() > 700 && + isbool == true && + autoPagingLimitCount < pagingSetting + ) { + isbool = false; + // 获取下一页页码和链接 + const { nextPage, nextPageLink } = getNextPageInfo(); + // 加载页面并且插入 + $('#loadingMessage').text(`加载第${nextPage}页...`).show(); + $('.page:last').after(`
    `); + $.get( + nextPageLink, + {}, + (data) => { + const $response = $('
    ').html(data); + $(`.loadPage${nextPage}`) + .append($response.find('.list')) + .append($response.find('.page')); + isbool = true; + autoPagingLimitCount++; + // 各个页面的功能追加 + // addHighlightOnID(); // TODO + // filterUserPost(); // TODO + hoverProfile(); + }, + 'html' + ); + setTimeout(() => { + $('#loadingMessage').fadeOut(); + }, 2000); + } + }); + } +} + +export default autoPaging; diff --git a/src/index.js b/src/index.js index 3d52299..4b28a62 100644 --- a/src/index.js +++ b/src/index.js @@ -18,6 +18,7 @@ import earnedStatusInGuide from './components/EarnedStatusInGuide'; import gameCompletion from './components/GameCompletion'; import replyContent from './components/ReplyContent'; import allGame from './components/AllGame'; +import autoPaging from './components/AutoPaging'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -79,3 +80,8 @@ if (/(gene|topic|trade|battle)\//.test(page)) { if (/psnid\/[A-Za-z0-9_-]+$/.test(page) && $('tbody').length > 2) { allGame(true); // TODO 设置面板 } + +// 综合页面:一览 +if (/((gene|qa|topic|trade)($|\?))/.test(page)) { + autoPaging(3); // TODO 设置面板 +} From 8529a46b3d5a3d99e2018001f0a1f6ba90bf7618 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 21:16:07 +0900 Subject: [PATCH 27/45] add: highchart global setting --- src/index.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/index.js b/src/index.js index 4b28a62..06ca7a5 100644 --- a/src/index.js +++ b/src/index.js @@ -23,6 +23,48 @@ import autoPaging from './components/AutoPaging'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); +Highcharts.setOptions({ + lang: { + decimalPoint: '.', + drillUpText: '返回 {series.name}', + loading: '加载中', + months: [ + '一月', + '二月', + '三月', + '四月', + '五月', + '六月', + '七月', + '八月', + '九月', + '十月', + '十一月', + '十二月', + ], + noData: '没有数据', + numericSymbols: ['千', '兆', 'G', 'T', 'P', 'E'], + resetZoom: '恢复缩放', + resetZoomTitle: '恢复图表', + shortMonths: [ + '1月', + '2月', + '3月', + '4月', + '5月', + '6月', + '7月', + '8月', + '9月', + '10月', + '11月', + '12月', + ], + thousandsSep: ',', + weekdays: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'], + }, +}); + // 全局 autoCheckIn(true); // TODO 设置面板 pageBottom(); From 64d2cb31428d85b275e2e57faac9c390ec500998 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 21:28:17 +0900 Subject: [PATCH 28/45] add: floorIndex function --- src/components/FloorIndex/index.js | 23 +++++++++++++++++++++++ src/index.js | 2 ++ 2 files changed, 25 insertions(+) create mode 100644 src/components/FloorIndex/index.js diff --git a/src/components/FloorIndex/index.js b/src/components/FloorIndex/index.js new file mode 100644 index 0000000..9d4105f --- /dev/null +++ b/src/components/FloorIndex/index.js @@ -0,0 +1,23 @@ +/* + * 功能:增加帖子楼层信息 + */ +const floorIndex = () => { + let baseFloorIndex = 0; + let subFloorIndex = -1; + $('span[class^=r]').map((i, el) => { + if (i > 0) { + if ($(el).attr('class') === 'r') { + $(el).children('a:last') + .after(`  #${++baseFloorIndex}`); + subFloorIndex = -1; + } else { + $(el).children('a:last') + .after( + `  #${baseFloorIndex}${subFloorIndex--}` + ); + } + } + }); +} + +export default floorIndex; diff --git a/src/index.js b/src/index.js index 06ca7a5..f7e9fe0 100644 --- a/src/index.js +++ b/src/index.js @@ -19,6 +19,7 @@ import gameCompletion from './components/GameCompletion'; import replyContent from './components/ReplyContent'; import allGame from './components/AllGame'; import autoPaging from './components/AutoPaging'; +import floorIndex from './components/FloorIndex'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -71,6 +72,7 @@ pageBottom(); hotTag(30); // TODO 设置面板 showMarkMessage(true); // TODO 设置面板 hoverProfile(true); // TODO 设置面板 +floorIndex(); // TODO Router // TODO Router refactor if (/(gene|trade|topic)\//.test(page) & !/comment/.test(page)) { From f482a7c64be18d6a7c854537ef9793e3e10efd01 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 22:03:33 +0900 Subject: [PATCH 29/45] add: p9TimeTextParser --- src/utils/date.js | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/utils/date.js diff --git a/src/utils/date.js b/src/utils/date.js new file mode 100644 index 0000000..ac2bfc7 --- /dev/null +++ b/src/utils/date.js @@ -0,0 +1,74 @@ +const UNIT_TIME_HOUT = 60 * 60 * 1000; + +// 1小时 +const relative_description_to_offset = (prune_pattern, unit_time) => { + return -parseInt(timestamp_text.replace(prune_pattern, '')) * unit_time; +} + +const relative_timestamp = (offset, replace_pattern) => { + if (replace_pattern) { + return ( + (new Date((new Date()).getTime() + 8 * UNIT_TIME_HOUT + offset)) + .toLocaleDateString('en-CA', { timeZone: "Asia/Shanghai" }) + .split('-') + .concat(timestamp_text.replace(replace_pattern, '').split(/:/)) + ); + } else { + let _array = (new Date((new Date()).getTime() + offset)) + .toLocaleString('en-CA', { timeZone: "Asia/Shanghai", hour12: false }) + .split(/-|, |:/); + _array.pop(); + return _array; + } +} + +const date_string_to_array = date_string => { + return date_string.split(/-|\s|:/); +}; + +/* + * P9时间格式转换函数 + * @param timestamp_text P9时间字符串 + * @return UTC 时间 + */ +const p9TimeTextParser = (timestamp_text) => { // returns UTC time + let array = null; + if (timestamp_text.match(/[0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}/)) { + array = date_string_to_array(timestamp_text); + } else if (timestamp_text.match(/[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}/)) { + array = date_string_to_array(timestamp_text); + array.unshift((new Date()).getFullYear()); + } else { + // if time were not offset by 8 hours, date calculation would be incorrect when description involves '[0-9]+天前' + if (timestamp_text.match(/[0-9]+天前\s[0-9]{2}:[0-9]{2}/)) + array = relative_timestamp(relative_description_to_offset(/天前.+$/g, UNIT_TIME_HOUT * 24), /[0-9]+天前\s/g); + else if (timestamp_text.match(/前天\s[0-9]{2}:[0-9]{2}/)) + array = relative_timestamp(-2 * UNIT_TIME_HOUT * 24, /前天\s/g); + else if (timestamp_text.match(/昨天\s[0-9]{2}:[0-9]{2}/)) + array = relative_timestamp(-UNIT_TIME_HOUT * 24, /昨天\s/g); + else if (timestamp_text.match(/今天\s[0-9]{2}:[0-9]{2}/)) + array = relative_timestamp(0, /今天\s/g); + else if (timestamp_text.match(/[0-9]+小时前/)) + array = relative_timestamp(relative_description_to_offset(/小时.+$/g, UNIT_TIME_HOUT)); + else if (timestamp_text.match(/[0-9]+分钟前/)) + array = relative_timestamp(relative_description_to_offset(/分钟.+$/g, 60 * 1000)); + else if (timestamp_text.match(/刚刚/)) + array = relative_timestamp(0); + } + if (array) { + for (let i = array.length - 1; i >= 0; i--) { + if (array[i] == '') { + array.splice(i, 1); + continue; + } + array[i] = parseInt(array[i]); + if (i == 1) // Everything else is normal except month starts from 0 + array[i]--; + } + return Date.UTC(...array) - 8 * UNIT_TIME_HOUT; + } + console.log('not parsed: ' + timestamp_text); + return null; +} + +export default p9TimeTextParser; From fa6419095cae689d6c94e6a58ae52541e6ddefe6 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 22:13:26 +0900 Subject: [PATCH 30/45] add: priceLinePlot function --- src/components/PriceLinePlot/index.js | 197 ++++++++++++++++++++++++++ src/index.js | 6 + src/utils/date.js | 14 +- 3 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 src/components/PriceLinePlot/index.js diff --git a/src/components/PriceLinePlot/index.js b/src/components/PriceLinePlot/index.js new file mode 100644 index 0000000..e959f80 --- /dev/null +++ b/src/components/PriceLinePlot/index.js @@ -0,0 +1,197 @@ +import { converntTime } from '../../utils/date'; + +/* + * 获取当前页面的价格变动时间,构建绘图曲线X轴数据集 + * @return xValue 价格变动时间X数据 + */ +const priceLineDataX = () => { + // 获取X轴的日期 + const xContents = $('p.dd_text'); + let xValue = []; + for (let index = 3; index < xContents.length; index += 4) { + const tamp = xContents[index].innerText.split(' ~ ').map((item) => { + return converntTime(item); + }); + xValue = [tamp[0], tamp[0], tamp[1], tamp[1], ...xValue]; + } + return xValue; +} + +/* + * 获取当前页面的价格情况,构建绘图曲线Y轴数据集 + * @return yNormal 普通会员价格Y数据 + * @return yPlus plus会员价格Y数据 + */ +const priceLineDataY = () => { + const div = $('.dd_price'); + let yNormal = []; + let yPlus = []; + div.map((i, el) => { + const yOld = $(el).children('.dd_price_old').eq(0).text(); + const yPriceNormal = $(el).children('.dd_price_off').eq(0).text(); + // 普通会员价格曲线值 + yNormal = [yOld, yPriceNormal, yPriceNormal, yOld, ...yNormal]; + // PS+会员价格曲线值 + const yPricePlus = $(el).children('.dd_price_plus').eq(0); + const pricePlusTamp = yPricePlus.length === 0 ? yPriceNormal : yPricePlus.text(); + yPlus = [yOld, pricePlusTamp, pricePlusTamp, yOld, ...yPlus]; + }); + return { yNormal, yPlus }; +} + +/* + * 修正数据集的最后一组数据函数。如果当前日期在最后一次促销结束前, + * 则修改最后一组数据为当前日期,如在以后,则将最后一次促销的原始 + * 价格作为最后一组数据的当前价格。 + * @param [dataArray] 包含[datetime, price]的原始数据 + * + * @return [dataArray] 修改后的[datetime, price]数据 + */ +const fixTheLastElement = (data) => { + const today = new Date(); + const todayArray = Date.UTC( + today.getYear() + 1900, + today.getMonth(), + today.getDate() + ); + if (data[data.length - 1][0] > todayArray) { + data.pop(); + data[data.length - 1][0] = todayArray; + } else { + data.push([todayArray, data[data.length - 1][1]]); + } + return data; +} + +/* + * 传入时间和一般、Plus会员价格数组,生成绘图用数据集 + * @param xValue 价格变动时间数组 + * @param yNormal 一般会员价格数组 + * @param yPlus Plus会员价格数组 + * + * @return normalData 一般会员价格绘图用数组 + * @return plusData Plus会员价格绘图用数组 + * @return region 地区货币符 + */ +const createPriceLineData = (xValue, yNormal, yPlus) => { + // 用于保存绘图数据的变量 + let normalData = []; + let plusData = []; + // 判断地区 + const prefix = yNormal[0].substring(0, 1); + const region = prefix === 'H' ? 'HK$' : prefix; + + xValue.map((item, i) => { + normalData.push([item, Number(yNormal[i].replace(region, ''))]); + plusData.push([item, Number(yPlus[i].replace(region, ''))]); + }) + // 最后一组数组的处理,生成最终数据绘图数据集 + normalData = fixTheLastElement(normalData); + plusData = fixTheLastElement(plusData); + return { normalData, plusData, region } +} + +/* + * 根据数据绘制价格变动走势图 + * @param normalData 一般会员价格绘图用数组 + * @param plusData Plus会员价格绘图用数组 + * @param region 地区货币符 + * + * @return priceLinePlot highChart对象 + */ +const createPriceLinePlot = (normalData, plusData, region) => { + const priceLineChart = { + type: 'areaspline', + backgroundColor: 'rgba(0,0,0,0)', + }; + const priceLineTitle = { + text: '价格变动走势图', + style: { + color: '#808080', + }, + }; + const priceLineXAxis = { + type: 'datetime', + dateTimeLabelFormats: { + year: '%y年', + day: '%y年
    %b%e日', + week: '%y年
    %b%e日', + month: '%y年
    %b', + }, + title: { + text: '日期', + }, + }; + const priceLineYAxis = { + title: { + text: '价格', + }, + plotLines: [ + { + value: 0, + width: 1, + color: '#808080', + }, + ], + }; + const priceLineTooltip = { + headerFormat: '{series.name}
    ', + pointFormat: `{point.x:%y年%b%e日}: ${region}{point.y:.2f}`, + }; + const priceLinePlotOptions = { + areaspline: { + fillOpacity: 0.25, + }, + }; + const priceLineSeries = [ + { + name: '普通会员价', + color: '#00a2ff', + data: normalData, + }, + { + name: 'PS+会员价', + color: '#ffd633', + data: plusData, + }, + ]; + const priceLineCredits = { + enabled: false, + }; + const priceLineLegend = { + itemStyle: { + color: '#808080', + }, + itemHoverStyle: { + color: '#3890ff', + }, + }; + const priceLinePlot = { + chart: priceLineChart, + title: priceLineTitle, + tooltip: priceLineTooltip, + xAxis: priceLineXAxis, + yAxis: priceLineYAxis, + series: priceLineSeries, + plotOptions: priceLinePlotOptions, + credits: priceLineCredits, + legend: priceLineLegend, + }; + return priceLinePlot; +} + +/* + * 功能:在页面中插入价格变动走势图 + */ +const priceLinePlot = () => { + // 构建绘图数据 + const xValue = priceLineDataX(); + const { yNormal, yPlus } = priceLineDataY(); + const { normalData, plusData, region } = createPriceLineData(xValue, yNormal, yPlus); + const priceLinePlot = createPriceLinePlot(normalData, plusData, region); + // 插入页面 + $('.dd_ul').before(`
    `); + Highcharts.chart('container', priceLinePlot) +} + +export default priceLinePlot; diff --git a/src/index.js b/src/index.js index f7e9fe0..e4db81e 100644 --- a/src/index.js +++ b/src/index.js @@ -20,6 +20,7 @@ import replyContent from './components/ReplyContent'; import allGame from './components/AllGame'; import autoPaging from './components/AutoPaging'; import floorIndex from './components/FloorIndex'; +import priceLinePlot from './components/PriceLinePlot' const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -129,3 +130,8 @@ if (/psnid\/[A-Za-z0-9_-]+$/.test(page) && $('tbody').length > 2) { if (/((gene|qa|topic|trade)($|\?))/.test(page)) { autoPaging(3); // TODO 设置面板 } + +// 页面:数折 > 商品页 +if (/\/dd\//.test(page) || /game\/[0-9]+\/dd$/.test(page)) { + priceLinePlot(); +} diff --git a/src/utils/date.js b/src/utils/date.js index ac2bfc7..a063d26 100644 --- a/src/utils/date.js +++ b/src/utils/date.js @@ -71,4 +71,16 @@ const p9TimeTextParser = (timestamp_text) => { // returns UTC time return null; } -export default p9TimeTextParser; +/* 日期转换函数,将(XX年XX月XX日)形式切割成UTC时间 + * @param value XX年XX月XX日 形式的字符串 + * @return {object} UTC时间对象 + */ +const converntTime = (value) => { + const time = value.replace(/年|月|日/g, '-').split('-'); + return Date.UTC('20' + time[0], Number(time[1]) - 1, time[2]); +} + +export { + p9TimeTextParser, + converntTime, +}; From a26ee4bf40b4c4bd1e19556c50f98720022a8a6a Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 22:15:52 +0900 Subject: [PATCH 31/45] fix: docs --- src/utils/date.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/utils/date.js b/src/utils/date.js index a063d26..72948f3 100644 --- a/src/utils/date.js +++ b/src/utils/date.js @@ -71,9 +71,10 @@ const p9TimeTextParser = (timestamp_text) => { // returns UTC time return null; } -/* 日期转换函数,将(XX年XX月XX日)形式切割成UTC时间 - * @param value XX年XX月XX日 形式的字符串 - * @return {object} UTC时间对象 +/* + * 日期转换函数,将(XX年XX月XX日)形式切割成UTC时间 + * @param value XX年XX月XX日 形式的字符串 + * @return {object} UTC时间对象 */ const converntTime = (value) => { const time = value.replace(/年|月|日/g, '-').split('-'); From e3239651c96c7908984d99dea0bde856da2a9882 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 22:20:54 +0900 Subject: [PATCH 32/45] add: hoverShowReply function --- src/components/HoverShowReply/index.js | 25 +++++++++++++++++++++++++ src/index.js | 9 ++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/components/HoverShowReply/index.js diff --git a/src/components/HoverShowReply/index.js b/src/components/HoverShowReply/index.js new file mode 100644 index 0000000..8a432ea --- /dev/null +++ b/src/components/HoverShowReply/index.js @@ -0,0 +1,25 @@ +/* + * 回复按钮悬浮触发显示 + * @param div 标签 + */ +const hoverShowReply = (div) => { + const subClass = "span[class='r']"; + $(`${div} ${subClass}`).css({ + opacity: 0, + transition: 'all 0.2s ease', + }); + $(div).hover( + function () { + $(this).find(subClass).css({ + opacity: 1, + }); + }, + function () { + $(this).find(subClass).css({ + opacity: 0, + }); + } + ); +} + +export default hoverShowReply; diff --git a/src/index.js b/src/index.js index e4db81e..f9a40e3 100644 --- a/src/index.js +++ b/src/index.js @@ -20,7 +20,8 @@ import replyContent from './components/ReplyContent'; import allGame from './components/AllGame'; import autoPaging from './components/AutoPaging'; import floorIndex from './components/FloorIndex'; -import priceLinePlot from './components/PriceLinePlot' +import priceLinePlot from './components/PriceLinePlot'; +import hoverShowReply from './components/HoverShowReply'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -74,6 +75,7 @@ hotTag(30); // TODO 设置面板 showMarkMessage(true); // TODO 设置面板 hoverProfile(true); // TODO 设置面板 floorIndex(); // TODO Router +hoverShowReply('.post'); // TODO Router refactor if (/(gene|trade|topic)\//.test(page) & !/comment/.test(page)) { @@ -135,3 +137,8 @@ if (/((gene|qa|topic|trade)($|\?))/.test(page)) { if (/\/dd\//.test(page) || /game\/[0-9]+\/dd$/.test(page)) { priceLinePlot(); } + +if (/^(?!.*trade|.*qa(\?(ob|title)=.*)?$)/.test(page)) { + // 回复按钮悬浮触发显示 + hoverShowReply("div[class$='ml64']"); +} From d67ed4601ced4c8fab46c4c1626ee1a99382ead4 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 22:29:58 +0900 Subject: [PATCH 33/45] add: discountTitleColor function --- psnineplus.js | 1 - src/components/DiscountTitleColor/index.js | 31 ++++++++++++++++++++++ src/index.js | 7 +++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/components/DiscountTitleColor/index.js diff --git a/psnineplus.js b/psnineplus.js index 08fbb4a..9cd0e23 100644 --- a/psnineplus.js +++ b/psnineplus.js @@ -141,7 +141,6 @@ contextButtonTitle: '图表导出菜单', decimalPoint: '.', downloadJPEG: '下载JPEG图片', - downloadPDF: '下载PDF文件', downloadPNG: '下载PNG文件', downloadSVG: '下载SVG文件', drillUpText: '返回 {series.name}', diff --git a/src/components/DiscountTitleColor/index.js b/src/components/DiscountTitleColor/index.js new file mode 100644 index 0000000..a06b815 --- /dev/null +++ b/src/components/DiscountTitleColor/index.js @@ -0,0 +1,31 @@ +/* + * 功能:根据降价幅度变更标题颜色 + */ +const discountTitleColor = () => { + // 设定不同降价范围的标题颜色 + const priceTitleColorDict = { + 100: 'rgb(220,53,69)', + 80: 'rgb(253,126,20)', + 50: 'rgb(255,193,7)', + 20: 'rgb(40,167,69)', + }; + // 着色 + $('.dd_box').map((i, el) => { + try { + const offPercent = Number( + $(el).find('.dd_pic > div[class^="dd_tag"] ').text() + .match('省(.+)%')[1] + ); + for (let key in priceTitleColorDict) { + if (offPercent < key) { + $('.dd_title.mb10>a').eq(i).css({ + color: priceTitleColorDict[key] + }); + break; + } + } + } catch (e) { } + }); +} + +export default discountTitleColor; diff --git a/src/index.js b/src/index.js index f9a40e3..47b12d7 100644 --- a/src/index.js +++ b/src/index.js @@ -22,6 +22,7 @@ import autoPaging from './components/AutoPaging'; import floorIndex from './components/FloorIndex'; import priceLinePlot from './components/PriceLinePlot'; import hoverShowReply from './components/HoverShowReply'; +import discountTitleColor from './components/DiscountTitleColor'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -133,6 +134,12 @@ if (/((gene|qa|topic|trade)($|\?))/.test(page)) { autoPaging(3); // TODO 设置面板 } +// 页面:数折 一览 +if (/\/dd($|\?)/.test(page)) { + // 根据降价幅度变更标题颜色 + discountTitleColor(); +} + // 页面:数折 > 商品页 if (/\/dd\//.test(page) || /game\/[0-9]+\/dd$/.test(page)) { priceLinePlot(); From a4290614806e728c8726ded9b2ffa3fdfde7b388 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 22:36:12 +0900 Subject: [PATCH 34/45] add: bestOnly function --- src/components/BestOnly/index.js | 39 ++++++++++++++++++++++++++++++++ src/index.js | 9 ++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/components/BestOnly/index.js diff --git a/src/components/BestOnly/index.js b/src/components/BestOnly/index.js new file mode 100644 index 0000000..9ee8fab --- /dev/null +++ b/src/components/BestOnly/index.js @@ -0,0 +1,39 @@ +/* +* 功能:页面上追加“只看史低”功能按键,点击显示史低,再次点击恢复显示所有游戏(数折页面) +*/ +const bestOnly = () => { + // 追加只看史低按键 + $('.dropmenu').append('
  • 只看史低
  • '); + // 点击按钮隐藏或者显示 + let toggle = $('#bestOnly'); + toggle[0].checked = false; + toggle.change(() => { + $('li.dd_box').map((i, el) => { + if ($(el).children('.dd_status.dd_status_best').length === 0) { + toggle[0].checked === true ? $(el).hide() : $(el).show(); + } + }); + }); +} + +/* +* 功能:页面上追加“只看史低”功能按键,点击显示史低,再次点击恢复显示所有游戏(活动页面) +*/ +const bestOnlySalesPage = () => { + // 追加只看史低按键 + $('.disabled.h-p').eq(0).after('
  • 只看史低
  • '); + let toggle = $('#bestOnlySalesPage'); + toggle[0].checked = false; + toggle.change(() => { + $(document.querySelectorAll('li.store_box')).map((i, el) => { + if ((el).querySelector('.store_tag_best') === null) { + $(el).css('display', toggle[0].checked === true ? 'none' : 'block'); + } + }) + }); +} + +export { + bestOnly, + bestOnlySalesPage, +} diff --git a/src/index.js b/src/index.js index 47b12d7..054ea2a 100644 --- a/src/index.js +++ b/src/index.js @@ -23,6 +23,7 @@ import floorIndex from './components/FloorIndex'; import priceLinePlot from './components/PriceLinePlot'; import hoverShowReply from './components/HoverShowReply'; import discountTitleColor from './components/DiscountTitleColor'; +import { bestOnly, bestOnlySalesPage } from './components/BestOnly'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -138,6 +139,8 @@ if (/((gene|qa|topic|trade)($|\?))/.test(page)) { if (/\/dd($|\?)/.test(page)) { // 根据降价幅度变更标题颜色 discountTitleColor(); + // 只看史低 + bestOnly(); } // 页面:数折 > 商品页 @@ -145,6 +148,12 @@ if (/\/dd\//.test(page) || /game\/[0-9]+\/dd$/.test(page)) { priceLinePlot(); } +// 页面:活动 +if (/huodong/.test(page)) { + // 只看史低 + bestOnlySalesPage(); +} + if (/^(?!.*trade|.*qa(\?(ob|title)=.*)?$)/.test(page)) { // 回复按钮悬浮触发显示 hoverShowReply("div[class$='ml64']"); From 985a356aa99b593a40f3cbf149c65d661ae9a202 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 22:47:45 +0900 Subject: [PATCH 35/45] add: currencyConversion function --- src/components/CurrencyConversion/index.js | 137 +++++++++++++++++++++ src/index.js | 10 ++ 2 files changed, 147 insertions(+) create mode 100644 src/components/CurrencyConversion/index.js diff --git a/src/components/CurrencyConversion/index.js b/src/components/CurrencyConversion/index.js new file mode 100644 index 0000000..bd04f78 --- /dev/null +++ b/src/components/CurrencyConversion/index.js @@ -0,0 +1,137 @@ +/* + * 增加单个价格或文字展示标签 + * @param value 展示数值或字符串 + * @param className 样式名 + * @param styleString 额外追加的样式 + * @return {string} 展示内容标签 + */ +const priceSpan = (value, className, styleString = null) => { + let text = value; + if (typeof value === 'number') { + if (value > 0) { + text = '¥' + value.toFixed(2); + } else { + return; + } + } + return `${text}`; +} + +const repeatUntilSuccessful = (function_ptr, interval) => { + if (!function_ptr()) + setTimeout(() => { + repeatUntilSuccessful(function_ptr, interval); + }, interval); +} + +const retrieveRealTimeExchangeRate = (callback_success, callback_failure) => { + // 默认汇率 + let exchangeRate = { HKD: 0.8796572978575602, USD: 6.817381644163391, GBP: 8.770269230346404, JPY: 0.06453927675754388 };//latest exchange rate as of 2020/09/30/00:00 AM (GMT+8) + try {// 获取实时汇率 + let httpReq = new XMLHttpRequest(); + httpReq.open("GET", 'https://api.exchangeratesapi.io/latest', false); + httpReq.send(null); + let startTime = Date.now(); + repeatUntilSuccessful(() => { + // Wait until HTTP GET SUCCESSFULL or TIMEOUT + if ((httpReq.status !== 200) && (httpReq.readyState !== XMLHttpRequest.DONE) && (Date.now() - startTime) < 3000) + return false; + let rawExchangeRate = null; + if ((httpReq.status == 200) && (httpReq.readyState == XMLHttpRequest.DONE)) + rawExchangeRate = JSON.parse(httpReq.response); + if (Boolean(rawExchangeRate))// HTTP GET SUCCESSFULL + ['HKD', 'USD', 'GBP', 'JPY'].forEach(currency => exchangeRate[currency] = rawExchangeRate.rates.CNY / rawExchangeRate.rates[currency]); + callback_success(exchangeRate); + return true; + }, 50); + } catch (e) { + console.log('实时汇率获取失败,使用默认汇率'); + callback_failure(exchangeRate); + } +} + +const currencyConversion = () => { + const insertConvertedPriceTags = (exchangeRate) => { + $('.dd_price').map((i, el) => { + // 一览页面和单商品页面不同位置偏移 + const offset = /dd\//.test(window.location.href) ? 2 : 3; + const region = $(`.dd_info p:nth-child(${offset})`).eq(i).text(); + if (region == '国服') + return; + const price = [ + $(el).children().eq(0).text(), // 原始价格 + $(el).children().eq(1).text(), // 优惠价格 + $(el).children().eq(2).text(), // 会员优惠价格 + ]; + // 根据地区转换原始价格 + const regionCurrency = { + 港服: ['HK$', exchangeRate.HKD], + 美服: ['$', exchangeRate.USD], + 日服: ['¥', exchangeRate.JPY], + 英服: ['£', exchangeRate.GBP] + }; + const CNY = price.map(item => { + return ( + Number(item.replace(regionCurrency[region][0], '')) * + regionCurrency[region][1] + ); + }); + // 整块增加的价格表示 + const addCNYPriceBlock = [ + priceSpan(CNY[2], 'dd_price_plus'), + priceSpan(CNY[1], 'dd_price_off'), + priceSpan(CNY[0], 'dd_price_old', 'text-decoration:line-through'), + priceSpan('CNY:', 'dd_price_off', 'font-size:12px;'), + ].filter(Boolean).join(''); + // 添加到页面中 + $('.dd_price span:last-child').eq(i).after(addCNYPriceBlock); + }); + } + retrieveRealTimeExchangeRate(insertConvertedPriceTags, insertConvertedPriceTags); +} + +const currencyConversionSalesPage = () => { + const changeToConvertedPriceTags = (exchangeRate) => { + $('.store_box>.store_price').map((i, el) => { + // 一览页面和单商品页面不同位置偏移 + const region = window.location.href.match(/region=.+?(&|$)/)[0].replace(/(region=|&)/g, '').toLowerCase(); + if (region == 'cn') + return; + // 根据地区转换原始价格 + const regionCurrency = { + hk: ['HK$', exchangeRate.HKD], + us: ['$', exchangeRate.USD], + jp: ['¥', exchangeRate.JPY], + gb: ['£', exchangeRate.GBP] + }; + $(el).children().each((j, price_tag) => { + $(price_tag).attr('original-price', $(price_tag).text()); + $(price_tag).attr('converted-price', `CN¥${(Number($(price_tag).text().replace(regionCurrency[region][0], '')) * regionCurrency[region][1]).toFixed(2)}`); + $(price_tag).text($(price_tag).attr('converted-price')); + }); + }); + } + retrieveRealTimeExchangeRate(changeToConvertedPriceTags, changeToConvertedPriceTags); +} + +/* + * 功能:页面上追加“显示人民币”功能按键(活动页面) + */ +const showOriginalPrice = () => { + if (window.location.href.match(/region=.+?(&|$)/)[0].replace(/(region=|&)/g, '').toLowerCase() == 'cn') + return; + $('.disabled.h-p').eq(0).after('
  • 显示人民币
  • '); + let toggle = $('#selectOriginalPrice'); + toggle[0].checked = true; + toggle.change(() => { + $('.store_box>.store_price').children().each((i, price_tag) => { + $(price_tag).text($(price_tag).attr(toggle[0].checked === true ? 'converted-price' : 'original-price')); + }); + }) +} + +export { + currencyConversion, + currencyConversionSalesPage, + showOriginalPrice, +} diff --git a/src/index.js b/src/index.js index 054ea2a..784854b 100644 --- a/src/index.js +++ b/src/index.js @@ -24,6 +24,7 @@ import priceLinePlot from './components/PriceLinePlot'; import hoverShowReply from './components/HoverShowReply'; import discountTitleColor from './components/DiscountTitleColor'; import { bestOnly, bestOnlySalesPage } from './components/BestOnly'; +import { currencyConversion, currencyConversionSalesPage, showOriginalPrice } from './components/CurrencyConversion'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -141,17 +142,26 @@ if (/\/dd($|\?)/.test(page)) { discountTitleColor(); // 只看史低 bestOnly(); + // 外币转人民币 + currencyConversion(); } // 页面:数折 > 商品页 if (/\/dd\//.test(page) || /game\/[0-9]+\/dd$/.test(page)) { + // 价格走势图 priceLinePlot(); + // 外币转人民币 + currencyConversion(); } // 页面:活动 if (/huodong/.test(page)) { // 只看史低 bestOnlySalesPage(); + // 外币转人民币 + currencyConversionSalesPage(); + // 原币种价格 + showOriginalPrice(); } if (/^(?!.*trade|.*qa(\?(ob|title)=.*)?$)/.test(page)) { From 461d5162b73ce5c2a2471e2b4af7990dfa3ebb1c Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sat, 3 Oct 2020 23:06:04 +0900 Subject: [PATCH 36/45] add: earnedTrophiesSummary function --- src/components/EarnedTrophiesSummary/index.js | 64 +++++++++++++++++++ src/index.js | 3 + 2 files changed, 67 insertions(+) create mode 100644 src/components/EarnedTrophiesSummary/index.js diff --git a/src/components/EarnedTrophiesSummary/index.js b/src/components/EarnedTrophiesSummary/index.js new file mode 100644 index 0000000..48f0eb8 --- /dev/null +++ b/src/components/EarnedTrophiesSummary/index.js @@ -0,0 +1,64 @@ +// 创建奖杯汇总框架函数 +const createTrophyContainer = (object, className, title) => { + const trophyTitleStyle = `border-radius: 2px; padding:5px; cursor: pointer; background-color:${$('li.current').css('background-color')};`; + // 添加标题框在汇总图下 + $('.box.pd10').append( + `

    ` + ); + object.map(function (i, v) { + // 如果这个奖杯有Tips,就设置左边框为绿色,否则就为底色(边框颜色和底色一致) + let tipColor = $(this).parent().parent().next().find('.alert-success.pd5').length > 0 + ? '#8cc14c' + : $('.box').css('background-color'); + // 添加奖杯图标 + $(`.${className}> .trophyContainer`).append( + `` + ); + // 添加鼠标悬浮弹出消息 + tippy(`#${className}Small${i}`, { + content: `${$(this).parent().parent().html()}

    ${$(this).parent().parent().next().html()}`, + theme: 'psnine', + animateFill: false, + }); + }); + // 给奖杯汇总标题填充文字 + const summaryTrophyDict = { + '.t1': ['text-platinum', '白'], + '.t2': ['text-gold', '金'], + '.t3': ['text-silver', '银'], + '.t4': ['text-bronze', '铜'], + }; + let trophySubText = "" + for (let i in summaryTrophyDict) { + trophySubText += ` ${summaryTrophyDict[i][1]}${object.parent().parent(i).length}` + } + $(`.${className}> .trophyCount`).append( + `${title}:${trophySubText} 总${object.length}` + ); +} + +/* + * 功能:汇总以获得和未获得奖杯 + * @param expand 默认展开 + */ +const earnedTrophiesSummary = (collapse) => { + // tippy弹出框的样式 + GM_addStyle(`.tippy-tooltip.psnine-theme {background-color: ${$('.box').css('background-color')};}`); + // 创建已获得奖杯汇总框 + createTrophyContainer($('.imgbg.earned'), 'earnedTrophy', '已获得奖杯'); + // 创建未获得奖杯汇总框 + createTrophyContainer($("img[class$='imgbg']"), 'notEarnedTrophy', '未获得奖杯'); + // 未获得奖杯变黑白 + $('span[id^="notEarnedTrophySmall"] > a > img').css({ filter: 'grayscale(100%)' }); + // 折叠奖杯汇总 + // 奖杯图标设置为不可见 + if (collapse) { + $('.trophyContainer').css('display', 'none'); + } + // 单击奖杯汇总标题后展开奖杯图标 + $('.trophyCount').click(function () { + $(this).next().slideToggle(); + }); +} + +export default earnedTrophiesSummary; diff --git a/src/index.js b/src/index.js index 784854b..073cbad 100644 --- a/src/index.js +++ b/src/index.js @@ -25,6 +25,7 @@ import hoverShowReply from './components/HoverShowReply'; import discountTitleColor from './components/DiscountTitleColor'; import { bestOnly, bestOnlySalesPage } from './components/BestOnly'; import { currencyConversion, currencyConversionSalesPage, showOriginalPrice } from './components/CurrencyConversion'; +import earnedTrophiesSummary from './components/EarnedTrophiesSummary'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -110,6 +111,8 @@ if (/psngame\//.test(page) && /^(?!.*comment|.*rank|.*battle|.*gamelist|.*topic| trophyEarnedLineChart(); // 只显示为获得 showTrophyNotEarned(); + // 汇总已获得和未获得奖杯 + earnedTrophiesSummary(false); // TODO 设置面板 } if (/topic\//.test(page) && psnidCookie) { From 1f560a68dd518fa450ead6c400250217338423b7 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 00:18:56 +0900 Subject: [PATCH 37/45] chore: revert readme --- README.md | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 163246f..5b28ce2 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,15 @@ -## Require -- Node -- npm -- Git +# 🎮 PSN中文网功能增强插件 ![psnine](https://img.shields.io/badge/-PSNINE-black?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAMFBMVEVHcEw0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNs0mNuEOyNSAAAAD3RSTlMAQMAQ4PCApCBQcDBg0JD74B98AAABN0lEQVRIx+2WQRaDIAxECSACWLn/bdsCIkNQ2XXT2bTyHEx+glGIv4STU3KNRccp6dNh4qTM4VDLrGVRxbLGaa3ZQSVQulVJl5JFlh3cLdNyk/xe2IXz4DqYLhZ4mWtHd4/SLY/QQwKmWmGcmUfHb4O1mu8BIPGw4Hg1TEvySQGWoBcItgxndmsbhtJd6baukIKnt525W4anygNECVc1UD8uVbRNbumZNl6UmkagHeRJfX0BdM5NXgA+ZKESpiJ9tRFftZEvue2cS6cKOrGk/IOLTLUcaXuZHrZDq3FB2IonOBCHIy8Bs1Zzo1MxVH+m8fQ+nFeCQM3MWwEsWsy8e8Di7meA5Bb5MDYCt4SnUbP3lv1xOuWuOi3j5kJ5tPiZKahbi54anNRaaG7YElFKQBHR/9PjN3oD6fkt9WKF9rgAAAAASUVORK5CYII=&link=https://www.psnine.com/) ![install](https://img.shields.io/badge/dynamic/json?url=https://raw.githubusercontent.com/swsoyee/swsoyee/master/public/data.json&label=installs&query=$.psnine_enhance_install[0]&color=orange&style=flat-square) ![Last commit](https://img.shields.io/github/last-commit/swsoyee/psnine-enhanced-version.svg?style=flat-square) ![license](https://img.shields.io/github/license/swsoyee/psnine-enhanced-version.svg?style=flat-square) -- `git clone https://github.com/SettingDust/webpack-tampermonkey.git` -- `npm i` -- `npm run dev` -- Copy the content of `./test/header.js` to the TamperMonkey script editor. -- Open a webpage. + -## Features +## 🔧 功能介绍 -- Test without `Ctrl+V` -- Build a public version easily. +### ⏫ 全局优化 - 🌙 增加`黑夜模式`主题选择4。 - ⚙️ `自动黑夜模式`2。 @@ -29,11 +21,10 @@ - 🤼‍♂️ [`约战`](https://psnine.com/battle)页面可以选择不显示发起用户头像。 - 🔧 点击P9页面的右上角`我的` ➡ `插件设置` 可进行插件具体设置1。 -- [webpack-tampermonkey](https://github.com/momocow/webpack-tampermonkey) +--- + -## Example -- [biliplus-material](https://github.com/SettingDust/biliplus-material) -- [RSSHelper](https://github.com/BangumiSystem/RSSHelper) +### 📜 帖子浏览强化 - 🗣 增加蓝色`楼主`标识,更易区分`楼主`与`回帖者`1。 - 🖼 鼠标悬浮预览`-插图-`内容,无需点击打开查看图片。 From 027b3bfa9eb3fcdfcfa1751549546ba4c762196b Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 00:25:13 +0900 Subject: [PATCH 38/45] fix: change opBadge selector --- src/components/OpBadge/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/OpBadge/index.js b/src/components/OpBadge/index.js index 5f968e4..d2083f9 100644 --- a/src/components/OpBadge/index.js +++ b/src/components/OpBadge/index.js @@ -2,7 +2,7 @@ * 功能:对发帖楼主增加“楼主”标志 */ const opBadge = () => { - const userId = document.querySelector('.psnnode').text; + const userId = document.querySelector('.title2').text; $('.psnnode').map((index, node) => { // 匹配楼主ID,变更CSS if ($(node).text() == userId) { From e3d216333708a1ae41f52d358b7b91db5294abc2 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 17:19:36 +0900 Subject: [PATCH 39/45] chore: disable auto check in --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 073cbad..93a6b84 100644 --- a/src/index.js +++ b/src/index.js @@ -73,7 +73,7 @@ Highcharts.setOptions({ }); // 全局 -autoCheckIn(true); // TODO 设置面板 +// autoCheckIn(true); // TODO Webpack打包后无法获得全局函数 pageBottom(); hotTag(30); // TODO 设置面板 showMarkMessage(true); // TODO 设置面板 From a2a02107e45ff427fce9912662830e084dfc8493 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 17:25:37 +0900 Subject: [PATCH 40/45] add: RevertSubReply function --- src/components/RevertSubReply/index.js | 23 +++++++++++++++++++++++ src/index.js | 2 ++ 2 files changed, 25 insertions(+) create mode 100644 src/components/RevertSubReply/index.js diff --git a/src/components/RevertSubReply/index.js b/src/components/RevertSubReply/index.js new file mode 100644 index 0000000..07ea860 --- /dev/null +++ b/src/components/RevertSubReply/index.js @@ -0,0 +1,23 @@ +/* + * 功能:层内逆序显示 + * @param isOn 是否开启该功能 + */ +const revertSubReply = (isOn) => { + $('div.btn.btn-white.font12').click(); + const blocks = $('div.sonlistmark.ml64.mt10:not([style="display:none;"])'); + blocks.map((index, block) => { + const reversedBlock = $($(block).find('li').get().reverse()); + $(block).find('.sonlist').remove(); + $(block).append('
      '); + reversedBlock.map((index, li) => { + if (index === 0) { + $(li).attr({ style: 'border-top:none;' }); + } else { + $(li).attr({ style: '' }); + } + $(block).find('.sonlist').append(li); + }) + }) +} + +export default revertSubReply; diff --git a/src/index.js b/src/index.js index 93a6b84..ad410dd 100644 --- a/src/index.js +++ b/src/index.js @@ -26,6 +26,7 @@ import discountTitleColor from './components/DiscountTitleColor'; import { bestOnly, bestOnlySalesPage } from './components/BestOnly'; import { currencyConversion, currencyConversionSalesPage, showOriginalPrice } from './components/CurrencyConversion'; import earnedTrophiesSummary from './components/EarnedTrophiesSummary'; +import revertSubReply from './components/RevertSubReply'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -78,6 +79,7 @@ pageBottom(); hotTag(30); // TODO 设置面板 showMarkMessage(true); // TODO 设置面板 hoverProfile(true); // TODO 设置面板 +revertSubReply(true); // TODO 设置面板 floorIndex(); // TODO Router hoverShowReply('.post'); From ccc17f87593117310bb9d4150e7de7fc1c1d8c48 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 17:32:34 +0900 Subject: [PATCH 41/45] add: trophySortByTimestamp function --- src/components/TrophySort/index.js | 26 ++++++++++++++++++++++++++ src/index.js | 3 +++ 2 files changed, 29 insertions(+) create mode 100644 src/components/TrophySort/index.js diff --git a/src/components/TrophySort/index.js b/src/components/TrophySort/index.js new file mode 100644 index 0000000..9f9e9f8 --- /dev/null +++ b/src/components/TrophySort/index.js @@ -0,0 +1,26 @@ +import createTrophyEarnedTimeData from "../../utils/trophyData"; + +const sortTrophiesByTimestamp = () => { + const trophyGetTimeData = createTrophyEarnedTimeData('em.lh180.alert-success.pd5.r'); + const trophyTableEntries = $('table.list').eq(0).children().find('tr'); + const trophies = trophyTableEntries.filter((i, e) => e.id != ""); + if (trophies.eq(0).hasClass('t1')) // Platinum + trophyTableEntries.filter((i, e) => e.id == "").eq(0).after(trophyGetTimeData.trophyElements); + else + trophies.eq(0).after(trophyGetTimeData.trophyElements); +} + +/* + * 功能:奖杯筛选功能 + */ + +const trophySortByTimestamp = () => { + $('div.main ul.dropmenu > li.dropdown > ul').eq(0).append('
    • 获得时间
    • '); + $('#sortTrophiesByTimestamp').click(() => { + sortTrophiesByTimestamp(); + $('#sortTrophiesByTimestamp').remove(); + $('div.main ul.dropmenu > li.dropdown').removeClass('hover'); + }); +} + +export default trophySortByTimestamp; diff --git a/src/index.js b/src/index.js index ad410dd..f1f5d81 100644 --- a/src/index.js +++ b/src/index.js @@ -27,6 +27,7 @@ import { bestOnly, bestOnlySalesPage } from './components/BestOnly'; import { currencyConversion, currencyConversionSalesPage, showOriginalPrice } from './components/CurrencyConversion'; import earnedTrophiesSummary from './components/EarnedTrophiesSummary'; import revertSubReply from './components/RevertSubReply'; +import trophySortByTimestamp from './components/TrophySort'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -115,6 +116,8 @@ if (/psngame\//.test(page) && /^(?!.*comment|.*rank|.*battle|.*gamelist|.*topic| showTrophyNotEarned(); // 汇总已获得和未获得奖杯 earnedTrophiesSummary(false); // TODO 设置面板 + // 奖杯获得时间排序 + trophySortByTimestamp(); } if (/topic\//.test(page) && psnidCookie) { From bd211514bc5c39ea14e9c885b6e941b684408e13 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 17:49:14 +0900 Subject: [PATCH 42/45] fix: qaBadge function --- src/components/OpBadge/index.js | 2 +- src/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/OpBadge/index.js b/src/components/OpBadge/index.js index d2083f9..49eb2a1 100644 --- a/src/components/OpBadge/index.js +++ b/src/components/OpBadge/index.js @@ -2,7 +2,7 @@ * 功能:对发帖楼主增加“楼主”标志 */ const opBadge = () => { - const userId = document.querySelector('.title2').text; + const userId = $('.psnnode').get(0).text; $('.psnnode').map((index, node) => { // 匹配楼主ID,变更CSS if ($(node).text() == userId) { diff --git a/src/index.js b/src/index.js index f1f5d81..9085b1e 100644 --- a/src/index.js +++ b/src/index.js @@ -85,7 +85,7 @@ floorIndex(); // TODO Router hoverShowReply('.post'); // TODO Router refactor -if (/(gene|trade|topic)\//.test(page) & !/comment/.test(page)) { +if (/(gene|trade|topic|qa|battle)\//.test(page) & !/comment/.test(page)) { opBadge(); } From 0200d05d5baf1bfbc9f84d2b0a0fc9da634024eb Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 21:21:25 +0900 Subject: [PATCH 43/45] update: sortTipsByLikes style --- src/components/SortTipsByLikes/index.js | 36 +++++++------------------ 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/src/components/SortTipsByLikes/index.js b/src/components/SortTipsByLikes/index.js index 782e815..1beae74 100644 --- a/src/components/SortTipsByLikes/index.js +++ b/src/components/SortTipsByLikes/index.js @@ -29,36 +29,18 @@ const sortTips = (isSorted) => { * 功能:奖杯心得按“顶”的数量排序功能 */ const sortTipsByLikes = () => { - GM_addStyle( - `#sortTipsByLikes { - padding : 8px 16px; - margin : 10px; - border-radius : 2px; - display : inline-block; - color : white; - background-color : #3498db; - cursor : pointer; - line-height : 24px; - }` - ); let isSorted = false; - $("根据顶数排序Tips") - .insertAfter($('div.box.mt20>div.pd10.alert-error').get(0)).css({ - width: '111px', - textAlign: 'center', - textDecoration: 'none', - }) + $("
    • 根据顶数排序Tips
    • ") + .insertAfter($('div.box.mt20>div.pd10.alert-error').get(0)) .click((event) => { sortTips(isSorted); - isSorted - ? $(event.target).text('根据顶数排序Tips').css({ - "background-color": "#3498db", - "color": "#FFFFFF" - }) - : $(event.target).text('恢复默认排序').css({ - "background-color": "#E7EBEE", - "color": "#99A1A7" - }); + if (isSorted) { + $(event.target).text('根据顶数排序Tips'); + $(event.target).parent().addClass('current'); + } else { + $(event.target).text('恢复默认排序'); + $(event.target).parent().removeClass('current'); + } isSorted = !isSorted; }); } From 40726ca69ae56498c41d4c644928c0f8f6678313 Mon Sep 17 00:00:00 2001 From: swsoyee Date: Sun, 4 Oct 2020 21:38:52 +0900 Subject: [PATCH 44/45] refactor: move criticAverage Co-Authored-By: Nathaniel-Wu <7333103+Nathaniel-Wu@users.noreply.github.com> --- src/components/CriticAverage/index.js | 528 ++++++++++++++++++++++++++ src/index.js | 2 + 2 files changed, 530 insertions(+) create mode 100644 src/components/CriticAverage/index.js diff --git a/src/components/CriticAverage/index.js b/src/components/CriticAverage/index.js new file mode 100644 index 0000000..9f987b8 --- /dev/null +++ b/src/components/CriticAverage/index.js @@ -0,0 +1,528 @@ +import { p9TimeTextParser } from '../../utils/date'; + +let filteredCriticPost = false; +const filterUserPost = () => { + if (settings.blockList.length > 0) { + let window_href = window.location.href; + let userListLowerCase = []; + settings.blockList.forEach(user => { userListLowerCase.push(user.toLowerCase()); }); + let FilterRegular = (psnnode, parent) => Filter(psnnode, parent, userListLowerCase, el => el.html().toLowerCase(), (user, psnid) => user == psnid); + if (window_href.match(/\/gen(e\/|e)$/)) { + FilterRegular('.touchclick .psnnode', '.touchclick'); // 机因一览 + } else if (window_href.indexOf('gene') > -1) { + FilterRegular('div.post .psnnode', 'div.post'); // 机因回复 + } else if (window_href.match(/\.co(m\/|m)$/) != null || window_href.indexOf('node') > -1 || window_href.indexOf('qa') > -1 || window_href.match(/\/trad(e\/|e)$/) != null) { + FilterRegular('div.ml64>.meta>.psnnode', 'li'); // 主页一览、问答一览、问答回复、交易一览 + } else if (window_href.indexOf('topic') > -1 || window_href.indexOf('trade') > -1 || window_href.match(/\/battle\/[1-9][0-9]+/) != null) { + FilterRegular('div.ml64>.meta>.psnnode', 'div.post'); // 主页帖回复、交易帖回复、约战帖回复 + } else if (window_href.match(/\/my\/notice/)) { + FilterRegular('.psnnode', 'li'); // 消息通知 + } else if (window_href.indexOf('trophy') > -1 || window_href.match(/\/psnid\/[^\/]+\/comment/) != null) { + FilterRegular('div.ml64>.meta.pb10>.psnnode', 'li'); // 奖杯TIPS、个人主页留言 + FilterRegular('ul.sonlist .content>.psnnode', 'ul.sonlist>li'); // 奖杯TIPS二级回复、个人主页留言二级回复 + } else if (window_href.match(/\/psngame\/[1-9][0-9]+\/comment/) != null) { + filteredCriticPost = FilterRegular('div.ml64>.meta.pb10>.psnnode', 'li') > 0; // 游戏测评 + FilterRegular('ul.sonlist .content>.psnnode', 'ul.sonlist>li'); // 游戏测评二级回复 + } else if (window_href.indexOf('battle') > -1) { + Filter('table.list td.pdd15.h-p>a', 'tr', userListLowerCase, el => el[0].href, (user, element_href) => element_href.indexOf(`psnid/${user}`) > -1); // 约战一览 + } + if (window_href.match(/\/qa\/[1-9][0-9]*/)) { + FilterRegular('ul.sonlist .content>.psnnode', 'ul.sonlist>li'); // 问答二级回复 + } + } +} + +// 游戏评论页面计算平均分 +function criticAverage() { + if (window.location.href.match(/psngame\/[1-9][0-9]+\/comment/)) { + var score_parser, score_elements, score_parent_review; + const selectScoreElements = () => { + score_elements = $('div.min-inner.mt40 div.box ul.list li div.ml64 div.meta.pb10 span.alert-success.pd5:contains(评分 )'); + if (score_elements.length > 0) { + score_parser = (element) => { return parseInt(element.text().replace('评分 ', '')); }; + score_parent_review = 'li'; + } else { + score_elements = $('div.min-inner.mt40 div.box div.ml64 p.text-success:contains(评分 ) b'); + if (score_elements.length > 0) { + score_parser = (element) => { return parseInt(element.text()); }; + score_parent_review = 'div.post'; + } else { + return false; + } + } + return true; + } + if (!selectScoreElements()) + return; + var reviews_no_score = null, reviews_no_score_hidden = false; + const selectReviewsNoScore = () => { + if (reviews_no_score == null) + reviews_no_score = $('div.min-inner.mt40 div.box ul.list li div.ml64 div.meta.pb10:not(:has(span.alert-success.pd5))').parents('li'); + if (reviews_no_score.length == 0) + reviews_no_score = $('div.min-inner.mt40 div.box div.ml64:not(:has(p.text-success))').parents('div.post'); + } + const hideReviewsNoScore = () => { + if (reviews_no_score_hidden) + return; + selectReviewsNoScore(); + reviews_no_score.hide(); + reviews_no_score_hidden = true; + } + const showReviewsNoScore = () => { + if (!reviews_no_score_hidden) + return; + selectReviewsNoScore(); + reviews_no_score.show(); + reviews_no_score_hidden = false; + } + var hidden_scores = []; + const hideSpecificScore = (score) => { + if (hidden_scores.indexOf(score) > -1) + return; + var hidden = 0; + score_elements.each(function () { + if (score_parser($(this)) == score) { + $(this).parents(score_parent_review).hide(); + hidden++; + } + }); + if (hidden > 0) { + hideReviewsNoScore(); + hidden_scores.push(score); + } + } + const showSpecificScore = (score) => { + var hidden_score_index = hidden_scores.indexOf(score); + if (hidden_score_index >= 0) { + score_elements.each(function () { + if (score_parser($(this)) == score) + $(this).parents(score_parent_review).show(); + }); + hidden_scores.splice(hidden_score_index, 1); + if (hidden_scores.length == 0) + showReviewsNoScore(); + } + } + const scoreOnclick = (chart, seriesEntry, score) => { + if (filteredCriticPost) { + selectScoreElements(); + filteredCriticPost = false; + } + switch (seriesEntry.color.length) { + case 7:// no alpha, score is being shown + seriesEntry.color += '1f'; + hideSpecificScore(score); + break; + case 9:// has alpha, score is being hidden + seriesEntry.color = seriesEntry.color.substring(0, 7); + showSpecificScore(score); + break; + } + chart.redraw(); + } + var gaussian_on = true, gradient_stops = null; + var score_data_barchart, score_data_barchart_no_gaussian, score_data_gaussian; + var score_axis, score_axis_no_gaussian; + const scoreBarChartAddLabelOnclick = (chart) => { + chart.xAxis[0].labelGroup.element.childNodes.forEach(function (label) { + label.onclick = function () { + var value = parseInt(this.innerHTML); + var pos = chart.series[0].data.find(e => e.category == value).index; + scoreOnclick(chart, chart.series[0].data[pos], value); + } + }); + } + const createScoreBarChart = (criticsCount, scoreCountMin, scoreCountMax) => { + const scoreChart = { + type: 'column', + backgroundColor: 'rgba(0,0,0,0)', + events: { + click: function (event) { + gaussian_on = !gaussian_on; + var chart = Highcharts.chart('scoreBarChart', createScoreBarChart(criticsCount, scoreCountMin, scoreCountMax)) + scoreBarChartAddLabelOnclick(chart); + hidden_scores.forEach(s => scoreOnclick(chart, chart.series[0].data[chart.xAxis[0].categories.indexOf(s)], s)); + } + } + }; + const scoreTitle = { + text: '评论分数分布', + style: { color: '#808080' } + }; + const scoreSubtitle = { + text: '点击分数柱或横坐标数字隐藏相应评论', + style: { fontSize: '9px', color: '#808080' } + }; + const scoreXaxis = [{ + categories: gaussian_on ? score_axis : score_axis_no_gaussian, + crosshair: true + }]; + const scoreYaxis = [{ + tickInterval: gaussian_on ? 2 : 1, + min: scoreCountMin < 3 ? 0 : scoreCountMin, + max: scoreCountMax, + title: { text: '点评人数' } + }]; + const scoreTooltip = { + formatter() { + switch (this.series.index) { + case 0: + return `${this.y}人`; + case 1: + return `${(this.y * 100).toFixed(2)}%`; + default: + return this.y; + } + }, + pointFormat: '{point.y}' + }; + const scorePlotOptions = { + column: { + pointPadding: 0, + borderWidth: 0 + }, + bellcurve: { + color: '#8080807f', + fillColor: '#00000000' + }, + series: { point: { events: { click: function () { if (this.series.name == '评分计数') scoreOnclick(this.series.chart, this, this.category); } } } } + }; + const scoreSeries = [{ + name: '评分计数', + xAxis: 0, + yAxis: 0, + zIndex: 1, + baseSeries: 0, + data: gaussian_on ? score_data_barchart : score_data_barchart_no_gaussian + }]; + const scoreCredits = { + text: '点评总人数:' + criticsCount + }; + if (gaussian_on) { + scoreXaxis.push({ + min: 0.5, + max: 10.5, + alignTicks: true, + opposite: true, + visible: false + }); + scoreYaxis.push({ + min: 0, + title: { text: '正态分布' }, + opposite: true, + labels: { + formatter: function () { + return this.value * 100 + '%'; + } + } + }); + scoreSeries.push({ + type: 'bellcurve', + xAxis: 1, + yAxis: 1, + zIndex: 0, + baseSeries: 1, + data: score_data_gaussian, + enableMouseTracking: false + }); + } + const scoreBarChart = { + chart: scoreChart, + title: scoreTitle, + subtitle: scoreSubtitle, + xAxis: scoreXaxis, + yAxis: scoreYaxis, + tooltip: scoreTooltip, + plotOptions: scorePlotOptions, + series: scoreSeries, + legend: { enabled: false }, + credits: scoreCredits + }; + return scoreBarChart; + }; + const weekOfYear = (date) => { // https://stackoverflow.com/a/6117889 + let start_of_day = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); + let day_of_week = start_of_day.getUTCDay() || 7; + start_of_day.setUTCDate(start_of_day.getUTCDate() + 4 - day_of_week); + let start_of_year = new Date(Date.UTC(start_of_day.getUTCFullYear(), 0, 1)); + return Math.ceil((((start_of_day - start_of_year) / 86400000/* milliseconds of a day */) + 1) / 7); + }; + const weeksOfYearCache = {}; + const weeksOfYear = (year) => { + let weeks = weeksOfYearCache[year]; + if (weeks == undefined) { + let last_week = weekOfYear(new Date(year, 11, 31)); + if (last_week == 1) + weeks = weekOfYear(new Date(year, 11, 24)); + else + weeks = last_week; + weeksOfYearCache[year] = weeks; + } + return weeks; + }; + const yearOfWeek = (date, week = null) => { + let real_year = date.getUTCFullYear(); + if (week == null) + week = weekOfYear(date); + if (date.getMonth() == 0) { + if (week > 5) + return real_year - 1; + } else { + if (week == 1) + return real_year + 1; + } + return real_year; + }; + const weekToTimestamp = (year, week, day = 4) => { + let start_of_year = new Date(Date.UTC(year, 0, 1)); + if (weekOfYear(start_of_year) > 1) + start_of_year = new Date(Date.UTC(year, 0, 8)); + return start_of_year.getTime() + (-((start_of_year.getUTCDay() || 7) - 1) + (7 * (week - 1) + (day - 1))) * 86400000/* milliseconds of a day */; + } + const weekDifference = (date_1, date_2) => { + let week_of_year_1 = weekOfYear(date_1), year_of_week_1 = yearOfWeek(date_1, week_of_year_1), week_start_1 = weekToTimestamp(year_of_week_1, week_of_year_1, 1); + let week_of_year_2 = weekOfYear(date_2), year_of_week_2 = yearOfWeek(date_2, week_of_year_2), week_start_2 = weekToTimestamp(year_of_week_2, week_of_year_2, 1); + return (week_start_1 - week_start_2) / 604800000/* milliseconds of a week */; + } + const createScoreTrendChart = () => { + var score_trend = [], comment_trend = [], min_score = Number.MAX_SAFE_INTEGER, max_score = Number.MIN_SAFE_INTEGER, first_week, last_week; + const createScoreTrendChartData = () => { + const scoreElementTime = (score_element) => {//must be single element + let timestamp_element = $(score_element).parents('div.ml64').find('div.meta:not(.pb10) > span:nth-child(2)'); + if (timestamp_element.length > 0) { + return p9TimeTextParser(timestamp_element.text().replace(/(^\s)|(\s$)|(修改)/g, '')); + } + timestamp_element = $(score_element).parents('div.ml64').find('div.meta'); + if (timestamp_element.length > 0) { + let text_array = timestamp_element.text().split(/\r?\n/); + let index = -1, text; + do { + text = text_array[text_array.length + index].replace(/(^\s)|(\s$)|(修改)/g, '') + index--; + } while (text == '') + return p9TimeTextParser(text); + } + return null; + } + score_elements.each(function () { + let timestamp = scoreElementTime($(this)); + if (timestamp != null) { + let score_date = new Date(timestamp); + let week_of_year = weekOfYear(score_date); + let year_of_week = yearOfWeek(score_date, week_of_year); + score_trend.push([timestamp, score_parser($(this)), year_of_week, week_of_year]); + } + }); + score_trend.sort((e1, e2) => (e1[0] - e2[0])); + let accumulated_score = 0; + for (let i = 0; i < score_trend.length; i++) { + accumulated_score += score_trend[i][1]; + let updated_average_score = accumulated_score / (i + 1); + score_trend[i][1] = updated_average_score; + if (updated_average_score < min_score) + min_score = updated_average_score; + if (updated_average_score > max_score) + max_score = updated_average_score; + } + let comment_count_by_week = {}; + let first_score = score_trend[0], last_score = score_trend[score_trend.length - 1]; + first_week = [first_score[2], first_score[3]], last_week = [last_score[2], last_score[3]]; + score_trend.forEach(score => { + let week = `${score[2]}/${score[3]}`; + if (comment_count_by_week[week] == undefined) + comment_count_by_week[week] = 1; + else + comment_count_by_week[week]++; + score.splice(2, 2); + }); + for (let year = first_week[0]; year <= last_week[0]; year++) { + let first = year == first_week[0] ? first_week[1] : 1; + let last = year == last_week[0] ? last_week[1] : weeksOfYear(year); + for (let week = first; week <= last; week++) { + let count = comment_count_by_week[`${year}/${week}`]; + comment_trend.push([weekToTimestamp(year, week, 7.5), count == undefined ? 0 : count]); + } + } + }; + createScoreTrendChartData(); + // 悬浮内容设置 + const scoreTrendTooltip = { + split: false + }; + // 日期格式设置 + const scoreTrendXaxis = { + type: 'datetime', + dateTimeLabelFormats: { + second: '%Y-%m-%d
      %H:%M:%S', + minute: '%Y-%m-%d
      %H:%M', + hour: '%Y-%m-%d
      %H:%M', + day: '%Y
      %m-%d', + week: '%Y
      %m-%d', + month: '%Y-%m', + year: '%Y', + }, + title: { + display: false, + }, + }; + // 绘图数据 + const first_week_date = new Date(weekToTimestamp(first_week[0], first_week[1])), last_week_date = new Date(weekToTimestamp(last_week[0], last_week[1])), total_weeks_passed = weekDifference(last_week_date, first_week_date) + 1; + const scoreTrendSeries = [ + { + name: '平均分', + yAxis: 0, + data: score_trend, + showInLegend: false, + color: '#7CB5EC', + opacity: 1, + tooltip: { + pointFormatter() { + return `${this.y.toFixed(2)}`; + } + } + }, { + name: '周增评分次数', + yAxis: 1, + data: comment_trend, + showInLegend: false, + color: '#E41A1C', + opacity: 0.5, + tooltip: { + headerFormat: '',// tooltip.formatter doesn't work, using this hack to suppress default xAxis label + pointFormatter() { + let week_str; + if (total_weeks_passed > 26) { + let week_date = new Date(this.x); + let week_of_year = weekOfYear(week_date); + let year_of_week = yearOfWeek(week_date, week_of_year); + week_str = `${year_of_week}年 第${week_of_year}周
      ` + } else { + week_str = `第${weekDifference(new Date(this.x), first_week_date) + 1}周
      `; + } + return week_str + (this.y > 0 ? `${this.y}` : `无评论`); + } + } + } + ]; + // 标题设置 + const scoreTrendTitle = [ + { + text: '均分走势', + style: { + color: '#808080', + } + }, { + text: '热度走势', + style: { + color: '#808080', + } + } + ]; + // Y轴设置 + const scoreTrendYAxis = [ + { + title: { + text: '平均分', + style: { + color: '#7CB5EC', + } + }, + min: min_score - 0.2 > 0 ? min_score - 0.2 : min_score, + max: max_score + 0.2 < 10 ? max_score + 0.2 : 10, + endOnTick: true, + tickInterval: 0.1, + opposite: false + }, { + title: { + text: '周增评分次数', + style: { + color: '#F28D8F', + } + }, + min: Math.min.apply(Math, comment_trend.map((i) => { return i[1]; })), + max: Math.max.apply(Math, comment_trend.map((i) => { return i[1]; })), + endOnTick: true, + tickInterval: 1, + opposite: true + } + ]; + // 绘图设置 + const scoreTrendChart = { + backgroundColor: 'rgba(0,0,0,0)', + type: 'line', + }; + // 图形设置 + const scoreTrendPlotOptions = { + line: { + opacity: 1 + } + }; + // Credits设置 + const scoreTrendChartData = { + chart: scoreTrendChart, + tooltip: scoreTrendTooltip, + xAxis: scoreTrendXaxis, + yAxis: scoreTrendYAxis, + title: scoreTrendTitle, + series: scoreTrendSeries, + plotOptions: scoreTrendPlotOptions, + legend: { enabled: false }, + credits: { enabled: false } + }; + return scoreTrendChartData; + } + var score_total = 0; + score_data_barchart = new Array(10).fill(0); + score_data_gaussian = []; + score_elements.each(function () { + const score = score_parser($(this)); + score_data_gaussian.push(score); + score_total += score; + score_data_barchart[score - 1]++; + }); + var score_average = (score_total / score_elements.length).toFixed(2); + var score_stddev = 0; + score_data_gaussian.forEach(score => { + const dev = score - score_average; + score_stddev += dev * dev; + }); + score_stddev = Math.sqrt(score_stddev) / Math.sqrt(score_elements.length); + // adding score average to stats + const psnine_stats = $('div.min-inner.mt40 div.box.pd10'); + psnine_stats.append(` 均分 ${score_average}

      `); + score_axis = []; + score_axis_no_gaussian = []; + let score_count_min = Number.MAX_SAFE_INTEGER, score_count_max = Number.MIN_SAFE_INTEGER; + score_data_barchart_no_gaussian = score_data_barchart.slice(0); + // 评分人数最高区间(分数) + const max_score_count_index = score_data_barchart.indexOf(Math.max(...score_data_barchart)); + // 柱状图颜色 + let score_colors = new Array(10).fill('#3890ff'); // do not assign transparency! otherwise scoreOnclick() will break + score_colors[max_score_count_index] = '#da314b'; + for (var score = 10; score >= 1; score--) { + const index = score - 1; + const score_count = score_data_barchart[index]; + if (score_count == 0) { + score_data_barchart_no_gaussian.splice(index, 1); + } else { + if (score_count < score_count_min) { + score_count_min = score_count; + } + if (score_count > score_count_max) { + score_count_max = score_count; + } + score_data_barchart_no_gaussian[index] = { y: score_count, color: score_colors[index] }; + score_axis_no_gaussian.unshift(score); + } + score_data_barchart[index] = { y: score_count, color: score_colors[index] }; + score_axis.unshift(score); + } + psnine_stats.append('

      '); + psnine_stats.append('
      '); + var charts = Highcharts.chart('scoreBarChart', createScoreBarChart(score_elements.length, score_count_min, score_count_max)) + scoreBarChartAddLabelOnclick(charts); + Highcharts.chart('scoreTrendChart', createScoreTrendChart()) + } +} + +export default criticAverage; diff --git a/src/index.js b/src/index.js index 9085b1e..df9a1bd 100644 --- a/src/index.js +++ b/src/index.js @@ -28,6 +28,7 @@ import { currencyConversion, currencyConversionSalesPage, showOriginalPrice } fr import earnedTrophiesSummary from './components/EarnedTrophiesSummary'; import revertSubReply from './components/RevertSubReply'; import trophySortByTimestamp from './components/TrophySort'; +import criticAverage from './components/CriticAverage'; const page = window.location.href; const psnidCookie = document.cookie.match(/__Psnine_psnid=(\w+);/); @@ -83,6 +84,7 @@ hoverProfile(true); // TODO 设置面板 revertSubReply(true); // TODO 设置面板 floorIndex(); // TODO Router hoverShowReply('.post'); +criticAverage(); // TODO Refactor // TODO Router refactor if (/(gene|trade|topic|qa|battle)\//.test(page) & !/comment/.test(page)) { From 5b6c8e8b21c734b7abb4bd890612f9f66dd22295 Mon Sep 17 00:00:00 2001 From: Tianyu Wu Date: Sun, 4 Oct 2020 13:13:26 -0400 Subject: [PATCH 45/45] refactor: criticAverage --- src/components/CriticAverage/index.js | 977 +++++++++++++------------- 1 file changed, 479 insertions(+), 498 deletions(-) diff --git a/src/components/CriticAverage/index.js b/src/components/CriticAverage/index.js index 9f987b8..97ecd5b 100644 --- a/src/components/CriticAverage/index.js +++ b/src/components/CriticAverage/index.js @@ -1,528 +1,509 @@ import { p9TimeTextParser } from '../../utils/date'; -let filteredCriticPost = false; -const filterUserPost = () => { - if (settings.blockList.length > 0) { - let window_href = window.location.href; - let userListLowerCase = []; - settings.blockList.forEach(user => { userListLowerCase.push(user.toLowerCase()); }); - let FilterRegular = (psnnode, parent) => Filter(psnnode, parent, userListLowerCase, el => el.html().toLowerCase(), (user, psnid) => user == psnid); - if (window_href.match(/\/gen(e\/|e)$/)) { - FilterRegular('.touchclick .psnnode', '.touchclick'); // 机因一览 - } else if (window_href.indexOf('gene') > -1) { - FilterRegular('div.post .psnnode', 'div.post'); // 机因回复 - } else if (window_href.match(/\.co(m\/|m)$/) != null || window_href.indexOf('node') > -1 || window_href.indexOf('qa') > -1 || window_href.match(/\/trad(e\/|e)$/) != null) { - FilterRegular('div.ml64>.meta>.psnnode', 'li'); // 主页一览、问答一览、问答回复、交易一览 - } else if (window_href.indexOf('topic') > -1 || window_href.indexOf('trade') > -1 || window_href.match(/\/battle\/[1-9][0-9]+/) != null) { - FilterRegular('div.ml64>.meta>.psnnode', 'div.post'); // 主页帖回复、交易帖回复、约战帖回复 - } else if (window_href.match(/\/my\/notice/)) { - FilterRegular('.psnnode', 'li'); // 消息通知 - } else if (window_href.indexOf('trophy') > -1 || window_href.match(/\/psnid\/[^\/]+\/comment/) != null) { - FilterRegular('div.ml64>.meta.pb10>.psnnode', 'li'); // 奖杯TIPS、个人主页留言 - FilterRegular('ul.sonlist .content>.psnnode', 'ul.sonlist>li'); // 奖杯TIPS二级回复、个人主页留言二级回复 - } else if (window_href.match(/\/psngame\/[1-9][0-9]+\/comment/) != null) { - filteredCriticPost = FilterRegular('div.ml64>.meta.pb10>.psnnode', 'li') > 0; // 游戏测评 - FilterRegular('ul.sonlist .content>.psnnode', 'ul.sonlist>li'); // 游戏测评二级回复 - } else if (window_href.indexOf('battle') > -1) { - Filter('table.list td.pdd15.h-p>a', 'tr', userListLowerCase, el => el[0].href, (user, element_href) => element_href.indexOf(`psnid/${user}`) > -1); // 约战一览 - } - if (window_href.match(/\/qa\/[1-9][0-9]*/)) { - FilterRegular('ul.sonlist .content>.psnnode', 'ul.sonlist>li'); // 问答二级回复 +let score_elements; // 评分元素合集 +let score_parser; // 分数parser +let score_parent_review; // 母评论selector +const selectScoreElements = () => { // 查找评分元素、选定分数parser和母评论selector + score_elements = $('div.min-inner.mt40 div.box ul.list li div.ml64 div.meta.pb10 span.alert-success.pd5:contains(评分 )'); + if (score_elements.length > 0) { + score_parser = (element) => { return parseInt(element.text().replace('评分 ', '')); }; + score_parent_review = 'li'; + } else { + score_elements = $('div.min-inner.mt40 div.box div.ml64 p.text-success:contains(评分 ) b'); + if (score_elements.length > 0) { + score_parser = (element) => { return parseInt(element.text()); }; + score_parent_review = 'div.post'; + } else { + return false; } } + return true; } -// 游戏评论页面计算平均分 -function criticAverage() { - if (window.location.href.match(/psngame\/[1-9][0-9]+\/comment/)) { - var score_parser, score_elements, score_parent_review; - const selectScoreElements = () => { - score_elements = $('div.min-inner.mt40 div.box ul.list li div.ml64 div.meta.pb10 span.alert-success.pd5:contains(评分 )'); - if (score_elements.length > 0) { - score_parser = (element) => { return parseInt(element.text().replace('评分 ', '')); }; - score_parent_review = 'li'; - } else { - score_elements = $('div.min-inner.mt40 div.box div.ml64 p.text-success:contains(评分 ) b'); - if (score_elements.length > 0) { - score_parser = (element) => { return parseInt(element.text()); }; - score_parent_review = 'div.post'; - } else { - return false; - } - } - return true; - } - if (!selectScoreElements()) - return; - var reviews_no_score = null, reviews_no_score_hidden = false; - const selectReviewsNoScore = () => { - if (reviews_no_score == null) - reviews_no_score = $('div.min-inner.mt40 div.box ul.list li div.ml64 div.meta.pb10:not(:has(span.alert-success.pd5))').parents('li'); - if (reviews_no_score.length == 0) - reviews_no_score = $('div.min-inner.mt40 div.box div.ml64:not(:has(p.text-success))').parents('div.post'); +let reviews_no_score = null; // 未评分评测合集 +let reviews_no_score_hidden = false; // 未评分评测隐藏与否 +const selectReviewsNoScore = () => { // 查找未评分评测 + if (reviews_no_score == null) + reviews_no_score = $('div.min-inner.mt40 div.box ul.list li div.ml64 div.meta.pb10:not(:has(span.alert-success.pd5))').parents('li'); + if (reviews_no_score.length == 0) + reviews_no_score = $('div.min-inner.mt40 div.box div.ml64:not(:has(p.text-success))').parents('div.post'); +} +const hideReviewsNoScore = () => { // 隐藏未评分评测 + if (reviews_no_score_hidden) + return; + selectReviewsNoScore(); + reviews_no_score.hide(); + reviews_no_score_hidden = true; +} +const showReviewsNoScore = () => { // 显示未评分评测 + if (!reviews_no_score_hidden) + return; + selectReviewsNoScore(); + reviews_no_score.show(); + reviews_no_score_hidden = false; +} + +let hidden_scores = []; // 已被隐藏的特定分数 +const hideSpecificScore = (score) => { // 隐藏某一个特定分数的评分 + if (hidden_scores.indexOf(score) > -1) + return; + let hidden = 0; + score_elements.each(function () { + if (score_parser($(this)) == score) { + $(this).parents(score_parent_review).hide(); + hidden++; } - const hideReviewsNoScore = () => { - if (reviews_no_score_hidden) - return; - selectReviewsNoScore(); - reviews_no_score.hide(); - reviews_no_score_hidden = true; + }); + if (hidden > 0) { + hideReviewsNoScore(); + hidden_scores.push(score); + } +} +const showSpecificScore = (score) => { // 显示某一个特定分数的评分 + let hidden_score_index = hidden_scores.indexOf(score); + if (hidden_score_index >= 0) { + score_elements.each(function () { + if (score_parser($(this)) == score) + $(this).parents(score_parent_review).show(); + }); + hidden_scores.splice(hidden_score_index, 1); + if (hidden_scores.length == 0) + showReviewsNoScore(); + } +} + +const scoreOnclick = (chart, seriesEntry, score) => { // for Highcharts, actuator: 隐藏/显示分数bar对应的评分 + switch (seriesEntry.color.length) { + case 7:// no alpha, score is being shown + seriesEntry.color += '1f'; + hideSpecificScore(score); + break; + case 9:// has alpha, score is being hidden + seriesEntry.color = seriesEntry.color.substring(0, 7); + showSpecificScore(score); + break; + } + chart.redraw(); +} + +const scoreBarChartAddLabelOnclick = (chart) => { // for Highcharts: 设置分数bar的onlick callback + chart.xAxis[0].labelGroup.element.childNodes.forEach(function (label) { + label.onclick = function () { + let value = parseInt(this.innerHTML); + let pos = chart.series[0].data.find(e => e.category == value).index; + scoreOnclick(chart, chart.series[0].data[pos], value); } - const showReviewsNoScore = () => { - if (!reviews_no_score_hidden) - return; - selectReviewsNoScore(); - reviews_no_score.show(); - reviews_no_score_hidden = false; + }); +} + +// 日期与星期遵循ISO定义,使用UTC时间计算 +// 日期是该年的第几个星期?从1计起;每星期从星期一开始 +const weekOfYear = (date) => { // https://stackoverflow.com/a/6117889 + let start_of_day = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())); + let day_of_week = start_of_day.getUTCDay() || 7; + start_of_day.setUTCDate(start_of_day.getUTCDate() + 4 - day_of_week); + let start_of_year = new Date(Date.UTC(start_of_day.getUTCFullYear(), 0, 1)); + return Math.ceil((((start_of_day - start_of_year) / 86400000/* milliseconds of a day */) + 1) / 7); +}; +// 一年有多少个星期? +const weeksOfYearCache = {}; +const weeksOfYear = (year) => { + let weeks = weeksOfYearCache[year]; + if (weeks == undefined) { + let last_week = weekOfYear(new Date(year, 11, 31)); + if (last_week == 1) + weeks = weekOfYear(new Date(year, 11, 24)); + else + weeks = last_week; + weeksOfYearCache[year] = weeks; + } + return weeks; +}; +// 日期所处的星期被归于哪一年?每年的头几天和最后几天的结果可能会比较反直觉 +const yearOfWeek = (date, week = null) => { + let real_year = date.getUTCFullYear(); + if (week == null) + week = weekOfYear(date); + if (date.getUTCMonth() == 0) { + if (week > 5) + return real_year - 1; + } else { + if (week == 1) + return real_year + 1; + } + return real_year; +}; +// 将(年、周、周内第几日)转换为UTC时间 +const weekToTimestamp = (year, week, day = 4) => { + let start_of_year = new Date(Date.UTC(year, 0, 1)); + if (weekOfYear(start_of_year) > 1) + start_of_year = new Date(Date.UTC(year, 0, 8)); + return start_of_year.getTime() + (-((start_of_year.getUTCDay() || 7) - 1) + (7 * (week - 1) + (day - 1))) * 86400000/* milliseconds of a day */; +} +// 两个日期之间隔了多少周? +const weekDifference = (date_1, date_2) => { + let week_of_year_1 = weekOfYear(date_1), year_of_week_1 = yearOfWeek(date_1, week_of_year_1), week_start_1 = weekToTimestamp(year_of_week_1, week_of_year_1, 1); + let week_of_year_2 = weekOfYear(date_2), year_of_week_2 = yearOfWeek(date_2, week_of_year_2), week_start_2 = weekToTimestamp(year_of_week_2, week_of_year_2, 1); + return (week_start_1 - week_start_2) / 604800000/* milliseconds of a week */; +} + +// 设置评分直方图 +let score_data_barchart, score_data_barchart_no_gaussian, score_data_gaussian, score_axis, score_axis_no_gaussian; +const createScoreBarChart = (gaussian_on, criticsCount, scoreCountMin, scoreCountMax) => { + const scoreChart = { + type: 'column', + backgroundColor: 'rgba(0,0,0,0)', + events: { + click: function (event) { + gaussian_on = !gaussian_on; + let chart = Highcharts.chart('scoreBarChart', createScoreBarChart(gaussian_on, criticsCount, scoreCountMin, scoreCountMax)) + scoreBarChartAddLabelOnclick(chart); + hidden_scores.forEach(s => scoreOnclick(chart, chart.series[0].data[chart.xAxis[0].categories.indexOf(s)], s)); + } } - var hidden_scores = []; - const hideSpecificScore = (score) => { - if (hidden_scores.indexOf(score) > -1) - return; - var hidden = 0; - score_elements.each(function () { - if (score_parser($(this)) == score) { - $(this).parents(score_parent_review).hide(); - hidden++; + }; + const scoreTitle = { + text: '评论分数分布', + style: { color: '#808080' } + }; + const scoreSubtitle = { + text: '点击分数柱或横坐标数字隐藏相应评论', + style: { fontSize: '9px', color: '#808080' } + }; + const scoreXaxis = [{ + categories: gaussian_on ? score_axis : score_axis_no_gaussian, + crosshair: true + }]; + const scoreYaxis = [{ + tickInterval: gaussian_on ? 2 : 1, + min: scoreCountMin < 3 ? 0 : scoreCountMin, + max: scoreCountMax, + title: { text: '点评人数' } + }]; + const scoreTooltip = { + formatter() { + switch (this.series.index) { + case 0: + return `${this.y}人`; + case 1: + return `${(this.y * 100).toFixed(2)}%`; + default: + return this.y; + } + }, + pointFormat: '{point.y}' + }; + const scorePlotOptions = { + column: { + pointPadding: 0, + borderWidth: 0 + }, + bellcurve: { + color: '#8080807f', + fillColor: '#00000000' + }, + series: { point: { events: { click: function () { if (this.series.name == '评分计数') scoreOnclick(this.series.chart, this, this.category); } } } } + }; + const scoreSeries = [{ + name: '评分计数', + xAxis: 0, + yAxis: 0, + zIndex: 1, + baseSeries: 0, + data: gaussian_on ? score_data_barchart : score_data_barchart_no_gaussian + }]; + const scoreCredits = { + text: '点评总人数:' + criticsCount + }; + if (gaussian_on) { + scoreXaxis.push({ + min: 0.5, + max: 10.5, + alignTicks: true, + opposite: true, + visible: false + }); + scoreYaxis.push({ + min: 0, + title: { text: '正态分布' }, + opposite: true, + labels: { + formatter: function () { + return this.value * 100 + '%'; } - }); - if (hidden > 0) { - hideReviewsNoScore(); - hidden_scores.push(score); } + }); + scoreSeries.push({ + type: 'bellcurve', + xAxis: 1, + yAxis: 1, + zIndex: 0, + baseSeries: 1, + data: score_data_gaussian, + enableMouseTracking: false + }); + } + const scoreBarChart = { + chart: scoreChart, + title: scoreTitle, + subtitle: scoreSubtitle, + xAxis: scoreXaxis, + yAxis: scoreYaxis, + tooltip: scoreTooltip, + plotOptions: scorePlotOptions, + series: scoreSeries, + legend: { enabled: false }, + credits: scoreCredits + }; + return scoreBarChart; +}; + +// 计算评分走势图的数据 +let score_trend = [], comment_trend = [], min_score = Number.MAX_SAFE_INTEGER, max_score = Number.MIN_SAFE_INTEGER, first_week, last_week; +const createScoreTrendChartData = () => { + const scoreElementTime = (score_element) => {//must be single element + let timestamp_element = $(score_element).parents('div.ml64').find('div.meta:not(.pb10) > span:nth-child(2)'); + if (timestamp_element.length > 0) { + return p9TimeTextParser(timestamp_element.text().replace(/(^\s)|(\s$)|(修改)/g, '')); } - const showSpecificScore = (score) => { - var hidden_score_index = hidden_scores.indexOf(score); - if (hidden_score_index >= 0) { - score_elements.each(function () { - if (score_parser($(this)) == score) - $(this).parents(score_parent_review).show(); - }); - hidden_scores.splice(hidden_score_index, 1); - if (hidden_scores.length == 0) - showReviewsNoScore(); - } + timestamp_element = $(score_element).parents('div.ml64').find('div.meta'); + if (timestamp_element.length > 0) { + let text_array = timestamp_element.text().split(/\r?\n/); + let index = -1, text; + do { + text = text_array[text_array.length + index].replace(/(^\s)|(\s$)|(修改)/g, '') + index--; + } while (text == '') + return p9TimeTextParser(text); } - const scoreOnclick = (chart, seriesEntry, score) => { - if (filteredCriticPost) { - selectScoreElements(); - filteredCriticPost = false; - } - switch (seriesEntry.color.length) { - case 7:// no alpha, score is being shown - seriesEntry.color += '1f'; - hideSpecificScore(score); - break; - case 9:// has alpha, score is being hidden - seriesEntry.color = seriesEntry.color.substring(0, 7); - showSpecificScore(score); - break; - } - chart.redraw(); + return null; + } + score_elements.each(function () { + let timestamp = scoreElementTime($(this)); + if (timestamp != null) { + let score_date = new Date(timestamp); + let week_of_year = weekOfYear(score_date); + let year_of_week = yearOfWeek(score_date, week_of_year); + score_trend.push([timestamp, score_parser($(this)), year_of_week, week_of_year]); } - var gaussian_on = true, gradient_stops = null; - var score_data_barchart, score_data_barchart_no_gaussian, score_data_gaussian; - var score_axis, score_axis_no_gaussian; - const scoreBarChartAddLabelOnclick = (chart) => { - chart.xAxis[0].labelGroup.element.childNodes.forEach(function (label) { - label.onclick = function () { - var value = parseInt(this.innerHTML); - var pos = chart.series[0].data.find(e => e.category == value).index; - scoreOnclick(chart, chart.series[0].data[pos], value); - } - }); + }); + score_trend.sort((e1, e2) => (e1[0] - e2[0])); + let accumulated_score = 0; + for (let i = 0; i < score_trend.length; i++) { + accumulated_score += score_trend[i][1]; + let updated_average_score = accumulated_score / (i + 1); + score_trend[i][1] = updated_average_score; + if (updated_average_score < min_score) + min_score = updated_average_score; + if (updated_average_score > max_score) + max_score = updated_average_score; + } + let comment_count_by_week = {}; + let first_score = score_trend[0], last_score = score_trend[score_trend.length - 1]; + first_week = [first_score[2], first_score[3]], last_week = [last_score[2], last_score[3]]; + score_trend.forEach(score => { + let week = `${score[2]}/${score[3]}`; + if (comment_count_by_week[week] == undefined) + comment_count_by_week[week] = 1; + else + comment_count_by_week[week]++; + score.splice(2, 2); + }); + for (let year = first_week[0]; year <= last_week[0]; year++) { + let first = year == first_week[0] ? first_week[1] : 1; + let last = year == last_week[0] ? last_week[1] : weeksOfYear(year); + for (let week = first; week <= last; week++) { + let count = comment_count_by_week[`${year}/${week}`]; + comment_trend.push([weekToTimestamp(year, week, 7.5), count == undefined ? 0 : count]); } - const createScoreBarChart = (criticsCount, scoreCountMin, scoreCountMax) => { - const scoreChart = { - type: 'column', - backgroundColor: 'rgba(0,0,0,0)', - events: { - click: function (event) { - gaussian_on = !gaussian_on; - var chart = Highcharts.chart('scoreBarChart', createScoreBarChart(criticsCount, scoreCountMin, scoreCountMax)) - scoreBarChartAddLabelOnclick(chart); - hidden_scores.forEach(s => scoreOnclick(chart, chart.series[0].data[chart.xAxis[0].categories.indexOf(s)], s)); - } + } +}; +// 设置评分走势图 +const createScoreTrendChart = () => { + createScoreTrendChartData(); + // 悬浮内容设置 + const scoreTrendTooltip = { + split: false + }; + // 日期格式设置 + const scoreTrendXaxis = { + type: 'datetime', + dateTimeLabelFormats: { + second: '%Y-%m-%d
      %H:%M:%S', + minute: '%Y-%m-%d
      %H:%M', + hour: '%Y-%m-%d
      %H:%M', + day: '%Y
      %m-%d', + week: '%Y
      %m-%d', + month: '%Y-%m', + year: '%Y', + }, + title: { + display: false, + }, + }; + // 绘图数据 + const first_week_date = new Date(weekToTimestamp(first_week[0], first_week[1])), last_week_date = new Date(weekToTimestamp(last_week[0], last_week[1])), total_weeks_passed = weekDifference(last_week_date, first_week_date) + 1; + const scoreTrendSeries = [ + { + name: '平均分', + yAxis: 0, + data: score_trend, + showInLegend: false, + color: '#7CB5EC', + opacity: 1, + tooltip: { + pointFormatter() { + return `${this.y.toFixed(2)}`; } - }; - const scoreTitle = { - text: '评论分数分布', - style: { color: '#808080' } - }; - const scoreSubtitle = { - text: '点击分数柱或横坐标数字隐藏相应评论', - style: { fontSize: '9px', color: '#808080' } - }; - const scoreXaxis = [{ - categories: gaussian_on ? score_axis : score_axis_no_gaussian, - crosshair: true - }]; - const scoreYaxis = [{ - tickInterval: gaussian_on ? 2 : 1, - min: scoreCountMin < 3 ? 0 : scoreCountMin, - max: scoreCountMax, - title: { text: '点评人数' } - }]; - const scoreTooltip = { - formatter() { - switch (this.series.index) { - case 0: - return `${this.y}人`; - case 1: - return `${(this.y * 100).toFixed(2)}%`; - default: - return this.y; - } - }, - pointFormat: '{point.y}' - }; - const scorePlotOptions = { - column: { - pointPadding: 0, - borderWidth: 0 - }, - bellcurve: { - color: '#8080807f', - fillColor: '#00000000' - }, - series: { point: { events: { click: function () { if (this.series.name == '评分计数') scoreOnclick(this.series.chart, this, this.category); } } } } - }; - const scoreSeries = [{ - name: '评分计数', - xAxis: 0, - yAxis: 0, - zIndex: 1, - baseSeries: 0, - data: gaussian_on ? score_data_barchart : score_data_barchart_no_gaussian - }]; - const scoreCredits = { - text: '点评总人数:' + criticsCount - }; - if (gaussian_on) { - scoreXaxis.push({ - min: 0.5, - max: 10.5, - alignTicks: true, - opposite: true, - visible: false - }); - scoreYaxis.push({ - min: 0, - title: { text: '正态分布' }, - opposite: true, - labels: { - formatter: function () { - return this.value * 100 + '%'; - } + } + }, { + name: '周增评分次数', + yAxis: 1, + data: comment_trend, + showInLegend: false, + color: '#E41A1C', + opacity: 0.5, + tooltip: { + headerFormat: '',// tooltip.formatter doesn't work, using this hack to suppress default xAxis label + pointFormatter() { + let week_str; + if (total_weeks_passed > 26) { + let week_date = new Date(this.x); + let week_of_year = weekOfYear(week_date); + let year_of_week = yearOfWeek(week_date, week_of_year); + week_str = `${year_of_week}年 第${week_of_year}周
      ` + } else { + week_str = `第${weekDifference(new Date(this.x), first_week_date) + 1}周
      `; } - }); - scoreSeries.push({ - type: 'bellcurve', - xAxis: 1, - yAxis: 1, - zIndex: 0, - baseSeries: 1, - data: score_data_gaussian, - enableMouseTracking: false - }); + return week_str + (this.y > 0 ? `${this.y}` : `无评论`); + } } - const scoreBarChart = { - chart: scoreChart, - title: scoreTitle, - subtitle: scoreSubtitle, - xAxis: scoreXaxis, - yAxis: scoreYaxis, - tooltip: scoreTooltip, - plotOptions: scorePlotOptions, - series: scoreSeries, - legend: { enabled: false }, - credits: scoreCredits - }; - return scoreBarChart; - }; - const weekOfYear = (date) => { // https://stackoverflow.com/a/6117889 - let start_of_day = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); - let day_of_week = start_of_day.getUTCDay() || 7; - start_of_day.setUTCDate(start_of_day.getUTCDate() + 4 - day_of_week); - let start_of_year = new Date(Date.UTC(start_of_day.getUTCFullYear(), 0, 1)); - return Math.ceil((((start_of_day - start_of_year) / 86400000/* milliseconds of a day */) + 1) / 7); - }; - const weeksOfYearCache = {}; - const weeksOfYear = (year) => { - let weeks = weeksOfYearCache[year]; - if (weeks == undefined) { - let last_week = weekOfYear(new Date(year, 11, 31)); - if (last_week == 1) - weeks = weekOfYear(new Date(year, 11, 24)); - else - weeks = last_week; - weeksOfYearCache[year] = weeks; + } + ]; + // 标题设置 + const scoreTrendTitle = [ + { + text: '均分走势', + style: { + color: '#808080', } - return weeks; - }; - const yearOfWeek = (date, week = null) => { - let real_year = date.getUTCFullYear(); - if (week == null) - week = weekOfYear(date); - if (date.getMonth() == 0) { - if (week > 5) - return real_year - 1; - } else { - if (week == 1) - return real_year + 1; + }, { + text: '热度走势', + style: { + color: '#808080', } - return real_year; - }; - const weekToTimestamp = (year, week, day = 4) => { - let start_of_year = new Date(Date.UTC(year, 0, 1)); - if (weekOfYear(start_of_year) > 1) - start_of_year = new Date(Date.UTC(year, 0, 8)); - return start_of_year.getTime() + (-((start_of_year.getUTCDay() || 7) - 1) + (7 * (week - 1) + (day - 1))) * 86400000/* milliseconds of a day */; - } - const weekDifference = (date_1, date_2) => { - let week_of_year_1 = weekOfYear(date_1), year_of_week_1 = yearOfWeek(date_1, week_of_year_1), week_start_1 = weekToTimestamp(year_of_week_1, week_of_year_1, 1); - let week_of_year_2 = weekOfYear(date_2), year_of_week_2 = yearOfWeek(date_2, week_of_year_2), week_start_2 = weekToTimestamp(year_of_week_2, week_of_year_2, 1); - return (week_start_1 - week_start_2) / 604800000/* milliseconds of a week */; } - const createScoreTrendChart = () => { - var score_trend = [], comment_trend = [], min_score = Number.MAX_SAFE_INTEGER, max_score = Number.MIN_SAFE_INTEGER, first_week, last_week; - const createScoreTrendChartData = () => { - const scoreElementTime = (score_element) => {//must be single element - let timestamp_element = $(score_element).parents('div.ml64').find('div.meta:not(.pb10) > span:nth-child(2)'); - if (timestamp_element.length > 0) { - return p9TimeTextParser(timestamp_element.text().replace(/(^\s)|(\s$)|(修改)/g, '')); - } - timestamp_element = $(score_element).parents('div.ml64').find('div.meta'); - if (timestamp_element.length > 0) { - let text_array = timestamp_element.text().split(/\r?\n/); - let index = -1, text; - do { - text = text_array[text_array.length + index].replace(/(^\s)|(\s$)|(修改)/g, '') - index--; - } while (text == '') - return p9TimeTextParser(text); - } - return null; - } - score_elements.each(function () { - let timestamp = scoreElementTime($(this)); - if (timestamp != null) { - let score_date = new Date(timestamp); - let week_of_year = weekOfYear(score_date); - let year_of_week = yearOfWeek(score_date, week_of_year); - score_trend.push([timestamp, score_parser($(this)), year_of_week, week_of_year]); - } - }); - score_trend.sort((e1, e2) => (e1[0] - e2[0])); - let accumulated_score = 0; - for (let i = 0; i < score_trend.length; i++) { - accumulated_score += score_trend[i][1]; - let updated_average_score = accumulated_score / (i + 1); - score_trend[i][1] = updated_average_score; - if (updated_average_score < min_score) - min_score = updated_average_score; - if (updated_average_score > max_score) - max_score = updated_average_score; - } - let comment_count_by_week = {}; - let first_score = score_trend[0], last_score = score_trend[score_trend.length - 1]; - first_week = [first_score[2], first_score[3]], last_week = [last_score[2], last_score[3]]; - score_trend.forEach(score => { - let week = `${score[2]}/${score[3]}`; - if (comment_count_by_week[week] == undefined) - comment_count_by_week[week] = 1; - else - comment_count_by_week[week]++; - score.splice(2, 2); - }); - for (let year = first_week[0]; year <= last_week[0]; year++) { - let first = year == first_week[0] ? first_week[1] : 1; - let last = year == last_week[0] ? last_week[1] : weeksOfYear(year); - for (let week = first; week <= last; week++) { - let count = comment_count_by_week[`${year}/${week}`]; - comment_trend.push([weekToTimestamp(year, week, 7.5), count == undefined ? 0 : count]); - } - } - }; - createScoreTrendChartData(); - // 悬浮内容设置 - const scoreTrendTooltip = { - split: false - }; - // 日期格式设置 - const scoreTrendXaxis = { - type: 'datetime', - dateTimeLabelFormats: { - second: '%Y-%m-%d
      %H:%M:%S', - minute: '%Y-%m-%d
      %H:%M', - hour: '%Y-%m-%d
      %H:%M', - day: '%Y
      %m-%d', - week: '%Y
      %m-%d', - month: '%Y-%m', - year: '%Y', - }, - title: { - display: false, - }, - }; - // 绘图数据 - const first_week_date = new Date(weekToTimestamp(first_week[0], first_week[1])), last_week_date = new Date(weekToTimestamp(last_week[0], last_week[1])), total_weeks_passed = weekDifference(last_week_date, first_week_date) + 1; - const scoreTrendSeries = [ - { - name: '平均分', - yAxis: 0, - data: score_trend, - showInLegend: false, + ]; + // Y轴设置 + const scoreTrendYAxis = [ + { + title: { + text: '平均分', + style: { color: '#7CB5EC', - opacity: 1, - tooltip: { - pointFormatter() { - return `${this.y.toFixed(2)}`; - } - } - }, { - name: '周增评分次数', - yAxis: 1, - data: comment_trend, - showInLegend: false, - color: '#E41A1C', - opacity: 0.5, - tooltip: { - headerFormat: '',// tooltip.formatter doesn't work, using this hack to suppress default xAxis label - pointFormatter() { - let week_str; - if (total_weeks_passed > 26) { - let week_date = new Date(this.x); - let week_of_year = weekOfYear(week_date); - let year_of_week = yearOfWeek(week_date, week_of_year); - week_str = `${year_of_week}年 第${week_of_year}周
      ` - } else { - week_str = `第${weekDifference(new Date(this.x), first_week_date) + 1}周
      `; - } - return week_str + (this.y > 0 ? `${this.y}` : `无评论`); - } - } - } - ]; - // 标题设置 - const scoreTrendTitle = [ - { - text: '均分走势', - style: { - color: '#808080', - } - }, { - text: '热度走势', - style: { - color: '#808080', - } } - ]; - // Y轴设置 - const scoreTrendYAxis = [ - { - title: { - text: '平均分', - style: { - color: '#7CB5EC', - } - }, - min: min_score - 0.2 > 0 ? min_score - 0.2 : min_score, - max: max_score + 0.2 < 10 ? max_score + 0.2 : 10, - endOnTick: true, - tickInterval: 0.1, - opposite: false - }, { - title: { - text: '周增评分次数', - style: { - color: '#F28D8F', - } - }, - min: Math.min.apply(Math, comment_trend.map((i) => { return i[1]; })), - max: Math.max.apply(Math, comment_trend.map((i) => { return i[1]; })), - endOnTick: true, - tickInterval: 1, - opposite: true + }, + min: min_score - 0.2 > 0 ? min_score - 0.2 : min_score, + max: max_score + 0.2 < 10 ? max_score + 0.2 : 10, + endOnTick: true, + tickInterval: 0.1, + opposite: false + }, { + title: { + text: '周增评分次数', + style: { + color: '#F28D8F', } - ]; - // 绘图设置 - const scoreTrendChart = { - backgroundColor: 'rgba(0,0,0,0)', - type: 'line', - }; - // 图形设置 - const scoreTrendPlotOptions = { - line: { - opacity: 1 - } - }; - // Credits设置 - const scoreTrendChartData = { - chart: scoreTrendChart, - tooltip: scoreTrendTooltip, - xAxis: scoreTrendXaxis, - yAxis: scoreTrendYAxis, - title: scoreTrendTitle, - series: scoreTrendSeries, - plotOptions: scoreTrendPlotOptions, - legend: { enabled: false }, - credits: { enabled: false } - }; - return scoreTrendChartData; + }, + min: Math.min.apply(Math, comment_trend.map((i) => { return i[1]; })), + max: Math.max.apply(Math, comment_trend.map((i) => { return i[1]; })), + endOnTick: true, + tickInterval: 1, + opposite: true } - var score_total = 0; - score_data_barchart = new Array(10).fill(0); - score_data_gaussian = []; - score_elements.each(function () { - const score = score_parser($(this)); - score_data_gaussian.push(score); - score_total += score; - score_data_barchart[score - 1]++; - }); - var score_average = (score_total / score_elements.length).toFixed(2); - var score_stddev = 0; - score_data_gaussian.forEach(score => { - const dev = score - score_average; - score_stddev += dev * dev; - }); - score_stddev = Math.sqrt(score_stddev) / Math.sqrt(score_elements.length); - // adding score average to stats - const psnine_stats = $('div.min-inner.mt40 div.box.pd10'); - psnine_stats.append(` 均分 ${score_average}

      `); - score_axis = []; - score_axis_no_gaussian = []; - let score_count_min = Number.MAX_SAFE_INTEGER, score_count_max = Number.MIN_SAFE_INTEGER; - score_data_barchart_no_gaussian = score_data_barchart.slice(0); - // 评分人数最高区间(分数) - const max_score_count_index = score_data_barchart.indexOf(Math.max(...score_data_barchart)); - // 柱状图颜色 - let score_colors = new Array(10).fill('#3890ff'); // do not assign transparency! otherwise scoreOnclick() will break - score_colors[max_score_count_index] = '#da314b'; - for (var score = 10; score >= 1; score--) { - const index = score - 1; - const score_count = score_data_barchart[index]; - if (score_count == 0) { - score_data_barchart_no_gaussian.splice(index, 1); - } else { - if (score_count < score_count_min) { - score_count_min = score_count; - } - if (score_count > score_count_max) { - score_count_max = score_count; - } - score_data_barchart_no_gaussian[index] = { y: score_count, color: score_colors[index] }; - score_axis_no_gaussian.unshift(score); + ]; + // 绘图设置 + const scoreTrendChart = { + backgroundColor: 'rgba(0,0,0,0)', + type: 'line', + }; + // 图形设置 + const scoreTrendPlotOptions = { + line: { + opacity: 1 + } + }; + // Credits设置 + const scoreTrendChartData = { + chart: scoreTrendChart, + tooltip: scoreTrendTooltip, + xAxis: scoreTrendXaxis, + yAxis: scoreTrendYAxis, + title: scoreTrendTitle, + series: scoreTrendSeries, + plotOptions: scoreTrendPlotOptions, + legend: { enabled: false }, + credits: { enabled: false } + }; + return scoreTrendChartData; +} + +// 游戏评论页面计算平均分 +function criticAverage() { + if (!Boolean(window.location.href.match(/psngame\/[1-9][0-9]+\/comment/))) // 非评分页面直接返回 + return; + if (!selectScoreElements()) // 寻找评分,无则直接返回 + return; + // 计算评分直方图的数据 + let score_total = 0; + score_data_barchart = new Array(10).fill(0); + score_data_gaussian = []; + score_elements.each(function () { + const score = score_parser($(this)); + score_data_gaussian.push(score); + score_total += score; + score_data_barchart[score - 1]++; + }); + let score_average = (score_total / score_elements.length).toFixed(2); + // 将均分信息添加到页面中 + const psnine_stats = $('div.min-inner.mt40 div.box.pd10'); + psnine_stats.append(` 均分 ${score_average}

      `); + score_axis = []; + score_axis_no_gaussian = []; + let score_count_min = Number.MAX_SAFE_INTEGER, score_count_max = Number.MIN_SAFE_INTEGER; + score_data_barchart_no_gaussian = score_data_barchart.slice(0); + // 评分人数最高区间(分数) + const max_score_count_index = score_data_barchart.indexOf(Math.max(...score_data_barchart)); + // 分配柱状图颜色 + let score_colors = new Array(10).fill('#3890ff'); // do not assign transparency! otherwise scoreOnclick() will break + score_colors[max_score_count_index] = '#da314b'; + for (let score = 10; score >= 1; score--) { // 从10~1分,不可改为1~10分! + const index = score - 1; + const score_count = score_data_barchart[index]; + if (score_count == 0) { // 将1~10分中不存在对应分数的分数bar从不显示正态分布的直方图中剔除 + score_data_barchart_no_gaussian.splice(index, 1); + } else { // 查找最低分和最高分 + if (score_count < score_count_min) { + score_count_min = score_count; + } + if (score_count > score_count_max) { + score_count_max = score_count; } - score_data_barchart[index] = { y: score_count, color: score_colors[index] }; - score_axis.unshift(score); + score_data_barchart_no_gaussian[index] = { y: score_count, color: score_colors[index] }; // 设置分数bar的颜色 + score_axis_no_gaussian.unshift(score); // 设置直方图x轴 } - psnine_stats.append('

      '); - psnine_stats.append('
      '); - var charts = Highcharts.chart('scoreBarChart', createScoreBarChart(score_elements.length, score_count_min, score_count_max)) - scoreBarChartAddLabelOnclick(charts); - Highcharts.chart('scoreTrendChart', createScoreTrendChart()) + score_data_barchart[index] = { y: score_count, color: score_colors[index] }; // 设置分数bar的颜色 + score_axis.unshift(score); // 设置直方图x轴 } + // 插入直方图元素 + psnine_stats.append('
      '); + // 插入趋势图元素 + psnine_stats.append('
      '); + // 设置直方图 + let charts = Highcharts.chart('scoreBarChart', createScoreBarChart(true, score_elements.length, score_count_min, score_count_max)); + scoreBarChartAddLabelOnclick(charts); + // 设置趋势图 + Highcharts.chart('scoreTrendChart', createScoreTrendChart()); } -export default criticAverage; +export default criticAverage; \ No newline at end of file