summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.babelrc4
-rw-r--r--.eslintignore9
-rw-r--r--.eslintrc40
-rw-r--r--.flowconfig16
-rw-r--r--.gitignore5
-rw-r--r--.travis.yml119
-rw-r--r--README images/app-diagram.pngbin0 -> 44230 bytes
-rw-r--r--README images/app-diagram.xml2
-rw-r--r--README.md105
-rw-r--r--app/app.js121
-rw-r--r--app/assets/css/buttons.css131
-rw-r--r--app/assets/css/fonts.css23
-rw-r--r--app/assets/css/global.css19
-rw-r--r--app/assets/css/reset.css48
-rw-r--r--app/assets/css/style.css19
-rw-r--r--app/assets/css/transitions.css91
-rw-r--r--app/assets/css/uiswitch.css135
-rwxr-xr-xapp/assets/fonts/DINPro-Black.otfbin0 -> 88940 bytes
-rwxr-xr-xapp/assets/fonts/DINPro-Bold.otfbin0 -> 90228 bytes
-rwxr-xr-xapp/assets/fonts/OpenSans-ExtraBold.ttfbin0 -> 222584 bytes
-rwxr-xr-xapp/assets/fonts/OpenSans-Semibold.ttfbin0 -> 221328 bytes
-rw-r--r--app/assets/images/app-header-backdrop.svg5
-rw-r--r--app/assets/images/app-triangle.svg5
-rwxr-xr-xapp/assets/images/icon-arrow.svg7
-rw-r--r--app/assets/images/icon-back.svg8
-rw-r--r--app/assets/images/icon-chevron.svg6
-rw-r--r--app/assets/images/icon-close.svg8
-rw-r--r--app/assets/images/icon-extLink.svg6
-rwxr-xr-xapp/assets/images/icon-fail.svg8
-rwxr-xr-xapp/assets/images/icon-fastest.svg7
-rw-r--r--app/assets/images/icon-nearest.svg6
-rwxr-xr-xapp/assets/images/icon-settings.svg9
-rw-r--r--app/assets/images/icon-spinner.svg17
-rwxr-xr-xapp/assets/images/icon-success.svg8
-rwxr-xr-xapp/assets/images/icon-tick.svg14
-rwxr-xr-xapp/assets/images/location-marker-secure.svg19
-rwxr-xr-xapp/assets/images/location-marker-unsecure.svg19
-rw-r--r--app/assets/images/logo-icon.svg1
-rw-r--r--app/assets/images/menubar icons/lock-1.pngbin0 -> 131 bytes
-rw-r--r--app/assets/images/menubar icons/lock-1@2x.pngbin0 -> 181 bytes
-rw-r--r--app/assets/images/menubar icons/lock-2.pngbin0 -> 143 bytes
-rw-r--r--app/assets/images/menubar icons/lock-2@2x.pngbin0 -> 193 bytes
-rw-r--r--app/assets/images/menubar icons/lock-3.pngbin0 -> 129 bytes
-rw-r--r--app/assets/images/menubar icons/lock-3@2x.pngbin0 -> 183 bytes
-rw-r--r--app/assets/images/menubar icons/lock-4.pngbin0 -> 138 bytes
-rw-r--r--app/assets/images/menubar icons/lock-4@2x.pngbin0 -> 189 bytes
-rw-r--r--app/assets/images/menubar icons/lock-5.pngbin0 -> 121 bytes
-rw-r--r--app/assets/images/menubar icons/lock-5@2x.pngbin0 -> 165 bytes
-rw-r--r--app/assets/images/menubar icons/lock-6.pngbin0 -> 128 bytes
-rw-r--r--app/assets/images/menubar icons/lock-6@2x.pngbin0 -> 168 bytes
-rw-r--r--app/assets/images/menubar icons/lock-7.pngbin0 -> 127 bytes
-rw-r--r--app/assets/images/menubar icons/lock-7@2x.pngbin0 -> 172 bytes
-rw-r--r--app/assets/images/menubar icons/lock-8.pngbin0 -> 127 bytes
-rw-r--r--app/assets/images/menubar icons/lock-8@2x.pngbin0 -> 167 bytes
-rw-r--r--app/assets/images/menubar icons/lock-9.pngbin0 -> 128 bytes
-rw-r--r--app/assets/images/menubar icons/lock-9@2x.pngbin0 -> 163 bytes
-rw-r--r--app/components/Account.css98
-rw-r--r--app/components/Account.js78
-rw-r--r--app/components/AccountInput.js317
-rw-r--r--app/components/AdvancedSettings.js145
-rw-r--r--app/components/Connect.css169
-rw-r--r--app/components/Connect.js369
-rw-r--r--app/components/CustomScrollbars.css4
-rw-r--r--app/components/CustomScrollbars.js19
-rw-r--r--app/components/HeaderBar.css61
-rw-r--r--app/components/HeaderBar.js51
-rw-r--r--app/components/Layout.css15
-rw-r--r--app/components/Layout.js46
-rw-r--r--app/components/Login.css154
-rw-r--r--app/components/Login.js212
-rw-r--r--app/components/Map.js51
-rw-r--r--app/components/SelectLocation.css106
-rw-r--r--app/components/SelectLocation.js112
-rw-r--r--app/components/Settings.css140
-rw-r--r--app/components/Settings.js117
-rw-r--r--app/components/Support.css169
-rw-r--r--app/components/Support.js254
-rw-r--r--app/components/Switch.css44
-rw-r--r--app/components/Switch.js142
-rw-r--r--app/components/WindowChrome.css6
-rw-r--r--app/components/WindowChrome.js16
-rw-r--r--app/config.json220
-rw-r--r--app/containers/AccountPage.js22
-rw-r--r--app/containers/AdvancedSettingsPage.js55
-rw-r--r--app/containers/ConnectPage.js32
-rw-r--r--app/containers/LoginPage.js22
-rw-r--r--app/containers/SelectLocationPage.js36
-rw-r--r--app/containers/SettingsPage.js22
-rw-r--r--app/containers/SupportPage.js88
-rw-r--r--app/index.html20
-rw-r--r--app/lib/backend.js424
-rw-r--r--app/lib/formatters.js9
-rw-r--r--app/lib/ipc-facade.js221
-rw-r--r--app/lib/jsonrpc-ws-ipc.js290
-rw-r--r--app/lib/keyframe-animation.js226
-rw-r--r--app/lib/proc.js27
-rw-r--r--app/lib/transition-rule.js47
-rw-r--r--app/lib/tray-icon-manager.js58
-rw-r--r--app/main.js442
-rw-r--r--app/redux/account/actions.js94
-rw-r--r--app/redux/account/reducers.js63
-rw-r--r--app/redux/connection/actions.js118
-rw-r--r--app/redux/connection/reducers.js69
-rw-r--r--app/redux/settings/actions.js19
-rw-r--r--app/redux/settings/reducers.js37
-rw-r--r--app/redux/store.js69
-rw-r--r--app/routes.js109
-rw-r--r--app/tilecache.sw.js27
-rw-r--r--app/transitions.js113
-rw-r--r--app/types.js6
-rw-r--r--dist-assets/ca.crt109
-rw-r--r--dist-assets/crl.pem36
-rw-r--r--dist-assets/icon.icnsbin0 -> 372875 bytes
-rw-r--r--dist-assets/icon.iconset/icon_128x128.pngbin0 -> 10979 bytes
-rw-r--r--dist-assets/icon.iconset/icon_128x128@2x.pngbin0 -> 26461 bytes
-rw-r--r--dist-assets/icon.iconset/icon_16x16.pngbin0 -> 647 bytes
-rw-r--r--dist-assets/icon.iconset/icon_16x16@2x.pngbin0 -> 1535 bytes
-rw-r--r--dist-assets/icon.iconset/icon_256x256.pngbin0 -> 26461 bytes
-rw-r--r--dist-assets/icon.iconset/icon_256x256@2x.pngbin0 -> 64855 bytes
-rw-r--r--dist-assets/icon.iconset/icon_32x32.pngbin0 -> 1535 bytes
-rw-r--r--dist-assets/icon.iconset/icon_32x32@2x.pngbin0 -> 3909 bytes
-rw-r--r--dist-assets/icon.iconset/icon_512x512.pngbin0 -> 64855 bytes
-rw-r--r--dist-assets/icon.iconset/icon_512x512@2x.pngbin0 -> 169745 bytes
-rw-r--r--dist-assets/icon.iconset/icon_64x64.pngbin0 -> 3909 bytes
-rw-r--r--dist-assets/icon.iconset/icon_64x64@2x.pngbin0 -> 10979 bytes
-rw-r--r--electron-builder.yml81
-rw-r--r--flow-libs/electron.js.flow192
-rw-r--r--flow-libs/history.js.flow24
-rw-r--r--flow-libs/nseventmonitor.js.flow42
-rw-r--r--flow-typed/npm/babel-cli_vx.x.x.js108
-rw-r--r--flow-typed/npm/babel-core_vx.x.x.js227
-rw-r--r--flow-typed/npm/babel-eslint_vx.x.x.js80
-rw-r--r--flow-typed/npm/babel-plugin-inline-react-svg_vx.x.x.js81
-rw-r--r--flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js39
-rw-r--r--flow-typed/npm/babel-preset-es2015_vx.x.x.js32
-rw-r--r--flow-typed/npm/babel-preset-react_vx.x.x.js32
-rw-r--r--flow-typed/npm/babel-preset-stage-0_vx.x.x.js32
-rw-r--r--flow-typed/npm/babel-runtime_vx.x.x.js1691
-rw-r--r--flow-typed/npm/browser-sync_vx.x.x.js339
-rw-r--r--flow-typed/npm/chai_v4.x.x.js223
-rw-r--r--flow-typed/npm/chai_vx.x.x.js255
-rw-r--r--flow-typed/npm/cheap-ruler_vx.x.x.js129
-rw-r--r--flow-typed/npm/electron-builder_vx.x.x.js333
-rw-r--r--flow-typed/npm/electron-devtools-installer_vx.x.x.js67
-rw-r--r--flow-typed/npm/electron-log_vx.x.x.js101
-rw-r--r--flow-typed/npm/electron-mocha_vx.x.x.js59
-rw-r--r--flow-typed/npm/electron_vx.x.x.js59
-rw-r--r--flow-typed/npm/enzyme_v2.3.x.js85
-rw-r--r--flow-typed/npm/esdoc_vx.x.x.js417
-rw-r--r--flow-typed/npm/eslint-plugin-react_vx.x.x.js500
-rw-r--r--flow-typed/npm/eslint_vx.x.x.js2293
-rw-r--r--flow-typed/npm/flow-bin_v0.x.x.js6
-rw-r--r--flow-typed/npm/flow-typed_vx.x.x.js193
-rw-r--r--flow-typed/npm/history_vx.x.x.js150
-rw-r--r--flow-typed/npm/jsonrpc-lite_vx.x.x.js32
-rw-r--r--flow-typed/npm/mapbox-gl_vx.x.x.js2482
-rw-r--r--flow-typed/npm/mocha_v3.1.x.js221
-rw-r--r--flow-typed/npm/moment_v2.x.x.js244
-rw-r--r--flow-typed/npm/npm-run-all_vx.x.x.js186
-rw-r--r--flow-typed/npm/react-addons-test-utils_v15.x.x.js28
-rw-r--r--flow-typed/npm/react-custom-scrollbars_vx.x.x.js130
-rw-r--r--flow-typed/npm/react-if_vx.x.x.js39
-rw-r--r--flow-typed/npm/react-mapbox-gl_vx.x.x.js158
-rw-r--r--flow-typed/npm/react-redux_v5.x.x.js98
-rw-r--r--flow-typed/npm/react-router-redux_vx.x.x.js108
-rw-r--r--flow-typed/npm/react-router_v4.x.x.js128
-rw-r--r--flow-typed/npm/react-router_vx.x.x.js501
-rw-r--r--flow-typed/npm/react-transition-group_vx.x.x.js73
-rw-r--r--flow-typed/npm/redux-actions_v2.x.x.js93
-rw-r--r--flow-typed/npm/redux-actions_vx.x.x.js179
-rw-r--r--flow-typed/npm/redux-localstorage_vx.x.x.js60
-rw-r--r--flow-typed/npm/redux-mock-store_v1.2.x.js31
-rw-r--r--flow-typed/npm/redux-thunk_vx.x.x.js60
-rw-r--r--flow-typed/npm/redux_v3.x.x.js109
-rw-r--r--flow-typed/npm/rimraf_vx.x.x.js39
-rw-r--r--flow-typed/npm/sinon_vx.x.x.js333
-rw-r--r--flow-typed/npm/sudo-prompt_vx.x.x.js45
-rw-r--r--flow-typed/npm/uuid_v3.x.x.js15
-rw-r--r--init.js1
-rw-r--r--package.json89
-rwxr-xr-xpre-mac-sign.sh5
-rw-r--r--scripts/serve.js52
-rw-r--r--test/auth.spec.js56
-rw-r--r--test/autologin.spec.js124
-rw-r--r--test/components/Account.spec.js76
-rw-r--r--test/components/AccountInput.spec.js178
-rw-r--r--test/components/Connect.spec.js196
-rw-r--r--test/components/HeaderBar.spec.js48
-rw-r--r--test/components/Login.spec.js135
-rw-r--r--test/components/SelectLocation.spec.js52
-rw-r--r--test/components/Settings.spec.js158
-rw-r--r--test/components/Support.spec.js126
-rw-r--r--test/components/Switch.spec.js126
-rw-r--r--test/connect.spec.js95
-rw-r--r--test/connection-info.spec.js46
-rw-r--r--test/helpers/IpcChain.js104
-rw-r--r--test/helpers/dom-events.js22
-rw-r--r--test/helpers/ipc-helpers.js100
-rw-r--r--test/ipc.spec.js138
-rw-r--r--test/keyframe-animation.spec.js250
-rw-r--r--test/login.spec.js85
-rw-r--r--test/logout.spec.js66
-rw-r--r--test/mocks/ipc.js84
-rw-r--r--test/mocks/redux.js42
-rw-r--r--test/setup/main.js4
-rw-r--r--test/transition-rule.spec.js58
-rw-r--r--yarn.lock6262
207 files changed, 29080 insertions, 25 deletions
diff --git a/.babelrc b/.babelrc
new file mode 100644
index 0000000000..60ed99df98
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,4 @@
+{
+ "presets": ["es2015", "stage-0", "react"],
+ "plugins": ["transform-runtime", "inline-react-svg"]
+}
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000000..458993947b
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,9 @@
+node_modules
+build
+cache
+lib
+dist
+webpack.*.js
+server.js
+build.js
+init.js \ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000000..35c8fb9bbb
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,40 @@
+{
+ "extends": [
+ "eslint:recommended",
+ "plugin:react/recommended"
+ ],
+ "parser": "babel-eslint",
+ "parserOptions": {
+ "ecmaFeatures": {
+ "jsx": true,
+ "modules": true
+ }
+ },
+ "plugins": [ "react", "flowtype" ],
+ "rules": {
+ "indent": [ "error", 2 ],
+ "quotes": [ "error", "single" ],
+ "linebreak-style": [ "error", "unix" ],
+ "semi": [ 2, "always" ],
+ "no-console": "off",
+ "no-loop-func": "warn",
+ "new-cap": "off",
+ "no-trailing-spaces": [ "error", { "skipBlankLines": true } ],
+ "no-param-reassign": "warn",
+ "func-names": "off",
+ "comma-dangle": "off",
+ "comma-spacing": "warn",
+ "no-unused-expressions" : "off", // until fixed https://github.com/babel/babel-eslint/issues/158
+ "no-unused-vars": ["error", {"args": "all", "argsIgnorePattern": "_.*"}],
+ "block-scoped-var": "off", // until fixed https://github.com/eslint/eslint/issues/2253
+ "react/prop-types": "off",
+ "flowtype/define-flow-type": "warn",
+ "react/no-render-return-value": "off" // see https://github.com/facebook/react/issues/10266
+ },
+ "env": {
+ "es6": true,
+ "node": true,
+ "browser": true,
+ "mocha": true
+ }
+}
diff --git a/.flowconfig b/.flowconfig
new file mode 100644
index 0000000000..e08fa5ecae
--- /dev/null
+++ b/.flowconfig
@@ -0,0 +1,16 @@
+[ignore]
+.*/node_modules/mapbox-gl/.*
+.*/node_modules/cheap-ruler/.*
+.*/node_modules/jsonlint-lines-primitives/.*
+.*/node_modules/unflowify/.*
+
+[include]
+
+[libs]
+flow-libs/
+
+[options]
+emoji=true
+suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe
+munge_underscores=true
+unsafe.enable_getters_and_setters=true
diff --git a/.gitignore b/.gitignore
index 2f7896d1d1..be01f23d88 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,6 @@
target/
+node_modules
+dist
+build
+.DS_Store
+*.log
diff --git a/.travis.yml b/.travis.yml
index df827b0b0f..2ac2b4aad5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,31 +1,104 @@
-language: rust
-cache: cargo
-rust:
- - nightly
- - stable
- - beta
-os:
- - linux
- - osx
-
+sudo: false
env:
global:
- MACOSX_DEPLOYMENT_TARGET="10.7"
-before_script:
- - export PATH=$HOME/.cargo/bin:$HOME/.local/bin:$PATH
- - env
+matrix:
+ include:
+ - language: node_js
+ node_js: '8'
+ cache: yarn
+
+ install: &node_install
+ - yarn install
+
+ # FIXME: Flow throws error for optional dependencies
+ # missing from node_modules on unsupported platforms
+ # see: https://github.com/facebook/flow/issues/4171
+ - NSEVENTMON_INDEX_JS=node_modules/nseventmonitor/index.js;
+ if [ ! -f $NSEVENTMON_INDEX_JS ]; then
+ echo "Installing a stub for NSEventMonitor..";
+ mkdir -p `dirname $NSEVENTMON_INDEX_JS`;
+ echo "module.exports = {};" > $NSEVENTMON_INDEX_JS;
+ fi
+ before_script: &node_before_script
+ - export DISPLAY=:99.0; sh -e /etc/init.d/xvfb start
+ script: &node_script
+ - yarn run lint
+ - yarn run flow
+ - yarn test
+
+ - language: node_js
+ node_js: '7'
+ cache: yarn
+ install: *node_install
+ before_script: *node_before_script
+ script: *node_script
+
+ - language: node_js
+ node_js: '6'
+ cache: yarn
+ install: *node_install
+ before_script: *node_before_script
+ script: *node_script
+
+
+ # Backend Linux
+ - language: rust
+ rust: nightly
+ os: linux
+ cache: cargo
+
+ before_script: &rust_before_script
+ - export PATH=$HOME/.cargo/bin:$HOME/.local/bin:$PATH
+ - env
+ script: &rust_script
+ - cargo build --verbose
+ - cargo test --verbose
+ # Format only on nightly, since that is where rustfmt-nightly compiles
+ - if [ "${TRAVIS_RUST_VERSION}" = "nightly" ] && [ "${TRAVIS_OS_NAME}" = "linux" ]; then
+ export LD_LIBRARY_PATH=$(rustc --print sysroot)/lib:$LD_LIBRARY_PATH
+ && ./format.sh --write-mode=diff;
+ else
+ echo "Not checking formatting on this build";
+ fi
+
+ - language: rust
+ rust: stable
+ os: linux
+ cache: cargo
+ before_script: *rust_before_script
+ script: *rust_script
+
+ - language: rust
+ rust: beta
+ os: linux
+ cache: cargo
+ before_script: *rust_before_script
+ script: *rust_script
+
+ # Backend macOS
+ - language: rust
+ rust: stable
+ os: osx
+ cache: cargo
+ before_script: *rust_before_script
+ script: *rust_script
+
+ - language: rust
+ rust: beta
+ os: osx
+ cache: cargo
+ before_script: *rust_before_script
+ script: *rust_script
+
+ - language: rust
+ rust: nightly
+ os: osx
+ cache: cargo
+ before_script: *rust_before_script
+ script: *rust_script
-script:
- - cargo build --verbose
- - cargo test --verbose
- # Format only on nightly, since that is where rustfmt-nightly compiles
- - if [ "${TRAVIS_RUST_VERSION}" = "nightly" ] && [ "${TRAVIS_OS_NAME}" = "linux" ]; then
- export LD_LIBRARY_PATH=$(rustc --print sysroot)/lib:$LD_LIBRARY_PATH
- && ./format.sh --write-mode=diff;
- else
- echo "Not checking formatting on this build";
- fi
notifications:
email:
diff --git a/README images/app-diagram.png b/README images/app-diagram.png
new file mode 100644
index 0000000000..17d634be5e
--- /dev/null
+++ b/README images/app-diagram.png
Binary files differ
diff --git a/README images/app-diagram.xml b/README images/app-diagram.xml
new file mode 100644
index 0000000000..b8a41198ea
--- /dev/null
+++ b/README images/app-diagram.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mxfile type="device" userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8" version="6.3.1" editor="www.draw.io"><diagram name="Page-1">7Vtbc+I2FP41zLQPyViSr4+BwLYzvewku+32UdgC3DUWtUUu/fWVbQksS4BZi2Sz2zxk8NHV5/qdI3mEJuundwXerH6lCclG0EmeRuh2BGHoQv6/Ijw3BM9HDWFZpElDAnvCffovEURHULdpQkqlI6M0Y+lGJcY0z0nMFBouCvqodlvQTF11g5diRWdPuI9xRrRuf6YJWwkq8KN9w08kXa7E0iH0m4Y5jj8vC7rNxXojiBb1X9O8xnIusW65wgl9bJHQdIQmBaWs+bV+mpCsYq1kmxzHnuVeR2i8YuuMPwD+s26eHRgM+gzmL1eQnLWXOzSfHzYjHnC2lRN2V3hcpYzcb3BcPT9ybVGXTHC5Iol4WKRZNqEZLeqhknNoXLKCfiatlhs/dMahccfiHR9IwchTiyTe4B2ha8KKZ95FtHqSp0JXQSieH/eS3/VZtYTuIkHEQtuWu7n3POM/BNsOiAQGg3nYYdtsNoOTiYlts9lt5PuW2OaqbOMUjW1uaGAb8j0LbAP+RVVvMuFcnJl46DiTSc1dCzwE0k8eUT1o4qEV1XOBxsI1KUvu2kqNlSTh/lE80oKt6JLmOJvuqePa6dXsdFQ2k6eUfWr9/qvqcu1VTznf8Scxon5otyU3lSPnhDjDZZnGH1Zp3jTM0kxO/jdh7FnED7xllJP22/uF0o3od9iDlAwXzLxU3dRa7KDES7otYsEpIVE+dEmktISwKib2UYuKA221QGLOgmSYpQ9qjDJpQD0zfyf83OqwoWnOytbC7yvCftWdTolVg47vP6s7/9Gsbx58hbrOQ30ZuliUnHtdZd6xqpd+e/5RNc5pflxvd9p5DT1FQe2rp7QRuZQwkyFKF/k9le48rdJECb1O+AQd19TsU4waJlA9VCZpucEsXmmS5h6YqfIsSJn+i+d1h0qEwh54b2888m45BWfpMq8kyllNuJ8YV5485ajwRjSs0ySpnV2G5yQb77CeCbMsaM6E5IFZjlI/tXixw7Vit6M2NjQ5jCuuN64c+6yoxEDpXqkByr+AmUJNqBVjuR1x4vuCPj33iuuNg5dgHR0FSAkm4SI2RQU/Dsl8YSe4ww6udPXYDkyw0rcR2p0jTP35/cQ6SwlIPBKYWBr5AcKWMKfrvx5LAx0tjaCfMWHqtdHKl/b/2VYJHH9lhDhgdJw2yV+yGnwyXO2olgiOWUrzUbX1ZsZ5Ifut8WaT5kvZwHfZrNa0DgtwXwMwq95GzV0a3N0r7Pm+HvdkdmEv7vXVEF9PSW5JTAvMaKEL9oeCJNuna+Hpf7RukYswJrHRyc1Dz/UcS1lgqFokkoWelzDJ0Duq/xbzFOsq30YGHRMQHqMrbQWSAt0uNTFPb/zx8WRfMSXv9SAkCjpK1M1um01pEPLcDAc4XW2NUHu+0wOAdyIpiob1h57XMYBWFvUF2Cp8y4j5kF3o+iwdgRUk7YRBqApxZAVJR4Ey61VnBitYWlpxS95/pOUWV30mdL3hiECY0NsLNaH/iqEmQC8VanZFB6XmAF4OeelhRymRCVTZro05w8OPa0Jylwk/50YNv1Po9kQ5zpqP1hMLzlxGOGme5gkH/3o59qvw1SbffLrqIS3Jjq920UV8dUfkl3DVwHCUZ8GlONdBu4LoqD4l0JxKH9u+SC2+7WC+PPIbXElkcCXQtifpf7ynWzc3uewrNekvFIJU5eE2XRUyw2E2fMFSZaCX1T7eT++qmtpvH6Z3s5vJtIdc1VApbK4NqQSpv3RNAE493axkK/YEDAI8F4t5UD2hAmGkYzHg6VgMWjn71bOau+ntx0/fB++BqyYSIIIa7z0D60FogfVId2fcoVQsqhhfo5ZLw2R0okD5piKaXi7nf/0LoCbYvLtR8sq42e3iZrHCwVqI2y3uhx3VHIazXb08e89ooWtsucKb6mdVoi/rHmYrP5IQLxbQnBAn/tz3LJ2GdE9ePcfVHIFvyIc9/7Ck+zqCyOCCSbKNSaEjm6HlhTgh83Bu4ibyUYQSS9yEWnnh2oXA8aCPgBeEEla+RLUh0lX1pj4iss/cCvyF4Usz13RZ7GLcBOAixRtRoWld1ThUvHHeWlTqFXukC1BuOlkv2fQXsqvZTE4eD8KSt5xuAZslFODCSHV8o0Hpl90iCYD/m+7LlEgi66ixv+nqpxayArrdJN+c9UKL1ishnzxUgsOMVx7IqgMs1Tv1jwXufv/4oSqffA9pu9dB61Cm0ifQupWKCbpMrVnJy6FyftW5oQC/t8x8l4W/wIWKczNzz+mkOuJjikOZebe/vHdnKzMHSM93dlUlfCDxecshANmslwfdiwUDY4Blr6/D8t1tx4PHm9ZrhsGpW41v2zWdd9ZuQn+9z9qVG+eq3skAd+GyYuey2MnvVLqXy9Q7Xyc+VNFKbJdARkgvpq1x3nyHVfu/hwoKl3FBSH4BsJSRBTsXKg1OR84BTupZE3QNZ03QdNZko3aEIk02MjdZL9f6XapvXhzAU1MO6AQ6jkVWpMEf919CN4a1/9ocTf8D</diagram></mxfile> \ No newline at end of file
diff --git a/README.md b/README.md
index 52406280cc..92b6e40fed 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,107 @@
-# Mullvad VPN client
+# Mullvad VPN desktop and mobile app
+
+The back- and frontend for the Mullvad VPN app.
+
+## Status
+
+There is a [beta release available](https://mullvad.net/en/guides/beta-app/) for macOS.
+Support for Linux, Windows, Android and iOS is in the making.
+
+
+## Developing
+
+First you need to install all the javascript dependencies by running
+```bash
+yarn install
+```
+then you can start the program using
+```bash
+yarn run develop
+```
+
+If you change any javascript file while the development mode is running it will automatically
+transpile and reload the file so that the changes are visible almost immediately.
+
+The app will attempt to start the backend automatically. The exact binary being run can be
+customized with the `MULLVAD_BACKEND` environment variable.
+
+If the `/tmp/.mullvad_rpc_address` file exists the app will not start the backend, so if you want
+to run a specific version of the backend you can just start it yourself and the app will pick up on
+it and behave accordingly.
+
+
+## Packaging
+
+By running
+```bash
+yarn run pack
+```
+you create installation packages for windows, linux and MacOS. Note that you have to have run
+`yarn install` at least once to download the javascript dependencies.
+
+If you only want to build for a specific OS you run
+```bash
+yarn run pack:OS
+```
+as in `yarn run pack:linux`.
+
+The artifact (.dmg, .deb, .msi) version is the `version` property of `package.json`.
+
+### Build dependencies
+
+#### Linux
+
+```bash
+sudo apt install icnsutils graphicsmagick
+```
+
+
+## Command line tools
+
+- `$ yarn run develop` - develop app with live-reload enabled
+- `$ yarn run flow` - type-check the code
+- `$ yarn run lint` - lint code
+- `$ yarn run pack` - prepare app for distribution for macOS, Windows, Linux. Use `pack:mac`,
+ `pack:win`, `pack:linux` to generate package for single target.
+- `$ yarn run test` - run tests
+
+## Structure
+
+- **app/**
+ - **redux/** - state management
+ - **components/** - components
+ - **containers/** - containers that provide a glueing layer between components and redux
+ actions/backend.
+ - **lib/** - shared classes and utilities
+ - **assets/** - graphical assets and stylesheets
+ - **config.js** - static configuration file
+ - **app.js** - entry file for renderer process
+ - **main.js** - entry file for background process
+ - **routes.js** - routes configurator
+ - **store.js** - redux store configurator
+ - **enums.js** - common enums used across components
+- **test/** - tests
+- **scripts/** - support scripts for development
+- **init.js** - entry file for electron, points to compiled **main.js**
+
+## App diagram
+
+![App diagram](README%20images/app-diagram.png)
+
+## View layout
+
+Most of application layouts consist of header bar area and main content area. Three of components
+from `components/Layout` help to assemble each view, i.e:
+
+```
+<Layout>
+ <Header />
+ <Container>
+ { /* content goes here */ }
+ </Container>
+</Layout>
+```
-Repository containing most main components of the Mullvad VPN client
# License
diff --git a/app/app.js b/app/app.js
new file mode 100644
index 0000000000..6536de4983
--- /dev/null
+++ b/app/app.js
@@ -0,0 +1,121 @@
+// @flow
+
+import path from 'path';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { Provider } from 'react-redux';
+import { ConnectedRouter } from 'react-router-redux';
+import { createMemoryHistory } from 'history';
+import { webFrame, ipcRenderer } from 'electron';
+import log from 'electron-log';
+import makeRoutes from './routes';
+import configureStore from './redux/store';
+import { Backend } from './lib/backend';
+
+import type { ConnectionState } from './redux/connection/reducers';
+import type { TrayIconType } from './lib/tray-icon-manager';
+
+const initialState = null;
+const memoryHistory = createMemoryHistory();
+const store = configureStore(initialState, memoryHistory);
+
+//////////////////////////////////////////////////////////////////////////
+// Backend
+//////////////////////////////////////////////////////////////////////////
+const backend = new Backend(store);
+ipcRenderer.on('backend-info', (_event, args) => {
+ backend.setCredentials(args.credentials);
+ backend.sync();
+ backend.autologin()
+ .then( () => {
+ return backend.syncRelayConstraints();
+ })
+ .catch( e => {
+ if (e.type === 'NO_ACCOUNT') {
+ log.debug('No user set in the backend, showing window');
+ ipcRenderer.send('show-window');
+ }
+ });
+});
+ipcRenderer.on('shutdown', () => {
+ log.info('Been told by the node process to shutdown');
+ backend.shutdown()
+ .catch( e => {
+ log.warn('Unable to shut down the backend', e.message);
+ });
+});
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// Tray icon
+//////////////////////////////////////////////////////////////////////////
+
+/**
+ * Get tray icon type based on connection state
+ */
+const getIconType = (s: ConnectionState): TrayIconType => {
+ switch(s) {
+ case 'connected': return 'secured';
+ case 'connecting': return 'securing';
+ default: return 'unsecured';
+ }
+};
+
+/**
+ * Update tray icon via IPC call
+ */
+const updateTrayIcon = () => {
+ const { connection } = store.getState();
+ // TODO: Only update the tray icon if the connection status changed
+ ipcRenderer.send('changeTrayIcon', getIconType(connection.status));
+};
+store.subscribe(updateTrayIcon);
+
+// force update tray
+updateTrayIcon();
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+// disable smart pinch.
+webFrame.setZoomLevelLimits(1, 1);
+
+if(navigator.serviceWorker) {
+ navigator.serviceWorker.register(path.join(__dirname, 'tilecache.sw.js'))
+ .then((registration) => {
+ log.info('ServiceWorker registration successful with scope: ', registration.scope);
+ }).catch((err) => {
+ log.info('ServiceWorker registration failed: ', err);
+ });
+}
+
+ipcRenderer.send('on-browser-window-ready');
+
+function getRootElement() {
+ const currentScript = document.currentScript;
+ if (!currentScript) {
+ throw new Error('Missing document.currentScript');
+ }
+
+ const containerId = currentScript.getAttribute('data-container');
+ if(!containerId) {
+ throw new Error('Missing data-container attribute.');
+ }
+
+ const rootElement = document.querySelector(containerId);
+ if(!rootElement) {
+ throw new Error('Missing root element.');
+ }
+
+ return rootElement;
+}
+
+
+ReactDOM.render(
+ <Provider store={ store }>
+ <ConnectedRouter history={ memoryHistory }>
+ { makeRoutes(store.getState, { backend }) }
+ </ConnectedRouter>
+ </Provider>,
+ getRootElement()
+);
diff --git a/app/assets/css/buttons.css b/app/assets/css/buttons.css
new file mode 100644
index 0000000000..805d9e9a74
--- /dev/null
+++ b/app/assets/css/buttons.css
@@ -0,0 +1,131 @@
+.button {
+ display: flex;
+ width: 100%;
+ padding: 7px 12px 9px;
+ border-radius: 4px;
+ border: 0;
+ font-family: DINPro;
+ font-size: 20px;
+ font-weight: 900;
+ line-height: 26px;
+ justify-content: center;
+ align-items: center;
+ transition: 0.25s opacity;
+}
+
+.button:disabled {
+ opacity: 0.5;
+}
+
+.button-label {
+ margin: 0 auto;
+}
+
+/* make negative margin to center label within button */
+.button-label + .button-icon--16 {
+ margin-left: -16px;
+}
+
+.button--blur {
+ backdrop-filter: blur(4px);
+}
+
+.button--primary {
+ background-color: rgba(41,71,115,1);
+ color: rgba(255,255,255,0.8);
+}
+
+.button--primary .button-icon path {
+ fill: rgba(255,255,255,0.8);
+}
+
+.button--primary:not(:disabled):hover {
+ background-color: rgba(41,71,115,0.9);
+ color: rgba(255,255,255,1);
+}
+
+.button--primary:not(:disabled):hover .button-icon path {
+ fill: rgba(255,255,255,1);
+}
+
+.button--primary:active {
+ background-color: rgba(41,71,115,1);
+}
+
+.button--secondary {
+ background-color: rgba(41,71,115,0.4);
+ color: rgba(255,255,255,0.6);
+}
+
+.button--secondary:not(:disabled):hover {
+ background-color: rgba(41,71,115,0.5);
+ color: rgba(255,255,255,0.8);
+}
+
+.button--secondary:active {
+ background-color: rgba(41,71,115,0.4);
+}
+
+.button--negative {
+ background-color: rgba(208,2,27,1);
+ color: rgba(255,255,255,0.8);
+}
+
+.button--negative:not(:disabled):hover {
+ background-color: rgba(208,2,27,0.95);
+ color: rgba(255,255,255,1);
+}
+
+.button--negative:active {
+ background-color: rgba(208,2,27,1);
+}
+
+.button--negative-light {
+ background-color: rgba(208,2,27,0.4);
+ color: rgba(255,255,255,0.6);
+}
+
+.button--negative-light:not(:disabled):hover {
+ background-color: rgba(208,2,27,0.45);
+ color: rgba(255,255,255,0.8);
+}
+
+.button--negative-light:active {
+ background-color: rgba(208,2,27,0.4);
+}
+
+.button--positive {
+ background-color: rgba(63,173,77,1);
+ color: rgba(255,255,255,0.8);
+}
+
+.button--positive .button-icon path {
+ fill: rgba(255,255,255,0.8);
+}
+
+.button--positive:not(:disabled):hover {
+ background-color: rgba(63,173,77,0.9);
+ color: rgba(255,255,255,1);
+}
+
+.button--positive:not(:disabled):hover .button-icon path {
+ fill: rgba(255,255,255,1);
+}
+
+.button--positive:active {
+ background-color: rgba(63,173,77,1);
+}
+
+.button--neutral {
+ background-color: rgba(255,255,255,0.2);
+ color: rgba(255,255,255,0.8);
+}
+
+.button--neutral:not(:disabled):hover {
+ background-color: rgba(255,255,255,0.25);
+ color: rgba(255,255,255,1);
+}
+
+.button--neutral:active {
+ background-color: rgba(255,255,255,0.2);
+}
diff --git a/app/assets/css/fonts.css b/app/assets/css/fonts.css
new file mode 100644
index 0000000000..22b97c7f2e
--- /dev/null
+++ b/app/assets/css/fonts.css
@@ -0,0 +1,23 @@
+@font-face {
+ font-family: DINPro;
+ font-weight: bold;
+ src: url("../fonts/DINPro-Bold.otf") format("opentype");
+}
+
+@font-face {
+ font-family: DINPro;
+ font-weight: 900;
+ src: url("../fonts/DINPro-Black.otf") format("opentype");
+}
+
+@font-face {
+ font-family: "Open Sans";
+ font-weight: 800;
+ src: url("../fonts/OpenSans-ExtraBold.ttf") format("truetype");
+}
+
+@font-face {
+ font-family: "Open Sans";
+ font-weight: 600;
+ src: url("../fonts/OpenSans-Semibold.ttf") format("truetype");
+}
diff --git a/app/assets/css/global.css b/app/assets/css/global.css
new file mode 100644
index 0000000000..f724a6b5ff
--- /dev/null
+++ b/app/assets/css/global.css
@@ -0,0 +1,19 @@
+* { box-sizing: border-box; }
+
+:focus {
+ outline: 0;
+}
+
+html {
+ -webkit-font-smoothing: antialiased;
+ user-select: none;
+ cursor: default;
+}
+
+img {
+ -webkit-user-drag: none;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, sans-serif;
+}
diff --git a/app/assets/css/reset.css b/app/assets/css/reset.css
new file mode 100644
index 0000000000..cf3d1dd178
--- /dev/null
+++ b/app/assets/css/reset.css
@@ -0,0 +1,48 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+} \ No newline at end of file
diff --git a/app/assets/css/style.css b/app/assets/css/style.css
new file mode 100644
index 0000000000..8b0bd30f23
--- /dev/null
+++ b/app/assets/css/style.css
@@ -0,0 +1,19 @@
+/* global */
+@import 'reset.css';
+@import 'fonts.css';
+@import 'global.css';
+@import 'buttons.css';
+@import 'transitions.css';
+
+/* app */
+@import '../../components/WindowChrome.css';
+@import '../../components/CustomScrollbars.css';
+@import '../../components/Login.css';
+@import '../../components/Connect.css';
+@import '../../components/Settings.css';
+@import '../../components/Account.css';
+@import '../../components/Support.css';
+@import '../../components/SelectLocation.css';
+@import '../../components/HeaderBar.css';
+@import '../../components/Layout.css';
+@import '../../components/Switch.css';
diff --git a/app/assets/css/transitions.css b/app/assets/css/transitions.css
new file mode 100644
index 0000000000..239be5b63b
--- /dev/null
+++ b/app/assets/css/transitions.css
@@ -0,0 +1,91 @@
+/**
+ * CSS rules for transitions using React-router and CSSTransitionGroup
+ */
+
+div[class*="-transition-leave"], div[class*="-transition-enter"] {
+ /* keep animated .layout divs pinned to viewport boundaries */
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100vw;
+
+ /* disable UI interaction during transitions */
+ pointer-events: none;
+}
+
+.transition-container {
+ position: relative;
+ width: 100vw;
+ height: 100vh;
+ overflow: hidden;
+}
+
+/* New view slides bottom top */
+
+.slide-up-transition-leave { z-index: 0; }
+.slide-up-transition-enter {
+ transform: translateY(100vh);
+ z-index: 1;
+}
+
+.slide-up-transition-enter.slide-up-transition-enter-active {
+ transform: translateY(0);
+ transition: transform 450ms ease;
+}
+
+/* New view slides top bottom */
+
+.slide-down-transition-enter { z-index: 0; }
+.slide-down-transition-leave {
+ transform: translateY(0);
+ z-index: 1;
+}
+
+.slide-down-transition-leave.slide-down-transition-leave-active {
+ transform: translateY(100vh);
+ transition: transform 450ms ease;
+}
+
+/* New view slids right to left */
+
+.push-transition-leave {
+ transform: translateX(0vw);
+ z-index: 0;
+}
+
+.push-transition-enter {
+ transform: translateX(100vw);
+ z-index: 1;
+}
+
+.push-transition-leave.push-transition-leave-active {
+ transform: translateX(-50vw);
+ transition: transform 450ms ease;
+}
+
+.push-transition-enter.push-transition-enter-active {
+ transform: translateX(0);
+ transition: transform 450ms ease;
+}
+
+/* New view slides left to right */
+
+.pop-transition-enter {
+ transform: translateX(-50vw);
+ z-index: 0;
+}
+
+.pop-transition-leave {
+ transform: translateX(0);
+ z-index: 1;
+}
+
+.pop-transition-enter.pop-transition-enter-active {
+ transform: translateX(0vw);
+ transition: transform 450ms ease;
+}
+
+.pop-transition-leave.pop-transition-leave-active {
+ transform: translateX(100vw);
+ transition: transform 450ms ease;
+} \ No newline at end of file
diff --git a/app/assets/css/uiswitch.css b/app/assets/css/uiswitch.css
new file mode 100644
index 0000000000..e8c037bf1e
--- /dev/null
+++ b/app/assets/css/uiswitch.css
@@ -0,0 +1,135 @@
+/* https://github.com/fnky/css3-uiswitch */
+.uiswitch {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ -ms-appearance: none;
+ -o-appearance: none;
+ appearance: none;
+ height: 31px;
+ width: 51px;
+ position: relative;
+ border-radius: 16px;
+ cursor: pointer;
+ outline: 0;
+ z-index: 0;
+ margin: 0;
+ padding: 0;
+ border: none;
+ background-color: #e5e5e5;
+ -webkit-transition-duration: 600ms;
+ -moz-transition-duration: 600ms;
+ transition-duration: 600ms;
+ -webkit-transition-timing-function: ease-in-out;
+ -moz-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-touch-callout: none;
+ -webkit-text-size-adjust: none;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-user-select: none; }
+ .uiswitch::before {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ height: 27px;
+ width: 47px;
+ content: ' ';
+ position: absolute;
+ left: 2px;
+ top: 2px;
+ background-color: white;
+ border-radius: 16px;
+ z-index: 1;
+ -webkit-transition-duration: 300ms;
+ -moz-transition-duration: 300ms;
+ transition-duration: 300ms;
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ -ms-transform: scale(1);
+ -o-transform: scale(1);
+ transform: scale(1); }
+ .uiswitch::after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ height: 27px;
+ width: 27px;
+ content: ' ';
+ position: absolute;
+ border-radius: 27px;
+ background: white;
+ z-index: 2;
+ top: 2px;
+ left: 2px;
+ box-shadow: 0px 0px 1px 0px rgba(0, 0, 0, 0.25), 0px 4px 11px 0px rgba(0, 0, 0, 0.08), -1px 3px 3px 0px rgba(0, 0, 0, 0.14);
+ -webkit-transition: -webkit-transform 300ms, width 280ms;
+ -moz-transition: -moz-transform 300ms, width 280ms;
+ transition: transform 300ms, width 280ms;
+ -webkit-transform: translate3d(0, 0, 0);
+ -moz-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0);
+ -o-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ -webkit-transition-timing-function: cubic-bezier(0.42, 0.8, 0.58, 1.2);
+ -moz-transition-timing-function: cubic-bezier(0.42, 0.8, 0.58, 1.2);
+ transition-timing-function: cubic-bezier(0.42, 0.8, 0.58, 1.2); }
+ .uiswitch:checked {
+ background-color: #4cd964;
+ background-image: -webkit-linear-gradient(-90deg, #4cd964 0%, #4dd865 100%);
+ background-image: linear-gradient(-180deg,#4cd964 0%, #4dd865 100%); }
+ .uiswitch:checked::after {
+ -webkit-transform: translate3d(16px, 0, 0);
+ -moz-transform: translate3d(16px, 0, 0);
+ -ms-transform: translate3d(16px, 0, 0);
+ -o-transform: translate3d(16px, 0, 0);
+ transform: translate3d(16px, 0, 0);
+ right: 18px;
+ left: inherit; }
+ .uiswitch:active::after {
+ width: 35px; }
+ .uiswitch:checked::before, .uiswitch:active::before {
+ -webkit-transform: scale(0);
+ -moz-transform: scale(0);
+ -ms-transform: scale(0);
+ -o-transform: scale(0);
+ transform: scale(0); }
+ .uiswitch:disabled {
+ opacity: 0.5;
+ cursor: default;
+ -webkit-transition: none;
+ -moz-transition: none;
+ transition: none; }
+ .uiswitch:disabled:active::before, .uiswitch:disabled:active::after, .uiswitch:disabled:checked:active::before, .uiswitch:disabled:checked::before {
+ width: 27px;
+ -webkit-transition: none;
+ -moz-transition: none;
+ transition: none; }
+ .uiswitch:disabled:active::before {
+ height: 27px;
+ width: 41px;
+ -webkit-transform: translate3d(6px, 0, 0);
+ -moz-transform: translate3d(6px, 0, 0);
+ -ms-transform: translate3d(6px, 0, 0);
+ -o-transform: translate3d(6px, 0, 0);
+ transform: translate3d(6px, 0, 0); }
+ .uiswitch:disabled:checked:active::before {
+ height: 27px;
+ width: 27px;
+ -webkit-transform: scale(0);
+ -moz-transform: scale(0);
+ -ms-transform: scale(0);
+ -o-transform: scale(0);
+ transform: scale(0); }
+
+.uiswitch {
+ background-color: #e5e5e5; }
+ .uiswitch::before {
+ background-color: white; }
+ .uiswitch::after {
+ background: white; }
+ .uiswitch:checked {
+ background-color: #4cd964;
+ background-image: -webkit-linear-gradient(-90deg, #4cd964 0%, #4dd865 100%);
+ background-image: linear-gradient(-180deg,#4cd964 0%, #4dd865 100%); } \ No newline at end of file
diff --git a/app/assets/fonts/DINPro-Black.otf b/app/assets/fonts/DINPro-Black.otf
new file mode 100755
index 0000000000..2092a7bbdc
--- /dev/null
+++ b/app/assets/fonts/DINPro-Black.otf
Binary files differ
diff --git a/app/assets/fonts/DINPro-Bold.otf b/app/assets/fonts/DINPro-Bold.otf
new file mode 100755
index 0000000000..7c83953648
--- /dev/null
+++ b/app/assets/fonts/DINPro-Bold.otf
Binary files differ
diff --git a/app/assets/fonts/OpenSans-ExtraBold.ttf b/app/assets/fonts/OpenSans-ExtraBold.ttf
new file mode 100755
index 0000000000..21f6f84a07
--- /dev/null
+++ b/app/assets/fonts/OpenSans-ExtraBold.ttf
Binary files differ
diff --git a/app/assets/fonts/OpenSans-Semibold.ttf b/app/assets/fonts/OpenSans-Semibold.ttf
new file mode 100755
index 0000000000..1a7679e394
--- /dev/null
+++ b/app/assets/fonts/OpenSans-Semibold.ttf
Binary files differ
diff --git a/app/assets/images/app-header-backdrop.svg b/app/assets/images/app-header-backdrop.svg
new file mode 100644
index 0000000000..4c811518bf
--- /dev/null
+++ b/app/assets/images/app-header-backdrop.svg
@@ -0,0 +1,5 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>app-triangle-extended</title>
+ <desc>Mullvad VPN app</desc>
+ <rect x="0" y="12" width="100%" height="100%" rx="8" ry="8" />
+</svg> \ No newline at end of file
diff --git a/app/assets/images/app-triangle.svg b/app/assets/images/app-triangle.svg
new file mode 100644
index 0000000000..e2f7ca044b
--- /dev/null
+++ b/app/assets/images/app-triangle.svg
@@ -0,0 +1,5 @@
+<svg width="30px" height="13px" viewBox="0 0 30 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>app-triangle-extended</title>
+ <desc>Mullvad VPN app</desc>
+ <path fill="#294D73" d="M0,12 L30,12 L30,13 L0,13 L0,12 Z M0,12 C7.24137931,12 12.9310345,1.0135008e-16 15,0 C17.0689655,0 23.7931034,12 30,12 L0,12 Z" id="app-triangle-extended"></path>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-arrow.svg b/app/assets/images/icon-arrow.svg
new file mode 100755
index 0000000000..96f1356fbe
--- /dev/null
+++ b/app/assets/images/icon-arrow.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="16px" viewBox="0 0 24 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-arrow</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <path fill="#FFFFFF" d="M18.7015867,9 L14.4331381,12.762659 C13.851665,13.2752305 13.8579999,14.1003943 14.4392669,14.612784 C15.0245863,15.1287461 15.9602099,15.1275926 16.5380921,14.6181865 L23.5668627,8.42228969 C23.8565791,8.16690324 24.000373,7.83391619 23.999837,7.50067932 L24,7.4966702 C23.999589,7.16348359 23.8547954,6.83138119 23.5668627,6.57756713 L16.5380921,0.381670278 C15.956619,-0.130901228 15.0205338,-0.125317014 14.4392669,0.387072772 C13.8539474,0.903034846 13.8552559,1.72779176 14.4331381,2.23719784 L18.7017491,6 L1.50909424,6 C0.66354084,6 0,6.67157288 0,7.5 C0,8.33420277 0.675644504,9 1.50909424,9 L18.7015867,9 Z" id="icon-arrow"></path>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-back.svg b/app/assets/images/icon-back.svg
new file mode 100644
index 0000000000..5ec98cbee6
--- /dev/null
+++ b/app/assets/images/icon-back.svg
@@ -0,0 +1,8 @@
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-back</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" fill-opacity="0.6">
+ <path d="M12,24 C5.37312,24 -3.2900871e-16,18.62688 -7.34788079e-16,12 C-1.14056745e-15,5.37312 5.37312,0 12,0 C18.62688,0 24,5.37312 24,12 C24,18.62688 18.62688,24 12,24 Z M7.00548958,11.9978652 C6.97547323,12.2732292 7.06852694,12.5603856 7.28524783,12.7773547 L13.2129013,18.7117979 C13.5936146,19.0929473 14.2231287,19.090784 14.6233317,18.7027276 L14.6942341,18.6339771 C15.09248,18.2478183 15.1055305,17.6195657 14.7108992,17.2180331 L9.58045095,11.9978652 L14.7108992,6.77769718 C15.1055305,6.37616462 15.09248,5.74791199 14.6942341,5.36175323 L14.6233317,5.29300272 C14.2231287,4.90494629 13.5936146,4.90278303 13.2129013,5.28393238 L7.28524783,11.2183756 C7.06852694,11.4353448 6.97547323,11.7225011 7.00548958,11.9978652 L7.00548958,11.9978652 Z" id="path" fill="#FFFFFF"></path>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-chevron.svg b/app/assets/images/icon-chevron.svg
new file mode 100644
index 0000000000..5437127c33
--- /dev/null
+++ b/app/assets/images/icon-chevron.svg
@@ -0,0 +1,6 @@
+<svg width="7px" height="12px" viewBox="0 0 7 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-cheveron</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <path d="M0.335204989,1.95371785 L4.23669259,6 L0.335204989,10.0462822 C-0.111734996,10.4932221 -0.111734996,11.217855 0.335204989,11.664795 C0.782144974,12.111735 1.49826561,12.111735 1.9452056,11.664795 L6.66818642,6.80553188 C6.88657769,6.58714061 6.99779844,6.29559541 6.99881099,6.00303766 C6.99779844,5.70440459 6.88657769,5.41285939 6.66818642,5.19446812 L1.9452056,0.335204989 C1.49826561,-0.111734996 0.782144974,-0.111734996 0.335204989,0.335204989 C-0.111734996,0.782144974 -0.111734996,1.50677786 0.335204989,1.95371785 Z" id="path" fill-opacity="0.8" fill="#FFFFFF" fill-rule="evenodd"></path>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-close.svg b/app/assets/images/icon-close.svg
new file mode 100644
index 0000000000..df23259a13
--- /dev/null
+++ b/app/assets/images/icon-close.svg
@@ -0,0 +1,8 @@
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-close</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" fill-opacity="0.6">
+ <path d="M12,24 C5.37312,24 -3.2900871e-16,18.62688 -7.34788079e-16,12 C-1.14056745e-15,5.37312 5.37312,0 12,0 C18.62688,0 24,5.37312 24,12 C24,18.62688 18.62688,24 12,24 Z M13.5,12 L17.2947612,8.20523878 C17.6857559,7.81424414 17.6838785,7.18387854 17.293923,6.79392296 L17.206077,6.70607704 C16.8181114,6.31811142 16.1842538,6.31574616 15.7947612,6.70523878 L12,10.5 L8.20523878,6.70523878 C7.81574616,6.31574616 7.18188858,6.31811142 6.79392296,6.70607704 L6.70607704,6.79392296 C6.31612146,7.18387854 6.31424414,7.81424414 6.70523878,8.20523878 L10.5,12 L6.70523878,15.7947612 C6.31424414,16.1857559 6.31612146,16.8161215 6.70607704,17.206077 L6.79392296,17.293923 C7.18188858,17.6818886 7.81574616,17.6842538 8.20523878,17.2947612 L12,13.5 L15.7947612,17.2947612 C16.1842538,17.6842538 16.8181114,17.6818886 17.206077,17.293923 L17.293923,17.206077 C17.6838785,16.8161215 17.6857559,16.1857559 17.2947612,15.7947612 L13.5,12 L13.5,12 Z" id="path" fill="#FFFFFF"></path>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-extLink.svg b/app/assets/images/icon-extLink.svg
new file mode 100644
index 0000000000..2da2e2f932
--- /dev/null
+++ b/app/assets/images/icon-extLink.svg
@@ -0,0 +1,6 @@
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-extLink</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <path d="M12.5857864,2 L8.99077797,2 C8.45097518,2 8,1.55228475 8,1 C8,0.443864822 8.4463856,0 8.99703014,0 L15.0029699,0 C15.5469637,0 16,0.446385598 16,0.997030139 L16,7.00296986 C16,7.54696369 15.5522847,8 15,8 C14.4438648,8 14,7.55641359 14,7.00922203 L14,3.41421356 L6.70710678,10.7071068 C6.31658249,11.0976311 5.68341751,11.0976311 5.29289322,10.7071068 C4.90236893,10.3165825 4.90236893,9.68341751 5.29289322,9.29289322 L12.5857864,2 Z M8.46446609,4 L6.46446609,6 L2,6 L2,14 L10,14 L10,9.53553391 L12,7.53553391 L12,14.9975267 C12,15.5511774 11.544239,16 10.9975267,16 L1.00247329,16 C0.448822582,16 0,15.544239 0,14.9975267 L0,5.00247329 C0,4.44882258 0.455760956,4 1.00247329,4 L8.46446609,4 Z" id="path" fill="#FFFFFF" fill-rule="evenodd"></path>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-fail.svg b/app/assets/images/icon-fail.svg
new file mode 100755
index 0000000000..3467374198
--- /dev/null
+++ b/app/assets/images/icon-fail.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-fail</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <circle id="bg-circle" fill="#FFFFFF" fill-rule="nonzero" cx="30" cy="30" r="22"></circle>
+ <path d="M33.2371523,30 L41.337119,21.9033278 C42.2203329,21.020473 42.223948,19.5681264 41.3300331,18.6745751 C40.429886,17.774794 38.9899682,17.7778525 38.0999667,18.6674921 L30,26.7641643 L21.9000333,18.6674921 C21.0100318,17.7778525 19.570114,17.774794 18.6699669,18.6745751 C17.776052,19.5681264 17.7796671,21.020473 18.662881,21.9033278 L26.7628477,30 L18.662881,38.0966722 C17.7796671,38.979527 17.776052,40.4318736 18.6699669,41.3254249 C19.570114,42.225206 21.0100318,42.2221475 21.9000333,41.3325079 L30,33.2358357 L38.0999667,41.3325079 C38.9899682,42.2221475 40.429886,42.225206 41.3300331,41.3254249 C42.223948,40.4318736 42.2203329,38.979527 41.337119,38.0966722 L33.2371523,30 Z" id="icon" fill="#D0021B" fill-rule="nonzero"></path>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-fastest.svg b/app/assets/images/icon-fastest.svg
new file mode 100755
index 0000000000..4c915da6d6
--- /dev/null
+++ b/app/assets/images/icon-fastest.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-fastest</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <path fill="#FFFFFF" d="M21.1507481,6.83280665 C24.8128031,10.5070481 24.963038,16.3056835 21.4959142,20.1552329 C18.0287905,24.0047824 12.1077149,24.6135147 7.89218032,21.5538019 C7.56927452,21.3111241 7.40378985,20.9190527 7.4580628,20.5252773 C7.51233574,20.131502 7.77812095,19.7958465 8.15529969,19.644749 C8.53247843,19.4936516 8.96374829,19.5500675 9.28665406,19.7927454 C11.5190533,21.5357122 14.5521978,21.9470531 17.1883493,20.8643366 C19.8245009,19.7816201 21.6398874,17.3788972 21.917643,14.604963 C22.1953986,11.8310288 20.890873,9.13180475 18.5192016,7.57316921 C17.4963669,6.86336234 16.3093972,6.41068921 15.0637596,6.25537178 C13.0068849,5.98676172 10.9251308,6.53023229 9.28173528,7.76484883 C8.78601466,8.13151903 8.08013307,8.04356746 7.69509115,7.56715586 C7.31004923,7.09074425 7.38788476,6.40161565 7.87004581,6.01816824 C9.32618858,4.91172269 11.0690124,4.22078431 12.9044157,4.02230413 L12.9044157,2.72367467 L11.7017744,2.72367467 C11.3810313,2.7211743 11.0761771,2.58728319 10.861863,2.354788 C10.647549,2.12229281 10.543565,1.81266216 10.5753741,1.50171705 C10.6494879,0.921669603 11.1609089,0.489587303 11.7607997,0.500191003 L16.3672359,0.500191003 C16.6892225,0.500064398 16.9962796,0.632463774 17.2126847,0.864738483 C17.4290898,1.09701319 17.5347009,1.40754432 17.5034738,1.71975262 C17.42936,2.29980007 16.917939,2.73188237 16.3180481,2.72127867 L15.1744321,2.72127867 L15.1744321,4.01990814 C17.4372686,4.26696772 19.5456874,5.2593463 21.1507481,6.83280665 Z M18.3814758,10.6663992 C18.6486569,10.3452379 18.6236955,9.87935381 18.323645,9.58703751 C18.0235945,9.29472121 17.5453839,9.27040316 17.2157252,9.53069739 L14.3111864,11.804497 C13.4337266,11.681255 12.5738342,12.1191557 12.1768555,12.8914065 C11.7798767,13.6636572 11.9349913,14.5967747 12.561864,15.2074889 C13.1887368,15.8182032 14.1465429,15.9693195 14.9392261,15.5825734 C15.7319094,15.1958273 16.1813962,14.3580998 16.0548935,13.5032576 L18.3888539,10.6663992 L18.3814758,10.6663992 Z M8.48981192,11.3252979 C9.03312521,11.3252979 9.47356765,10.8962084 9.47356765,10.3668998 C9.47356765,9.83759109 9.03312521,9.40850163 8.48981192,9.40850163 L0.983755727,9.40850163 C0.440442441,9.40850163 5.46094129e-17,9.83759109 0,10.3668998 C-5.46094129e-17,10.8962084 0.440442441,11.3252979 0.983755727,11.3252979 L8.48981192,11.3252979 Z M8.48981192,12.822795 L2.83321649,12.822795 C2.28990321,12.822795 1.84946077,13.2518844 1.84946077,13.7811931 C1.84946077,14.3105018 2.28990321,14.7395912 2.83321649,14.7395912 L8.48981192,14.7395912 C9.03312521,14.7395912 9.47356765,14.3105018 9.47356765,13.7811931 C9.47356765,13.2518844 9.03312521,12.822795 8.48981192,12.822795 Z M9.47356765,17.1859025 C9.47356765,16.6565938 9.03312521,16.2275043 8.48981192,16.2275043 L4.36541604,16.2275043 C3.82210275,16.2275043 3.38166031,16.6565938 3.38166031,17.1859025 C3.38166031,17.7152111 3.82210275,18.1443006 4.36541604,18.1443006 L8.48981192,18.1443006 C8.75072118,18.1430328 9.00042697,18.0408412 9.18399521,17.8602073 C9.36756345,17.6795734 9.46995668,17.4352944 9.46864887,17.1811105 L9.47356765,17.1859025 Z" fill-rule="nonzero"></path>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-nearest.svg b/app/assets/images/icon-nearest.svg
new file mode 100644
index 0000000000..badbf3674d
--- /dev/null
+++ b/app/assets/images/icon-nearest.svg
@@ -0,0 +1,6 @@
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-nearest</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <path d="M20.9450712,11 L23,11 C23.5522847,11 24,11.4477153 24,12 C24,12.5522847 23.5522847,13 23,13 L20.9450712,13 C20.4839224,17.1716166 17.1716166,20.4839224 13,20.9450712 L13,23 C13,23.5522847 12.5522847,24 12,24 C11.4477153,24 11,23.5522847 11,23 L11,20.9450712 C6.82838339,20.4839224 3.5160776,17.1716166 3.05492878,13 L1,13 C0.44771525,13 0,12.5522847 0,12 C0,11.4477153 0.44771525,11 1,11 L3.05492878,11 C3.5160776,6.82838339 6.82838339,3.5160776 11,3.05492878 L11,1 C11,0.44771525 11.4477153,0 12,0 C12.5522847,0 13,0.44771525 13,1 L13,3.05492878 C17.1716166,3.5160776 20.4839224,6.82838339 20.9450712,11 Z M18.9291111,11 C18.4905984,7.93430884 16.0656912,5.50940162 13,5.07088886 L13,7 C13,7.55228475 12.5522847,8 12,8 C11.4477153,8 11,7.55228475 11,7 L11,5.07088886 C7.93430884,5.50940162 5.50940162,7.93430884 5.07088886,11 L7,11 C7.55228475,11 8,11.4477153 8,12 C8,12.5522847 7.55228475,13 7,13 L5.07088886,13 C5.50940162,16.0656912 7.93430884,18.4905984 11,18.9291111 L11,17 C11,16.4477153 11.4477153,16 12,16 C12.5522847,16 13,16.4477153 13,17 L13,18.9291111 C16.0656912,18.4905984 18.4905984,16.0656912 18.9291111,13 L17,13 C16.4477153,13 16,12.5522847 16,12 C16,11.4477153 16.4477153,11 17,11 L18.9291111,11 Z" id="icon-nearest" fill="#FFFFFF" fill-rule="nonzero"></path>
+</svg>
diff --git a/app/assets/images/icon-settings.svg b/app/assets/images/icon-settings.svg
new file mode 100755
index 0000000000..fbaec4e52c
--- /dev/null
+++ b/app/assets/images/icon-settings.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-settings</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" fill-opacity="0.6">
+ <path d="M21.2552027,12.0000012 C21.2552027,12.4080002 21.2181943,12.792001 21.1688441,13.1760007 L23.7718756,15.1560004 C24.0062723,15.3360012 24.0679568,15.6600006 23.9199162,15.924001 L21.4525887,20.0760014 C21.304548,20.3400006 20.9837951,20.4480008 20.700053,20.3400006 L17.6282305,19.1400005 C16.9867248,19.6079998 16.2958725,20.016 15.5433381,20.316 L15.0745457,23.4959999 C15.037536,23.7839996 14.7784667,24 14.4700507,24 L9.53539566,24 C9.22697972,24 8.96791028,23.7839996 8.9309007,23.4959999 L8.46210833,20.316 C7.70957385,20.016 7.01872221,19.62 6.37721707,19.1400005 L3.30539454,20.3400006 C3.03398819,20.4360005 2.700899,20.3400006 2.55285948,20.0760014 L0.0855319329,15.924001 C-0.062507572,15.6600006 -0.000824444944,15.336 0.233571734,15.1560004 L2.83660217,13.1760007 C2.78725567,12.792001 2.7502455,12.3960011 2.7502455,12.0000012 C2.7502455,11.6040012 2.78725567,11.2080012 2.83660217,10.8240016 L0.23357145,8.84400074 C-0.000824444944,8.66400004 -0.0748444934,8.34000059 0.0855319329,8.07600026 L2.55285948,3.92400037 C2.70089958,3.66000059 3.02165186,3.55200039 3.30539454,3.66000059 L6.37721765,4.86000071 C7.01872279,4.39200082 7.70957502,3.9840006 8.4621095,3.68400057 L8.93090187,0.504000134 C8.96791146,0.216000094 9.2269809,0 9.53539685,0 L14.4700519,0 C14.7784679,0 15.0375373,0.216000094 15.0745481,0.50400071 L15.5433404,3.68400114 C16.2958761,3.98400117 16.9867272,4.38000112 17.6282328,4.86000128 L20.7000554,3.66000116 C20.9714629,3.56400067 21.3045504,3.66000116 21.452591,3.92400093 L23.9199186,8.0760014 C24.0679568,8.34000175 24.0062746,8.66400233 23.7718779,8.84400188 L21.1688466,10.8240016 C21.2181919,11.2080012 21.2552027,11.5920021 21.2552027,12.0000012 Z M12,17 C14.7571433,17 17,14.7571433 17,12 C17,9.24285657 14.7571433,7 12,7 C9.24285657,7 7,9.24285657 7,12 C7,14.7571433 9.24285657,17 12,17 Z" id="icon" fill="#FFFFFF"></path>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-spinner.svg b/app/assets/images/icon-spinner.svg
new file mode 100644
index 0000000000..580d56a349
--- /dev/null
+++ b/app/assets/images/icon-spinner.svg
@@ -0,0 +1,17 @@
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>Spinner</title>
+ <desc>Mulvad VPN app</desc>
+ <defs></defs>
+ <g id="container" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <path d="M27.6038221,6.11991768 C40.7924274,4.79654517 52.5567098,14.4152168 53.8800823,27.6038221 C55.2034548,40.7924274 45.5847832,52.5567098 32.3961779,53.8800823 C19.2075726,55.2034548 7.4432902,45.5847832 6.11991768,32.3961779 C4.79654517,19.2075726 14.4152168,7.4432902 27.6038221,6.11991768 Z M28.4025481,14.0799451 C19.6101445,14.9621935 13.1976968,22.8050484 14.0799451,31.5974519 C14.9621935,40.3898555 22.8050484,46.8023032 31.5974519,45.9200549 C40.3898555,45.0378065 46.8023032,37.1949516 45.9200549,28.4025481 C45.0378065,19.6101445 37.1949516,13.1976968 28.4025481,14.0799451 Z" id="track" fill-opacity="0.2" fill="#FFFFFF" fill-rule="nonzero"></path>
+ <path d="M25.2028561,6.48431564 C12.2155023,9.13370504 3.83492624,21.80979 6.48431564,34.7971439 C9.13370504,47.7844977 21.80979,56.1650738 34.7971439,53.5156844 C44.2988591,51.577357 51.5941458,44.163762 53.514681,34.8276709 C53.9598043,32.6638409 52.5665172,30.5488664 50.4026872,30.1037431 C48.2388572,29.6586198 46.1238826,31.0519068 45.6787593,33.2157369 C44.3979534,39.441981 39.5342463,44.3845633 33.1980959,45.6771229 C24.53986,47.4433825 16.0891367,41.8563318 14.3228771,33.1980959 C12.5566175,24.53986 18.1436682,16.0891367 26.8019041,14.3228771 C28.9664631,13.8813122 30.3632257,11.7686314 29.9216608,9.60407239 C29.4800959,7.43951342 27.3674151,6.04275074 25.2028561,6.48431564 Z" id="rotator" fill="#FFFFFF" fill-rule="nonzero">
+ <animateTransform attributeType="xml"
+ attributeName="transform"
+ type="rotate"
+ from="0 30 30"
+ to="360 30 30"
+ dur="0.6s"
+ repeatCount="indefinite"/>
+ </path>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-success.svg b/app/assets/images/icon-success.svg
new file mode 100755
index 0000000000..5a9e943406
--- /dev/null
+++ b/app/assets/images/icon-success.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-success</title>
+ <desc>Mullvad VPN app</desc>
+ <defs></defs>
+ <circle id="bg-circle" fill="#FFFFFF" fill-rule="nonzero" cx="30" cy="30" r="22"></circle>
+ <path d="M19.4142136,28.5857864 C18.633165,27.8047379 17.366835,27.8047379 16.5857864,28.5857864 C15.8047379,29.366835 15.8047379,30.633165 16.5857864,31.4142136 L24.5857864,39.4142136 C25.366835,40.1952621 26.633165,40.1952621 27.4142136,39.4142136 L43.4142136,23.4142136 C44.1952621,22.633165 44.1952621,21.366835 43.4142136,20.5857864 C42.633165,19.8047379 41.366835,19.8047379 40.5857864,20.5857864 L26,35.1715729 L19.4142136,28.5857864 Z" id="icon-tick" fill="#44AD4D" fill-rule="nonzero"></path>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/icon-tick.svg b/app/assets/images/icon-tick.svg
new file mode 100755
index 0000000000..65e354e2a3
--- /dev/null
+++ b/app/assets/images/icon-tick.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="17px" viewBox="0 0 24 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>icon-tick</title>
+ <desc>Mullvad VPN app</desc>
+ <defs>
+ <path d="M2.92646877,7.29791847 C2.25699855,6.63402718 1.17157288,6.63402718 0.502102661,7.29791847 C-0.167367554,7.96180977 -0.167367554,9.03819023 0.502102661,9.70208153 L7.35924552,16.5020815 C8.02871573,17.1659728 9.11414141,17.1659728 9.78361162,16.5020815 L23.4978973,2.90208153 C24.1673676,2.23819023 24.1673676,1.16180977 23.4978973,0.497918472 C22.8284271,-0.165972824 21.7430014,-0.165972824 21.0735312,0.497918472 L8.57142857,12.8958369 L2.92646877,7.29791847 Z" id="path-1"></path>
+ </defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <mask id="mask-2" fill="white">
+ <use xlink:href="#path-1"></use>
+ </mask>
+ <use id="path" fill="#FFFFFF" fill-rule="nonzero" xlink:href="#path-1"></use>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/location-marker-secure.svg b/app/assets/images/location-marker-secure.svg
new file mode 100755
index 0000000000..087fe5d0d4
--- /dev/null
+++ b/app/assets/images/location-marker-secure.svg
@@ -0,0 +1,19 @@
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>location-marker-secure</title>
+ <desc>Mullvad VPN app</desc>
+ <defs>
+ <circle id="shadow-path" cx="30" cy="30" r="10"></circle>
+ <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="shadow">
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+ <feOffset dx="0" dy="4" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+ <feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+ <feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+ </filter>
+ </defs>
+ <circle id="outer-circle" fill-opacity="0.4" fill="#44AD4D" cx="30" cy="30" r="30"></circle>
+ <g id="inner-circle">
+ <use fill="black" fill-opacity="1" filter="url(#shadow)" xlink:href="#shadow-path"></use>
+ <use stroke="#FFFFFF" stroke-width="2" fill="#44AD4D" fill-rule="evenodd" xlink:href="#shadow-path"></use>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/location-marker-unsecure.svg b/app/assets/images/location-marker-unsecure.svg
new file mode 100755
index 0000000000..509b8022f2
--- /dev/null
+++ b/app/assets/images/location-marker-unsecure.svg
@@ -0,0 +1,19 @@
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>location-marker-unsecure</title>
+ <desc>Mullvad VPN app</desc>
+ <defs>
+ <circle id="shadow-path" cx="30" cy="30" r="10"></circle>
+ <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="shadow">
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+ <feOffset dx="0" dy="4" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+ <feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+ <feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+ </filter>
+ </defs>
+ <circle id="outer-circle" fill-opacity="0.4" fill="#D0021B" cx="30" cy="30" r="30"></circle>
+ <g id="inner-circle">
+ <use fill="black" fill-opacity="1" filter="url(#shadow)" xlink:href="#shadow-path"></use>
+ <use stroke="#FFFFFF" stroke-width="2" fill="#D0021B" fill-rule="evenodd" xlink:href="#shadow-path"></use>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/assets/images/logo-icon.svg b/app/assets/images/logo-icon.svg
new file mode 100644
index 0000000000..c00cd67fb5
--- /dev/null
+++ b/app/assets/images/logo-icon.svg
@@ -0,0 +1 @@
+<svg width="49" height="50" viewBox="0 0 49 50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Elements/Logo Icon</title><defs><path d="M.1 6.833l1.467-2.047c.004.01-.092 2.947-.092 2.947l.413-2.22c1.225 2.474 4.217 5.897 6.96 7.718.296.197.528.406.707.625.346.133.703.212 1.059.27.187.034.379.048.565.065a7.42 7.42 0 0 0 1.12-.016 6.92 6.92 0 0 0 .554-.077 6.959 6.959 0 0 0 1.075-.273c.175-.053.35-.119.52-.186.173-.07.341-.144.508-.224.167-.084.333-.162.496-.252.166-.082.325-.178.49-.269.166-.084.318-.192.482-.283.163-.092.317-.2.481-.293.159-.102.317-.205.482-.303.158-.105.322-.205.491-.302l.152-.09.08.054 1.107.73-1.117-.29a7.07 7.07 0 0 1-.331.367c-.14.142-.288.277-.436.409-.154.129-.31.252-.471.373-.164.114-.329.232-.502.334a6.948 6.948 0 0 1-1.08.548 9.333 9.333 0 0 1-1.155.379c-.195.05-.397.084-.596.117-.201.03-.403.051-.604.07-.405.02-.813.01-1.211-.042a6.27 6.27 0 0 1-.595-.11 5.09 5.09 0 0 1-.573-.173 4.14 4.14 0 0 1-.936-.463c-.002.004-1.06.148-.633.941.428.79 1.073.72.769 1.651a7.54 7.54 0 0 1-.856 1.446c-.697.952-1.8 1.782-1.692 2.283 5.01 6.149 16.283 5.293 20.565-.191-.065-.794-1.314-1.173-2.19-3.11.241.075.607.185.607.171 0-.014-1.045-1.694-1.08-1.862l.669.045s-.895-1.1-.911-1.202l.898-.114s-1.13-1.298-1.15-1.401l1.15.182-1.258-1.513h.592l-.707-1.025a30.02 30.02 0 0 0-.36-.113c-.154-.05-.308-.096-.46-.144-1.722-.53-3.331-1.03-4.894-2.003-2.188-1.366-4.15-3.023-5.621-4.323L10.09 2.212c-2.831-.21-5.498-.141-7.116.179L4.015.613 2.424 2.522c-.113-.025-.14-.096-.14-.096l.11-2.35L1.891 2.2A1.274 1.274 0 0 0 .1 3.36c0 .64.477 1.172 1.098 1.258L.1 6.833z" id="a"/><path d="M1.887.156A1.274 1.274 0 0 0 .1 1.319c0 .617.443 1.133 1.031 1.246a.26.26 0 0 0 .027-.007C1.542 2.431 2.309 1.41 2.18.772a1.38 1.38 0 0 0-.294-.616z" id="c"/><path d="M4.594 5.277c-.228-.626-.172-1.442.156-2.197.457-1.048 1.325-1.75 2.157-1.75.169 0 .33.03.481.087A5.507 5.507 0 0 1 9.023.392c3.378-1.34 8.319 1.054 9.59 4.366.61 1.597.423 3.363-.1 4.955-.433 1.316-1.99 3.213-1.414 4.645-.236-.056-5.062-1.565-6.413-2.406-2.152-1.345-4.096-2.992-5.55-4.276l-.042-.04-4.91-2.328c-.058-.03-.115-.055-.173-.084.705 0 3.387.311 4.583.053" id="e"/><path d="M.199 3.717c.138.348.368.6.664.728.136.061.29.092.452.092.743 0 1.55-.669 1.966-1.626.255-.58.34-1.194.238-1.725C3.421.653 3.15.267 2.756.097a1.154 1.154 0 0 0-.454-.092C1.562.005.754.673.334 1.63.02 2.355-.03 3.134.2 3.717z" id="g"/><linearGradient x1="93.215%" y1="62.465%" x2="22.664%" y2="38.215%" id="i"><stop stop-color="#FFF" offset="0%"/><stop stop-color="#FFF" stop-opacity="0" offset="100%"/></linearGradient></defs><g transform="translate(0 .5)" fill="none" fill-rule="evenodd"><path d="M6 27c0 11.598 9.402 21 21 21s21-9.402 21-21S38.598 6 27 6 6 15.402 6 27zm-1 0C5 14.85 14.85 5 27 5s22 9.85 22 22-9.85 22-22 22S5 39.15 5 27z" fill="#192E45" fill-rule="nonzero"/><path d="M8 27c0 10.493 8.507 19 19 19s19-8.507 19-19S37.493 8 27 8 8 16.507 8 27z" fill="#192E45"/><g transform="translate(9.851 18.375)"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><path fill="#D0933A" fill-rule="nonzero" mask="url(#b)" d="M-0.54 -0.562H28.404V25.160999999999998H-0.54z"/></g><g transform="translate(9.851 20.417)"><mask id="d" fill="#fff"><use xlink:href="#c"/></mask><path fill="#FFCC86" fill-rule="nonzero" mask="url(#d)" d="M-0.54 -0.59H2.835V3.204H-0.54z"/></g><g transform="translate(18.295 13.654)"><mask id="f" fill="#fff"><use xlink:href="#e"/></mask><path fill="#FDD321" fill-rule="nonzero" mask="url(#f)" d="M-0.628 -0.625H19.635V14.995H-0.628z"/></g><g transform="translate(23.029 15.185)"><mask id="h" fill="#fff"><use xlink:href="#g"/></mask><g mask="url(#h)" fill-rule="nonzero"><path d="M1.315 4.346a.898.898 0 0 1-.373-.075C.69 4.162.496 3.947.377 3.647c-.211-.536-.161-1.26.134-1.94C.9.817 1.637.197 2.302.197c.132 0 .26.025.379.076.332.144.563.48.65.948.094.495.013 1.068-.226 1.613-.386.89-1.122 1.512-1.79 1.512z" fill="#FFF"/><path d="M2.302.388c.106 0 .208.02.302.06.272.119.463.405.538.81.087.456.011.989-.214 1.5-.35.81-1.029 1.396-1.613 1.396a.718.718 0 0 1-.294-.058l-.003-.001-.003-.002c-.2-.086-.36-.265-.459-.517-.193-.489-.144-1.159.13-1.792C1.041.975 1.72.388 2.302.388zm0-.383C1.562.005.754.673.334 1.63.02 2.355-.03 3.134.2 3.717c.138.348.368.6.664.728.136.061.29.092.452.092.742 0 1.55-.669 1.966-1.626.255-.58.339-1.194.238-1.725-.098-.533-.37-.919-.763-1.089a1.152 1.152 0 0 0-.454-.092z" fill="#1D2A3A"/></g></g><path d="M26.62 15.114s1.094 1.924-.024 3.583c-1.12 1.659-2.52 1.66-2.52 1.66L.25 12.672s-.952-4.115.85-7.526C2.899 1.733 6.837 0 6.837 0L26.62 15.114z" fill="url(#i)" fill-rule="nonzero" opacity=".3"/></g></svg> \ No newline at end of file
diff --git a/app/assets/images/menubar icons/lock-1.png b/app/assets/images/menubar icons/lock-1.png
new file mode 100644
index 0000000000..b20bc19515
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-1.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-1@2x.png b/app/assets/images/menubar icons/lock-1@2x.png
new file mode 100644
index 0000000000..1c512d12bd
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-1@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-2.png b/app/assets/images/menubar icons/lock-2.png
new file mode 100644
index 0000000000..d98d05d951
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-2.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-2@2x.png b/app/assets/images/menubar icons/lock-2@2x.png
new file mode 100644
index 0000000000..c92dec19ec
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-2@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-3.png b/app/assets/images/menubar icons/lock-3.png
new file mode 100644
index 0000000000..871f8402bf
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-3.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-3@2x.png b/app/assets/images/menubar icons/lock-3@2x.png
new file mode 100644
index 0000000000..d961af45f3
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-3@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-4.png b/app/assets/images/menubar icons/lock-4.png
new file mode 100644
index 0000000000..6fcb60c663
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-4.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-4@2x.png b/app/assets/images/menubar icons/lock-4@2x.png
new file mode 100644
index 0000000000..f67b4c0921
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-4@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-5.png b/app/assets/images/menubar icons/lock-5.png
new file mode 100644
index 0000000000..43d02ab1e0
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-5.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-5@2x.png b/app/assets/images/menubar icons/lock-5@2x.png
new file mode 100644
index 0000000000..1f05adf802
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-5@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-6.png b/app/assets/images/menubar icons/lock-6.png
new file mode 100644
index 0000000000..e282ff8dad
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-6.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-6@2x.png b/app/assets/images/menubar icons/lock-6@2x.png
new file mode 100644
index 0000000000..f76ab999f1
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-6@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-7.png b/app/assets/images/menubar icons/lock-7.png
new file mode 100644
index 0000000000..1299817a53
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-7.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-7@2x.png b/app/assets/images/menubar icons/lock-7@2x.png
new file mode 100644
index 0000000000..f3a1428ad4
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-7@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-8.png b/app/assets/images/menubar icons/lock-8.png
new file mode 100644
index 0000000000..161e4f5e82
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-8.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-8@2x.png b/app/assets/images/menubar icons/lock-8@2x.png
new file mode 100644
index 0000000000..5b12910e4a
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-8@2x.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-9.png b/app/assets/images/menubar icons/lock-9.png
new file mode 100644
index 0000000000..c823aa87a1
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-9.png
Binary files differ
diff --git a/app/assets/images/menubar icons/lock-9@2x.png b/app/assets/images/menubar icons/lock-9@2x.png
new file mode 100644
index 0000000000..e4dc28a192
--- /dev/null
+++ b/app/assets/images/menubar icons/lock-9@2x.png
Binary files differ
diff --git a/app/components/Account.css b/app/components/Account.css
new file mode 100644
index 0000000000..2f450e3828
--- /dev/null
+++ b/app/components/Account.css
@@ -0,0 +1,98 @@
+.account {
+ background: #192E45;
+ height: 100%;
+}
+
+.account__container {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.account__header {
+ flex: 0 0 auto;
+ padding: 40px 24px 24px;
+ position: relative; /* anchor for close button */
+}
+
+.account__close {
+ position: absolute;
+ display: flex;
+ align-items: center;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ top: 24px;
+ left: 12px;
+ z-index: 1; /* part of .account__container covers the button */
+}
+
+.account__close-icon {
+ opacity: 0.6;
+ margin-right: 8px;
+}
+
+.account__close-title {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ color: rgba(255, 255, 255, 0.6);
+}
+
+.account__title {
+ font-family: DINPro;
+ font-size: 32px;
+ font-weight: 900;
+ line-height: 40px;
+ color: #FFFFFF;
+}
+
+.account__content {
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+.account__main {
+ margin-bottom: 24px;
+}
+
+.account__footer {
+ padding: 24px;
+}
+
+.account__row {
+ padding: 0 24px;
+}
+
+.account__row + .account__row {
+ margin-top: 24px;
+}
+
+.account__row-label {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ color: rgba(255, 255, 255, 0.8);
+ margin-bottom: 8px;
+}
+
+.account__row-value {
+ font-family: "Open Sans";
+ font-size: 16px;
+ font-weight: 800;
+ color: rgba(255, 255, 255, 0.8);
+}
+
+.account__row-value--error {
+ color: #d0021b;
+}
+
+.account__footer .button + .button {
+ margin-top: 24px;
+}
+
+.account__id {
+ user-select: text;
+}
diff --git a/app/components/Account.js b/app/components/Account.js
new file mode 100644
index 0000000000..215014e543
--- /dev/null
+++ b/app/components/Account.js
@@ -0,0 +1,78 @@
+// @flow
+import moment from 'moment';
+import React, { Component } from 'react';
+import { If, Then, Else } from 'react-if';
+import { Layout, Container, Header } from './Layout';
+import { formatAccount } from '../lib/formatters';
+import ExternalLinkSVG from '../assets/images/icon-extLink.svg';
+
+import type { AccountReduxState } from '../redux/account/reducers';
+
+export type AccountProps = {
+ account: AccountReduxState;
+ onLogout: () => void;
+ onClose: () => void;
+ onBuyMore: () => void;
+};
+
+export default class Account extends Component {
+ props: AccountProps;
+
+ render(): React.Element<*> {
+ const expiry = moment(this.props.account.expiry);
+ const formattedAccountToken = formatAccount(this.props.account.accountToken || '');
+ const formattedExpiry = expiry.format('hA, D MMMM YYYY').toUpperCase();
+ const isOutOfTime = expiry.isSameOrBefore(moment());
+
+ return (
+ <Layout>
+ <Header hidden={ true } style={ 'defaultDark' } />
+ <Container>
+ <div className="account">
+ <div className="account__close" onClick={ this.props.onClose }>
+ <img className="account__close-icon" src="./assets/images/icon-back.svg" />
+ <span className="account__close-title">Settings</span>
+ </div>
+ <div className="account__container">
+
+ <div className="account__header">
+ <h2 className="account__title">Account</h2>
+ </div>
+
+ <div className="account__content">
+ <div className="account__main">
+
+ <div className="account__row">
+ <div className="account__row-label">Account ID</div>
+ <div className="account__row-value account__id">{ formattedAccountToken }</div>
+ </div>
+
+ <div className="account__row">
+ <div className="account__row-label">Paid until</div>
+ <If condition={ isOutOfTime }>
+ <Then>
+ <div className="account__out-of-time account__row-value account__row-value--error">OUT OF TIME</div>
+ </Then>
+ <Else>
+ <div className="account__row-value">{ formattedExpiry }</div>
+ </Else>
+ </If>
+ </div>
+
+ <div className="account__footer">
+ <button className="account__buymore button button--positive" onClick={ this.props.onBuyMore }>
+ <span className="button-label">Buy more time</span>
+ <ExternalLinkSVG className="button-icon button-icon--16" />
+ </button>
+ <button className="account__logout button button--negative" onClick={ this.props.onLogout }>Logout</button>
+ </div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </Container>
+ </Layout>
+ );
+ }
+}
diff --git a/app/components/AccountInput.js b/app/components/AccountInput.js
new file mode 100644
index 0000000000..1759423437
--- /dev/null
+++ b/app/components/AccountInput.js
@@ -0,0 +1,317 @@
+// @flow
+import React, { Component } from 'react';
+import { formatAccount } from '../lib/formatters';
+
+// @TODO: move it into types.js
+
+// ESLint issue: https://github.com/babel/babel-eslint/issues/445
+declare class ClipboardData { // eslint-disable-line no-unused-vars
+ setData(type: string, data: string): void;
+ getData(type: string): string;
+}
+
+declare class ClipboardEvent extends Event {
+ clipboardData: ClipboardData;
+}
+
+export type AccountInputProps = {
+ value: string;
+ onEnter: ?(() => void);
+ onChange: ?((newValue: string) => void);
+};
+
+export type AccountInputState = {
+ value: string;
+ selectionRange: SelectionRange;
+};
+
+export type SelectionRange = [number, number];
+
+export default class AccountInput extends Component {
+ props: AccountInputProps;
+
+ static defaultProps: AccountInputProps = {
+ value: '',
+ onEnter: null,
+ onChange: null
+ };
+
+ state: AccountInputState = {
+ value: '',
+ selectionRange: [0, 0]
+ };
+
+ _ref: ?HTMLInputElement;
+ _ignoreSelect = false;
+
+ constructor(props: AccountInputProps) {
+ super(props);
+
+ // selection range holds selection converted from DOM selection range to
+ // internal unformatted representation of account number
+ const val = this.sanitize(props.value);
+
+ this.state = {
+ value: val,
+ selectionRange: [val.length, val.length]
+ };
+ }
+
+ componentWillReceiveProps(nextProps: AccountInputProps) {
+ const nextVal = this.sanitize(nextProps.value);
+ if(nextVal !== this.state.value) {
+ const len = nextVal.length;
+ this.setState({ value: nextVal, selectionRange: [len, len] });
+ }
+ }
+
+ shouldComponentUpdate(nextProps: AccountInputProps, nextState: AccountInputState) {
+ return (this.props.value !== nextProps.value ||
+ this.props.onEnter !== nextProps.onEnter ||
+ this.props.onChange !== nextProps.onChange ||
+ this.state.value !== nextState.value ||
+ this.state.selectionRange[0] !== nextState.selectionRange[0] ||
+ this.state.selectionRange[1] !== nextState.selectionRange[1]);
+ }
+
+ render(): React.Element<*> {
+ const displayString = formatAccount(this.state.value || '');
+ const { value, onChange, onEnter, ...otherProps } = this.props; // eslint-disable-line no-unused-vars
+ return (
+ <input { ...otherProps }
+ type="text"
+ value={ displayString }
+ onChange={ () => {} }
+ onSelect={ this.onSelect }
+ onKeyUp={ this.onKeyUp }
+ onKeyDown={ this.onKeyDown }
+ onPaste={ this.onPaste }
+ onCut={ this.onCut }
+ ref={ this.onRef } />
+ );
+ }
+
+ // Private
+
+ /**
+ * Modify original string inserting substring using selection range
+ */
+ sanitize(val: ?string): string {
+ return (val || '').replace(/[^0-9]/g, '');
+ }
+
+ /**
+ * Modify original string inserting substring using selection range
+ *
+ * @private
+ * @param {String} val original string
+ * @param {String} insert insertion string
+ * @param {Array} selRange selection range ([x,y])
+ * @returns {Object}
+ */
+ insert(val: string, insert: string, selRange: SelectionRange): AccountInputState {
+ const head = val.slice(0, selRange[0]);
+ const tail = val.slice(selRange[1], val.length);
+ const newVal = head + insert + tail;
+ const selectionOffset = head.length + insert.length;
+
+ return { value: newVal, selectionRange: [selectionOffset, selectionOffset] };
+ }
+
+
+ /**
+ * Modify string by removing single character or range of characters based on selection range.
+ *
+ * @private
+ * @param {String} val original string
+ * @param {Array} selRange selection range ([x,y])
+ * @returns {Object}
+ *
+ * @memberOf AccountInput
+ */
+ remove(val: string, selRange: SelectionRange): AccountInputState {
+ let newVal, selectionOffset;
+
+ if(selRange[0] === selRange[1]) {
+ const oneOff = Math.max(0, selRange[0] - 1);
+ const head = val.slice(0, oneOff);
+ const tail = val.slice(selRange[0], val.length);
+ newVal = head + tail;
+ selectionOffset = head.length;
+ } else {
+ const head = val.slice(0, selRange[0]);
+ const tail = val.slice(selRange[1], val.length);
+ newVal = head + tail;
+ selectionOffset = head.length;
+ }
+
+ return { value: newVal, selectionRange: [selectionOffset, selectionOffset] };
+ }
+
+
+ /**
+ * Convert DOM selection range to internal selection range
+ *
+ * @private
+ * @param {String} val original string
+ * @param {Array} domRange selection range from DOM
+ * @returns {Object}
+ *
+ * @memberOf AccountInput
+ */
+ toInternalSelectionRange(val: string, domRange: SelectionRange): SelectionRange {
+ const countSpaces = (val) => {
+ return (val.match(/\s/g) || []).length;
+ };
+
+ const fmt = formatAccount(val || '');
+ let start = domRange[0];
+ let end = domRange[1];
+ const before = countSpaces(fmt.slice(0, start));
+ const within = countSpaces(fmt.slice(start, end));
+
+ start -= before;
+ end -= (before + within);
+
+ return [ start, end ];
+ }
+
+
+ /**
+ * Convert internal selection range to DOM selection range
+ *
+ * @private
+ * @param {String} val original string
+ * @param {Array} selRange selection range
+ * @returns {Object}
+ *
+ * @memberOf AccountInput
+ */
+ toDomSelection(val: string, selRange: SelectionRange): SelectionRange {
+ const countSpaces = (val, untilIndex) => {
+ if(val.length > 12) { return 0; }
+ return Math.floor(untilIndex / 4); // groups of 4 digits
+ };
+
+ let start = selRange[0];
+ let end = selRange[1];
+ const startSpaces = countSpaces(val, start);
+ const endSpaces = countSpaces(val, end);
+
+ start += startSpaces;
+ end += startSpaces + (endSpaces - startSpaces);
+
+ return [ start, end ];
+ }
+
+ // Events
+
+ onKeyDown = (e: KeyboardEvent) => {
+ const { value, selectionRange } = this.state;
+
+ if(e.which === 8) { // backspace
+ const result = this.remove(value, selectionRange);
+ e.preventDefault();
+
+ this._ignoreSelect = true;
+
+ this.setState(result, () => {
+ if(this.props.onChange) {
+ this.props.onChange(result.value);
+ }
+ });
+ } else if(/^[0-9]$/.test(e.key)) { // digits or cmd+v
+ const result = this.insert(value, e.key, selectionRange);
+ e.preventDefault();
+
+ this._ignoreSelect = true;
+
+ this.setState(result, () => {
+ if(this.props.onChange) {
+ this.props.onChange(result.value);
+ }
+ });
+ }
+ }
+
+ onKeyUp = (e: KeyboardEvent) => {
+ this._ignoreSelect = false;
+
+ if(e.which === 13 && this.props.onEnter) {
+ this.props.onEnter();
+ }
+ }
+
+ onSelect = (e: Event) => {
+ const ref = e.target;
+ if(!(ref instanceof HTMLInputElement)) {
+ throw new Error('ref must be an instance of HTMLInputElement');
+ }
+
+ if(this._ignoreSelect) {
+ return;
+ }
+
+ const start = ref.selectionStart;
+ const end = ref.selectionEnd;
+ const selRange = this.toInternalSelectionRange(this.sanitize(ref.value), [start, end]);
+ this.setState({ selectionRange: selRange });
+ }
+
+ onPaste = (e: ClipboardEvent) => {
+ const { value, selectionRange } = this.state;
+ const pastedData = e.clipboardData.getData('text');
+ const filteredData = this.sanitize(pastedData);
+ const result = this.insert(value, filteredData, selectionRange);
+ e.preventDefault();
+ this.setState(result, () => {
+ if(this.props.onChange) {
+ this.props.onChange(result.value);
+ }
+ });
+ }
+
+ onCut = (e: ClipboardEvent) => {
+ const target = e.target;
+ if(!(target instanceof HTMLInputElement)) {
+ throw new Error('ref must be an instance of HTMLInputElement');
+ }
+
+ const { value, selectionRange } = this.state;
+
+ e.preventDefault();
+
+ // range is not empty?
+ if(selectionRange[0] !== selectionRange[1]) {
+ const result = this.remove(value, selectionRange);
+ const domSelectionRange = this.toDomSelection(value, selectionRange);
+ const slice = target.value.slice(domSelectionRange[0], domSelectionRange[1]);
+
+ e.clipboardData.setData('text', slice);
+
+ this.setState(result, () => {
+ if(this.props.onChange) {
+ this.props.onChange(result.value);
+ }
+ });
+ }
+ }
+
+ onRef = (ref: HTMLInputElement) => {
+ this._ref = ref;
+ if(!ref) { return; }
+
+ const { value, selectionRange } = this.state;
+ const domRange = this.toDomSelection(value, selectionRange);
+
+ ref.selectionStart = domRange[0];
+ ref.selectionEnd = domRange[1];
+ }
+
+ focus() {
+ if(this._ref) {
+ this._ref.focus();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/app/components/AdvancedSettings.js b/app/components/AdvancedSettings.js
new file mode 100644
index 0000000000..227499a1a8
--- /dev/null
+++ b/app/components/AdvancedSettings.js
@@ -0,0 +1,145 @@
+// @flow
+
+import React from 'react';
+import { Layout, Container, Header } from './Layout';
+import CustomScrollbars from './CustomScrollbars';
+
+export class AdvancedSettings extends React.Component {
+
+ props: {
+ onClose: () => void,
+ protocol: string,
+ port: string|number,
+ updateConstraints: (string, string|number) => void,
+ };
+
+ render() {
+ let portSelector = null;
+ let protocol = this.props.protocol.toUpperCase();
+
+ if (protocol === 'AUTOMATIC') {
+ protocol = 'Automatic';
+ } else {
+ portSelector = this._createPortSelector();
+ }
+
+ return <BaseLayout onClose={ this.props.onClose }>
+
+ <Selector
+ title={ 'Network protocols' }
+ values={ ['Automatic', 'UDP', 'TCP'] }
+ value={ protocol }
+ onSelect={ protocol => {
+ this.props.updateConstraints(protocol, 'Automatic');
+ }}/>
+
+ <div className="settings__cell-spacer"></div>
+
+ { portSelector }
+
+ </BaseLayout>;
+ }
+
+ _createPortSelector() {
+ const protocol = this.props.protocol.toUpperCase();
+ const ports = protocol === 'TCP'
+ ? ['Automatic', 80, 443]
+ : ['Automatic', 1194, 1195, 1196, 1197, 1300, 1301, 1302];
+
+ return <Selector
+ title={ protocol + ' port' }
+ values={ ports }
+ value={ this.props.port }
+ onSelect={ port => {
+ this.props.updateConstraints(protocol, port);
+ }} />;
+ }
+}
+
+
+class Selector extends React.Component {
+
+ props: {
+ title: string,
+ values: Array<*>,
+ value: *,
+ onSelect: (*) => void,
+ }
+
+ render() {
+ return <div>
+ <div className="settings__cell">
+ <div className="settings__cell-label">{ this.props.title }</div>
+ </div>
+
+ { this.props.values.map(value => this._renderCell(value)) }
+ </div>;
+ }
+
+ _renderCell(value) {
+ const selected = value === this.props.value;
+ if (selected) {
+ return this._renderSelectedCell(value);
+ } else {
+ return this._renderUnselectedCell(value);
+ }
+ }
+
+ _renderSelectedCell(value) {
+ const onCellClick = () => this.props.onSelect(value);
+
+ return <div
+ key={ value }
+ className={ 'settings__cell--selected settings__cell' }
+ onClick={ onCellClick } >
+ <div className="settings__cell-label">
+ <div className={ 'settings__sub-cell--label' }>
+ <img src='./assets/images/icon-tick.svg' />
+ { value }
+ </div>
+ </div>
+ </div>;
+ }
+
+ _renderUnselectedCell(value) {
+ const onCellClick = () => this.props.onSelect(value);
+
+ return <div
+ key={ value }
+ className={ 'settings__cell settings__sub-cell' }
+ onClick={ onCellClick } >
+ <div className="settings__cell-label">
+ <div className="settings__sub-cell--label">{ value }</div>
+ </div>
+ </div>;
+ }
+}
+
+function BaseLayout(props) {
+ return <Layout>
+ <Header hidden={ true } style={ 'defaultDark' } />
+ <Container>
+ <div className="settings">
+ <div className="support__close" onClick={ props.onClose }>
+ <img className="support__close-icon" src="./assets/images/icon-back.svg" />
+ <span className="support__close-title">Settings</span>
+ </div>
+ <div className="settings__container">
+ <div className="settings__header">
+ <h2 className="settings__title">Advanced</h2>
+ </div>
+ <CustomScrollbars autoHide={ true }>
+ <div className="settings__content">
+ <div className="settings__main">
+ <div className="settings__advanced">
+ { props.children }
+ </div>
+ </div>
+ </div>
+ </CustomScrollbars>
+ </div>
+ </div>
+ </Container>
+ </Layout>;
+}
+
diff --git a/app/components/Connect.css b/app/components/Connect.css
new file mode 100644
index 0000000000..dc9a070c99
--- /dev/null
+++ b/app/components/Connect.css
@@ -0,0 +1,169 @@
+.connect {
+ height: 100%;
+ position: relative;
+}
+
+.connect__map {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 0;
+}
+
+.connect__container {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ position: relative; /* need this for z-index to work to cover map */
+ z-index: 1;
+}
+
+.connect__footer {
+ display: flex;
+ flex-direction: column;
+ padding: 42px 24px 24px;
+}
+
+.connect__row + .connect__row{
+ margin-top: 16px;
+}
+
+.connect__server {
+ padding: 7px 12px 9px;
+ background-color: rgba(255,255,255,0.2);
+ border-radius: 4px;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ backdrop-filter: blur(4px);
+}
+
+.connect__server-label {
+ font-family: "Open Sans";
+ font-size: 12px;
+ font-weight: 800;
+ line-height: 17px;
+ color: rgba(255,255,255,0.8);
+ text-transform: uppercase;
+ flex: 0 0 auto;
+}
+
+.connect__server-value {
+ flex: 1 1 auto;
+ margin-left: 8px;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-end;
+}
+
+.connect__server-name {
+ font-family: DINPro;
+ font-size: 20px;
+ font-weight: 900;
+ line-height: 26px;
+ color: #FFFFFF;
+ text-align: right;
+}
+
+.connect__server-icon + .connect__server-name {
+ margin-left: 8px;
+}
+
+.connect__footer-button {
+ display: block;
+ width:100%;
+ border: 0;
+ padding: 7px 12px 9px;
+ border-radius: 4px;
+ font-family: DINPro;
+ font-size: 20px;
+ font-weight: 900;
+ text-align: center;
+ line-height: 26px;
+ color: #FFFFFF;
+}
+
+.connect__status {
+ padding: 0 24px;
+ margin-top: 96px;
+ margin-bottom: auto;
+}
+
+.connect__error-title {
+ font-family: DINPro;
+ font-size: 32px;
+ font-weight: 900;
+ line-height: 1.25;
+ color: #fff;
+ margin-bottom: 8px;
+}
+
+.connect__error-message {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: normal;
+ color: #fff;
+ margin-bottom: 24px;
+}
+
+.connect__status-security {
+ font-family: "Open Sans";
+ font-size: 16px;
+ font-weight: 800;
+ line-height: 22px;
+ margin-bottom: 4px;
+ color: #FFFFFF;
+ text-transform: uppercase;
+}
+
+.connect__status-security--unsecured {
+ color: #D0021B;
+}
+
+.connect__status-security--secure {
+ color: #44AD4D;
+}
+
+.connect__status-location {
+ font-family: DINPro;
+ font-size: 38px;
+ font-weight: 900;
+ line-height: 1.16em;
+ max-height: calc(1.16em * 2);
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ letter-spacing: -0.9px;
+ color: #FFFFFF;
+ margin-bottom: 4px;
+}
+
+.connect__status-location-icon {
+ display: inline-block;
+ margin-right: 8px;
+}
+
+.connect__status-ipaddress {
+ font-family: "Open Sans";
+ font-size: 16px;
+ font-weight: 800;
+ line-height: normal;
+ color: #FFFFFF;
+}
+
+.connect__status-ipaddress--invisible {
+ visibility: hidden;
+}
+
+.connect__status-icon {
+ text-align: center;
+ margin-bottom: 32px;
+}
+
+.connect__status-icon--hidden {
+ visibility: hidden;
+}
diff --git a/app/components/Connect.js b/app/components/Connect.js
new file mode 100644
index 0000000000..1dc135c745
--- /dev/null
+++ b/app/components/Connect.js
@@ -0,0 +1,369 @@
+// @flow
+
+import moment from 'moment';
+import React, { Component } from 'react';
+import { If, Then } from 'react-if';
+import { Layout, Container, Header } from './Layout';
+import { BackendError } from '../lib/backend';
+import ExternalLinkSVG from '../assets/images/icon-extLink.svg';
+
+import type { ServerInfo } from '../lib/backend';
+import type { HeaderBarStyle } from './HeaderBar';
+import type { ConnectionReduxState } from '../redux/connection/reducers';
+import type { SettingsReduxState } from '../redux/settings/reducers';
+
+export type ConnectProps = {
+ accountExpiry: string,
+ connection: ConnectionReduxState,
+ settings: SettingsReduxState,
+ onSettings: () => void,
+ onSelectLocation: () => void,
+ onConnect: (host: string) => void,
+ onCopyIP: () => void,
+ onDisconnect: () => void,
+ onExternalLink: (type: string) => void,
+ getServerInfo: (identifier: string) => ?ServerInfo
+};
+
+
+export default class Connect extends Component {
+ props: ConnectProps;
+ state = {
+ isFirstPass: true,
+ showCopyIPMessage: false
+ };
+
+ _copyTimer: ?number;
+
+ componentDidMount() {
+ this.setState({ isFirstPass: false });
+ }
+
+ componentWillUnmount() {
+ if(this._copyTimer) {
+ clearTimeout(this._copyTimer);
+ this._copyTimer = null;
+ }
+
+ this.setState({
+ isFirstPass: true,
+ showCopyIPMessage: false
+ });
+ }
+
+ render(): React.Element<*> {
+ const error = this.displayError();
+ const child = error ? this.renderError(error) : this.renderMap();
+
+ return (
+ <Layout>
+ <Header style={ this.headerStyle() } showSettings={ true } onSettings={ this.props.onSettings } />
+ <Container>
+ { child }
+ </Container>
+ </Layout>
+ );
+ }
+
+ renderError(error: BackendError): React.Element<*> {
+ return (
+ <div className="connect">
+ <div className="connect__status">
+ <div className="connect__status-icon">
+ <img src="./assets/images/icon-fail.svg" alt="" />
+ </div>
+ <div className="connect__error-title">
+ { error.title }
+ </div>
+ <div className="connect__error-message">
+ { error.message }
+ </div>
+ <If condition={ error.type === 'NO_CREDIT' }>
+ <Then>
+ <div>
+ <button className="button button--positive" onClick={ this.onExternalLink.bind(this, 'purchase') }>
+ <span className="button-label">Buy more time</span>
+ <ExternalLinkSVG className="button-icon button-icon--16" />
+ </button>
+ </div>
+ </Then>
+ </If>
+ </div>
+ </div>
+ );
+ }
+
+ _getServerInfo() {
+ const { relayConstraints } = this.props.settings;
+ if (relayConstraints.host === 'any') {
+ return {
+ name: 'Automatic',
+ country: 'Automatic',
+ city: 'Automatic',
+ address: '',
+ };
+ }
+
+ return this.props.getServerInfo(relayConstraints.host);
+ }
+
+ renderMap(): React.Element<*> {
+ const serverInfo = this._getServerInfo();
+
+ let isConnecting = false;
+ let isConnected = false;
+ let isDisconnected = false;
+ switch(this.props.connection.status) {
+ case 'connecting': isConnecting = true; break;
+ case 'connected': isConnected = true; break;
+ case 'disconnected': isDisconnected = true; break;
+ }
+
+ const { city, country } = serverInfo && (isConnecting || isConnected)
+ ? serverInfo
+ : { city: '\u2003', country: '\u2002' };
+ const ip = serverInfo && isConnected
+ ? serverInfo.address
+ : '\u2003'; //this.props.connection.clientIp;
+ const serverName = serverInfo
+ ? serverInfo.name
+ : '\u2003';
+
+ // We decided to not include the map in the first beta release to customers
+ // but it MUST be included in the following releases. Therefore we choose
+ // to just comment it out
+ const map = undefined;
+ /*
+ const altitude = (isConnecting ? 300 : 100) * 1000;
+ const { location } = this.props.connection;
+ const map = <Map animate={ !this.state.isFirstPass }
+ location={ location || [0, 0] }
+ altitude= { altitude }
+ markerImagePath= { isConnected
+ ? './assets/images/location-marker-secure.svg'
+ : './assets/images/location-marker-unsecure.svg' } />
+ */
+
+ let ipComponent = undefined;
+ if (isConnected || isDisconnected) {
+ if (this.state.showCopyIPMessage) {
+ ipComponent = <span>{ 'IP copied to clipboard!' }</span>;
+ } else {
+ ipComponent = <span>{ ip }</span>;
+ }
+ }
+ return (
+ <div className="connect">
+ <div className="connect__map">
+ { map }
+ </div>
+ <div className="connect__container">
+
+ <div className="connect__status">
+ { /* show spinner when connecting */ }
+ <div className={ this.spinnerClass() }>
+ <img src="./assets/images/icon-spinner.svg" alt="" />
+ </div>
+
+ <div className={ this.networkSecurityClass() }>{ this.networkSecurityMessage() }</div>
+
+ { /*
+ **********************************
+ Begin: Location block
+ **********************************
+ */ }
+
+ { /* location when connecting */ }
+ <If condition={ isConnecting }>
+ <Then>
+ <div className="connect__status-location">
+ <span>{ country }</span>
+ </div>
+ </Then>
+ </If>
+
+ { /* location when connected */ }
+ <If condition={ isConnected }>
+ <Then>
+ <div className="connect__status-location">
+ { city }<br/>{ country }
+ </div>
+ </Then>
+ </If>
+
+ { /* location when disconnected */ }
+ <If condition={ isDisconnected }>
+ <Then>
+ <div className="connect__status-location">
+ { country }
+ </div>
+ </Then>
+ </If>
+
+ { /*
+ **********************************
+ End: Location block
+ **********************************
+ */ }
+
+ <div className={ this.ipAddressClass() } onClick={ this.onIPAddressClick.bind(this) }>
+ { ipComponent }
+ </div>
+ </div>
+
+
+ { /*
+ **********************************
+ Begin: Footer block
+ **********************************
+ */ }
+
+ { /* footer when disconnected */ }
+ <If condition={ isDisconnected }>
+ <Then>
+ <div className="connect__footer">
+ <div className="connect__row">
+
+ <div className="connect__server" onClick={ this.props.onSelectLocation }>
+ <div className="connect__server-label">Connect to</div>
+ <div className="connect__server-value">
+
+ <div className="connect__server-name">{ serverName }</div>
+
+ </div>
+ </div>
+ </div>
+
+ <div className="connect__row">
+ <button className="button button--positive" onClick={ this.onConnect.bind(this) }>Secure my connection</button>
+ </div>
+ </div>
+ </Then>
+ </If>
+
+ { /* footer when connecting */ }
+ <If condition={ isConnecting }>
+ <Then>
+ <div className="connect__footer">
+ <div className="connect__row">
+ <button className="button button--neutral button--blur" onClick={ this.props.onSelectLocation }>Switch location</button>
+ </div>
+
+ <div className="connect__row">
+ <button className="button button--negative-light button--blur" onClick={ this.props.onDisconnect }>Cancel</button>
+ </div>
+ </div>
+ </Then>
+ </If>
+
+ { /* footer when connected */ }
+ <If condition={ isConnected }>
+ <Then>
+ <div className="connect__footer">
+ <div className="connect__row">
+ <button className="button button--neutral button--blur" onClick={ this.props.onSelectLocation }>Switch location</button>
+ </div>
+
+ <div className="connect__row">
+ <button className="button button--negative-light button--blur" onClick={ this.props.onDisconnect }>Disconnect</button>
+ </div>
+ </div>
+ </Then>
+ </If>
+
+ { /*
+ **********************************
+ End: Footer block
+ **********************************
+ */ }
+
+ </div>
+ </div>
+ );
+ }
+
+ // Handlers
+
+ onConnect() {
+ const serverInfo = this._getServerInfo();
+ if(!serverInfo) {
+ return;
+ }
+
+ this.props.onConnect(serverInfo.address);
+ }
+
+ onExternalLink(type: string) {
+ this.props.onExternalLink(type);
+ }
+
+ onIPAddressClick() {
+ this._copyTimer && clearTimeout(this._copyTimer);
+ this._copyTimer = setTimeout(() => this.setState({ showCopyIPMessage: false }), 3000);
+ this.setState({ showCopyIPMessage: true });
+ this.props.onCopyIP();
+ }
+
+ // Private
+
+ headerStyle(): HeaderBarStyle {
+ switch(this.props.connection.status) {
+ case 'connecting':
+ case 'disconnected':
+ return 'error';
+ case 'connected':
+ return 'success';
+ }
+ throw new Error('Invalid ConnectionState');
+ }
+
+ networkSecurityClass(): string {
+ let classes = ['connect__status-security'];
+ if(this.props.connection.status === 'connected') {
+ classes.push('connect__status-security--secure');
+ } else if(this.props.connection.status === 'disconnected') {
+ classes.push('connect__status-security--unsecured');
+ }
+
+ return classes.join(' ');
+ }
+
+ networkSecurityMessage(): string {
+ switch(this.props.connection.status) {
+ case 'connected': return 'Secure connection';
+ case 'connecting': return 'Creating secure connection';
+ default: return 'Unsecured connection';
+ }
+ }
+
+ spinnerClass(): string {
+ var classes = ['connect__status-icon'];
+ if(this.props.connection.status !== 'connecting') {
+ classes.push('connect__status-icon--hidden');
+ }
+ return classes.join(' ');
+ }
+
+ ipAddressClass(): string {
+ var classes = ['connect__status-ipaddress'];
+ if(this.props.connection.status === 'connecting') {
+ classes.push('connect__status-ipaddress--invisible');
+ }
+ return classes.join(' ');
+ }
+
+ displayError(): ?BackendError {
+ // Offline?
+ if(!this.props.connection.isOnline) {
+ return new BackendError('NO_INTERNET');
+ }
+
+ // No credit?
+ const expiry = this.props.accountExpiry;
+ if(expiry && moment(expiry).isSameOrBefore(moment())) {
+ return new BackendError('NO_CREDIT');
+ }
+
+ return null;
+ }
+}
diff --git a/app/components/CustomScrollbars.css b/app/components/CustomScrollbars.css
new file mode 100644
index 0000000000..24788230b8
--- /dev/null
+++ b/app/components/CustomScrollbars.css
@@ -0,0 +1,4 @@
+.custom-scrollbars__thumb-vertical {
+ background-color: rgba(255, 255, 255, 0.2);
+ border-radius: 3px;
+}
diff --git a/app/components/CustomScrollbars.js b/app/components/CustomScrollbars.js
new file mode 100644
index 0000000000..4a0899c1be
--- /dev/null
+++ b/app/components/CustomScrollbars.js
@@ -0,0 +1,19 @@
+// @flow
+import React, { Component } from 'react';
+import { Scrollbars } from 'react-custom-scrollbars';
+
+export default class CustomScrollbars extends Component {
+ props: {
+ children: ?React.Element<*>
+ }
+
+ render(): React.Element<*> {
+ return (
+ <Scrollbars
+ { ...this.props }
+ renderThumbVertical={ () => <div className="custom-scrollbars__thumb-vertical"/> }>
+ { this.props.children }
+ </Scrollbars>
+ );
+ }
+}
diff --git a/app/components/HeaderBar.css b/app/components/HeaderBar.css
new file mode 100644
index 0000000000..9fcc65047b
--- /dev/null
+++ b/app/components/HeaderBar.css
@@ -0,0 +1,61 @@
+.headerbar {
+ padding: 12px;
+ background-color: #294D73;
+ transition: 0.5s background-color ease-in-out;
+}
+
+/* macOS app runs as menubar app so add extra padding */
+.headerbar--darwin {
+ padding-top: 24px;
+}
+
+.headerbar--hidden {
+ padding: 24px 0 0 0;
+}
+
+.headerbar--style-defaultDark {
+ background-color: #192E45;
+}
+
+.headerbar--style-error {
+ background-color: #D0021B;
+}
+
+.headerbar--style-success {
+ background-color: #44AD4D;
+}
+
+.headerbar__container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.headerbar__title {
+ font-family: DINPro;
+ font-size: 24px;
+ font-weight: 900;
+ line-height: 30px;
+ letter-spacing: -0.5px;
+ color: rgba(255,255,255,0.6);
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 8px;
+}
+
+.headerbar__logo {
+ height: 50px;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.headerbar__settings {
+ display: block;
+ border: 0;
+ padding: 0;
+ margin: 0 0 0 auto;
+ width: 24px;
+ height: 24px;
+ background-color: transparent;
+ background-image: url(../assets/images/icon-settings.svg);
+}
diff --git a/app/components/HeaderBar.js b/app/components/HeaderBar.js
new file mode 100644
index 0000000000..26e937ad23
--- /dev/null
+++ b/app/components/HeaderBar.js
@@ -0,0 +1,51 @@
+// @flow
+import React, { Component } from 'react';
+import { If, Then } from 'react-if';
+
+export type HeaderBarStyle = 'default' | 'defaultDark' | 'error' | 'success';
+export type HeaderBarProps = {
+ style: HeaderBarStyle;
+ hidden: boolean;
+ showSettings: boolean;
+ onSettings: ?(() => void);
+};
+
+export default class HeaderBar extends Component {
+ props: HeaderBarProps;
+ static defaultProps: $Shape<HeaderBarProps> = {
+ style: 'default',
+ hidden: false,
+ showSettings: false,
+ onSettings: null
+ };
+
+ render(): React.Element<*> {
+ let containerClass = [
+ 'headerbar',
+ 'headerbar--' + process.platform,
+ 'headerbar--style-' + this.props.style
+ ];
+
+ if(this.props.hidden) {
+ containerClass.push('headerbar--hidden');
+ }
+
+ return (
+ <div className={ containerClass.join(' ') }>
+ <If condition={ !this.props.hidden }>
+ <Then>
+ <div className="headerbar__container">
+ <img className="headerbar__logo" src="./assets/images/logo-icon.svg" />
+ <h2 className="headerbar__title">MULLVAD VPN</h2>
+ <If condition={ !!this.props.showSettings }>
+ <Then>
+ <button className="headerbar__settings" onClick={ this.props.onSettings } />
+ </Then>
+ </If>
+ </div>
+ </Then>
+ </If>
+ </div>
+ );
+ }
+}
diff --git a/app/components/Layout.css b/app/components/Layout.css
new file mode 100644
index 0000000000..14acf93769
--- /dev/null
+++ b/app/components/Layout.css
@@ -0,0 +1,15 @@
+.layout {
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+}
+
+.layout__header {
+ flex: 0 0 auto;
+}
+
+.layout__container {
+ flex: 1 1 100%;
+ background: #294D73;
+ overflow: hidden; /* needed for flex boxes with overflow: auto to work */
+} \ No newline at end of file
diff --git a/app/components/Layout.js b/app/components/Layout.js
new file mode 100644
index 0000000000..5c0e1f5bcb
--- /dev/null
+++ b/app/components/Layout.js
@@ -0,0 +1,46 @@
+// @flow
+import React, { Component } from 'react';
+import HeaderBar from './HeaderBar';
+
+import type { HeaderBarProps } from './HeaderBar';
+
+export class Header extends Component {
+ props: HeaderBarProps;
+ static defaultProps = HeaderBar.defaultProps;
+
+ render(): React.Element<*> {
+ return (
+ <div className="layout__header">
+ <HeaderBar { ...this.props } />
+ </div>
+ );
+ }
+}
+
+export class Container extends Component {
+ props: {
+ children: React.Element<*>
+ }
+
+ render(): React.Element<*> {
+ return (
+ <div className="layout__container">
+ { this.props.children }
+ </div>
+ );
+ }
+}
+
+export class Layout extends Component {
+ props: {
+ children: Array<React.Element<*>> | React.Element<*>
+ }
+
+ render(): React.Element<*> {
+ return (
+ <div className="layout">
+ { this.props.children }
+ </div>
+ );
+ }
+}
diff --git a/app/components/Login.css b/app/components/Login.css
new file mode 100644
index 0000000000..8793337f0c
--- /dev/null
+++ b/app/components/Login.css
@@ -0,0 +1,154 @@
+.login {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.login-footer {
+ background-color: #192E45;
+ padding: 18px 24px 24px;
+ flex: 0 0 auto;
+}
+
+.login-footer--invisible {
+ visibility: hidden;
+}
+
+.login-form__status-icon {
+ text-align: center;
+ margin-bottom: 44px;
+}
+
+.login-footer__prompt {
+ font-family: "Open Sans";
+ font-size: 13px;
+ line-height: 18px;
+ font-weight: 600;
+ color: rgba(255,255,255,0.8);
+ margin-bottom: 8px;
+}
+
+.login-form {
+ display: flex;
+ flex-direction: column;
+ padding: 0 24px;
+ margin: auto 0 70px;
+}
+
+.login-form__title {
+ font-family: DINPro;
+ font-size: 32px;
+ font-weight: 900;
+ line-height: 1.25em;
+ color: #FFFFFF;
+ margin-bottom: 7px;
+}
+
+.login-form__subtitle {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: normal;
+ color: rgba(255,255,255,0.8);
+ margin-bottom: 8px;
+}
+
+.login-form__input-wrap {
+ border: 2px solid transparent;
+ background-color: #FFFFFF;
+ background-clip: content-box;
+ border-radius: 8px;
+ margin-left: -2px;
+ margin-right: -2px;
+ display: flex;
+ flex-direction: row;
+ overflow: hidden;
+ transition-duration: 0.3s;
+ transition-property: background-color, border-color;
+ transition-timing-function: ease-in-out;
+
+ /* this fixes border-radius clipping bug when button animates opacity */
+ -webkit-backface-visibility: hidden;
+ -webkit-transform: translate3d(0, 0, 0);
+}
+
+.login-form__input-wrap--active {
+ border-color: rgba(25,46,69,0.4);
+}
+
+.login-form__input-wrap--inactive {
+ opacity: 0.6;
+}
+
+.login-form__input-field::-webkit-input-placeholder {
+ color: rgba(41,77,115,0.4);
+}
+
+.login-form__fields--invisible {
+ visibility: hidden;
+}
+
+.login-form__input-field {
+ width: 100%;
+ border-radius: 8px;
+ border: 0;
+ overflow: hidden;
+ padding: 10px 12px 12px 12px;
+ font-family: DINPro;
+ font-size: 20px;
+ font-weight: 900;
+ line-height: 26px;
+ color: #294D73;
+ background-color: transparent;
+ flex: 1 1 auto;
+ transition: 0.3s color ease-in-out;
+}
+
+.login-form__input-field--inactive {
+ background-color: rgba(255,255,255,0.6);
+}
+
+.login-form__input-wrap--error {
+ border-color: rgba(208,2,27,0.4);
+}
+
+.login-form__input-wrap--error .login-form__input-field {
+ color: #D0021B;
+}
+
+.login-form__submit {
+ flex: 0 0 auto;
+ border: 0;
+ width: 48px;
+ background-color: transparent;
+ transition-duration: 0.3s;
+ transition-property: background-color, opacity;
+ transition-timing-function: ease-in-out;
+}
+
+.login-form__submit-icon {
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.login-form__submit-icon path {
+ fill: rgba(41,77,115,0.2);
+ transition: fill 0.3s ease-in-out;
+}
+
+.login-form__submit--active {
+ background-color: #44ad4d;
+}
+
+.login-form__submit--active .login-form__submit-icon path {
+ fill: #fff;
+}
+
+.login-form__submit--active:hover {
+ background-color: rgba(68, 173, 76, 0.9);
+}
+
+.login-form__submit--invisible {
+ visibility: hidden;
+ opacity: 0;
+}
diff --git a/app/components/Login.js b/app/components/Login.js
new file mode 100644
index 0000000000..784d92daa8
--- /dev/null
+++ b/app/components/Login.js
@@ -0,0 +1,212 @@
+// @flow
+import React, { Component } from 'react';
+import { Layout, Container, Header } from './Layout';
+import AccountInput from './AccountInput';
+import ExternalLinkSVG from '../assets/images/icon-extLink.svg';
+import LoginArrowSVG from '../assets/images/icon-arrow.svg';
+
+import type { AccountReduxState, LoginState } from '../redux/account/reducers';
+
+export type LoginPropTypes = {
+ account: AccountReduxState,
+ onLogin: (accountToken: string) => void,
+ onSettings: ?(() => void),
+ onFirstChangeAfterFailure: () => void,
+ onExternalLink: (type: string) => void,
+ onAccountTokenChange: (string) => void,
+};
+
+export default class Login extends Component {
+ props: LoginPropTypes;
+ state = {
+ notifyOnFirstChangeAfterFailure: false,
+ isActive: false,
+ };
+
+ onCreateAccount = () => this.props.onExternalLink('createAccount');
+ onFocus = () => this.setState({ isActive: true });
+ onBlur = () => this.setState({ isActive: false });
+ onLogin = () => {
+ const accountToken = this.props.account.accountToken;
+ if(accountToken && accountToken.length > 0) {
+ this.props.onLogin(accountToken);
+ }
+ }
+
+ onInputChange = (val: string) => {
+ // notify delegate on first change after login failure
+ if(this.state.notifyOnFirstChangeAfterFailure) {
+ this.setState({ notifyOnFirstChangeAfterFailure: false });
+ this.props.onFirstChangeAfterFailure();
+ }
+ this.props.onAccountTokenChange(val);
+ }
+
+ formTitle(s: LoginState): string {
+ switch(s) {
+ case 'logging in': return 'Logging in...';
+ case 'failed': return 'Login failed';
+ case 'ok': return 'Login successful';
+ default: return 'Login';
+ }
+ }
+
+ formSubtitle(s: LoginState, e: ?Error): string {
+ switch(s) {
+ case 'failed': return (e && e.message) || 'Unknown error';
+ case 'logging in': return 'Checking account number';
+ default: return 'Enter your account number';
+ }
+ }
+
+ inputWrapClass(s: LoginState): string {
+ const classes = ['login-form__input-wrap'];
+
+ if(this.state.isActive) {
+ classes.push('login-form__input-wrap--active');
+ }
+
+ switch(s) {
+ case 'logging in':
+ classes.push('login-form__input-wrap--inactive');
+ break;
+ case 'failed':
+ classes.push('login-form__input-wrap--error');
+ break;
+ }
+
+ return classes.join(' ');
+ }
+
+ submitClass(s: LoginState, accountToken: ?string): string {
+ const classes = ['login-form__submit'];
+
+ if(accountToken && accountToken.length > 0) {
+ classes.push('login-form__submit--active');
+ }
+
+ if(s === 'logging in') {
+ classes.push('login-form__submit--invisible');
+ }
+
+ return classes.join(' ');
+ }
+
+ componentWillReceiveProps(nextProps: LoginPropTypes) {
+ const prev = this.props.account || {};
+ const next = nextProps.account || {};
+
+ if(prev.status !== next.status && next.status === 'failed') {
+ this.setState({ notifyOnFirstChangeAfterFailure: true });
+ }
+ }
+
+ render(): React.Element<*> {
+ const { status } = this.props.account;
+ const title = this.formTitle(status);
+
+ const shouldShowLoginForm = status !== 'ok';
+ const shouldShowFooter = status === 'none' || status === 'failed';
+
+ const statusIcon = this._getStatusIcon();
+
+ const loginFormClass = shouldShowLoginForm ? '' : 'login-form__fields--invisible';
+ const loginForm = this._createLoginForm();
+
+ const footerClass = shouldShowFooter ? '' : 'login-footer--invisible';
+ const footer = this._createFooter();
+
+ return (
+ <Layout>
+ <Header showSettings={ true } onSettings={ this.props.onSettings } />
+ <Container>
+ <div className="login">
+ <div className="login-form">
+ { statusIcon }
+
+ <div className="login-form__title">{ title }</div>
+
+ <div className={ 'login-form__fields ' + loginFormClass }>
+ { loginForm }
+ </div>
+ </div>
+
+ <div className={ 'login-footer ' + footerClass }>
+ { footer }
+ </div>
+ </div>
+ </Container>
+ </Layout>
+ );
+ }
+
+ _getStatusIcon(): React.Element<*> {
+ const statusIconPath = this._getStatusIconPath();
+
+ return <div className="login-form__status-icon">
+ <img src={ statusIconPath } alt="" />
+ </div>;
+ }
+
+ _getStatusIconPath(): ?string {
+ switch(this.props.account.status) {
+ case 'logging in':
+ return './assets/images/icon-spinner.svg';
+ case 'failed':
+ return './assets/images/icon-fail.svg';
+ case 'ok':
+ return './assets/images/icon-success.svg';
+ default:
+ return undefined;
+ }
+ }
+
+ _createLoginForm(): React.Element<*> {
+ const { status, error } = this.props.account;
+ const accountToken = this.props.account.accountToken;
+
+ const inputDisabled = status === 'logging in';
+
+ const subtitle = this.formSubtitle(status, error);
+
+ const inputWrapClass = this.inputWrapClass(status);
+ const submitClass = this.submitClass(status, accountToken);
+
+ const autoFocusRef = input => {
+ if(status === 'failed' && input) {
+ input.focus();
+ }
+ };
+
+ return <div>
+ <div className="login-form__subtitle">{ subtitle }</div>
+ <div className={ inputWrapClass }>
+ <AccountInput className="login-form__input-field"
+ type="text"
+ placeholder="e.g 0000 0000 0000"
+ onFocus={ this.onFocus }
+ onBlur={ this.onBlur }
+ onChange={ this.onInputChange }
+ onEnter={ this.onLogin }
+ value={ accountToken || '' }
+ disabled={ inputDisabled }
+ autoFocus={ true }
+ ref={ autoFocusRef } />
+ <button className={ submitClass } onClick={ this.onLogin }>
+ <LoginArrowSVG className="login-form__submit-icon" />
+ </button>
+ </div>
+ </div>;
+ }
+
+ _createFooter(): React.Element<*> {
+ return <div>
+ <div className="login-footer__prompt">{ 'Don\'t have an account number?' }</div>
+ <button className="button button--primary" onClick={ this.onCreateAccount }>
+ <span className="button-label">Create account</span>
+ <ExternalLinkSVG className="button-icon button-icon--16" />
+ </button>
+ </div>;
+ }
+}
+
diff --git a/app/components/Map.js b/app/components/Map.js
new file mode 100644
index 0000000000..337d5c812b
--- /dev/null
+++ b/app/components/Map.js
@@ -0,0 +1,51 @@
+// @flow
+
+import React, { Component } from 'react';
+import ReactMapboxGl, { Marker } from 'react-mapbox-gl';
+import { mapbox as mapboxConfig } from '../config';
+import cheapRuler from 'cheap-ruler';
+
+import type { Coordinate2d } from '../types';
+
+const ReactMap = ReactMapboxGl({
+ accessToken: mapboxConfig.accessToken,
+ attributionControl: false,
+ interactive: false,
+});
+
+export default class Map extends Component {
+ props: {
+ animate: boolean,
+ location: Coordinate2d,
+ altitude: number,
+ markerImagePath: string,
+ }
+
+ render() {
+
+ const mapBounds = this.calculateMapBounds(this.props.location, this.props.altitude);
+
+ const mapBoundsOptions = { offset: [0, -113], animate: this.props.animate };
+
+ return <ReactMap style={ mapboxConfig.styleURL }
+ containerStyle={{ height: '100%' }}
+ fitBounds={ mapBounds }
+ fitBoundsOptions={ mapBoundsOptions }>
+
+ <Marker coordinates={ this.convertToMapCoordinate(this.props.location) } offset={ [0, -10] }>
+ <img src={ this.props.markerImagePath } />
+ </Marker>
+ </ReactMap>;
+ }
+
+ calculateMapBounds(center: Coordinate2d, altitude: number): [Coordinate2d, Coordinate2d] {
+ const bounds = cheapRuler(center[0], 'meters').bufferPoint(center, altitude);
+ // convert [lat,lng] bounds to [lng,lat]
+ return [ [bounds[1], bounds[0]], [bounds[3], bounds[2]] ];
+ }
+
+ convertToMapCoordinate(pos: Coordinate2d): Coordinate2d {
+ // convert [lat,lng] bounds to [lng,lat]
+ return [pos[1], pos[0]];
+ }
+}
diff --git a/app/components/SelectLocation.css b/app/components/SelectLocation.css
new file mode 100644
index 0000000000..cb63f61115
--- /dev/null
+++ b/app/components/SelectLocation.css
@@ -0,0 +1,106 @@
+.select-location {
+ background: #192E45;
+ height: 100%;
+}
+
+.select-location__container {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.select-location__header {
+ flex: 0 0 auto;
+ padding: 40px 24px 16px;
+ position: relative; /* anchor for close button */
+}
+
+.select-location__close {
+ position: absolute;
+ display: block;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 24px;
+ height: 24px;
+ top: 24px;
+ left: 12px;
+ background-color: transparent;
+ background-image: url(../assets/images/icon-close.svg);
+ opacity: 0.6;
+ z-index: 1; /* part of .select-location__container covers the button */
+}
+
+.select-location__title {
+ font-family: DINPro;
+ font-size: 32px;
+ font-weight: 900;
+ line-height: 1.25em;
+ color: #FFFFFF;
+}
+
+.select-location__subtitle {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: normal;
+ color: rgba(255,255,255,0.8);
+ padding: 0 24px 24px;
+}
+
+.select-location__separator {
+ height: 24px;
+}
+
+.select-location__cell {
+ background-color: rgba(41,71,115,1);
+ padding: 15px 24px;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.select-location__cell:hover {
+ background-color:rgba(41,71,115,0.9);
+}
+
+.select-location__cell--selected,
+.select-location__cell--selected:hover {
+ background-color: #44AD4D;
+}
+
+.select-location__cell + .select-location__cell {
+ margin-top: 1px;
+}
+
+.select-location__cell-label {
+ font-family: DINPro;
+ font-size: 20px;
+ font-weight: 900;
+ line-height: 26px;
+ color: #FFFFFF;
+}
+
+.select-location__cell-icon {
+ width: 24px;
+ height: 24px;
+ flex: 0 0 auto;
+ margin-right: 8px;
+}
+
+.select-location__cell-value {
+ flex: 0 0 auto;
+}
+
+.select-location__cell-accessory {
+ margin-left: auto;
+}
+
+.select-location__cell-footer {
+ padding: 8px 24px 24px;
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 20px;
+ color: rgba(255,255,255,0.8);
+}
diff --git a/app/components/SelectLocation.js b/app/components/SelectLocation.js
new file mode 100644
index 0000000000..c6325ae2a5
--- /dev/null
+++ b/app/components/SelectLocation.js
@@ -0,0 +1,112 @@
+// @flow
+import React, { Component } from 'react';
+import { If, Then } from 'react-if';
+import { Layout, Container, Header } from './Layout';
+import { servers } from '../config';
+import CustomScrollbars from './CustomScrollbars';
+
+import type { SettingsReduxState } from '../redux/settings/reducers';
+
+export type SelectLocationProps = {
+ settings: SettingsReduxState,
+ onClose: () => void;
+ onSelect: (server: string) => void;
+};
+
+export default class SelectLocation extends Component {
+ props: SelectLocationProps;
+ _selectedCell: ?HTMLElement;
+
+ onSelect(name: string) {
+ if (!this.isSelected(name)) {
+ this.props.onSelect(name);
+ }
+ }
+
+ isSelected(server: string) {
+ const { host } = this.props.settings.relayConstraints;
+ return server === host;
+ }
+
+ drawCell(key: string, name: string, icon: ?string, onClick: (e: Event) => void): React.Element<*> {
+ const classes = ['select-location__cell'];
+ const selected = this.isSelected(key);
+
+ if(selected) {
+ classes.push('select-location__cell--selected');
+ }
+
+ const cellClass = classes.join(' ');
+
+ return (
+ <div key={ key } className={ cellClass } onClick={ onClick } ref={ (e) => this.onCellRef(key, e) }>
+
+ <If condition={ !!icon }>
+ <Then>
+ <img className="select-location__cell-icon" src={ icon } />
+ </Then>
+ </If>
+
+ <div className="select-location__cell-label">{ name }</div>
+
+ <If condition={ selected } >
+ <Then>
+ <img className="select-location__cell-accessory" src="./assets/images/icon-tick.svg" />
+ </Then>
+ </If>
+
+ </div>
+ );
+ }
+
+ onCellRef(key: string, element: HTMLElement) {
+ // save reference to selected cell
+ if(this.isSelected(key)) {
+ this._selectedCell = element;
+ }
+ }
+
+ componentDidMount() {
+ // restore scroll to selected cell
+ const cell = this._selectedCell;
+ if(cell) {
+ // this is non-standard webkit method but it works great!
+ if(typeof(cell.scrollIntoViewIfNeeded) !== 'function') {
+ console.warn('HTMLElement.scrollIntoViewIfNeeded() is not available anymore! Please replace it with viable alternative.');
+ return;
+ }
+ cell.scrollIntoViewIfNeeded(true);
+ }
+ }
+
+ render(): React.Element<*> {
+ return (
+ <Layout>
+ <Header hidden={ true } style={ 'defaultDark' } />
+ <Container>
+ <div className="select-location">
+ <button className="select-location__close" onClick={ this.props.onClose } />
+ <div className="select-location__container">
+ <div className="select-location__header">
+ <h2 className="select-location__title">Select location</h2>
+ </div>
+
+ <CustomScrollbars autoHide={ true }>
+ <div>
+ <div className="select-location__subtitle">
+ While connected, your real location is masked with a private and secure location in the selected region
+ </div>
+
+ <div className="select-location__separator"></div>
+
+ { Object.keys(servers).map((key) => this.drawCell(key, servers[key].name, null, this.onSelect.bind(this, key))) }
+
+ </div>
+ </CustomScrollbars>
+ </div>
+ </div>
+ </Container>
+ </Layout>
+ );
+ }
+}
diff --git a/app/components/Settings.css b/app/components/Settings.css
new file mode 100644
index 0000000000..ee4a90b6b9
--- /dev/null
+++ b/app/components/Settings.css
@@ -0,0 +1,140 @@
+.settings {
+ background: #192E45;
+ height: 100%;
+}
+
+.settings__container {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.settings__header {
+ flex: 0 0 auto;
+ padding: 40px 24px 24px;
+ position: relative; /* anchor for close button */
+}
+
+.settings__content {
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+.settings__close {
+ position: absolute;
+ display: block;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 24px;
+ height: 24px;
+ top: 24px;
+ left: 12px;
+ background-color: transparent;
+ background-image: url(../assets/images/icon-close.svg);
+ opacity: 0.6;
+ z-index: 1; /* part of .settings__container covers the button */
+}
+
+.settings__title {
+ font-family: DINPro;
+ font-size: 32px;
+ font-weight: 900;
+ line-height: 40px;
+ color: #FFFFFF;
+}
+
+.settings__cell {
+ background-color:rgba(41,71,115,1);
+ padding: 15px 24px;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.settings__cell-disclosure {
+ display: block;
+ margin-left: 8px;
+}
+
+.settings__cell-spacer {
+ height: 24px;
+}
+
+.settings__cell--selected,
+.settings__cell--selected:hover {
+ background-color: #44AD4D;
+}
+
+.settings__cell--active:hover {
+ background-color: rgba(41,71,115,0.9);
+}
+
+.settings__cell + .settings__cell {
+ margin-top: 1px;
+}
+
+.settings__cell-label {
+ font-family: DINPro;
+ font-size: 20px;
+ font-weight: 900;
+ line-height: 26px;
+ color: #FFFFFF;
+ flex: 1 0 auto;
+}
+
+.settings__cell-icon {
+ width: 16px;
+ flex: 0 0 auto;
+ margin-right: 8px;
+ opacity: 0.8;
+}
+
+.settings__cell-value {
+ flex: 0 0 auto;
+}
+
+.settings__sub-cell {
+ background-color: rgb(36, 57, 84);
+}
+.settings__sub-cell:hover {
+ background-color: rgba(41,71,115,0.9);
+}
+
+.settings__sub-cell--label {
+ padding-left: 15px;
+}
+
+.settings__sub-cell--label img {
+ padding-right: 8px;
+}
+
+.settings__account-paid-until-label {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 800;
+ line-height: 26px; /* matches .cell-label */
+ color: rgba(255, 255, 255, 0.8);
+ text-transform: uppercase;
+}
+
+.settings__account-paid-until-label--error {
+ color: #d0021b;
+}
+
+.settings__cell-footer {
+ padding: 8px 24px 24px;
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 20px;
+ color: rgba(255,255,255,0.8);
+}
+
+.settings__footer {
+ padding: 24px;
+}
+
+.settings__footer .button + .button { margin-top: 16px; }
diff --git a/app/components/Settings.js b/app/components/Settings.js
new file mode 100644
index 0000000000..95506cddc2
--- /dev/null
+++ b/app/components/Settings.js
@@ -0,0 +1,117 @@
+// @flow
+import moment from 'moment';
+import React, { Component } from 'react';
+import { If, Then, Else } from 'react-if';
+import { Layout, Container, Header } from './Layout';
+import CustomScrollbars from './CustomScrollbars';
+
+import type { AccountReduxState } from '../redux/account/reducers';
+import type { SettingsReduxState } from '../redux/settings/reducers';
+
+export type SettingsProps = {
+ account: AccountReduxState,
+ settings: SettingsReduxState,
+ onQuit: () => void,
+ onClose: () => void,
+ onViewAccount: () => void,
+ onViewSupport: () => void,
+ onViewAdvancedSettings: () => void,
+ onExternalLink: (type: string) => void
+};
+
+export default class Settings extends Component {
+
+ props: SettingsProps;
+
+ render() {
+ const isLoggedIn = this.props.account.status === 'ok';
+ let isOutOfTime = false, formattedExpiry = '';
+ let expiryIso = this.props.account.expiry;
+
+ if(isLoggedIn && expiryIso) {
+ let expiry = moment(this.props.account.expiry);
+ isOutOfTime = expiry.isSameOrBefore(moment());
+ formattedExpiry = expiry.fromNow(true) + ' left';
+ }
+
+ return (
+ <Layout>
+ <Header hidden={ true } style={ 'defaultDark' } />
+ <Container>
+ <div className="settings">
+ <button className="settings__close" onClick={ this.props.onClose } />
+ <div className="settings__container">
+ <div className="settings__header">
+ <h2 className="settings__title">Settings</h2>
+ </div>
+ <CustomScrollbars autoHide={ true }>
+ <div className="settings__content">
+ <div className="settings__main">
+
+ { /* show account options when logged in */ }
+ <If condition={ isLoggedIn }>
+ <Then>
+ <div className="settings__account">
+
+ <div className="settings__view-account settings__cell settings__cell--active" onClick={ this.props.onViewAccount }>
+ <div className="settings__cell-label">Account</div>
+ <div className="settings__cell-value">
+ <If condition={ isOutOfTime }>
+ <Then>
+ <span className="settings__account-paid-until-label settings__account-paid-until-label--error">OUT OF TIME</span>
+ </Then>
+ <Else>
+ <span className="settings__account-paid-until-label">{ formattedExpiry }</span>
+ </Else>
+ </If>
+ </div>
+ <img className="settings__cell-disclosure" src="assets/images/icon-chevron.svg" />
+ </div>
+ <div className="settings__cell-spacer"></div>
+ </div>
+ </Then>
+ </If>
+
+ <If condition={ isLoggedIn }>
+ <Then>
+ <div className="settings__advanced">
+ <div className="settings__cell settings__cell--active" onClick={ this.props.onViewAdvancedSettings }>
+ <div className="settings__cell-label">Advanced</div>
+ <div className="settings__cell-value">
+ <img className="settings__cell-disclosure" src="assets/images/icon-chevron.svg" />
+ </div>
+ </div>
+ <div className="settings__cell-spacer"></div>
+ </div>
+ </Then>
+ </If>
+
+ <div className="settings__external">
+ <div className="settings__cell settings__cell--active" onClick={ this.props.onExternalLink.bind(this, 'faq') }>
+ <div className="settings__cell-label">FAQs</div>
+ <img className="settings__cell-icon" src="./assets/images/icon-extLink.svg" />
+ </div>
+ <div className="settings__cell settings__cell--active" onClick={ this.props.onExternalLink.bind(this, 'guides') }>
+ <div className="settings__cell-label">Guides</div>
+ <img className="settings__cell-icon" src="./assets/images/icon-extLink.svg" />
+ </div>
+ <div className="settings__view-support settings__cell settings__cell--active" onClick={ this.props.onViewSupport }>
+ <div className="settings__cell-label">Report a problem</div>
+ <img className="settings__cell-disclosure" src="assets/images/icon-chevron.svg" />
+ </div>
+ </div>
+ </div>
+
+ <div className="settings__footer">
+ <button className="settings__quit button button--negative" onClick={ this.props.onQuit }>Quit app</button>
+ </div>
+
+ </div>
+ </CustomScrollbars>
+ </div>
+ </div>
+ </Container>
+ </Layout>
+ );
+ }
+}
diff --git a/app/components/Support.css b/app/components/Support.css
new file mode 100644
index 0000000000..8e8198742c
--- /dev/null
+++ b/app/components/Support.css
@@ -0,0 +1,169 @@
+.support {
+ background: #192E45;
+ height: 100%;
+}
+
+.support__container {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.support__header {
+ flex: 0 0 auto;
+ padding: 40px 24px 24px;
+ position: relative; /* anchor for close button */
+}
+
+.support__close {
+ position: absolute;
+ display: flex;
+ align-items: center;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ top: 24px;
+ left: 12px;
+ z-index: 1; /* part of .support__container covers the button */
+}
+
+.support__close-icon {
+ opacity: 0.6;
+ margin-right: 8px;
+}
+
+.support__close-title {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ color: rgba(255, 255, 255, 0.6);
+}
+
+.support__title {
+ font-family: DINPro;
+ font-size: 32px;
+ font-weight: 900;
+ line-height: 40px;
+ color: #FFFFFF;
+ margin-bottom: 16px;
+}
+
+.support__subtitle {
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: normal;
+ color: rgba(255,255,255,0.8);
+}
+
+.support__content {
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+.support__form {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+
+.support__form-row {
+ padding: 0 24px;
+}
+
+.support__form-row + .support__form-row {
+ margin-top: 8px;
+}
+
+.support__form-row-message {
+ display: flex;
+ flex: 1 1 auto;
+}
+
+.support__form-email {
+ width: 100%;
+ border-radius: 4px;
+ border: 0;
+ overflow: hidden;
+ padding: 10px 12px 12px 12px;
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 26px;
+ color: #294D73;
+ background-color: #fff;
+}
+
+.support__form-email::-webkit-input-placeholder {
+ color: rgba(41,77,115,0.4);
+}
+
+.support__form-message-scroll-wrap {
+ width: 100%;
+ display: flex;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.support__form-message {
+ width: 100%;
+ border: 0;
+ overflow-y: scroll;
+ resize: none;
+ padding: 10px 12px 12px 12px;
+ font-family: "Open Sans";
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 1.4em;
+ color: #294D73;
+ background-color: #fff;
+}
+
+.support__form-message::-webkit-input-placeholder {
+ color: rgba(41,77,115,0.4);
+}
+
+.support__footer {
+ padding: 16px 24px 24px;
+}
+
+.support__footer .button + .button {
+ margin-top: 16px;
+}
+
+.support__sent-email {
+ display: inline;
+ font-weight: 900;
+ color: white;
+}
+
+.support__status-security--secure {
+ font-family: "Open Sans";
+ font-size: 16px;
+ font-weight: 800;
+ line-height: 22px;
+ margin-bottom: 4px;
+ color: #44AD4D;
+ text-transform: uppercase;
+}
+
+.support__send-status {
+ font-family: DINPro;
+ font-size: 38px;
+ font-weight: 900;
+ line-height: 1.16em;
+ max-height: calc(1.16em * 2);
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ letter-spacing: -0.9px;
+ color: #FFFFFF;
+ margin-bottom: 4px;
+}
+
+.support__status-icon {
+ text-align: center;
+ margin-bottom: 32px;
+}
diff --git a/app/components/Support.js b/app/components/Support.js
new file mode 100644
index 0000000000..04e6c7392d
--- /dev/null
+++ b/app/components/Support.js
@@ -0,0 +1,254 @@
+// @flow
+import React, { Component } from 'react';
+import { Layout, Container, Header } from './Layout';
+import ExternalLinkSVG from '../assets/images/icon-extLink.svg';
+
+import type { AccountReduxState } from '../redux/account/reducers';
+
+export type SupportReport = {
+ email: string,
+ message: string,
+ savedReport: ?string,
+};
+
+export type SupportState = {
+ email: string,
+ message: string,
+ savedReport: ?string,
+ sendState: 'INITIAL' | 'LOADING' | 'SUCCESS' | 'FAILED',
+};
+export type SupportProps = {
+ account: AccountReduxState,
+ onClose: () => void;
+ onViewLog: (string) => void;
+ onCollectLog: (Array<string>) => Promise<string>;
+ onSend: (email: string, message: string, savedReport: string) => void;
+};
+
+export default class Support extends Component {
+ props: SupportProps;
+ state: SupportState = {
+ email: '',
+ message: '',
+ savedReport: null,
+ sendState: 'INITIAL',
+ }
+
+ validate() {
+ return this.state.message.trim().length > 0;
+ }
+
+ onChangeEmail = (e: Event) => {
+ const input = e.target;
+ if(!(input instanceof HTMLInputElement)) {
+ throw new Error('input must be an instance of HTMLInputElement');
+ }
+ this.setState({ email: input.value });
+ }
+
+ onChangeDescription = (e: Event) => {
+ const input = e.target;
+ if(!(input instanceof HTMLTextAreaElement)) {
+ throw new Error('input must be an instance of HTMLTextAreaElement');
+ }
+ this.setState({ message: input.value });
+ }
+
+ onViewLog = () => {
+
+ this._getLog()
+ .then((path) => {
+ this.props.onViewLog(path);
+ });
+ }
+
+ _getLog() {
+ const toRedact = [];
+ if (this.props.account.accountToken) {
+ toRedact.push(this.props.account.accountToken.toString());
+ }
+
+ const { savedReport } = this.state;
+ return savedReport ?
+ Promise.resolve(savedReport) :
+ this.props.onCollectLog(toRedact)
+ .then( path => {
+ return new Promise(resolve => this.setState({ savedReport: path }, () => resolve(path)));
+ });
+ }
+
+ onSend = () => {
+ this.setState({
+ sendState: 'LOADING',
+ }, () => {
+ this._getLog()
+ .then((path) => {
+ return this.props.onSend(this.state.email, this.state.message, path);
+ })
+ .then( () => {
+ this.setState({
+ sendState: 'SUCCESS',
+ });
+ })
+ .catch( () => {
+ this.setState({
+ sendState: 'FAILED',
+ });
+ });
+ });
+ }
+
+ render() {
+
+ const header = <div className="support__header">
+ <h2 className="support__title">Report a problem</h2>
+ { this.state.sendState === 'INITIAL' && <div className="support__subtitle">
+ { `To help you more effectively, your app's log file will be attached to this message.
+ Your data will remain secure and private, as it is encrypted & anonymised before sending.` }
+ </div>
+ }
+ </div>;
+
+ const content = this._renderContent();
+
+ return (
+ <Layout>
+ <Header hidden={ true } style={ 'defaultDark' } />
+ <Container>
+ <div className="support">
+ <div className="support__close" onClick={ this.props.onClose }>
+ <img className="support__close-icon" src="./assets/images/icon-back.svg" />
+ <span className="support__close-title">Settings</span>
+ </div>
+ <div className="support__container">
+
+ { header }
+
+ { content }
+
+ </div>
+ </div>
+ </Container>
+ </Layout>
+ );
+ }
+
+ _renderContent() {
+ switch(this.state.sendState) {
+ case 'INITIAL':
+ return this._renderForm();
+ case 'LOADING':
+ return this._renderLoading();
+ case 'SUCCESS':
+ return this._renderSent();
+ case 'FAILED':
+ return this._renderFailed();
+ default:
+ return null;
+ }
+ }
+
+ _renderForm() {
+ return <div className="support__content">
+ <div className="support__form">
+ <div className="support__form-row">
+ <input className="support__form-email"
+ type="email"
+ placeholder="Your email"
+ value={ this.state.email }
+ onChange={ this.onChangeEmail }
+ autoFocus={ true } />
+ </div>
+ <div className="support__form-row support__form-row-message">
+ <div className="support__form-message-scroll-wrap">
+ <textarea className="support__form-message"
+ placeholder="Describe your problem"
+ value={ this.state.message }
+ onChange={ this.onChangeDescription } />
+ </div>
+ </div>
+ <div className="support__footer">
+ <button type="button"
+ className="support__form-view-logs button button--primary"
+ onClick={ this.onViewLog }>
+ <span className="button-label">View app logs</span>
+ <ExternalLinkSVG className="button-icon button-icon--16" />
+ </button>
+ <button type="button"
+ className="support__form-send button button--positive"
+ disabled={ !this.validate() }
+ onClick={ this.onSend }>Send</button>
+ </div>
+ </div>
+ </div>;
+ }
+
+ _renderLoading() {
+ return <div className="support__content">
+
+ <div className="support__form">
+ <div className="support__form-row">
+ <div className="support__status-icon">
+ <img src="./assets/images/icon-spinner.svg" alt="" />
+ </div>
+ <div className="support__status-security--secure">
+ Secure Connection
+ </div>
+ <div className="support__send-status">
+ <span>Sending...</span>
+ </div>
+ </div>
+ </div>
+ </div>;
+ }
+
+ _renderSent() {
+ return <div className="support__content">
+ <div className="support__form">
+ <div className="support__form-row">
+ <div className="support__status-icon">
+ <img src="./assets/images/icon-success.svg" alt="" />
+ </div>
+ <div className="support__status-security--secure">
+ Secure Connection
+ </div>
+ <div className="support__send-status">
+ <span>Sent</span>
+ </div>
+ <div className="support__subtitle">
+ Thanks! We will look into this. If needed we will contact you on {'\u00A0'}
+ <div className="support__sent-email">{ this.state.email }</div>
+ </div>
+ </div>
+ </div>
+ </div>;
+ }
+
+ _renderFailed() {
+ return <div className="support__content">
+ <div className="support__form">
+ <div className="support__form-row">
+ <div className="support__status-icon">
+ <img src="./assets/images/icon-fail.svg" alt="" />
+ </div>
+ <div className="support__status-security--secure">
+ Secure Connection
+ </div>
+ <div className="support__send-status">
+ <span>Failed to send</span>
+ </div>
+ </div>
+ </div>
+ <div className="support__footer">
+ <button type="button"
+ className="support__form-view-logs button button--primary"
+ onClick={ () => this.setState({ sendState: 'INITIAL' }) }>
+ <span className="button-label">Edit message</span>
+ </button>
+ <button type="button"
+ className="support__form-send button button--positive"
+ onClick={ this.onSend }>Try again</button>
+ </div>
+ </div>;
+ }
+}
diff --git a/app/components/Switch.css b/app/components/Switch.css
new file mode 100644
index 0000000000..aaa3821c34
--- /dev/null
+++ b/app/components/Switch.css
@@ -0,0 +1,44 @@
+.switch {
+ display: block;
+ position: relative;
+ -webkit-appearance: none;
+ border-radius: 16px;
+ width: 52px;
+ height: 32px;
+ border: 2px solid white;
+ background-color: transparent;
+ transition: 300ms ease-in-out all;
+}
+
+.switch:checked {
+ text-align: right;
+}
+
+.switch::after {
+ position: absolute;
+ left: 2px;
+ top: 2px;
+ display: block;
+ content: '';
+ width: 24px;
+ height: 24px;
+ border-radius: 24px;
+ background-color: #D0021B;
+ transition: 200ms ease-in-out all;
+ transform: translate3d(0, 0, 0);
+}
+
+.switch:active::after {
+ width: 28px;
+}
+
+.switch:active:checked::after {
+ transform: translate3d(0, 0, 0);
+ left: 18px;
+}
+
+.switch:checked::after {
+ background-color: #44AD4D;
+ transform: translate3d(0, 0, 0);
+ left: 22px;
+} \ No newline at end of file
diff --git a/app/components/Switch.js b/app/components/Switch.js
new file mode 100644
index 0000000000..f0ad3b41bc
--- /dev/null
+++ b/app/components/Switch.js
@@ -0,0 +1,142 @@
+// @flow
+import React, { Component } from 'react';
+
+import type { Point2d } from '../types';
+
+const CLICK_TIMEOUT = 1000;
+const MOVE_THRESHOLD = 10;
+
+export type SwitchProps = {
+ isOn: boolean;
+ onChange: ?((isOn: boolean) => void);
+};
+
+export default class Switch extends Component {
+ props: SwitchProps;
+ static defaultProps: SwitchProps = {
+ isOn: false,
+ onChange: null
+ }
+
+ isCapturingMouseEvents = false;
+ ref: ?HTMLInputElement;
+ onRef = (e: HTMLInputElement) => this.ref = e;
+
+ state = {
+ ignoreChange: false,
+ initialPos: ({x: 0, y: 0}: Point2d),
+ startTime: (null: ?number)
+ }
+
+ handleMouseDown = (e: MouseEvent) => {
+ const { clientX: x, clientY: y } = e;
+ this.startCapturingMouseEvents();
+ this.setState({
+ initialPos: { x, y },
+ startTime: e.timeStamp
+ });
+ }
+
+ handleMouseMove = (e: MouseEvent) => {
+ const inputElement = this.ref;
+ const { x: x0 } = this.state.initialPos;
+ const { clientX: x, clientY: y } = e;
+ const dx = Math.abs(x0 - x);
+
+ if(dx < MOVE_THRESHOLD) {
+ return;
+ }
+
+ const isOn = !!this.props.isOn;
+ let nextOn = isOn;
+
+ if(x < x0 && isOn) {
+ nextOn = false;
+ } else if(x > x0 && !isOn) {
+ nextOn = true;
+ }
+
+ if(isOn !== nextOn) {
+ this.setState({
+ initialPos: { x, y },
+ ignoreChange: true
+ });
+
+ if(inputElement) {
+ inputElement.checked = nextOn;
+ }
+
+ this.notify(nextOn);
+ }
+ }
+
+ handleMouseUp = () => {
+ this.stopCapturingMouseEvents();
+ }
+
+ handleChange = (e: Event) => {
+ const startTime = this.state.startTime;
+ const eventTarget: Object = e.target;
+
+ if(typeof(startTime) !== 'number') {
+ throw new Error('startTime must be a number.');
+ }
+
+ const dt = e.timeStamp - startTime;
+
+ if(this.state.ignoreChange) {
+ this.setState({ ignoreChange: false });
+ e.preventDefault();
+ } else if(dt > CLICK_TIMEOUT) {
+ e.preventDefault();
+ } else {
+ this.notify(eventTarget.checked);
+ }
+ }
+
+ notify(isOn: boolean) {
+ const onChange = this.props.onChange;
+ if(onChange) {
+ onChange(isOn);
+ }
+ }
+
+ startCapturingMouseEvents() {
+ if(this.isCapturingMouseEvents) {
+ throw new Error('startCapturingMouseEvents() is called out of order.');
+ }
+ document.addEventListener('mousemove', this.handleMouseMove);
+ document.addEventListener('mouseup', this.handleMouseUp);
+ this.isCapturingMouseEvents = true;
+ }
+
+ stopCapturingMouseEvents() {
+ if(!this.isCapturingMouseEvents) {
+ throw new Error('stopCapturingMouseEvents() is called out of order.');
+ }
+ document.removeEventListener('mousemove', this.handleMouseMove);
+ document.removeEventListener('mouseup', this.handleMouseUp);
+ this.isCapturingMouseEvents = false;
+ }
+
+ componentWillUnmount() {
+ // guard from abrupt programmatic unmount
+ if(this.isCapturingMouseEvents) {
+ this.stopCapturingMouseEvents();
+ }
+ }
+
+ render(): React.Element<*> {
+ const { isOn, onChange, ...otherProps } = this.props; // eslint-disable-line no-unused-vars
+ let className = ('switch' + ' ' + (otherProps.className || '')).trim();
+ return (
+ <input { ...otherProps }
+ type="checkbox"
+ ref={ this.onRef }
+ className={ className }
+ checked={ isOn }
+ onMouseDown={ this.handleMouseDown }
+ onChange={ this.handleChange } />
+ );
+ }
+}
diff --git a/app/components/WindowChrome.css b/app/components/WindowChrome.css
new file mode 100644
index 0000000000..8f3fcdb52c
--- /dev/null
+++ b/app/components/WindowChrome.css
@@ -0,0 +1,6 @@
+/* macOS app runs as menubar; create an app chrome with arrow using mask */
+.window-chrome--darwin {
+ -webkit-mask:
+ url(../assets/images/app-triangle.svg) 50% 0% no-repeat,
+ url(../assets/images/app-header-backdrop.svg) no-repeat;
+} \ No newline at end of file
diff --git a/app/components/WindowChrome.js b/app/components/WindowChrome.js
new file mode 100644
index 0000000000..d7094813db
--- /dev/null
+++ b/app/components/WindowChrome.js
@@ -0,0 +1,16 @@
+// @flow
+import React, { Component } from 'react';
+
+export default class WindowChrome extends Component {
+ props: {
+ children: Array<React.Element<*>> | React.Element<*>
+ }
+ render(): React.Element<*> {
+ const chromeClass = ['window-chrome', 'window-chrome--' + process.platform];
+ return (
+ <div className={ chromeClass.join(' ') }>
+ { this.props.children }
+ </div>
+ );
+ }
+} \ No newline at end of file
diff --git a/app/config.json b/app/config.json
new file mode 100644
index 0000000000..ed984c0642
--- /dev/null
+++ b/app/config.json
@@ -0,0 +1,220 @@
+{
+ "mapbox": {
+ "accessToken": "pk.eyJ1IjoibWpob21lciIsImEiOiJjaXd3NmdmNHEwMGtvMnlvMGl3b3R5aGcwIn0.SqIPBcCP6-b9yjxCD32CNg",
+ "styleURL": "mapbox://styles/mjhomer/cizjoenga006f2smnm9z52u8e"
+ },
+ "links": {
+ "createAccount": "https://mullvad.net/account/create/",
+ "purchase": "https://mullvad.net/account/",
+ "faq": "https://mullvad.net/faq/",
+ "guides": "https://mullvad.net/guides/",
+ "supportEmail": "mailto:support@mullvad.net"
+ },
+ "defaultServer": "193.138.218.135",
+ "servers": {
+ "168.1.6.5": {
+ "address": "168.1.6.5",
+ "name": "Australia",
+ "city": "Sydney",
+ "country": "Australia"
+ },
+ "217.64.127.138": {
+ "address": "217.64.127.138",
+ "name": "Austria",
+ "city": "Wien",
+ "country": "Austria"
+ },
+ "185.104.186.202": {
+ "address": "185.104.186.202",
+ "name": "Belgium",
+ "city": "Brussels",
+ "country": "Belgium"
+ },
+ "185.94.192.42": {
+ "address": "185.94.192.42",
+ "name": "Bulgaria",
+ "city": "Sofia",
+ "country": "Bulgaria"
+ },
+ "162.219.176.250": {
+ "address": "162.219.176.250",
+ "name": "Canada",
+ "city": "Toronto",
+ "country": "Canada",
+ "location": [
+ 45.42153,
+ -75.697193
+ ]
+ },
+ "185.156.174.146": {
+ "address": "185.156.174.146",
+ "name": "Czech Republic",
+ "city": "Prague",
+ "country": "Czech Republic"
+ },
+ "82.103.140.213": {
+ "address": "82.103.140.213",
+ "name": "Denmark",
+ "city": "Copenhagen",
+ "country": "Denmark",
+ "location": [
+ 55.6760968,
+ 12.5683371
+ ]
+ },
+ "185.103.110.69": {
+ "address": "185.103.110.69",
+ "name": "Finland",
+ "city": "Helsinki",
+ "country": "Finland"
+ },
+ "185.156.173.218": {
+ "address": "185.156.173.218",
+ "name": "France",
+ "city": "Paris",
+ "country": "France"
+ },
+ "185.104.184.178": {
+ "address": "185.104.184.178",
+ "name": "Germany",
+ "city": "Berlin",
+ "country": "Germany",
+ "location": [
+ 52.52000659999999,
+ 13.404954
+ ]
+ },
+ "161.202.48.245": {
+ "address": "161.202.48.245",
+ "name": "Hong Kong",
+ "city": "Hong Kong",
+ "country": "Hong Kong"
+ },
+ "185.189.114.10": {
+ "address": "185.189.114.10",
+ "name": "Hungary",
+ "city": "Budapest",
+ "country": "Hungary"
+ },
+ "213.184.122.34": {
+ "address": "213.184.122.34",
+ "name": "Israel",
+ "city": "Petach-Tikva",
+ "country": "Israel"
+ },
+ "217.64.113.180": {
+ "address": "217.64.113.180",
+ "name": "Italy",
+ "city": "Milan",
+ "country": "Italy"
+ },
+ "161.202.144.203": {
+ "address": "161.202.144.203",
+ "name": "Japan",
+ "city": "Tokyo",
+ "country": "Japan"
+ },
+ "185.65.134.140": {
+ "address": "185.65.134.140",
+ "name": "Netherlands",
+ "city": "Amsterdam",
+ "country": "Netherlands",
+ "location": [
+ 52.3702157,
+ 4.895167900000001
+ ]
+ },
+ "31.169.51.154": {
+ "address": "31.169.51.154",
+ "name": "Norway",
+ "city": "Oslo",
+ "country": "Norway",
+ "location": [
+ 59.9138688,
+ 10.7522454
+ ]
+ },
+ "212.7.217.30": {
+ "address": "212.7.217.30",
+ "name": "Poland",
+ "city": "Warsaw",
+ "country": "Poland"
+ },
+ "185.45.13.10": {
+ "address": "185.45.13.10",
+ "name": "Romania",
+ "city": "Bucharest",
+ "country": "Romania",
+ "location": [
+ 44.4267674,
+ 26.1025384
+ ]
+ },
+ "103.57.72.30": {
+ "address": "103.57.72.30",
+ "name": "Singapore",
+ "city": "Singapore",
+ "country": "Singapore",
+ "location": [
+ 1.352083,
+ 103.819836
+ ]
+ },
+ "89.238.178.34": {
+ "address": "89.238.178.34",
+ "name": "Spain",
+ "city": "Madrid",
+ "country": "Spain",
+ "location": [
+ 40.4167754,
+ -3.7037902
+ ]
+ },
+ "185.213.152.132": {
+ "address": "185.213.152.132",
+ "name": "Sweden - Helsingborg",
+ "city": "Helsingborg",
+ "country": "Sweden"
+ },
+ "193.138.218.135": {
+ "address": "193.138.218.135",
+ "name": "Sweden - Malmö",
+ "city": "Malmö",
+ "country": "Sweden"
+ },
+ "185.65.135.143": {
+ "address": "185.65.135.143",
+ "name": "Sweden - Stockholm",
+ "city": "Stockholm",
+ "country": "Sweden"
+ },
+ "179.43.128.170": {
+ "address": "179.43.128.170",
+ "name": "Switzerland",
+ "city": "Zürich",
+ "country": "Switzerland"
+ },
+ "185.16.85.170": {
+ "address": "185.16.85.170",
+ "name": "United Kingdom",
+ "city": "London",
+ "country": "United Kingdom",
+ "location": [
+ 51.5073509,
+ -0.1277583
+ ]
+ },
+ "173.199.80.130": {
+ "address": "173.199.80.130",
+ "name": "USA - Los Angeles",
+ "city": "Los Angeles",
+ "country": "USA"
+ },
+ "38.132.107.138": {
+ "address": "38.132.107.138",
+ "name": "USA - New York",
+ "city": "New York",
+ "country": "USA"
+ }
+ }
+}
diff --git a/app/containers/AccountPage.js b/app/containers/AccountPage.js
new file mode 100644
index 0000000000..1727c1e5be
--- /dev/null
+++ b/app/containers/AccountPage.js
@@ -0,0 +1,22 @@
+import { connect } from 'react-redux';
+import { bindActionCreators } from 'redux';
+import { push } from 'react-router-redux';
+import Account from '../components/Account';
+import accountActions from '../redux/account/actions';
+import { shell } from 'electron';
+import { links } from '../config';
+
+const mapStateToProps = (state) => {
+ return state;
+};
+
+const mapDispatchToProps = (dispatch, props) => {
+ const { logout } = bindActionCreators(accountActions, dispatch);
+ return {
+ onLogout: () => logout(props.backend),
+ onClose: () => dispatch(push('/settings')),
+ onBuyMore: () => shell.openExternal(links['purchase'])
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Account);
diff --git a/app/containers/AdvancedSettingsPage.js b/app/containers/AdvancedSettingsPage.js
new file mode 100644
index 0000000000..ecb78eb218
--- /dev/null
+++ b/app/containers/AdvancedSettingsPage.js
@@ -0,0 +1,55 @@
+import { connect } from 'react-redux';
+import { push } from 'react-router-redux';
+import { AdvancedSettings } from '../components/AdvancedSettings';
+import settingsActions from '../redux/settings/actions';
+import log from 'electron-log';
+
+const mapStateToProps = (state) => {
+ const contraints = state.settings.relayConstraints;
+ return {
+ protocol: anyToAuto(contraints.protocol),
+ port: anyToAuto(contraints.port),
+ };
+};
+
+function anyToAuto(constraint) {
+ if (constraint === 'any') {
+ return 'Automatic';
+ } else {
+ return constraint;
+ }
+}
+
+const mapDispatchToProps = (dispatch, props) => {
+ const { backend } = props;
+ return {
+ onClose: () => dispatch(push('/settings')),
+
+ updateConstraints: (protocol, port) => {
+
+ const protConstraint = protocol === 'Automatic'
+ ? 'any'
+ : { only: protocol.toLowerCase() };
+
+ const portConstraint = port === 'Automatic'
+ ? 'any'
+ : { only: port };
+
+ const update = {
+ tunnel: { openvpn: {
+ protocol: protConstraint,
+ port: portConstraint,
+ }},
+ };
+
+ backend.updateRelayConstraints(update)
+ .then( () => dispatch(settingsActions.updateRelay({
+ port: typeof(portConstraint) === 'object' ? portConstraint.only : portConstraint,
+ protocol: typeof(protConstraint) === 'object' ? protConstraint.only : protConstraint,
+ })))
+ .catch( e => log.error('Failed updating relay constraints', e.message));
+ },
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(AdvancedSettings);
diff --git a/app/containers/ConnectPage.js b/app/containers/ConnectPage.js
new file mode 100644
index 0000000000..5c6dc1fa60
--- /dev/null
+++ b/app/containers/ConnectPage.js
@@ -0,0 +1,32 @@
+import { connect } from 'react-redux';
+import { bindActionCreators } from 'redux';
+import { push } from 'react-router-redux';
+import { shell } from 'electron';
+import { links } from '../config';
+import Connect from '../components/Connect';
+import connectActions from '../redux/connection/actions';
+
+const mapStateToProps = (state) => {
+ return {
+ accountExpiry: state.account.expiry,
+ connection: state.connection,
+ settings: state.settings,
+ };
+};
+
+const mapDispatchToProps = (dispatch, props) => {
+ const { connect, disconnect, copyIPAddress } = bindActionCreators(connectActions, dispatch);
+ const { backend } = props;
+
+ return {
+ onSettings: () => dispatch(push('/settings')),
+ onSelectLocation: () => dispatch(push('/select-location')),
+ onConnect: (relayEndpoint) => connect(backend, relayEndpoint),
+ onCopyIP: () => copyIPAddress(),
+ onDisconnect: () => disconnect(backend),
+ onExternalLink: (type) => shell.openExternal(links[type]),
+ getServerInfo: (key) => backend.serverInfo(key)
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Connect);
diff --git a/app/containers/LoginPage.js b/app/containers/LoginPage.js
new file mode 100644
index 0000000000..457be7a6f2
--- /dev/null
+++ b/app/containers/LoginPage.js
@@ -0,0 +1,22 @@
+import { shell } from 'electron';
+import { connect } from 'react-redux';
+import { bindActionCreators } from 'redux';
+import { push } from 'react-router-redux';
+import Login from '../components/Login';
+import accountActions from '../redux/account/actions';
+import { links } from '../config';
+
+const mapStateToProps = (state) => state;
+const mapDispatchToProps = (dispatch, props) => {
+ const { login } = bindActionCreators(accountActions, dispatch);
+ const { backend } = props;
+ return {
+ onSettings: () => dispatch(push('/settings')),
+ onLogin: (account) => login(backend, account),
+ onFirstChangeAfterFailure: () => dispatch(accountActions.resetLoginError()),
+ onExternalLink: (type) => shell.openExternal(links[type]),
+ onAccountTokenChange: (token) => dispatch(accountActions.updateAccountToken(token)),
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Login);
diff --git a/app/containers/SelectLocationPage.js b/app/containers/SelectLocationPage.js
new file mode 100644
index 0000000000..7ca2f1eb0a
--- /dev/null
+++ b/app/containers/SelectLocationPage.js
@@ -0,0 +1,36 @@
+import { connect } from 'react-redux';
+import { push } from 'react-router-redux';
+import SelectLocation from '../components/SelectLocation';
+import settingsActions from '../redux/settings/actions';
+import log from 'electron-log';
+
+const mapStateToProps = (state) => state;
+const mapDispatchToProps = (dispatch, props) => {
+ const { backend } = props;
+ return {
+ onClose: () => dispatch(push('/connect')),
+ onSelect: (preferredServer) => {
+
+ dispatch(push('/connect'));
+
+ // add delay to let the map load
+ setTimeout(() => {
+ const update = {
+ host: { only: preferredServer },
+ tunnel: { openvpn: {
+ }},
+ };
+
+ backend.updateRelayConstraints(update)
+ .then( () => dispatch(settingsActions.updateRelay({
+ host: preferredServer,
+ })))
+ .then( () => backend.connect())
+ .catch( e => log.error('Failed updating relay constraints', e.message));
+
+ }, 600);
+ }
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(SelectLocation);
diff --git a/app/containers/SettingsPage.js b/app/containers/SettingsPage.js
new file mode 100644
index 0000000000..72eafb9431
--- /dev/null
+++ b/app/containers/SettingsPage.js
@@ -0,0 +1,22 @@
+import { connect } from 'react-redux';
+import { push } from 'react-router-redux';
+import Settings from '../components/Settings';
+import { remote, shell } from 'electron';
+import { links } from '../config';
+
+const mapStateToProps = (state) => {
+ return state;
+};
+
+const mapDispatchToProps = (dispatch, _props) => {
+ return {
+ onQuit: () => remote.app.quit(),
+ onClose: () => dispatch(push('/connect')),
+ onViewAccount: () => dispatch(push('/settings/account')),
+ onViewSupport: () => dispatch(push('/settings/support')),
+ onViewAdvancedSettings: () => dispatch(push('/settings/advanced')),
+ onExternalLink: (type) => shell.openExternal(links[type]),
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Settings);
diff --git a/app/containers/SupportPage.js b/app/containers/SupportPage.js
new file mode 100644
index 0000000000..4d802183d7
--- /dev/null
+++ b/app/containers/SupportPage.js
@@ -0,0 +1,88 @@
+import log from 'electron-log';
+import { shell, ipcRenderer } from 'electron';
+import { connect } from 'react-redux';
+import { push } from 'react-router-redux';
+import Support from '../components/Support';
+import { resolveBin } from '../lib/proc';
+import { execFile } from 'child_process';
+import uuid from 'uuid';
+
+const mapStateToProps = (state) => {
+ return state;
+};
+
+const unAnsweredIpcCalls = new Map();
+function reapIpcCall(id) {
+ const promise = unAnsweredIpcCalls.get(id);
+ unAnsweredIpcCalls.delete(id);
+
+ if (promise) {
+ promise.reject(new Error('Timed out'));
+ }
+}
+ipcRenderer.on('collect-logs-reply', (_event, id, err, reportId) => {
+ const promise = unAnsweredIpcCalls.get(id);
+ unAnsweredIpcCalls.delete(id);
+
+ if (err) {
+ promise.reject(err);
+ } else if (promise) {
+ promise.resolve(reportId);
+ }
+});
+
+const mapDispatchToProps = (dispatch, _props) => {
+ return {
+ onClose: () => dispatch(push('/settings')),
+
+ onCollectLog: (toRedact) => {
+ return new Promise((resolve, reject) => {
+
+ const id = uuid.v4();
+ unAnsweredIpcCalls.set(id, { resolve, reject });
+ ipcRenderer.send('collect-logs', id, toRedact);
+ setTimeout(() => reapIpcCall(id), 1000);
+ })
+ .catch((e) => {
+ const { err, stdout } = e;
+ log.error('Failed collecting problem report', err);
+ log.error(' stdout: ' + stdout);
+
+ throw e;
+ });
+ },
+
+ onViewLog: (path) => shell.openItem(path),
+
+ onSend: (email, message, savedReport) => {
+
+ const args = ['send',
+ '--email', email,
+ '--message', message,
+ '--report', savedReport,
+ ];
+
+ const binPath = resolveBin('problem-report');
+
+ return new Promise((resolve, reject) => {
+ execFile(binPath, args, { windowsHide: true }, (err, stdout, stderr) => {
+ if (err) {
+ reject({ err, stdout, stderr });
+ } else {
+ log.debug('Report sent');
+ resolve();
+ }
+ });
+ })
+ .catch((e) => {
+ const { err, stdout } = e;
+ log.error('Failed sending problem report', err);
+ log.error(' stdout: ' + stdout);
+
+ throw e;
+ });
+ }
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Support);
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 0000000000..e0ac17cd31
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Mullvad VPN</title>
+ <link rel="stylesheet" href="./assets/css/style.css" />
+ </head>
+ <body>
+ <div id="app"></div>
+ <script src="./app.js" data-container="#app"></script>
+ <script>
+ if (process.env.BROWSER_SYNC_CLIENT_URL) {
+ const current = document.currentScript;
+ const script = document.createElement('script');
+ script.src = process.env.BROWSER_SYNC_CLIENT_URL;
+ script.async = true;
+ current.parentNode.insertBefore(script, current);
+ }
+ </script>
+ </body>
+</html>
diff --git a/app/lib/backend.js b/app/lib/backend.js
new file mode 100644
index 0000000000..7e5e21708f
--- /dev/null
+++ b/app/lib/backend.js
@@ -0,0 +1,424 @@
+// @flow
+
+import log from 'electron-log';
+import EventEmitter from 'events';
+import { servers } from '../config';
+import { IpcFacade, RealIpc } from './ipc-facade';
+import accountActions from '../redux/account/actions';
+import connectionActions from '../redux/connection/actions';
+import settingsActions from '../redux/settings/actions';
+import { push } from 'react-router-redux';
+import { defaultServer } from '../config';
+
+import type { ReduxStore } from '../redux/store';
+import type { BackendState, RelayConstraintsUpdate } from './ipc-facade';
+import type { ConnectionState } from '../redux/connection/reducers';
+
+export type EventType = 'connect' | 'connecting' | 'disconnect' | 'login' | 'logging' | 'logout' | 'updatedIp' | 'updatedLocation' | 'updatedReachability';
+export type ErrorType = 'NO_CREDIT' | 'NO_INTERNET' | 'INVALID_ACCOUNT' | 'NO_ACCOUNT';
+
+export type ServerInfo = {
+ address: string,
+ name: string,
+ city: string,
+ country: string,
+ location: [number, number]
+};
+
+export type ServerInfoList = { [string]: ServerInfo };
+
+export class BackendError extends Error {
+ type: ErrorType;
+ title: string;
+ message: string;
+
+ constructor(type: ErrorType) {
+ super('');
+ this.type = type;
+ this.title = BackendError.localizedTitle(type);
+ this.message = BackendError.localizedMessage(type);
+ }
+
+ static localizedTitle(type: ErrorType): string {
+ switch(type) {
+ case 'NO_CREDIT':
+ return 'Out of time';
+ case 'NO_INTERNET':
+ return 'Offline';
+ default:
+ return 'Something went wrong';
+ }
+ }
+
+ static localizedMessage(type: ErrorType): string {
+ switch(type) {
+ case 'NO_CREDIT':
+ return 'Buy more time, so you can continue using the internet securely';
+ case 'NO_INTERNET':
+ return 'Your internet connection will be secured when you get back online';
+ case 'INVALID_ACCOUNT':
+ return 'Invalid account number';
+ case 'NO_ACCOUNT':
+ return 'No account was set';
+ default:
+ return '';
+ }
+ }
+
+}
+
+
+export type IpcCredentials = {
+ connectionString: string,
+ sharedSecret: string,
+};
+export function parseIpcCredentials(data: string): ?IpcCredentials {
+ const [connectionString, sharedSecret] = data.split('\n', 2);
+ if(connectionString && sharedSecret) {
+ return {
+ connectionString,
+ sharedSecret,
+ };
+ } else {
+ return null;
+ }
+}
+
+
+/**
+ * Backend implementation
+ */
+export class Backend {
+
+ _ipc: IpcFacade;
+ _credentials: ?IpcCredentials;
+ _authenticationPromise: ?Promise<void>;
+ _store: ReduxStore;
+ _eventEmitter = new EventEmitter();
+
+ constructor(store: ReduxStore, credentials?: IpcCredentials, ipc: ?IpcFacade) {
+ this._store = store;
+ this._credentials = credentials;
+
+
+ if(ipc) {
+ this._ipc = ipc;
+
+ // force to re-authenticate when connection closed
+ this._ipc.setCloseConnectionHandler(() => {
+ this._authenticationPromise = null;
+ });
+
+ this._registerIpcListeners();
+ this._startReachability();
+ }
+ }
+
+ setCredentials(credentials: IpcCredentials) {
+ log.debug('Got connection info to backend', credentials.connectionString);
+ this._credentials = credentials;
+
+ if (this._ipc) {
+ this._credentials = credentials;
+ } else {
+ this._ipc = new RealIpc(credentials.connectionString);
+
+ // force to re-authenticate when connection closed
+ this._ipc.setCloseConnectionHandler(() => {
+ this._authenticationPromise = null;
+ });
+ }
+ this._registerIpcListeners();
+ }
+
+ sync() {
+ log.info('Syncing with the backend...');
+
+ this._ensureAuthenticated()
+ .then( () => {
+ this._ipc.getIp()
+ .then( ip => {
+ log.info('Got ip', ip);
+ this._store.dispatch(connectionActions.newPublicIp(ip));
+ })
+ .catch(e => {
+ log.info('Failed syncing with the backend,', e.message);
+ });
+ });
+
+ this._ensureAuthenticated()
+ .then( () => {
+ this._ipc.getLocation()
+ .then( location => {
+ log.info('Got location', location);
+ const newLocation = {
+ location: location.latlong,
+ country: location.country,
+ city: location.city
+ };
+ this._store.dispatch(connectionActions.newLocation(newLocation));
+ })
+ .catch(e => {
+ log.info('Failed getting new location,', e.message);
+ });
+ });
+ }
+
+ serverInfo(identifier: string): ?ServerInfo {
+ return (servers: ServerInfoList)[identifier];
+ }
+
+ login(accountToken: string): Promise<void> {
+ log.debug('Attempting to login with account number', accountToken);
+
+ this._store.dispatch(accountActions.startLogin(accountToken));
+
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.getAccountData(accountToken)
+ .then( response => {
+ log.debug('Account exists', response);
+
+ return this._ipc.setAccount(accountToken)
+ .then( () => response );
+
+ }).then( accountData => {
+ log.info('Log in complete');
+
+ this._store.dispatch(accountActions.loginSuccessful(accountData.expiry));
+
+ // Redirect the user after some time to allow for
+ // the 'Login Successful' screen to be visible
+ setTimeout(() => {
+ this._store.dispatch(push('/connect'));
+ this.connect();
+ }, 1000);
+ }).catch(e => {
+ log.error('Failed to log in,', e.message);
+
+ // TODO: This is not true. If there is a communication link failure the promise will be rejected too
+ const err = new BackendError('INVALID_ACCOUNT');
+ this._store.dispatch(accountActions.loginFailed(err));
+ });
+ });
+ }
+
+ autologin() {
+ log.debug('Attempting to log in automatically');
+
+ this._store.dispatch(accountActions.startLogin());
+
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.getAccount()
+ .then( accountToken => {
+ if (!accountToken) {
+ throw new BackendError('NO_ACCOUNT');
+ }
+ log.debug('The backend had an account number stored:', accountToken);
+ this._store.dispatch(accountActions.startLogin(accountToken));
+
+ return this._ipc.getAccountData(accountToken);
+ })
+ .then( accountData => {
+ log.debug('The stored account number still exists', accountData);
+
+ this._store.dispatch(accountActions.loginSuccessful(accountData.expiry));
+
+ this._store.dispatch(push('/connect'));
+ this.connect();
+ })
+ .catch( e => {
+ log.warn('Unable to autologin,', e.message);
+
+ this._store.dispatch(accountActions.autoLoginFailed());
+ this._store.dispatch(push('/'));
+
+ throw e;
+ });
+ });
+ }
+
+ logout() {
+ // @TODO: What does it mean for a logout to be successful or failed?
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.setAccount(null)
+ .then(() => {
+
+ this._store.dispatch(accountActions.loggedOut());
+
+ // disconnect user during logout
+ return this.disconnect()
+ .then( () => {
+ this._store.dispatch(push('/'));
+ });
+ })
+ .catch(e => {
+ log.info('Failed to logout,', e.message);
+ });
+ });
+ }
+
+ connect(aHost?: string): Promise<void> {
+ const host = aHost;
+
+ let setHostPromise = () => Promise.resolve();
+ if (host) {
+ this._store.dispatch(connectionActions.connectingTo(host || 'unknown'));
+ setHostPromise = () => this._ipc.updateRelayConstraints({
+ host: { only: host },
+ tunnel: { openvpn: {
+ }},
+ });
+ }
+
+ return this._ensureAuthenticated()
+ .then( setHostPromise )
+ .then( () => this._ipc.connect() )
+ .catch(e => {
+ log.info('Failed connecting to the relay set in the backend, ', e.message);
+ this._store.dispatch(connectionActions.disconnected());
+ });
+ }
+
+ disconnect(): Promise<void> {
+ // @TODO: Failure modes
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.disconnect()
+ .catch(e => {
+ log.info('Failed to disconnect,', e.message);
+ });
+ });
+ }
+
+ shutdown(): Promise<void> {
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.shutdown();
+ });
+ }
+
+ updateRelayConstraints(relayConstraints: RelayConstraintsUpdate): Promise<void> {
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.updateRelayConstraints(relayConstraints);
+ });
+ }
+
+ syncRelayConstraints(): Promise<void> {
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.getRelayContraints();
+ })
+ .then( constraints => {
+ log.debug('Got constraints from backend', constraints);
+
+ const host = constraints.host === 'any'
+ ? defaultServer
+ : constraints.host.only || defaultServer;
+
+ const openvpn = constraints.tunnel.openvpn;
+ this._store.dispatch(settingsActions.updateRelay({
+ host: host,
+ port: this._apiToReduxConstraints(openvpn.port),
+ protocol: this._apiToReduxConstraints(openvpn.protocol),
+ }));
+ })
+ .catch( e => {
+ log.error('Failed getting relay constraints', e);
+ });
+ }
+
+ _apiToReduxConstraints(constraint: *): * {
+ if (typeof(constraint) === 'object') {
+ return constraint.only;
+ } else {
+ return constraint;
+ }
+ }
+
+ /**
+ * Start reachability monitoring for online/offline detection
+ * This is currently done via HTML5 APIs but will be replaced later
+ * with proper backend integration.
+ */
+ _startReachability() {
+ window.addEventListener('online', () => {
+ this._store.dispatch(connectionActions.online());
+ });
+ window.addEventListener('offline', () => {
+ // force disconnect since there is no real connection anyway.
+ this.disconnect();
+ this._store.dispatch(connectionActions.offline());
+ });
+
+ // update online status in background
+ setTimeout(() => {
+ const action = navigator.onLine
+ ? connectionActions.online()
+ : connectionActions.offline();
+
+ this._store.dispatch(action);
+ }, 0);
+ }
+
+ _registerIpcListeners() {
+ return this._ensureAuthenticated()
+ .then( () => {
+ return this._ipc.registerStateListener(newState => {
+ log.debug('Got new state from backend', newState);
+
+ const newStatus = this._securityStateToConnectionState(newState);
+ switch(newStatus) {
+ case 'connecting':
+ this._store.dispatch(connectionActions.connecting());
+ break;
+ case 'connected':
+ this._store.dispatch(connectionActions.connected());
+ break;
+ case 'disconnected':
+ this._store.dispatch(connectionActions.disconnected());
+ break;
+ }
+
+ this.sync();
+ });
+ });
+ }
+
+ _securityStateToConnectionState(backendState: BackendState): ConnectionState {
+ if (backendState.state === 'unsecured' && backendState.target_state === 'secured') {
+ return 'connecting';
+ } else if (backendState.state === 'secured' && backendState.target_state === 'secured') {
+ return 'connected';
+ } else if (backendState.target_state === 'unsecured') {
+ return 'disconnected';
+ }
+ throw new Error('Unsupported state/target state combination: ' + JSON.stringify(backendState));
+ }
+
+ _ensureAuthenticated(): Promise<void> {
+ const credentials = this._credentials;
+ if(credentials) {
+ if(!this._authenticationPromise) {
+ this._authenticationPromise = this._authenticate(credentials.sharedSecret);
+ }
+ return this._authenticationPromise;
+ } else {
+ return Promise.reject(new Error('Missing authentication credentials.'));
+ }
+ }
+
+ _authenticate(sharedSecret: string): Promise<void> {
+ return this._ipc.authenticate(sharedSecret)
+ .then(() => {
+ log.info('Authenticated with backend');
+ })
+ .catch((e) => {
+ log.error('Failed to authenticate with backend: ', e.message);
+ throw e;
+ });
+ }
+}
diff --git a/app/lib/formatters.js b/app/lib/formatters.js
new file mode 100644
index 0000000000..89d45d44a0
--- /dev/null
+++ b/app/lib/formatters.js
@@ -0,0 +1,9 @@
+// @flow
+export const formatAccount = (val: string): string => {
+ // display number altogether when longer than 12
+ if(val.length > 12) {
+ return val;
+ }
+ // display quartets
+ return val.replace(/([0-9]{4})/g, '$1 ').trim();
+}; \ No newline at end of file
diff --git a/app/lib/ipc-facade.js b/app/lib/ipc-facade.js
new file mode 100644
index 0000000000..5b67dcb76f
--- /dev/null
+++ b/app/lib/ipc-facade.js
@@ -0,0 +1,221 @@
+// @flow
+
+import JsonRpcWs, { InvalidReply } from './jsonrpc-ws-ipc';
+import { object, string, arrayOf, number, enumeration, oneOf } from 'validated/schema';
+import { validate } from 'validated/object';
+
+import type { Coordinate2d } from '../types';
+
+export type AccountData = {expiry: string};
+export type AccountToken = string;
+export type Ip = string;
+export type Location = {
+ latlong: Coordinate2d,
+ country: string,
+ city: string,
+};
+const LocationSchema = object({
+ latlong: arrayOf(number),
+ country: string,
+ city: string,
+});
+
+export type SecurityState = 'secured' | 'unsecured';
+export type BackendState = {
+ state: SecurityState,
+ target_state: SecurityState,
+};
+type RelayConstraints = {
+ host: 'any' | { only: string },
+ tunnel: {
+ openvpn: {
+ port: 'any' | { only: number },
+ protocol: 'any' | { only: 'tcp' | 'udp' },
+ },
+ },
+};
+export type RelayConstraintsUpdate = {
+ host?: 'any' | { only: string },
+ tunnel: {
+ openvpn: {
+ port?: 'any' | { only: number },
+ protocol?: 'any' | { only: 'tcp' | 'udp' },
+ },
+ },
+};
+const Constraint = (v) => oneOf(string, object({
+ only: v,
+}));
+const RelayConstraintsSchema = object({
+ host: Constraint(string),
+ tunnel: object({
+ openvpn: object({
+ port: Constraint(number),
+ protocol: Constraint(enumeration('udp', 'tcp')),
+ }),
+ }),
+});
+
+
+export interface IpcFacade {
+ setConnectionString(string): void,
+ getAccountData(AccountToken): Promise<AccountData>,
+ getAccount(): Promise<?AccountToken>,
+ setAccount(accountToken: ?AccountToken): Promise<void>,
+ updateRelayConstraints(RelayConstraintsUpdate): Promise<void>,
+ getRelayContraints(): Promise<RelayConstraints>,
+ connect(): Promise<void>,
+ disconnect(): Promise<void>,
+ shutdown(): Promise<void>,
+ getIp(): Promise<Ip>,
+ getLocation(): Promise<Location>,
+ getState(): Promise<BackendState>,
+ registerStateListener((BackendState) => void): void,
+ setCloseConnectionHandler(() => void): void,
+ authenticate(sharedSecret: string): Promise<void>,
+}
+
+export class RealIpc implements IpcFacade {
+
+ _ipc: JsonRpcWs;
+
+ constructor(connectionString: string) {
+ this._ipc = new JsonRpcWs(connectionString);
+ }
+
+ setConnectionString(str: string) {
+ this._ipc.setConnectionString(str);
+ }
+
+ getAccountData(accountToken: AccountToken): Promise<AccountData> {
+ // send the IPC with 30s timeout since the backend will wait
+ // for a HTTP request before replying
+
+ return this._ipc.send('get_account_data', accountToken, 30000)
+ .then(raw => {
+ if (typeof raw === 'object' && raw && raw.expiry) {
+ return raw;
+ } else {
+ throw new InvalidReply(raw, 'Expected an object with expiry');
+ }
+ });
+ }
+
+ getAccount(): Promise<?AccountToken> {
+ return this._ipc.send('get_account')
+ .then( raw => {
+ if (raw === undefined || raw === null || typeof raw === 'string') {
+ return raw;
+ } else {
+ throw new InvalidReply(raw);
+ }
+ });
+ }
+
+ setAccount(accountToken: ?AccountToken): Promise<void> {
+ return this._ipc.send('set_account', accountToken)
+ .then(this._ignoreResponse);
+ }
+
+ _ignoreResponse(_response: mixed): void {
+ return;
+ }
+
+ updateRelayConstraints(relayConstraints: RelayConstraintsUpdate): Promise<void> {
+ return this._ipc.send('update_relay_constraints', [relayConstraints])
+ .then(this._ignoreResponse);
+ }
+
+ getRelayContraints(): Promise<RelayConstraints> {
+ return this._ipc.send('get_relay_constraints')
+ .then( raw => {
+ try {
+ const validated: any = validate(RelayConstraintsSchema, raw);
+ return (validated: RelayConstraints);
+ } catch (e) {
+ throw new InvalidReply(raw, e);
+ }
+ });
+ }
+
+ connect(): Promise<void> {
+ return this._ipc.send('connect')
+ .then(this._ignoreResponse);
+ }
+
+ disconnect(): Promise<void> {
+ return this._ipc.send('disconnect')
+ .then(this._ignoreResponse);
+ }
+
+ shutdown(): Promise<void> {
+ return this._ipc.send('shutdown')
+ .then(this._ignoreResponse);
+ }
+
+ getIp(): Promise<Ip> {
+ return this._ipc.send('get_ip')
+ .then(raw => {
+ if (typeof raw === 'string' && raw) {
+ return raw;
+ } else {
+ throw new InvalidReply(raw, 'Expected a string');
+ }
+ });
+ }
+
+ getLocation(): Promise<Location> {
+ return this._ipc.send('get_location')
+ .then(raw => {
+ try {
+ const validated: any = validate(LocationSchema, raw);
+ return (validated: Location);
+ } catch (e) {
+ throw new InvalidReply(raw, e);
+ }
+ });
+ }
+
+ getState(): Promise<BackendState> {
+ return this._ipc.send('get_state')
+ .then(raw => {
+ return this._parseBackendState(raw);
+ });
+ }
+
+ _parseBackendState(raw: mixed): BackendState {
+ if (raw && raw.state && raw.target_state) {
+
+ const uncheckedRaw: any = raw;
+
+ const states: Array<SecurityState> = ['secured', 'unsecured'];
+ const correctState = states.includes(uncheckedRaw.state);
+ const correctTargetState = states.includes(uncheckedRaw.target_state);
+
+ if (!correctState || !correctTargetState) {
+ throw new InvalidReply(raw);
+ }
+
+ return (uncheckedRaw: BackendState);
+ } else {
+ throw new InvalidReply(raw);
+ }
+ }
+
+ registerStateListener(listener: (BackendState) => void) {
+ this._ipc.on('new_state', (rawEvent) => {
+ const parsedEvent : BackendState = this._parseBackendState(rawEvent);
+
+ listener(parsedEvent);
+ });
+ }
+
+ setCloseConnectionHandler(handler: () => void) {
+ this._ipc.setCloseConnectionHandler(handler);
+ }
+
+ authenticate(sharedSecret: string): Promise<void> {
+ return this._ipc.send('auth', sharedSecret)
+ .then(this._ignoreResponse);
+ }
+}
diff --git a/app/lib/jsonrpc-ws-ipc.js b/app/lib/jsonrpc-ws-ipc.js
new file mode 100644
index 0000000000..909b4b0775
--- /dev/null
+++ b/app/lib/jsonrpc-ws-ipc.js
@@ -0,0 +1,290 @@
+// @flow
+
+import jsonrpc from 'jsonrpc-lite';
+import uuid from 'uuid';
+import log from 'electron-log';
+
+export type UnansweredRequest = {
+ resolve: (mixed) => void,
+ reject: (mixed) => void,
+ timerId: number,
+ message: Object,
+}
+
+export type JsonRpcError = {
+ type: 'error',
+ payload: {
+ id: string,
+ error: {
+ message: string,
+ }
+ }
+}
+export type JsonRpcNotification = {
+ type: 'notification',
+ payload: {
+ method: string,
+ params: {
+ subscription: string,
+ result: mixed,
+ }
+ }
+}
+export type JsonRpcSuccess = {
+ type: 'success',
+ payload: {
+ id: string,
+ result: mixed,
+ }
+}
+export type JsonRpcMessage = JsonRpcError | JsonRpcNotification | JsonRpcSuccess;
+
+export class TimeOutError extends Error {
+ jsonRpcMessage: Object;
+
+ constructor(jsonRpcMessage: Object) {
+ super('Request timed out');
+ this.name = 'TimeOutError';
+ this.jsonRpcMessage = jsonRpcMessage;
+ }
+}
+
+export class InvalidReply extends Error {
+ reply: mixed;
+
+ constructor(reply: mixed, msg: ?string) {
+ super(msg);
+ this.name = 'InvalidReply';
+ this.reply = reply;
+
+ if(msg) {
+ this.message = msg + ' - ';
+ }
+ this.message += JSON.stringify(reply);
+ }
+}
+
+const DEFAULT_TIMEOUT_MILLIS = 5000;
+
+export default class Ipc {
+
+ _connectionString: ?string;
+ _onConnect: Array<{resolve: ()=>void}>;
+ _unansweredRequests: Map<string, UnansweredRequest>;
+ _subscriptions: Map<string|number, (mixed) => void>;
+ _websocket: WebSocket;
+ _backoff: ReconnectionBackoff;
+ _websocketFactory: (string) => WebSocket;
+ _closeConnectionHandler: ?() => void;
+
+ constructor(connectionString: string, websocketFactory: ?(string)=>WebSocket) {
+ this._connectionString = connectionString;
+ this._onConnect = [];
+ this._unansweredRequests = new Map();
+ this._subscriptions = new Map();
+ this._websocketFactory = websocketFactory || (connectionString => new WebSocket(connectionString));
+
+ this._backoff = new ReconnectionBackoff();
+ this._reconnect();
+ }
+
+ setConnectionString(str: string) {
+ this._connectionString = str;
+ }
+
+ setCloseConnectionHandler(handler: ?() => void) {
+ this._closeConnectionHandler = handler;
+ }
+
+ on(event: string, listener: (mixed) => void): Promise<*> {
+
+ log.debug('Adding a listener to', event);
+ return this.send(event + '_subscribe')
+ .then(subscriptionId => {
+ if (typeof subscriptionId === 'string' || typeof subscriptionId === 'number') {
+ this._subscriptions.set(subscriptionId, listener);
+ } else {
+ throw new InvalidReply(subscriptionId, 'The subscription id was not a string or a number');
+ }
+ })
+ .catch(e => {
+ log.error('Failed adding listener to', event, ':', e);
+ });
+ }
+
+ send(action: string, data: mixed, timeout: number = DEFAULT_TIMEOUT_MILLIS): Promise<mixed> {
+ return new Promise((resolve, reject) => {
+ const id = uuid.v4();
+
+ const params = this._prepareParams(data);
+ const timerId = setTimeout(() => this._onTimeout(id), timeout);
+ const jsonrpcMessage = jsonrpc.request(id, action, params);
+ this._unansweredRequests.set(id, {
+ resolve: resolve,
+ reject: reject,
+ timerId: timerId,
+ message: jsonrpcMessage,
+ });
+
+ this._getWebSocket()
+ .then(ws => {
+ log.debug('Sending message', id, action);
+ ws.send(jsonrpcMessage);
+ })
+ .catch(e => {
+ log.error('Failed sending RPC message "' + action + '":', e);
+ reject(e);
+ });
+ });
+ }
+
+ _prepareParams(data: mixed): Array<mixed>|Object {
+ // JSONRPC only accepts arrays and objects as params, but
+ // this isn't very nice to use, so this method wraps other
+ // types in an array. The choice of array is based on try-and-error
+
+ if(data === undefined) {
+ return [];
+ } else if (data === null) {
+ return [null];
+ } else if (Array.isArray(data) || typeof(data) === 'object') {
+ return data;
+ } else {
+ return [data];
+ }
+ }
+
+ _getWebSocket() {
+ return new Promise(resolve => {
+ if (this._websocket && this._websocket.readyState === 1) { // Connected
+ resolve(this._websocket);
+ } else {
+ log.debug('Waiting for websocket to connect');
+ this._onConnect.push({
+ resolve: () => resolve(this._websocket),
+ });
+ }
+ });
+ }
+
+ _onTimeout(requestId) {
+ const request = this._unansweredRequests.get(requestId);
+ this._unansweredRequests.delete(requestId);
+
+ if (!request) {
+ log.debug(requestId, 'timed out but it seems to already have been answered');
+ return;
+ }
+
+ log.debug(request.message, 'timed out');
+ request.reject(new TimeOutError(request.message));
+ }
+
+ _onMessage(message: string) {
+ const json = JSON.parse(message);
+ const c = jsonrpc.parseObject(json);
+
+ if (c.type === 'notification') {
+ this._onNotification(c);
+ } else {
+ this._onReply(c);
+ }
+ }
+
+ _onNotification(message: JsonRpcNotification) {
+ const subscriptionId = message.payload.params.subscription;
+ const listener = this._subscriptions.get(subscriptionId);
+
+ if (listener) {
+ log.debug('Got notification', message.payload.method, message.payload.params.result);
+ listener(message.payload.params.result);
+ } else {
+ log.warn('Got notification for', message.payload.method, 'but no one is listening for it');
+ }
+ }
+
+ _onReply(message: JsonRpcError | JsonRpcSuccess) {
+ const id = message.payload.id;
+ const request = this._unansweredRequests.get(id);
+ this._unansweredRequests.delete(id);
+
+ if (!request) {
+ log.warn('Got reply to', id, 'but no one was waiting for it');
+ return;
+ }
+
+ log.debug('Got answer to', id, message.type);
+
+ clearTimeout(request.timerId);
+
+ if (message.type === 'error') {
+ request.reject(message.payload.error);
+ } else {
+ const reply = message.payload.result;
+ request.resolve(reply);
+ }
+ }
+
+ _reconnect() {
+ const connectionString = this._connectionString;
+ if (!connectionString) return;
+
+ log.info('Connecting to websocket', connectionString);
+ this._websocket = this._websocketFactory(connectionString);
+
+ this._websocket.onopen = () => {
+ log.debug('Websocket is connected');
+ this._backoff.successfullyConnected();
+
+ while(this._onConnect.length > 0) {
+ this._onConnect.pop().resolve();
+ }
+ };
+
+ this._websocket.onmessage = (evt) => {
+ const data = evt.data;
+ if (typeof data === 'string') {
+ this._onMessage(data);
+ } else {
+ log.error('Got invalid reply from the server', evt);
+ }
+ };
+
+ this._websocket.onclose = () => {
+ if(this._closeConnectionHandler) {
+ this._closeConnectionHandler();
+ }
+
+ const delay = this._backoff.getIncreasedBackoff();
+ log.warn('The websocket connetion closed, attempting to reconnect it in', delay, 'milliseconds');
+ setTimeout(() => this._reconnect(), delay);
+ };
+ }
+}
+
+/*
+ * Used to calculate the time to wait before reconnecting
+ * the websocket.
+ *
+ * It uses a linear backoff function that goes from 500ms
+ * to 3000ms
+ */
+class ReconnectionBackoff {
+ _attempt: number;
+
+ constructor() {
+ this._attempt = 0;
+ }
+
+ successfullyConnected() {
+ this._attempt = 0;
+ }
+
+ getIncreasedBackoff() {
+ if (this._attempt < 6) {
+ this._attempt++;
+ }
+
+ return this._attempt * 500;
+ }
+}
diff --git a/app/lib/keyframe-animation.js b/app/lib/keyframe-animation.js
new file mode 100644
index 0000000000..62d9be6cd8
--- /dev/null
+++ b/app/lib/keyframe-animation.js
@@ -0,0 +1,226 @@
+// @flow
+import { nativeImage } from 'electron';
+import type { NativeImage } from 'electron';
+
+export type OnFrameFn = (image: NativeImage) => void;
+export type OnFinishFn = (void) => void;
+export type KeyframeAnimationOptions = {
+ startFrame?: number,
+ endFrame?: number,
+ beginFromCurrentState?: boolean,
+ advanceTo?: 'end'
+};
+export type KeyframeAnimationRange = [number, number];
+
+export default class KeyframeAnimation {
+
+ _speed: number = 200; // ms
+ _repeat: boolean = false;
+ _reverse: boolean = false;
+ _alternate: boolean = false;
+
+ _onFrame: ?OnFrameFn;
+ _onFinish: ?OnFinishFn;
+
+ _nativeImages: Array<NativeImage>;
+ _frameRange: KeyframeAnimationRange;
+ _numFrames: number;
+ _currentFrame: number = 0;
+
+ _isRunning: boolean = false;
+ _isFinished: boolean = false;
+ _isFirstRun: boolean = true;
+
+ _timeout = null;
+
+ set onFrame(newValue: ?OnFrameFn) { this._onFrame = newValue; }
+ get onFrame(): ?OnFrameFn { this._onFrame; }
+
+ // called when animation finished for non-repeating animations.
+ set onFinish(newValue: ?OnFinishFn) { this._onFinish = newValue; }
+ get onFinish(): ?OnFinishFn { this._onFinish; }
+
+ // pace per frame in ms
+ set speed(newValue: number) { this._speed = parseInt(newValue); }
+ get speed(): number { return this._speed; }
+
+ set repeat(newValue: boolean) { this._repeat = newValue; }
+ get repeat(): boolean { return this._repeat; }
+
+ set reverse(newValue: boolean) { this._reverse = newValue; }
+ get reverse(): boolean { return this._repeat; }
+
+ // alternates the animation direction when it reaches the end
+ // only for repeating animations
+ set alternate(newValue: boolean) { this._alternate = !!newValue; }
+ get alternate(): boolean { return this._alternate; }
+
+ get nativeImages(): Array<NativeImage> { return this._nativeImages.slice(); }
+ get isFinished(): boolean { return this._isFinished; }
+
+ // create animation from files matching filename pattern. i.e (bubble-frame-{}.png)
+ static fromFilePattern(filePattern: string, range: KeyframeAnimationRange): KeyframeAnimation {
+ const images: Array<NativeImage> = [];
+
+ if(range.length !== 2 || range[0] > range[1]) {
+ throw new Error('the animation range is invalid');
+ }
+
+ for(let i = range[0]; i <= range[1]; i++) {
+ const filePath = filePattern.replace('{}', i.toString());
+ const image = nativeImage.createFromPath(filePath);
+ images.push(image);
+ }
+ return new KeyframeAnimation(images);
+ }
+
+ static fromFileSequence(files: Array<string>): KeyframeAnimation {
+ const images: Array<NativeImage> = files.map(filePath => nativeImage.createFromPath(filePath));
+ return new KeyframeAnimation(images);
+ }
+
+ constructor(images: Array<NativeImage>) {
+ const len = images.length;
+ if(len < 1) {
+ throw new Error('too few images in animation');
+ }
+
+ this._nativeImages = images.slice();
+ this._numFrames = len;
+ this._frameRange = [0, len];
+ }
+
+ get currentImage(): NativeImage {
+ return this._nativeImages[this._currentFrame];
+ }
+
+ play(options: KeyframeAnimationOptions = {}) {
+ let { startFrame, endFrame, beginFromCurrentState, advanceTo } = options;
+
+ if(startFrame !== undefined && endFrame !== undefined) {
+ if(startFrame < 0 || startFrame >= this._numFrames) {
+ throw new Error('Invalid start frame');
+ }
+
+ if(endFrame < 0 || endFrame >= this._numFrames) {
+ throw new Error('Invalid end frame');
+ }
+
+ if(startFrame < endFrame) {
+ this._frameRange = [ startFrame, endFrame ];
+ } else {
+ this._frameRange = [ endFrame, startFrame ];
+ }
+ } else {
+ this._frameRange = [ 0, this._numFrames - 1 ];
+ }
+
+ if(!beginFromCurrentState || this._isFirstRun) {
+ this._currentFrame = this._frameRange[this._reverse ? 1 : 0];
+ }
+
+ if(this._isFirstRun) {
+ this._isFirstRun = false;
+ }
+
+ if(advanceTo === 'end') {
+ this._currentFrame = this._frameRange[this._reverse ? 0 : 1];
+ }
+
+ this._isRunning = true;
+ this._isFinished = false;
+
+ this._unscheduleUpdate();
+
+ this._render();
+ this._scheduleUpdate();
+ }
+
+ stop() {
+ this._isRunning = false;
+ this._unscheduleUpdate();
+ }
+
+ _unscheduleUpdate() {
+ if(this._timeout) {
+ clearTimeout(this._timeout);
+ this._timeout = null;
+ }
+ }
+
+ _scheduleUpdate() {
+ this._timeout = setTimeout(() => this._onUpdateFrame(), this._speed);
+ }
+
+ _render() {
+ if(this._onFrame) {
+ this._onFrame(this._nativeImages[this._currentFrame]);
+ }
+ }
+
+ _didFinish() {
+ this._isFinished = true;
+
+ if(this._onFinish) {
+ this._onFinish();
+ }
+ }
+
+ _onUpdateFrame() {
+ this._advanceFrame();
+
+ if(this._isFinished) {
+ // mark animation as not running when finished
+ this._isRunning = false;
+ } else {
+ this._render();
+
+ // check once again since onFrame() may stop animation
+ if(this._isRunning) {
+ this._scheduleUpdate();
+ }
+ }
+ }
+
+ _advanceFrame() {
+ if(this._isFinished) { return; }
+
+ let lastFrame = this._frameRange[this._reverse ? 0 : 1];
+ if(this._currentFrame === lastFrame) {
+ // mark animation as finished if it's not repeating
+ if(!this._repeat) {
+ this._didFinish();
+ return;
+ }
+
+ // change animation direction if marked for alternation
+ if(this._alternate) {
+ this._reverse = !this._reverse;
+
+ this._currentFrame = this._nextFrame(this._currentFrame, this._frameRange, this._reverse);
+ } else {
+ this._currentFrame = this._frameRange[this._reverse ? 1 : 0];
+ }
+ } else {
+ this._currentFrame = this._nextFrame(this._currentFrame, this._frameRange, this._reverse);
+ }
+ }
+
+ _nextFrame(cur: number, frameRange: KeyframeAnimationRange, isReverse: boolean): number {
+ if(isReverse) {
+ if(cur < frameRange[0]) {
+ return cur + 1;
+ } else if(cur > frameRange[0]) {
+ return cur - 1;
+ }
+ } else {
+ if(cur > frameRange[1]) {
+ return cur - 1;
+ } else if(cur < frameRange[1]) {
+ return cur + 1;
+ }
+ }
+ return cur;
+ }
+
+}
diff --git a/app/lib/proc.js b/app/lib/proc.js
new file mode 100644
index 0000000000..d11fa392a5
--- /dev/null
+++ b/app/lib/proc.js
@@ -0,0 +1,27 @@
+// @flow
+
+import path from 'path';
+
+export function resolveBin(binaryName: string) {
+ const basepath = getBasePath();
+ return path.resolve(basepath, binaryName + getExtension());
+}
+
+function getBasePath() {
+ if (process.env.NODE_ENV === 'development') {
+ return process.env.MULLVAD_BACKEND || '../talpid_core/target/debug';
+
+ } else {
+ return process.resourcesPath;
+ }
+}
+
+function getExtension() {
+ switch (process.platform) {
+ case 'win32':
+ return '.exe';
+
+ default:
+ return '';
+ }
+}
diff --git a/app/lib/transition-rule.js b/app/lib/transition-rule.js
new file mode 100644
index 0000000000..a91ba4da66
--- /dev/null
+++ b/app/lib/transition-rule.js
@@ -0,0 +1,47 @@
+// @flow
+
+export type TransitionDescriptor = {
+ name: string,
+ duration: number
+};
+
+export type TransitionFork = {
+ forward: TransitionDescriptor,
+ backward: TransitionDescriptor
+};
+
+export type TransitionMatch = {
+ direction: 'forward' | 'backward',
+ descriptor: TransitionDescriptor
+};
+
+export default class TransitionRule {
+
+ _from: ?string;
+ _to: string;
+ _fork: TransitionFork;
+
+ constructor(from: ?string, to: string, fork: TransitionFork) {
+ this._from = from;
+ this._to = to;
+ this._fork = fork;
+ }
+
+ match(fromRoute: ?string, toRoute: string): ?TransitionMatch {
+ if((!this._from || this._from === fromRoute) && this._to === toRoute) {
+ return {
+ direction: 'forward',
+ descriptor: this._fork['forward']
+ };
+ }
+
+ if((!this._from || this._from === toRoute) && this._to === fromRoute) {
+ return {
+ direction: 'backward',
+ descriptor: this._fork['backward']
+ };
+ }
+
+ return null;
+ }
+} \ No newline at end of file
diff --git a/app/lib/tray-icon-manager.js b/app/lib/tray-icon-manager.js
new file mode 100644
index 0000000000..73424cb7ef
--- /dev/null
+++ b/app/lib/tray-icon-manager.js
@@ -0,0 +1,58 @@
+// @flow
+import path from 'path';
+import KeyframeAnimation from './keyframe-animation';
+
+import type { Tray } from 'electron';
+
+export type TrayIconType = 'unsecured' | 'securing' | 'secured';
+
+export default class TrayIconManager {
+
+ _animation: ?KeyframeAnimation;
+ _iconType: TrayIconType;
+
+ constructor(tray: Tray, initialType: TrayIconType) {
+ const animation = this._createAnimation();
+ animation.onFrame = (img) => tray.setImage(img);
+ animation.reverse = this._isReverseAnimation(initialType);
+ animation.play({ advanceTo: 'end' });
+
+ this._animation = animation;
+ this._iconType = initialType;
+ }
+
+ destroy() {
+ if(this._animation) {
+ this._animation.stop();
+ this._animation = null;
+ }
+ }
+
+ _createAnimation(): KeyframeAnimation {
+ const basePath = path.join(path.resolve(__dirname, '..'), 'assets/images/menubar icons');
+ const filePath = path.join(basePath, 'lock-{}.png');
+ const animation = KeyframeAnimation.fromFilePattern(filePath, [1, 9]);
+ animation.speed = 100;
+ return animation;
+ }
+
+ _isReverseAnimation(type: TrayIconType): bool {
+ // unsecured & securing are treated as one
+ return type !== 'secured';
+ }
+
+ get iconType(): TrayIconType {
+ return this._iconType;
+ }
+
+ set iconType(type: TrayIconType) {
+ if(this._iconType === type || !this._animation) { return; }
+
+ const animation = this._animation;
+ animation.reverse = this._isReverseAnimation(type);
+ animation.play({ beginFromCurrentState: true });
+
+ this._iconType = type;
+ }
+
+}
diff --git a/app/main.js b/app/main.js
new file mode 100644
index 0000000000..d9a3358e1f
--- /dev/null
+++ b/app/main.js
@@ -0,0 +1,442 @@
+// @flow
+import path from 'path';
+import fs from 'fs';
+import mkdirp from 'mkdirp';
+import log from 'electron-log';
+import { app, BrowserWindow, ipcMain, Tray, Menu, nativeImage } from 'electron';
+import TrayIconManager from './lib/tray-icon-manager';
+import ElectronSudo from 'electron-sudo';
+import shellescape from 'shell-escape';
+import { version } from '../package.json';
+import { parseIpcCredentials } from './lib/backend';
+import { resolveBin } from './lib/proc';
+import { execFile } from 'child_process';
+import uuid from 'uuid';
+
+import type { TrayIconType } from './lib/tray-icon-manager';
+
+const isDevelopment = (process.env.NODE_ENV === 'development');
+const isMacOS = (process.platform === 'darwin');
+const isLinux = (process.platform === 'linux');
+
+// The name for application directory used for
+// scoping logs and user data in platform special folders
+const appDirectoryName = 'MullvadVPN';
+
+const writableDirectory = isMacOS || isLinux
+ ? '/tmp'
+ : app.getPath('temp');
+
+const rpcAddressFile = path.join(writableDirectory, '.mullvad_rpc_address');
+
+let browserWindowReady = false;
+
+const appDelegate = {
+ _window: (null: ?BrowserWindow),
+ _tray: (null: ?Tray),
+ _logFileLocation: '',
+ connectionFilePollInterval: (null: ?number),
+
+ setup: () => {
+ // Override userData path, i.e on macOS: ~/Library/Application Support/MullvadVPN
+ app.setPath('userData', path.join(app.getPath('appData'), appDirectoryName));
+
+ appDelegate._logFileLocation = appDelegate._getLogsDirectory();
+ appDelegate._initLogging();
+
+ log.info('Running version', version);
+
+ appDelegate._startBackend();
+
+ app.on('window-all-closed', () => appDelegate.onAllWindowsClosed());
+ app.on('ready', () => appDelegate.onReady());
+ },
+
+ _initLogging: () => {
+
+ const format = '[{y}-{m}-{d} {h}:{i}:{s}.{ms}][{level}] {text}';
+ log.transports.console.format = format;
+ log.transports.file.format = format;
+ if (isDevelopment) {
+ log.transports.console.level = 'debug';
+
+ // Disable log file in development
+ log.transports.file.level = false;
+ } else {
+ log.transports.console.level = 'debug';
+ log.transports.file.level = 'debug';
+ log.transports.file.file = path.join(appDelegate._logFileLocation, 'frontend.log');
+ }
+
+ // create log folder
+ mkdirp.sync(appDelegate._logFileLocation);
+ },
+
+ // Returns platform specific logs folder for application
+ // See open issue and PR on Github:
+ // 1. https://github.com/electron/electron/issues/10118
+ // 2. https://github.com/electron/electron/pull/10191
+ _getLogsDirectory: () => {
+ // macOS: ~/Library/Logs/{appname}
+ if(isMacOS) {
+ return path.join(app.getPath('home'), 'Library/Logs', appDirectoryName);
+ }
+ // Linux: ~/.config/{appname}/logs
+ // Windows: ~\AppData\Roaming\{appname}\logs
+ return path.join(app.getPath('userData'), 'logs');
+ },
+
+ onReady: async () => {
+ const window = appDelegate._window = appDelegate._createWindow();
+
+ ipcMain.on('on-browser-window-ready', () => {
+ browserWindowReady = true;
+ appDelegate._pollForConnectionInfoFile();
+ });
+
+ ipcMain.on('show-window', () => {
+ appDelegate._showWindow(window, appDelegate._tray);
+ });
+
+ window.loadURL('file://' + path.join(__dirname, 'index.html'));
+ window.on('close', () => {
+ log.debug('The browser window is closing, shutting down the tunnel...');
+ window.webContents.send('shutdown');
+ });
+
+ // create tray icon on macOS
+ if(isMacOS) {
+ appDelegate._tray = appDelegate._createTray(window);
+ } else {
+ appDelegate._showWindow(window, null);
+ }
+
+ appDelegate._setAppMenu();
+ appDelegate._addContextMenu(window);
+
+ if(isDevelopment) {
+ await appDelegate._installDevTools();
+ window.openDevTools({ mode: 'detach' });
+ }
+ },
+
+ onAllWindowsClosed: () => {
+ app.quit();
+ },
+
+ _startBackend: () => {
+ const backendIsRunning = appDelegate._rpcAddressFileExists();
+ if (backendIsRunning) {
+ log.info('Not starting the backend as it appears to already be running');
+ return;
+ }
+
+ const pathToBackend = resolveBin('mullvadd');
+ log.info('Starting the mullvad backend at', pathToBackend);
+
+ const options = {
+ name: 'Mullvad',
+ };
+ const sudo = new ElectronSudo(options);
+ const backendCommand = shellescape([
+ pathToBackend, '-v',
+ '--log', path.join(appDelegate._logFileLocation, 'backend.log'),
+ '--tunnel-log', path.join(appDelegate._logFileLocation, 'openvpn.log')
+ ]);
+ sudo.spawn(backendCommand, [])
+ .then( p => {
+ appDelegate._setupBackendProcessListeners(p);
+ return p;
+ });
+ },
+ _rpcAddressFileExists: () => {
+ return fs.existsSync(rpcAddressFile);
+ },
+ _setupBackendProcessListeners: (p) => {
+ // electron-sudo writes all output to some buffers in memory.
+ // For long-running processes such as this one that would
+ // cause a memory leak.
+ p.stdout.removeAllListeners('data');
+ p.stderr.removeAllListeners('data');
+
+ p.stdout.on('data', (data) => {
+ console.log('BACKEND stdout:', data.toString());
+ });
+ p.stderr.on('data', (data) => {
+ console.warn('BACKEND stderr:', data.toString());
+ });
+
+ p.on('error', (err) => {
+ log.error('Failed to start or kill the backend', err);
+ });
+
+ p.on('exit', (code) => {
+ const timeoutMs = 500;
+ log.info('The backend exited with code', code + '. Attempting to restart it in', timeoutMs, 'milliseconds...');
+ setTimeout( () => appDelegate._startBackend(), timeoutMs);
+ });
+ },
+ _pollForConnectionInfoFile: () => {
+
+ if (appDelegate.connectionFilePollInterval) {
+ log.warn('Attempted to start polling for the RPC connection info file while another polling was already running');
+ return;
+ }
+
+ const pollIntervalMs = 200;
+ appDelegate.connectionFilePollInterval = setInterval(() => {
+
+ if (browserWindowReady && appDelegate._rpcAddressFileExists()) {
+
+ if (appDelegate.connectionFilePollInterval) {
+ clearInterval(appDelegate.connectionFilePollInterval);
+ appDelegate.connectionFilePollInterval = null;
+ }
+
+ appDelegate._sendBackendInfo();
+ }
+
+ }, pollIntervalMs);
+ },
+ _sendBackendInfo: () => {
+ const window = appDelegate._window;
+ if (!window) {
+ log.error('Attempted to send backend rpc address before the window was ready');
+ return;
+ }
+
+ log.debug('Reading the ipc connection info from', rpcAddressFile);
+
+ const isSecureEnough = isOwnedAndOnlyWritableByRoot(rpcAddressFile);
+ if (!isSecureEnough) {
+ log.error('Not trusting the contents of', rpcAddressFile, 'as it was not owned and only writable by root.');
+ return;
+ }
+
+ // There is a race condition here where the owner and permissions of
+ // the file can change in the time between we validate the owner and
+ // permissions and read the contents of the file. We deem the chance
+ // of that to be small enough to ignore.
+
+ fs.readFile(rpcAddressFile, 'utf8', function (err, data) {
+ if (err) {
+ return log.error('Could not find backend connection info', err);
+ }
+
+ const credentials = parseIpcCredentials(data);
+ if(credentials) {
+ log.debug('Read IPC connection info', credentials.connectionString);
+ window.webContents.send('backend-info', { credentials });
+ } else {
+ log.error('Could not parse IPC credentials.');
+ }
+ });
+ },
+
+ _installDevTools: async () => {
+ const installer = require('electron-devtools-installer');
+ const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS'];
+ const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
+ for(const name of extensions) {
+ try {
+ await installer.default(installer[name], forceDownload);
+ } catch (e) {
+ log.info(`Error installing ${name} extension: ${e.message}`);
+ }
+ }
+ },
+
+ _createWindow: (): BrowserWindow => {
+ const contentHeight = 568;
+ let options = {
+ width: 320,
+ height: contentHeight,
+ resizable: false,
+ maximizable: false,
+ fullscreenable: false,
+ show: false,
+ webPreferences: {
+ // prevents renderer process code from not running when window is hidden
+ backgroundThrottling: false,
+ // Enable experimental features
+ blinkFeatures: 'CSSBackdropFilter'
+ }
+ };
+
+ // setup window flags to mimic popover on macOS
+ if(isMacOS) {
+ options = Object.assign({}, options, {
+ height: contentHeight + 12, // 12 is the size of transparent area around arrow
+ frame: false,
+ transparent: true
+ });
+ }
+
+ return new BrowserWindow(options);
+ },
+
+ _setAppMenu: () => {
+ const template = [
+ {
+ label: 'Mullvad',
+ submenu: [
+ { role: 'about' },
+ { type: 'separator' },
+ { role: 'quit' }
+ ]
+ },
+ {
+ label: 'Edit',
+ submenu: [
+ { role: 'cut' },
+ { role: 'copy' },
+ { role: 'paste' },
+ { type: 'separator' },
+ { role: 'selectall' }
+ ]
+ }
+ ];
+ Menu.setApplicationMenu(Menu.buildFromTemplate(template));
+ },
+
+ _addContextMenu: (window: BrowserWindow) => {
+ let menuTemplate = [
+ { role: 'cut' },
+ { role: 'copy' },
+ { role: 'paste' },
+ { type: 'separator' },
+ { role: 'selectall' }
+ ];
+
+ // add inspect element on right click menu
+ window.webContents.on('context-menu', (_e: Event, props: { x: number, y: number }) => {
+ let inspectTemplate = [{
+ label: 'Inspect element',
+ click() {
+ window.openDevTools({ mode: 'detach' });
+ window.inspectElement(props.x, props.y);
+ }
+ }];
+
+ if(props.isEditable) {
+ let inputMenu = menuTemplate;
+
+ // mixin 'inspect element' into standard menu when in development mode
+ if(isDevelopment) {
+ inputMenu = menuTemplate.concat([{type: 'separator'}], inspectTemplate);
+ }
+
+ Menu.buildFromTemplate(inputMenu).popup(window);
+ } else if(isDevelopment) {
+ // display inspect element for all non-editable
+ // elements when in development mode
+ Menu.buildFromTemplate(inspectTemplate).popup(window);
+ }
+ });
+ },
+
+ _toggleWindow: (window: BrowserWindow, tray: ?Tray) => {
+ if(window.isVisible()) {
+ window.hide();
+ } else {
+ appDelegate._showWindow(window, tray);
+ }
+ },
+
+ _showWindow: (window: BrowserWindow, tray: ?Tray) => {
+ // position window based on tray icon location
+ if(tray) {
+ const { x, y } = appDelegate._getWindowPosition(window, tray);
+ window.setPosition(x, y, false);
+ }
+
+ window.show();
+ window.focus();
+ },
+
+ _getWindowPosition: (window: BrowserWindow, tray: Tray): { x: number, y: number } => {
+ const windowBounds = window.getBounds();
+ const trayBounds = tray.getBounds();
+
+ // center window horizontally below the tray icon
+ const x = Math.round(trayBounds.x + (trayBounds.width / 2) - (windowBounds.width / 2));
+
+ // position window vertically below the tray icon
+ const y = Math.round(trayBounds.y + trayBounds.height);
+
+ return { x, y };
+ },
+
+ _createTray: (window: BrowserWindow): Tray => {
+ const tray = new Tray(nativeImage.createEmpty());
+ tray.setHighlightMode('never');
+ tray.on('click', () => appDelegate._toggleWindow(window, tray));
+
+ // setup NSEvent monitor to fix inconsistent window.blur
+ // see https://github.com/electron/electron/issues/8689
+ const { NSEventMonitor, NSEventMask } = require('nseventmonitor');
+ const trayIconManager = new TrayIconManager(tray, 'unsecured');
+ const macEventMonitor = new NSEventMonitor();
+ const eventMask = NSEventMask.leftMouseDown | NSEventMask.rightMouseDown;
+
+ // add IPC handler to change tray icon from renderer
+ ipcMain.on('changeTrayIcon', (_: Event, type: TrayIconType) => trayIconManager.iconType = type);
+
+ ipcMain.on('collect-logs', (event, id, toRedact) => {
+ log.info('Collecting logs in', appDelegate._logFileLocation);
+ fs.readdir(appDelegate._logFileLocation, (err, files) => {
+ if (err) {
+ event.sender.send('collect-logs-reply', id, err);
+ return;
+ }
+
+ const logFiles = files.filter(file => file.endsWith('.log'))
+ .filter(file => !file.startsWith('openvpn'))
+ .map(f => path.join(appDelegate._logFileLocation, f));
+ const reportPath = path.join(writableDirectory, uuid.v4() + '.report');
+
+ const binPath = resolveBin('problem-report');
+ let args = [
+ 'collect',
+ '--output', reportPath,
+ ];
+
+ if (toRedact.length > 0) {
+ args = args.concat([
+ '--redact', ...toRedact,
+ '--',
+ ]);
+ }
+
+ args = args.concat(logFiles);
+
+ execFile(binPath, args, {windowsHide: true}, (err) => {
+ if (err) {
+ event.sender.send('collect-logs-reply', id, err);
+ } else {
+ log.debug('Report written to', reportPath);
+ event.sender.send('collect-logs-reply', id, null, reportPath);
+ }
+ });
+ });
+ });
+
+ // setup event handlers
+ window.on('show', () => macEventMonitor.start(eventMask, () => window.hide()));
+ window.on('hide', () => macEventMonitor.stop());
+ window.on('close', () => window.closeDevTools());
+ window.on('blur', () => !window.isDevToolsOpened() && window.hide());
+
+ return tray;
+ }
+};
+
+appDelegate.setup();
+
+function isOwnedAndOnlyWritableByRoot(path) {
+ const stat = fs.statSync(path);
+ const isOwnedByRoot = stat.uid === 0;
+ const isOnlyWritableByOwner = (stat.mode & parseInt('022', 8)) === 0;
+
+ return isOwnedByRoot && isOnlyWritableByOwner;
+}
diff --git a/app/redux/account/actions.js b/app/redux/account/actions.js
new file mode 100644
index 0000000000..d528f4f3d0
--- /dev/null
+++ b/app/redux/account/actions.js
@@ -0,0 +1,94 @@
+// @flow
+
+import type { Backend, BackendError } from '../../lib/backend';
+
+type StartLoginAction = {
+ type: 'START_LOGIN',
+ accountToken?: string,
+};
+type LoginSuccessfulAction = {
+ type: 'LOGIN_SUCCESSFUL',
+ expiry: string,
+};
+type LoginFailedAction = {
+ type: 'LOGIN_FAILED',
+ error: BackendError,
+};
+
+type LoggedOutAction = {
+ type: 'LOGGED_OUT',
+};
+
+type ResetLoginErrorAction = {
+ type: 'RESET_LOGIN_ERROR',
+};
+
+type UpdateAccountTokenAction = {
+ type: 'UPDATE_ACCOUNT_TOKEN',
+ token: string,
+};
+
+export type AccountAction = StartLoginAction
+ | LoginSuccessfulAction
+ | LoginFailedAction
+ | LoggedOutAction
+ | ResetLoginErrorAction;
+
+function startLogin(accountToken?: string): StartLoginAction {
+ return {
+ type: 'START_LOGIN',
+ accountToken: accountToken,
+ };
+}
+
+function loginSuccessful(expiry: string): LoginSuccessfulAction {
+ return {
+ type: 'LOGIN_SUCCESSFUL',
+ expiry: expiry,
+ };
+}
+
+function loginFailed(error: BackendError): LoginFailedAction {
+ return {
+ type: 'LOGIN_FAILED',
+ error: error,
+ };
+}
+
+function loggedOut(): LoggedOutAction {
+ return {
+ type: 'LOGGED_OUT',
+ };
+}
+
+function autoLoginFailed(): LoggedOutAction {
+ return loggedOut();
+}
+
+function resetLoginError(): ResetLoginErrorAction {
+ return {
+ type: 'RESET_LOGIN_ERROR',
+ };
+}
+
+function updateAccountToken(token: string): UpdateAccountTokenAction {
+ return {
+ type: 'UPDATE_ACCOUNT_TOKEN',
+ token: token,
+ };
+}
+
+const login = (backend: Backend, account: string) => () => backend.login(account);
+const logout = (backend: Backend) => () => backend.logout();
+
+export default {
+ login,
+ logout,
+ startLogin,
+ loginSuccessful,
+ loginFailed,
+ loggedOut,
+ autoLoginFailed,
+ resetLoginError,
+ updateAccountToken,
+};
diff --git a/app/redux/account/reducers.js b/app/redux/account/reducers.js
new file mode 100644
index 0000000000..27530499c9
--- /dev/null
+++ b/app/redux/account/reducers.js
@@ -0,0 +1,63 @@
+// @flow
+
+import type { ReduxAction } from '../store';
+import type { BackendError } from '../../lib/backend';
+
+export type LoginState = 'none' | 'logging in' | 'failed' | 'ok';
+export type AccountReduxState = {
+ accountToken: ?string,
+ expiry: ?string, // ISO8601
+ status: LoginState,
+ error: ?BackendError
+};
+
+const initialState: AccountReduxState = {
+ accountToken: null,
+ expiry: null,
+ status: 'none',
+ error: null
+};
+
+export default function(state: AccountReduxState = initialState, action: ReduxAction): AccountReduxState {
+
+ switch (action.type) {
+ case 'LOGIN_CHANGE':
+ return { ...state, ...action.newData };
+ case 'START_LOGIN':
+ return { ...state, ...{
+ status: 'logging in',
+ accountToken: action.accountToken,
+ error: null,
+ }};
+ case 'LOGIN_SUCCESSFUL':
+ return { ...state, ...{
+ status: 'ok',
+ error: null,
+ expiry: action.expiry,
+ }};
+ case 'LOGIN_FAILED':
+ return { ...state, ...{
+ status: 'failed',
+ accountToken: null,
+ error: action.error,
+ }};
+ case 'LOGGED_OUT':
+ return { ...state, ...{
+ status: 'none',
+ accountToken: null,
+ expiry: null,
+ error: null,
+ }};
+ case 'RESET_LOGIN_ERROR':
+ return { ...state, ...{
+ status: 'none',
+ error: null,
+ }};
+ case 'UPDATE_ACCOUNT_TOKEN':
+ return { ...state, ...{
+ accountToken: action.token,
+ }};
+ }
+
+ return state;
+}
diff --git a/app/redux/connection/actions.js b/app/redux/connection/actions.js
new file mode 100644
index 0000000000..dcc90f7273
--- /dev/null
+++ b/app/redux/connection/actions.js
@@ -0,0 +1,118 @@
+// @flow
+
+import { clipboard } from 'electron';
+
+import type { Backend } from '../../lib/backend';
+import type { ReduxGetState, ReduxDispatch } from '../store';
+import type { Coordinate2d } from '../../types';
+
+
+const connect = (backend: Backend, relay: string) => () => backend.connect(relay);
+const disconnect = (backend: Backend) => () => backend.disconnect();
+const copyIPAddress = () => {
+ return (_dispatch: ReduxDispatch, getState: ReduxGetState) => {
+ const ip: ?string = getState().connection.clientIp;
+ if(ip) {
+ clipboard.writeText(ip);
+ }
+ };
+};
+
+
+type ConnectingAction = {
+ type: 'CONNECTING',
+ host?: string,
+};
+type ConnectedAction = {
+ type: 'CONNECTED',
+};
+type DisconnectedAction = {
+ type: 'DISCONNECTED',
+};
+
+type NewPublicIpAction = {
+ type: 'NEW_PUBLIC_IP',
+ ip: string,
+};
+
+type Location = {
+ location: Coordinate2d,
+ country: string,
+ city: string,
+};
+
+type NewLocationAction = {
+ type: 'NEW_LOCATION',
+ newLocation: Location,
+};
+
+type OnlineAction = {
+ type: 'ONLINE',
+};
+
+type OfflineAction = {
+ type: 'OFFLINE',
+};
+
+export type ConnectionAction = NewPublicIpAction
+ | NewLocationAction
+ | ConnectingAction
+ | ConnectedAction
+ | DisconnectedAction
+ | OnlineAction
+ | OfflineAction;
+
+function connectingTo(host: string): ConnectingAction {
+ return {
+ type: 'CONNECTING',
+ host: host,
+ };
+}
+
+function connecting(): ConnectingAction {
+ return {
+ type: 'CONNECTING',
+ };
+}
+
+function connected(): ConnectedAction {
+ return {
+ type: 'CONNECTED',
+ };
+}
+
+function disconnected(): DisconnectedAction {
+ return {
+ type: 'DISCONNECTED',
+ };
+}
+
+function newPublicIp(ip: string): NewPublicIpAction {
+ return {
+ type: 'NEW_PUBLIC_IP',
+ ip: ip,
+ };
+}
+
+function newLocation(newLoc: Location): NewLocationAction {
+ return {
+ type: 'NEW_LOCATION',
+ newLocation: newLoc,
+ };
+}
+
+function online(): OnlineAction {
+ return {
+ type: 'ONLINE',
+ };
+}
+
+function offline(): OfflineAction {
+ return {
+ type: 'OFFLINE',
+ };
+}
+
+
+export default { connect, disconnect, copyIPAddress, newPublicIp, newLocation, connectingTo, connecting, connected, disconnected, online, offline };
+
diff --git a/app/redux/connection/reducers.js b/app/redux/connection/reducers.js
new file mode 100644
index 0000000000..ce4cb79344
--- /dev/null
+++ b/app/redux/connection/reducers.js
@@ -0,0 +1,69 @@
+// @flow
+
+import type { ReduxAction } from '../store';
+import type { Coordinate2d } from '../../types';
+
+export type ConnectionState = 'disconnected' | 'connecting' | 'connected';
+export type ConnectionReduxState = {
+ status: ConnectionState,
+ isOnline: boolean,
+ serverAddress: ?string,
+ clientIp: ?string,
+ location: ?Coordinate2d,
+ country: ?string,
+ city: ?string,
+};
+
+const initialState: ConnectionReduxState = {
+ status: 'disconnected',
+ isOnline: true,
+ serverAddress: null,
+ clientIp: null,
+ location: null,
+ country: null,
+ city: null,
+};
+
+
+export default function(state: ConnectionReduxState = initialState, action: ReduxAction): ConnectionReduxState {
+
+ switch (action.type) {
+ case 'CONNECTION_CHANGE':
+ return { ...state, ...action.newData };
+
+ case 'NEW_PUBLIC_IP':
+ return { ...state, ...{ clientIp: action.ip }};
+
+ case 'NEW_LOCATION':
+ return { ...state, ...action.newLocation };
+
+ case 'CONNECTING':
+ return onConnecting(state, action);
+
+ case 'CONNECTED':
+ return { ...state, ...{ status: 'connected' }};
+
+ case 'DISCONNECTED':
+ return { ...state, ...{ status: 'disconnected' }};
+
+ case 'ONLINE':
+ return { ...state, ...{ isOnline: true }};
+
+ case 'OFFLINE':
+ return { ...state, ...{ isOnline: false }};
+
+ default:
+ return state;
+ }
+}
+
+function onConnecting(state, action) {
+ const newState: $Shape<ConnectionReduxState> = {
+ status: 'connecting',
+ };
+
+ if (action.host) {
+ newState.serverAddress = action.host;
+ }
+ return { ...state, ...newState};
+}
diff --git a/app/redux/settings/actions.js b/app/redux/settings/actions.js
new file mode 100644
index 0000000000..6bb6b0ed71
--- /dev/null
+++ b/app/redux/settings/actions.js
@@ -0,0 +1,19 @@
+// @flow
+
+import type { RelayConstraints } from './reducers';
+
+export type UpdateRelayAction = {
+ type: 'UPDATE_RELAY',
+ relay: RelayConstraints,
+};
+
+export type SettingsAction = UpdateRelayAction;
+
+function updateRelay(relay: RelayConstraints): UpdateRelayAction {
+ return {
+ type: 'UPDATE_RELAY',
+ relay: relay,
+ };
+}
+
+export default { updateRelay };
diff --git a/app/redux/settings/reducers.js b/app/redux/settings/reducers.js
new file mode 100644
index 0000000000..e16f25a068
--- /dev/null
+++ b/app/redux/settings/reducers.js
@@ -0,0 +1,37 @@
+// @flow
+
+import { defaultServer } from '../../config';
+
+import type { ReduxAction } from '../store';
+
+export type RelayConstraints = {
+ host: string,
+ port: 'any' | number,
+ protocol: 'any' | 'tcp' | 'udp',
+};
+
+export type SettingsReduxState = {
+ relayConstraints: RelayConstraints
+};
+
+const initialState: SettingsReduxState = {
+ relayConstraints: {
+ host: defaultServer,
+ port: 'any',
+ protocol: 'any',
+ },
+};
+
+export default function(state: SettingsReduxState = initialState, action: ReduxAction): SettingsReduxState {
+
+ if (action.type === 'UPDATE_RELAY') {
+ return { ...state,
+ relayConstraints: {
+ ...state.relayConstraints,
+ ...action.relay,
+ },
+ };
+ }
+
+ return state;
+}
diff --git a/app/redux/store.js b/app/redux/store.js
new file mode 100644
index 0000000000..3f73574103
--- /dev/null
+++ b/app/redux/store.js
@@ -0,0 +1,69 @@
+// @flow
+import { createStore, applyMiddleware, combineReducers, compose } from 'redux';
+import { routerMiddleware, routerReducer, push, replace } from 'react-router-redux';
+import thunk from 'redux-thunk';
+
+import account from './account/reducers.js';
+import accountActions from './account/actions.js';
+import connection from './connection/reducers.js';
+import connectionActions from './connection/actions.js';
+import settings from './settings/reducers.js';
+import settingsActions from './settings/actions.js';
+
+import type { Store } from 'redux';
+import type { History } from 'history';
+import type { AccountReduxState } from './account/reducers.js';
+import type { ConnectionReduxState } from './connection/reducers.js';
+import type { SettingsReduxState } from './settings/reducers.js';
+
+import type { ConnectionAction } from './connection/actions.js';
+import type { AccountAction } from './account/actions.js';
+import type { SettingsAction } from './settings/actions.js';
+
+export type ReduxState = {
+ account: AccountReduxState,
+ connection: ConnectionReduxState,
+ settings: SettingsReduxState
+};
+
+export type ReduxAction = AccountAction
+ | SettingsAction
+ | ConnectionAction;
+
+export type ReduxStore = Store<ReduxState, ReduxAction, ReduxDispatch>;
+export type ReduxGetState = () => ReduxState;
+export type ReduxDispatch = (action: ReduxAction | ReduxThunk) => any;
+export type ReduxThunk = (dispatch: ReduxDispatch, getState: ReduxGetState) => any;
+
+export default function configureStore(initialState: ?ReduxState, routerHistory: History): ReduxStore {
+ const router = routerMiddleware(routerHistory);
+
+ const actionCreators: { [string]: Function } = {
+ ...accountActions,
+ ...connectionActions,
+ ...settingsActions,
+ pushRoute: (route) => push(route),
+ replaceRoute: (route) => replace(route),
+ };
+
+ const reducers = {
+ account, connection, settings, router: routerReducer
+ };
+
+ const middlewares = [ thunk, router ];
+
+ const composeEnhancers = (() => {
+ const reduxCompose = window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;
+ if(process.env.NODE_ENV === 'development' && reduxCompose) {
+ return reduxCompose({ actionCreators });
+ }
+ return compose;
+ })();
+
+ const enhancer = composeEnhancers(applyMiddleware(...middlewares));
+ const rootReducer = combineReducers(reducers);
+ if(initialState) {
+ return createStore(rootReducer, initialState, enhancer);
+ }
+ return createStore(rootReducer, enhancer);
+}
diff --git a/app/routes.js b/app/routes.js
new file mode 100644
index 0000000000..f428c8093b
--- /dev/null
+++ b/app/routes.js
@@ -0,0 +1,109 @@
+// @flow
+
+import React from 'react';
+import { Switch, Route, Redirect } from 'react-router';
+import { CSSTransitionGroup } from 'react-transition-group';
+import WindowChrome from './components/WindowChrome';
+import LoginPage from './containers/LoginPage';
+import ConnectPage from './containers/ConnectPage';
+import SettingsPage from './containers/SettingsPage';
+import AdvancedSettingsPage from './containers/AdvancedSettingsPage';
+import AccountPage from './containers/AccountPage';
+import SupportPage from './containers/SupportPage';
+import SelectLocationPage from './containers/SelectLocationPage';
+import { getTransitionProps } from './transitions';
+
+import type { ReduxGetState } from './redux/store';
+import type { Backend } from './lib/backend';
+
+export type SharedRouteProps = {
+ backend: Backend
+};
+
+type CustomRouteProps = {
+ component: ReactClass<*>
+};
+
+export default function makeRoutes(getState: ReduxGetState, componentProps: SharedRouteProps): React.Element<*> {
+
+ // Merge props and render component
+ const renderMergedProps = (ComponentClass: ReactClass<*>, ...rest: Array<Object>): React.Element<*> => {
+ const finalProps = Object.assign({}, componentProps, ...rest);
+ return (
+ <ComponentClass { ...finalProps } />
+ );
+ };
+
+ // Renders public route
+ // example: <PublicRoute path="/" component={ MyComponent } />
+ const PublicRoute = ({ component, ...otherProps }: CustomRouteProps) => {
+ return (
+ <Route { ...otherProps } render={ (routeProps) => {
+ return renderMergedProps(component, routeProps, otherProps);
+ }} />
+ );
+ };
+
+ // Renders protected route that requires authentication, otherwise redirects to /
+ // example: <PrivateRoute path="/protected" component={ MyComponent } />
+ const PrivateRoute = ({ component, ...otherProps }: CustomRouteProps) => {
+ return (
+ <Route { ...otherProps } render={ (routeProps) => {
+ const { account } = getState();
+ const isLoggedIn = account.status === 'ok';
+
+ if(isLoggedIn) {
+ return renderMergedProps(component, routeProps, otherProps);
+ } else {
+ return (<Redirect to={ '/' } />);
+ }
+ }} />
+ );
+ };
+
+ // Renders login route that is only available to non-authenticated
+ // users. Otherwise this route redirects user to /connect.
+ // example: <LoginRoute path="/login" component={ MyComponent } />
+ const LoginRoute = ({ component, ...otherProps }: CustomRouteProps) => {
+ return (
+ <Route { ...otherProps } render={ (routeProps) => {
+ const { account } = getState();
+ const isLoggedIn = account.status === 'ok';
+
+ if(isLoggedIn) {
+ return (<Redirect to={ '/connect' } />);
+ } else {
+ return renderMergedProps(component, routeProps, otherProps);
+ }
+ }} />
+ );
+ };
+
+ // store previous route
+ let previousRoute: ?string;
+
+ return (
+ <Route render={({ location }) => {
+ const toRoute = location.pathname;
+ const fromRoute = previousRoute;
+ const transitionProps = getTransitionProps(fromRoute, toRoute);
+ previousRoute = toRoute;
+
+ return (
+ <WindowChrome>
+ <CSSTransitionGroup component="div" className="transition-container" { ...transitionProps }>
+ <Switch key={ location.key } location={ location }>
+ <LoginRoute exact path="/" component={ LoginPage } />
+ <PrivateRoute exact path="/connect" component={ ConnectPage } />
+ <PublicRoute exact path="/settings" component={ SettingsPage } />
+ <PrivateRoute exact path="/settings/account" component={ AccountPage } />
+ <PublicRoute exact path="/settings/support" component={ SupportPage } />
+ <PublicRoute exact path="/settings/advanced" component={ AdvancedSettingsPage } />
+ <PrivateRoute exact path="/select-location" component={ SelectLocationPage } />
+ </Switch>
+ </CSSTransitionGroup>
+ </WindowChrome>
+ );
+ }} />
+ );
+}
diff --git a/app/tilecache.sw.js b/app/tilecache.sw.js
new file mode 100644
index 0000000000..15ec8f9493
--- /dev/null
+++ b/app/tilecache.sw.js
@@ -0,0 +1,27 @@
+
+this.addEventListener('install', function (event) {
+ console.log('Installing Service Worker');
+ event.waitUntil(this.skipWaiting());
+});
+
+this.addEventListener('activate', function (event) {
+ event.waitUntil(this.clients.claim());
+});
+
+this.addEventListener('fetch', function(event) {
+ var url = event.request.url;
+
+ if(url.startsWith('https://') && (url.includes('tiles.mapbox.com') || url.includes('api.mapbox.com'))) {
+ event.respondWith(
+ caches.match(event.request).then(function(resp) {
+ return resp || fetch(event.request).then(function(response) {
+ var cacheResponse = response.clone();
+ caches.open('mapbox').then(function(cache) {
+ cache.put(event.request, cacheResponse);
+ });
+ return response;
+ });
+ })
+ );
+ }
+});
diff --git a/app/transitions.js b/app/transitions.js
new file mode 100644
index 0000000000..fe6da53563
--- /dev/null
+++ b/app/transitions.js
@@ -0,0 +1,113 @@
+// @flow
+
+import TransitionRule from './lib/transition-rule';
+import type { TransitionFork, TransitionDescriptor } from './lib/transition-rule';
+
+export type CSSTransitionGroupProps = {
+ transitionName: string,
+ transitionEnterTimeout: number,
+ transitionLeaveTimeout: number,
+ transitionEnter: boolean,
+ transitionLeave: boolean,
+ transitionAppear?: boolean,
+ transitionAppearTimeout?: number
+};
+
+type TransitionMap = {
+ [name: string]: TransitionFork
+};
+
+/**
+ * Transition descriptors
+ */
+const transitions: TransitionMap = {
+ slide: {
+ forward: {
+ name: 'slide-up-transition',
+ duration: 450
+ },
+ backward: {
+ name: 'slide-down-transition',
+ duration: 450
+ }
+ },
+ push: {
+ forward: {
+ name: 'push-transition',
+ duration: 450
+ },
+ backward: {
+ name: 'pop-transition',
+ duration: 450
+ }
+ }
+};
+
+/**
+ * Transition rules
+ * (null) is used to indicate any route.
+ */
+const transitionRules = [
+ r('/settings', '/settings/account', transitions.push),
+ r('/settings', '/settings/support', transitions.push),
+ r('/settings', '/settings/advanced', transitions.push),
+ r(null, '/settings', transitions.slide),
+ r(null, '/select-location', transitions.slide)
+];
+
+/**
+ * Calculate CSSTransitionGroup props.
+ *
+ * @param {string} [fromRoute] - source route
+ * @param {string} toRoute - target route
+ */
+export function getTransitionProps(fromRoute: ?string, toRoute: string): CSSTransitionGroupProps {
+ // ignore initial transition and transition between the same routes
+ if(!fromRoute || fromRoute === toRoute) {
+ return noTransitionProps();
+ }
+
+ for(const rule of transitionRules) {
+ const match = rule.match(fromRoute, toRoute);
+ if(match) {
+ return toCSSTransitionGroupProps(match.descriptor);
+ }
+ }
+
+ return noTransitionProps();
+}
+
+/**
+ * Integrate TransitionDescriptor into CSSTransitionGroupProps
+ * @param {TransitionDescriptor} descriptor
+ */
+function toCSSTransitionGroupProps(descriptor: TransitionDescriptor): CSSTransitionGroupProps {
+ const {name, duration} = descriptor;
+ return {
+ transitionName: name,
+ transitionEnterTimeout: duration,
+ transitionLeaveTimeout: duration,
+ transitionEnter: true,
+ transitionLeave: true
+ };
+}
+
+/**
+ * Returns default props with animations disabled
+ */
+function noTransitionProps(): CSSTransitionGroupProps {
+ return {
+ transitionName: '',
+ transitionEnterTimeout: 0,
+ transitionLeaveTimeout: 0,
+ transitionEnter: false,
+ transitionLeave: false
+ };
+}
+
+/**
+ * Shortcut to create TransitionRule
+ */
+function r(from: ?string, to: string, fork: TransitionFork): TransitionRule {
+ return new TransitionRule(from, to, fork);
+}
diff --git a/app/types.js b/app/types.js
new file mode 100644
index 0000000000..3e247a875a
--- /dev/null
+++ b/app/types.js
@@ -0,0 +1,6 @@
+// @flow
+export type Point2d = {
+ x: number;
+ y: number;
+};
+export type Coordinate2d = [number, number];
diff --git a/dist-assets/ca.crt b/dist-assets/ca.crt
new file mode 100644
index 0000000000..b795d910f3
--- /dev/null
+++ b/dist-assets/ca.crt
@@ -0,0 +1,109 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 3 (0x3)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=NA, ST=None, L=None, O=Mullvad, CN=Mullvad CA/emailAddress=info@mullvad.net
+ Validity
+ Not Before: Mar 24 16:19:48 2009 GMT
+ Not After : Mar 22 16:19:48 2019 GMT
+ Subject: C=NA, ST=None, L=None, O=Mullvad, CN=master.mullvad.net/emailAddress=info@mullvad.net
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (2048 bit)
+ Modulus (2048 bit):
+ 00:c5:00:39:5d:fe:9b:0c:b7:ff:76:a4:93:bf:26:
+ 1b:d6:c8:4a:e5:3c:ce:1c:2c:16:80:a2:61:a6:e9:
+ 63:4b:70:a1:80:6f:0e:0c:bb:a9:b6:d1:bd:f5:a0:
+ 78:82:09:4d:94:22:aa:77:7c:09:36:42:cd:a5:a6:
+ 90:73:27:42:00:31:e4:d4:8b:49:36:65:a3:25:82:
+ b8:26:d7:d1:f5:b5:a9:be:57:93:9d:7c:d6:1c:df:
+ 9a:87:81:53:0b:17:81:d1:0d:ca:dc:4d:19:13:fa:
+ 11:e6:da:68:eb:81:05:39:e3:1e:3a:3f:fc:e2:64:
+ 3c:98:3c:89:a9:42:b3:30:70:57:56:a1:f5:08:b2:
+ 75:12:a0:36:93:9d:69:e9:7e:11:71:d9:1c:e8:7d:
+ ec:03:21:11:7a:0a:7a:03:35:ba:b8:b2:0c:3a:6f:
+ 57:88:62:45:3d:0c:6c:18:ff:21:49:37:ae:40:78:
+ 6d:45:52:29:ac:21:ad:4a:01:61:67:0b:01:c4:ac:
+ b0:88:97:52:ff:cb:3a:21:f0:14:2b:c1:79:8d:79:
+ 35:14:fc:9c:3f:6c:c9:62:fc:8c:c7:a8:51:34:75:
+ 1c:23:d5:db:b9:44:08:1c:0c:17:2c:21:2a:b4:29:
+ db:15:59:e7:a9:1c:d6:19:19:ef:e4:6b:ea:78:6d:
+ 76:8d
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 75:8A:14:92:0D:F3:6E:B7:36:4F:8B:4F:15:6C:3F:18:15:90:64:DE
+ X509v3 Authority Key Identifier:
+ keyid:E1:63:B4:3E:55:A3:D2:37:5F:DE:3A:91:48:51:4B:20:1A:F2:9B:C5
+ DirName:/C=NA/ST=None/L=None/O=Mullvad/CN=Mullvad CA/emailAddress=info@mullvad.net
+ serial:84:68:2E:A0:51:2A:BB:D4
+
+ X509v3 Basic Constraints:
+ CA:TRUE
+ Signature Algorithm: sha1WithRSAEncryption
+ a4:b4:62:3d:cb:7e:57:b3:bd:2a:41:e0:3b:94:d0:4c:08:69:
+ 8a:b1:73:15:13:20:c9:d7:b0:b6:5d:65:4a:4d:1d:27:cc:ca:
+ 11:0e:86:fa:65:61:26:39:c2:54:8e:da:eb:78:21:37:0e:c7:
+ a4:d2:17:8a:4b:ad:17:84:25:5e:24:0e:9a:81:ff:d1:1b:0e:
+ 32:9b:f4:81:e0:07:e9:8f:9d:c1:43:7f:40:30:01:07:7c:02:
+ c7:c4:9c:05:48:4c:bf:41:69:57:c1:d3:bb:a3:5a:01:17:96:
+ b0:c9:00:22:57:2f:84:da:45:33:6e:6c:2b:13:c5:af:75:a7:
+ b2:6b:71:6e:13:2c:97:0e:d9:93:da:6d:d9:34:c6:06:7d:0e:
+ e2:b8:d2:78:13:79:0f:ac:ac:a8:68:a9:72:73:7a:d8:ab:7b:
+ 0a:b0:54:b5:f3:ce:29:0d:47:82:0c:b4:d9:20:64:ff:ef:17:
+ 46:92:de:65:e8:67:ce:3a:92:de:e4:3e:99:73:9f:7a:7c:00:
+ 72:07:39:78:77:37:62:89:a2:db:24:fd:60:2a:e0:82:57:f6:
+ 55:94:f6:79:47:19:c9:13:3b:5d:b7:6b:66:14:d4:7d:3c:76:
+ 75:e9:a3:55:ba:b4:92:30:3b:ad:66:72:0c:39:4b:cc:95:a9:
+ bc:06:ef:2b
+-----BEGIN CERTIFICATE-----
+MIIEQjCCAyqgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBzMQswCQYDVQQGEwJOQTEN
+MAsGA1UECBMETm9uZTENMAsGA1UEBxMETm9uZTEQMA4GA1UEChMHTXVsbHZhZDET
+MBEGA1UEAxMKTXVsbHZhZCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0BtdWxsdmFk
+Lm5ldDAeFw0wOTAzMjQxNjE5NDhaFw0xOTAzMjIxNjE5NDhaMHsxCzAJBgNVBAYT
+Ak5BMQ0wCwYDVQQIEwROb25lMQ0wCwYDVQQHEwROb25lMRAwDgYDVQQKEwdNdWxs
+dmFkMRswGQYDVQQDExJtYXN0ZXIubXVsbHZhZC5uZXQxHzAdBgkqhkiG9w0BCQEW
+EGluZm9AbXVsbHZhZC5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDFADld/psMt/92pJO/JhvWyErlPM4cLBaAomGm6WNLcKGAbw4Mu6m20b31oHiC
+CU2UIqp3fAk2Qs2lppBzJ0IAMeTUi0k2ZaMlgrgm19H1tam+V5OdfNYc35qHgVML
+F4HRDcrcTRkT+hHm2mjrgQU54x46P/ziZDyYPImpQrMwcFdWofUIsnUSoDaTnWnp
+fhFx2RzofewDIRF6CnoDNbq4sgw6b1eIYkU9DGwY/yFJN65AeG1FUimsIa1KAWFn
+CwHErLCIl1L/yzoh8BQrwXmNeTUU/Jw/bMli/IzHqFE0dRwj1du5RAgcDBcsISq0
+KdsVWeepHNYZGe/ka+p4bXaNAgMBAAGjgdgwgdUwHQYDVR0OBBYEFHWKFJIN8263
+Nk+LTxVsPxgVkGTeMIGlBgNVHSMEgZ0wgZqAFOFjtD5Vo9I3X946kUhRSyAa8pvF
+oXekdTBzMQswCQYDVQQGEwJOQTENMAsGA1UECBMETm9uZTENMAsGA1UEBxMETm9u
+ZTEQMA4GA1UEChMHTXVsbHZhZDETMBEGA1UEAxMKTXVsbHZhZCBDQTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0BtdWxsdmFkLm5ldIIJAIRoLqBRKrvUMAwGA1UdEwQFMAMB
+Af8wDQYJKoZIhvcNAQEFBQADggEBAKS0Yj3LflezvSpB4DuU0EwIaYqxcxUTIMnX
+sLZdZUpNHSfMyhEOhvplYSY5wlSO2ut4ITcOx6TSF4pLrReEJV4kDpqB/9EbDjKb
+9IHgB+mPncFDf0AwAQd8AsfEnAVITL9BaVfB07ujWgEXlrDJACJXL4TaRTNubCsT
+xa91p7JrcW4TLJcO2ZPabdk0xgZ9DuK40ngTeQ+srKhoqXJzetirewqwVLXzzikN
+R4IMtNkgZP/vF0aS3mXoZ846kt7kPplzn3p8AHIHOXh3N2KJotsk/WAq4IJX9lWU
+9nlHGckTO123a2YU1H08dnXpo1W6tJIwO61mcgw5S8yVqbwG7ys=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEQjCCAyqgAwIBAgIJAIRoLqBRKrvUMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV
+BAYTAk5BMQ0wCwYDVQQIEwROb25lMQ0wCwYDVQQHEwROb25lMRAwDgYDVQQKEwdN
+dWxsdmFkMRMwEQYDVQQDEwpNdWxsdmFkIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv
+QG11bGx2YWQubmV0MB4XDTA5MDMyNDA2NDcyNVoXDTE5MDMyMjA2NDcyNVowczEL
+MAkGA1UEBhMCTkExDTALBgNVBAgTBE5vbmUxDTALBgNVBAcTBE5vbmUxEDAOBgNV
+BAoTB011bGx2YWQxEzARBgNVBAMTCk11bGx2YWQgQ0ExHzAdBgkqhkiG9w0BCQEW
+EGluZm9AbXVsbHZhZC5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDNNzZOrq+gMaA6wfyWdNFmxlM2OB1czwFgtPiDd9f6F8m6CGYBQog3Q2Wx3yAv
+hxt/uchFBCKtYz6Yh59BCxXKfNAQT2uaMC6KAvKFgz0wppi4S8YbWg2KDelNO/Zv
+Rb1QT4CBWMbtYzCQZvlJpHr2ZwuXG2OiT477oMyX5Hmf+iT0drmqi+wylRr7CRBs
+LBu+fxLZ2LFD5g6MATuL3ql5JLIoVjlSqIgbld74pD4WUnM61HRwFsKoCEjq409Y
+QNP1xO7BeaJu3uQvg/HJhXnGZxTatXhqvdCuAPQRppQ4UnkUzxdSTrfgM3hqMony
+vX1vy0dX1S8iTQCIeyzAYNObAgMBAAGjgdgwgdUwHQYDVR0OBBYEFOFjtD5Vo9I3
+X946kUhRSyAa8pvFMIGlBgNVHSMEgZ0wgZqAFOFjtD5Vo9I3X946kUhRSyAa8pvF
+oXekdTBzMQswCQYDVQQGEwJOQTENMAsGA1UECBMETm9uZTENMAsGA1UEBxMETm9u
+ZTEQMA4GA1UEChMHTXVsbHZhZDETMBEGA1UEAxMKTXVsbHZhZCBDQTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0BtdWxsdmFkLm5ldIIJAIRoLqBRKrvUMAwGA1UdEwQFMAMB
+Af8wDQYJKoZIhvcNAQEFBQADggEBAMjMAFPDeFOrQsvMXD/x+CuARwegS2PDZuB5
+f1Svw3YDF6cB1jlc0F12nh9SZxaYRwKIlpYoolLCOLoUCLwQJ0gsokxLV7G4gVb8
+dzETnNq4HG/QOPwPisjoOCaEmcd0tx1EkyNY0KLqFZTS0VdmDHCn89dDFA/6yuYI
+5u04uJs7c/K4qaW7X6ajOOdneqjbtPeVOvx9DWXHxA0xz4Y+/w4laX/OTRD7jySq
+K9fLfRliE5zsxzpUr5EWxAnqiABoWL71SiItk5fG8k3MJJ9SVr+YnTHmE7S4KNqu
+4wTksvkb0Tmjae1lRSlMd6u2AulAxVcVKAod2QVffhj+hdkYM94=
+-----END CERTIFICATE-----
diff --git a/dist-assets/crl.pem b/dist-assets/crl.pem
new file mode 100644
index 0000000000..10e26ddf82
--- /dev/null
+++ b/dist-assets/crl.pem
@@ -0,0 +1,36 @@
+-----BEGIN X509 CRL-----
+MIIGMTCCBRkwDQYJKoZIhvcNAQELBQAwezELMAkGA1UEBhMCTkExDTALBgNVBAgT
+BE5vbmUxDTALBgNVBAcTBE5vbmUxEDAOBgNVBAoTB011bGx2YWQxGzAZBgNVBAMT
+Em1hc3Rlci5tdWxsdmFkLm5ldDEfMB0GCSqGSIb3DQEJARYQaW5mb0BtdWxsdmFk
+Lm5ldBcNMTcwNjIyMTQzMzEyWhcNMjcwNjIwMTQzMzEyWjCCBGswEgIBARcNMTcw
+NjIyMTQzMzExWjASAgEDFw0xNzA2MjIxNDMzMTFaMBICASkXDTE3MDYyMjE0MzMx
+MVowEwICDasXDTE3MDYyMjE0MzMxMVowEwICDawXDTE3MDYyMjE0MzMxMVowEwIC
+Da0XDTE3MDYyMjE0MzMxMVowEwICDx4XDTE3MDYyMjE0MzMxMVowEwICGxsXDTE3
+MDYyMjE0MzMxMVowEwICPf4XDTE3MDYyMjE0MzMxMVowEwICSrUXDTE3MDYyMjE0
+MzMxMVowFAIDAbbXFw0xNzA2MjIxNDMzMTFaMBQCAwaeUBcNMTcwNjIyMTQzMzEx
+WjAUAgMGnlUXDTE3MDYyMjE0MzMxMVowFAIDCheTFw0xNzA2MjIxNDMzMTFaMBQC
+AwpvDBcNMTcwNjIyMTQzMzExWjAUAgML2jcXDTE3MDYyMjE0MzMxMVowFAIDDCfI
+Fw0xNzA2MjIxNDMzMTFaMBQCAwwrKhcNMTcwNjIyMTQzMzExWjAUAgMMNWEXDTE3
+MDYyMjE0MzMxMVowFAIDDDViFw0xNzA2MjIxNDMzMTFaMBQCAwyXhRcNMTcwNjIy
+MTQzMzExWjAUAgMM99UXDTE3MDYyMjE0MzMxMVowFAIDDPfWFw0xNzA2MjIxNDMz
+MTFaMBQCAwz31xcNMTcwNjIyMTQzMzExWjAUAgMM9+MXDTE3MDYyMjE0MzMxMVow
+FAIDDPfkFw0xNzA2MjIxNDMzMTFaMBQCAwz35RcNMTcwNjIyMTQzMzExWjAUAgMN
+FHEXDTE3MDYyMjE0MzMxMVowFAIDDRSLFw0xNzA2MjIxNDMzMTFaMBQCAw1FfBcN
+MTcwNjIyMTQzMzExWjAUAgMNUWcXDTE3MDYyMjE0MzMxMVowFAIDDVFoFw0xNzA2
+MjIxNDMzMTFaMBQCAw1RbBcNMTcwNjIyMTQzMzExWjAUAgMN2AoXDTE3MDYyMjE0
+MzMxMVowFAIDDdgLFw0xNzA2MjIxNDMzMTFaMBQCAw6G3xcNMTcwNjIyMTQzMzEx
+WjAUAgMOkpwXDTE3MDYyMjE0MzMxMVowFAIDDpKdFw0xNzA2MjIxNDMzMTFaMBQC
+Aw7DWhcNMTcwNjIyMTQzMzExWjAUAgMPFEEXDTE3MDYyMjE0MzMxMVowFAIDDyaP
+Fw0xNzA2MjIxNDMzMTFaMBQCAw9D1xcNMTcwNjIyMTQzMzExWjAUAgMPzJQXDTE3
+MDYyMjE0MzMxMVowFAIDE3pTFw0xNzA2MjIxNDMzMTFaMBQCAxN6VBcNMTcwNjIy
+MTQzMzExWjAUAgMTjroXDTE3MDYyMjE0MzMxMVowFAIDFIUDFw0xNzA2MjIxNDMz
+MTFaMBQCAx7XBxcNMTcwNjIyMTQzMzExWjAUAgMgFScXDTE3MDYyMjE0MzMxMVow
+FAIDImufFw0xNzA2MjIxNDMzMTFaMBQCAyPpNRcNMTcwNjIyMTQzMzExWjAUAgMk
+eEgXDTE3MDYyMjE0MzMxMVowDQYJKoZIhvcNAQELBQADggEBAEdGuk5OitTepMQL
+O2ugSjKl9le9ttuwiNkXCowYZwMpvOvk98RuhcgqwetDtxdMIi7koMIlbILfbIwA
+VYvaV7HzpOzkL9D4RpE8GN3r1xjc+pjz5RN08Q+l/pRI9VeS2Bz6sstujqDMu0kT
+LEzxtyiWGgdyYL0ykirahStLxmjc0JLLSsZXHuVJGmdJsphoEw/zgTRR02N7Q0gP
+AmL6+i4mXY8OMaUMFWwKikliT+VAT23H1VPPUpS/5n3p+j15Hn5bI+rHyLmO2Ca7
+0UlcBbTVhoNMO25/6js5icRktebiaI0hq3Zofd5U80tGJnH+udIUEAq6CD/wUNqq
+VcdW4oc=
+-----END X509 CRL-----
diff --git a/dist-assets/icon.icns b/dist-assets/icon.icns
new file mode 100644
index 0000000000..77c0e0a0b4
--- /dev/null
+++ b/dist-assets/icon.icns
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_128x128.png b/dist-assets/icon.iconset/icon_128x128.png
new file mode 100644
index 0000000000..93f2bf550a
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_128x128.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_128x128@2x.png b/dist-assets/icon.iconset/icon_128x128@2x.png
new file mode 100644
index 0000000000..3f437773a6
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_128x128@2x.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_16x16.png b/dist-assets/icon.iconset/icon_16x16.png
new file mode 100644
index 0000000000..a93d450cb9
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_16x16.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_16x16@2x.png b/dist-assets/icon.iconset/icon_16x16@2x.png
new file mode 100644
index 0000000000..053963bd58
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_16x16@2x.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_256x256.png b/dist-assets/icon.iconset/icon_256x256.png
new file mode 100644
index 0000000000..3f437773a6
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_256x256.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_256x256@2x.png b/dist-assets/icon.iconset/icon_256x256@2x.png
new file mode 100644
index 0000000000..e1fadd3a24
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_256x256@2x.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_32x32.png b/dist-assets/icon.iconset/icon_32x32.png
new file mode 100644
index 0000000000..053963bd58
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_32x32.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_32x32@2x.png b/dist-assets/icon.iconset/icon_32x32@2x.png
new file mode 100644
index 0000000000..db8bf078d5
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_32x32@2x.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_512x512.png b/dist-assets/icon.iconset/icon_512x512.png
new file mode 100644
index 0000000000..e1fadd3a24
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_512x512.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_512x512@2x.png b/dist-assets/icon.iconset/icon_512x512@2x.png
new file mode 100644
index 0000000000..c4ff686d31
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_512x512@2x.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_64x64.png b/dist-assets/icon.iconset/icon_64x64.png
new file mode 100644
index 0000000000..db8bf078d5
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_64x64.png
Binary files differ
diff --git a/dist-assets/icon.iconset/icon_64x64@2x.png b/dist-assets/icon.iconset/icon_64x64@2x.png
new file mode 100644
index 0000000000..93f2bf550a
--- /dev/null
+++ b/dist-assets/icon.iconset/icon_64x64@2x.png
Binary files differ
diff --git a/electron-builder.yml b/electron-builder.yml
new file mode 100644
index 0000000000..a69dd685a4
--- /dev/null
+++ b/electron-builder.yml
@@ -0,0 +1,81 @@
+appId: net.mullvad.vpn
+copyright: Amagicom AB
+productName: MullvadVPN
+
+asar: true
+compression: maximum
+
+# assets bundled on all platforms
+extraResources:
+ # master.mullvad.net certificate used by mullvadd
+ - from: dist-assets/ca.crt
+ to: .
+ - from: dist-assets/crl.pem
+ to: .
+
+directories:
+ buildResources: dist-assets/
+ output: dist/
+
+files:
+ - package.json
+ - init.js
+ - build/
+ - node_modules/
+
+dmg:
+ contents:
+ - type: link
+ path: /Applications
+ x: 410
+ y: 150
+ - type: file
+ x: 130
+ y: 150
+
+mac:
+ target:
+ - dmg
+ artifactName: ${productName}-${version}.${ext}
+ category: public.app-category.tools
+ extendInfo:
+ LSUIElement: true
+ extraResources:
+ - from: ../talpid_core/target/release/mullvad
+ to: .
+ - from: ../talpid_core/target/release/problem-report
+ to: .
+ - from: ../talpid_core/target/release/mullvadd
+ to: .
+ - from: ../talpid_core/target/release/libtalpid_openvpn_plugin.dylib
+ to: .
+ - from: ../client-binaries/mac/include/openvpn
+ to: ./openvpn-binaries/openvpn
+
+win:
+ target:
+ - nsis
+ artifactName: ${productName}-${version}.${ext}
+ extraResources:
+ - from: ../talpid_core/target/release/mullvad.exe
+ to: .
+ - from: ../talpid_core/target/release/problem-report.exe
+ to: .
+ - from: ../talpid_core/target/release/mullvadd.exe
+ to: .
+ - from: ../talpid_core/target/release/libtalpid_openvpn_plugin.dll
+ to: .
+
+linux:
+ target:
+ - deb
+ artifactName: ${productName}-${version}_${arch}.${ext}
+ extraResources:
+ - from: ../talpid_core/target/release/mullvad
+ to: .
+ - from: ../talpid_core/target/release/problem-report
+ to: .
+ - from: ../talpid_core/target/release/mullvadd
+ to: .
+ - from: ../talpid_core/target/release/libtalpid_openvpn_plugin.so
+ to: .
diff --git a/flow-libs/electron.js.flow b/flow-libs/electron.js.flow
new file mode 100644
index 0000000000..631e99559a
--- /dev/null
+++ b/flow-libs/electron.js.flow
@@ -0,0 +1,192 @@
+// @flow
+
+import EventEmitter from 'events';
+
+declare var process: Process & {
+ resourcesPath: string;
+ type: "browser" | "renderer";
+ versions: {
+ electron: string;
+ chrome: string;
+ };
+};
+
+declare module 'electron' {
+
+ // common types
+
+ declare type Size = {
+ width: number;
+ height: number;
+ }
+
+ declare type Rectangle = {
+ width: number;
+ height: number;
+ x: number;
+ y: number;
+ }
+
+ // http://electron.atom.io/docs/api/app
+
+ declare class App extends EventEmitter {
+ getPath(name: string): string;
+ setPath(name: string, path: string): void;
+ quit(): void;
+ }
+
+ // http://electron.atom.io/docs/api/shell
+ declare type OpenExternalOptions = {
+ activate: boolean;
+ }
+
+ declare class Shell {
+ showItemInFolder(fullPath: string): boolean;
+ openItem(fullPath: string): boolean;
+ openExternal(url: string, options?: OpenExternalOptions, callback: (error: Error) => void): boolean;
+ moveItemToTrash(fullPath: string): boolean;
+ beep(): void;
+ }
+
+ // http://electron.atom.io/docs/api/remote
+
+ declare class Remote {
+ app: App;
+ getCurrentWindow(): BrowserWindow;
+ getCurrentWebContents(): WebContents;
+ getGlobal(name: string): ?mixed;
+ }
+
+ // http://electron.atom.io/docs/api/clipboard
+
+ declare class Clipboard {
+ writeText(text: string, type?: string): void;
+ }
+
+ // http://electron.atom.io/docs/api/native-image
+
+ declare class NativeImage {
+ isEmpty(): boolean;
+ getSize(): Size;
+ }
+
+ // http://electron.atom.io/docs/api/tray
+
+ declare class Tray extends EventEmitter {
+ constructor(image: NativeImage | string): void;
+ getBounds(): Rectangle;
+ setHighlightMode(mode: 'selection' | 'always' | 'never'): void;
+ setImage(image: NativeImage | string): void;
+ setPressedImage(image: NativeImage | string): void;
+ }
+
+ // http://electron.atom.io/docs/api/web-frame
+
+ declare class WebFrame extends EventEmitter {
+ setZoomLevelLimits(minimumLevel: number, maximumLevel: number): void;
+ }
+
+ // http://electron.atom.io/docs/api/ipc-renderer
+
+ declare class IpcRenderer extends EventEmitter {
+ send(channel: string, ...args: Array<mixed>): void;
+ }
+
+ // http://electron.atom.io/docs/api/ipc-main
+
+ declare class IpcMain extends EventEmitter {}
+
+ declare class WebContents extends EventEmitter {}
+
+ // http://electron.atom.io/docs/api/browser-window
+
+ declare type OpenDevToolsOptions = {
+ mode: 'right' | 'bottom' | 'undocked' | 'detach';
+ }
+
+ declare type WebPreferences = {
+ backgroundThrottling?: boolean;
+ scrollBounce?: boolean;
+ blinkFeatures?: string;
+ disableBlinkFeatures?: string;
+ }
+
+ declare type BrowserWindowConstructorOptions = {
+ width?: number;
+ height?: number;
+ resizable?: boolean;
+ maximizable?: boolean;
+ fullscreenable?: boolean;
+ show?: boolean;
+ frame?: boolean;
+ transparent?: boolean;
+ webPreferences?: WebPreferences;
+ }
+
+ declare type LoadURLOptions = {
+ userAgent?: string;
+ }
+
+ declare class BrowserWindow extends EventEmitter {
+ constructor(options: ?BrowserWindowConstructorOptions): this;
+ isVisible(): boolean;
+ show(): void;
+ hide(): void;
+ focus(): void;
+ setPosition(x: number, y: number, animate?: boolean): void;
+ getBounds(): Rectangle;
+ inspectElement(x: number, y: number): void;
+ isDevToolsOpened(): boolean;isDevToolsOpened(): boolean;
+ openDevTools(options?: OpenDevToolsOptions): void;
+ closeDevTools(): void;
+ loadURL(url: string, options?: LoadURLOptions): void;
+ webContents: WebContents;
+ }
+
+ // http://electron.atom.io/docs/api/menu-item
+ declare class MenuItem {}
+
+ // http://electron.atom.io/docs/api/menu
+
+ declare type MenuItemConstructorOptions = {
+ type?: 'normal' | 'separator' | 'submenu' | 'checkbox' | 'radio';
+ label?: string;
+ role?: string;
+ click?: (menuItem: MenuItem, browserWindow: BrowserWindow, event: Event) => void;
+ }
+
+ declare type PopupOptions = {
+ x?: number;
+ y?: number;
+ }
+
+ declare class Menu {
+ static buildFromTemplate(template: Array<MenuItemConstructorOptions>): Menu;
+ static setApplicationMenu(menu: Menu): void;
+ popup(browserWindow?: BrowserWindow, options?: PopupOptions): void;
+ }
+
+ // http://electron.atom.io/docs/api/app
+
+ declare class App extends EventEmitter {
+ setPath(name: string, path: string): void;
+ getPath(name: string): string;
+ quit(): void;
+ }
+
+ // MainInterface
+
+ declare var nativeImage: {
+ createEmpty(): NativeImage,
+ createFromPath(path: string): NativeImage,
+ createFromBuffer(buffer: Buffer, scaleFactor?: number): NativeImage,
+ createFromDataURL(dataURL: string): NativeImage
+ };
+ declare var webFrame: WebFrame;
+ declare var app: App;
+ declare var ipcRenderer: IpcRenderer;
+ declare var ipcMain: IpcMain;
+ declare var remote: Remote;
+ declare var shell: Shell;
+ declare var clipboard: Clipboard;
+}
diff --git a/flow-libs/history.js.flow b/flow-libs/history.js.flow
new file mode 100644
index 0000000000..69c25e2011
--- /dev/null
+++ b/flow-libs/history.js.flow
@@ -0,0 +1,24 @@
+// @flow
+
+declare module 'history' {
+
+ declare class History {
+ length: number;
+ action: string;
+ location: string;
+ index: number;
+ entries: Array<string>;
+ createHref(location: string): string;
+ push(path: string): void;
+ replace(path: string): void;
+ go(index: number): void;
+ goBack(): void;
+ goForward(): void;
+ canGo(index: number): boolean;
+ block(prompt?: boolean): void;
+ listen(listener: (location: string, action: string) => void): void;
+ }
+
+ declare function createMemoryHistory(): History;
+
+} \ No newline at end of file
diff --git a/flow-libs/nseventmonitor.js.flow b/flow-libs/nseventmonitor.js.flow
new file mode 100644
index 0000000000..33b0c06966
--- /dev/null
+++ b/flow-libs/nseventmonitor.js.flow
@@ -0,0 +1,42 @@
+declare module 'nseventmonitor' {
+
+ declare export class NSEventMonitor {
+ start(eventMask: number, handler: () => void): void;
+ stop(): void;
+ }
+
+ declare export var NSEventMask: {
+ leftMouseDown: number;
+ leftMouseUp: number;
+ rightMouseDown: number;
+ rightMouseUp: number;
+ mouseMoved: number;
+ leftMouseDragged: number;
+ rightMouseDragged: number;
+ mouseEntered: number;
+ mouseExited: number;
+ keyDown: number;
+ keyUp: number;
+ flagsChanged: number;
+ appKitDefined: number;
+ applicationDefined: number;
+ periodic: number;
+ cursorUpdate: number;
+ scrollWheel: number;
+ tabletPoint: number;
+ tabletProximity: number;
+ otherMouseDown: number;
+ otherMouseUp: number;
+ otherMouseDragged: number;
+ gesture: number;
+ magnify: number;
+ swipe: number;
+ rotate: number;
+ beginGesture: number;
+ endGesture: number;
+ smartMagnify: number;
+ maskPressure: number;
+ directTouch: number;
+ any: number;
+ }
+} \ No newline at end of file
diff --git a/flow-typed/npm/babel-cli_vx.x.x.js b/flow-typed/npm/babel-cli_vx.x.x.js
new file mode 100644
index 0000000000..9c4028988a
--- /dev/null
+++ b/flow-typed/npm/babel-cli_vx.x.x.js
@@ -0,0 +1,108 @@
+// flow-typed signature: bf4b0be6a05260190b630beff7bd2dd0
+// flow-typed version: <<STUB>>/babel-cli_v^6.22.2/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-cli'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-cli' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-cli/bin/babel-doctor' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/bin/babel-external-helpers' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/bin/babel-node' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/bin/babel' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/lib/_babel-node' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/lib/babel-external-helpers' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/lib/babel-node' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/lib/babel/dir' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/lib/babel/file' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/lib/babel/index' {
+ declare module.exports: any;
+}
+
+declare module 'babel-cli/lib/babel/util' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-cli/bin/babel-doctor.js' {
+ declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>;
+}
+declare module 'babel-cli/bin/babel-external-helpers.js' {
+ declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>;
+}
+declare module 'babel-cli/bin/babel-node.js' {
+ declare module.exports: $Exports<'babel-cli/bin/babel-node'>;
+}
+declare module 'babel-cli/bin/babel.js' {
+ declare module.exports: $Exports<'babel-cli/bin/babel'>;
+}
+declare module 'babel-cli/index' {
+ declare module.exports: $Exports<'babel-cli'>;
+}
+declare module 'babel-cli/index.js' {
+ declare module.exports: $Exports<'babel-cli'>;
+}
+declare module 'babel-cli/lib/_babel-node.js' {
+ declare module.exports: $Exports<'babel-cli/lib/_babel-node'>;
+}
+declare module 'babel-cli/lib/babel-external-helpers.js' {
+ declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>;
+}
+declare module 'babel-cli/lib/babel-node.js' {
+ declare module.exports: $Exports<'babel-cli/lib/babel-node'>;
+}
+declare module 'babel-cli/lib/babel/dir.js' {
+ declare module.exports: $Exports<'babel-cli/lib/babel/dir'>;
+}
+declare module 'babel-cli/lib/babel/file.js' {
+ declare module.exports: $Exports<'babel-cli/lib/babel/file'>;
+}
+declare module 'babel-cli/lib/babel/index.js' {
+ declare module.exports: $Exports<'babel-cli/lib/babel/index'>;
+}
+declare module 'babel-cli/lib/babel/util.js' {
+ declare module.exports: $Exports<'babel-cli/lib/babel/util'>;
+}
diff --git a/flow-typed/npm/babel-core_vx.x.x.js b/flow-typed/npm/babel-core_vx.x.x.js
new file mode 100644
index 0000000000..545b19d881
--- /dev/null
+++ b/flow-typed/npm/babel-core_vx.x.x.js
@@ -0,0 +1,227 @@
+// flow-typed signature: 66c7098fcc8846ee9acdd434f88fab09
+// flow-typed version: <<STUB>>/babel-core_v^6.2.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-core'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-core' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-core/lib/api/browser' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/api/node' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/get-possible-plugin-names' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/get-possible-preset-names' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/merge' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/normalize-ast' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/resolve-from-possible-names' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/resolve-plugin' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/resolve-preset' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/helpers/resolve' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/store' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/tools/build-external-helpers' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/index' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/logger' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/options/build-config-chain' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/options/config' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/options/index' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/options/option-manager' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/options/parsers' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/file/options/removed' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/internal-plugins/block-hoist' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/pipeline' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/plugin-pass' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/transformation/plugin' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/lib/util' {
+ declare module.exports: any;
+}
+
+declare module 'babel-core/register' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-core/index' {
+ declare module.exports: $Exports<'babel-core'>;
+}
+declare module 'babel-core/index.js' {
+ declare module.exports: $Exports<'babel-core'>;
+}
+declare module 'babel-core/lib/api/browser.js' {
+ declare module.exports: $Exports<'babel-core/lib/api/browser'>;
+}
+declare module 'babel-core/lib/api/node.js' {
+ declare module.exports: $Exports<'babel-core/lib/api/node'>;
+}
+declare module 'babel-core/lib/helpers/get-possible-plugin-names.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/get-possible-plugin-names'>;
+}
+declare module 'babel-core/lib/helpers/get-possible-preset-names.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/get-possible-preset-names'>;
+}
+declare module 'babel-core/lib/helpers/merge.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/merge'>;
+}
+declare module 'babel-core/lib/helpers/normalize-ast.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/normalize-ast'>;
+}
+declare module 'babel-core/lib/helpers/resolve-from-possible-names.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/resolve-from-possible-names'>;
+}
+declare module 'babel-core/lib/helpers/resolve-plugin.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/resolve-plugin'>;
+}
+declare module 'babel-core/lib/helpers/resolve-preset.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/resolve-preset'>;
+}
+declare module 'babel-core/lib/helpers/resolve.js' {
+ declare module.exports: $Exports<'babel-core/lib/helpers/resolve'>;
+}
+declare module 'babel-core/lib/store.js' {
+ declare module.exports: $Exports<'babel-core/lib/store'>;
+}
+declare module 'babel-core/lib/tools/build-external-helpers.js' {
+ declare module.exports: $Exports<'babel-core/lib/tools/build-external-helpers'>;
+}
+declare module 'babel-core/lib/transformation/file/index.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/index'>;
+}
+declare module 'babel-core/lib/transformation/file/logger.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/logger'>;
+}
+declare module 'babel-core/lib/transformation/file/metadata.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/metadata'>;
+}
+declare module 'babel-core/lib/transformation/file/options/build-config-chain.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/options/build-config-chain'>;
+}
+declare module 'babel-core/lib/transformation/file/options/config.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/options/config'>;
+}
+declare module 'babel-core/lib/transformation/file/options/index.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/options/index'>;
+}
+declare module 'babel-core/lib/transformation/file/options/option-manager.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/options/option-manager'>;
+}
+declare module 'babel-core/lib/transformation/file/options/parsers.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/options/parsers'>;
+}
+declare module 'babel-core/lib/transformation/file/options/removed.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/file/options/removed'>;
+}
+declare module 'babel-core/lib/transformation/internal-plugins/block-hoist.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/block-hoist'>;
+}
+declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/shadow-functions'>;
+}
+declare module 'babel-core/lib/transformation/pipeline.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/pipeline'>;
+}
+declare module 'babel-core/lib/transformation/plugin-pass.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/plugin-pass'>;
+}
+declare module 'babel-core/lib/transformation/plugin.js' {
+ declare module.exports: $Exports<'babel-core/lib/transformation/plugin'>;
+}
+declare module 'babel-core/lib/util.js' {
+ declare module.exports: $Exports<'babel-core/lib/util'>;
+}
+declare module 'babel-core/register.js' {
+ declare module.exports: $Exports<'babel-core/register'>;
+}
diff --git a/flow-typed/npm/babel-eslint_vx.x.x.js b/flow-typed/npm/babel-eslint_vx.x.x.js
new file mode 100644
index 0000000000..3531c363c2
--- /dev/null
+++ b/flow-typed/npm/babel-eslint_vx.x.x.js
@@ -0,0 +1,80 @@
+// flow-typed signature: efd0381105fe579ff3e86fcbd5ae00cb
+// flow-typed version: <<STUB>>/babel-eslint_v^7.1.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-eslint'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-eslint' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-eslint/babylon-to-espree/attachComments' {
+ declare module.exports: any;
+}
+
+declare module 'babel-eslint/babylon-to-espree/convertComments' {
+ declare module.exports: any;
+}
+
+declare module 'babel-eslint/babylon-to-espree/convertTemplateType' {
+ declare module.exports: any;
+}
+
+declare module 'babel-eslint/babylon-to-espree/index' {
+ declare module.exports: any;
+}
+
+declare module 'babel-eslint/babylon-to-espree/toAST' {
+ declare module.exports: any;
+}
+
+declare module 'babel-eslint/babylon-to-espree/toToken' {
+ declare module.exports: any;
+}
+
+declare module 'babel-eslint/babylon-to-espree/toTokens' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-eslint/babylon-to-espree/attachComments.js' {
+ declare module.exports: $Exports<'babel-eslint/babylon-to-espree/attachComments'>;
+}
+declare module 'babel-eslint/babylon-to-espree/convertComments.js' {
+ declare module.exports: $Exports<'babel-eslint/babylon-to-espree/convertComments'>;
+}
+declare module 'babel-eslint/babylon-to-espree/convertTemplateType.js' {
+ declare module.exports: $Exports<'babel-eslint/babylon-to-espree/convertTemplateType'>;
+}
+declare module 'babel-eslint/babylon-to-espree/index.js' {
+ declare module.exports: $Exports<'babel-eslint/babylon-to-espree/index'>;
+}
+declare module 'babel-eslint/babylon-to-espree/toAST.js' {
+ declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toAST'>;
+}
+declare module 'babel-eslint/babylon-to-espree/toToken.js' {
+ declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toToken'>;
+}
+declare module 'babel-eslint/babylon-to-espree/toTokens.js' {
+ declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toTokens'>;
+}
+declare module 'babel-eslint/index' {
+ declare module.exports: $Exports<'babel-eslint'>;
+}
+declare module 'babel-eslint/index.js' {
+ declare module.exports: $Exports<'babel-eslint'>;
+}
diff --git a/flow-typed/npm/babel-plugin-inline-react-svg_vx.x.x.js b/flow-typed/npm/babel-plugin-inline-react-svg_vx.x.x.js
new file mode 100644
index 0000000000..5ed462b165
--- /dev/null
+++ b/flow-typed/npm/babel-plugin-inline-react-svg_vx.x.x.js
@@ -0,0 +1,81 @@
+// flow-typed signature: 568356fc5a3cf56b87fec1c90e4399f8
+// flow-typed version: <<STUB>>/babel-plugin-inline-react-svg_v^0.3.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-plugin-inline-react-svg'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-plugin-inline-react-svg' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-plugin-inline-react-svg/lib/camelize' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-inline-react-svg/lib/cssToObj' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-inline-react-svg/lib/escapeBraces' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-inline-react-svg/lib/index' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-inline-react-svg/lib/optimize' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-inline-react-svg/lib/transformSvg' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-inline-react-svg/test/fixtures/test' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-inline-react-svg/test/sanity' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-plugin-inline-react-svg/lib/camelize.js' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/lib/camelize'>;
+}
+declare module 'babel-plugin-inline-react-svg/lib/cssToObj.js' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/lib/cssToObj'>;
+}
+declare module 'babel-plugin-inline-react-svg/lib/escapeBraces.js' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/lib/escapeBraces'>;
+}
+declare module 'babel-plugin-inline-react-svg/lib/index.js' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/lib/index'>;
+}
+declare module 'babel-plugin-inline-react-svg/lib/optimize.js' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/lib/optimize'>;
+}
+declare module 'babel-plugin-inline-react-svg/lib/transformSvg.js' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/lib/transformSvg'>;
+}
+declare module 'babel-plugin-inline-react-svg/test/fixtures/test.jsx' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/test/fixtures/test'>;
+}
+declare module 'babel-plugin-inline-react-svg/test/sanity.js' {
+ declare module.exports: $Exports<'babel-plugin-inline-react-svg/test/sanity'>;
+}
diff --git a/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js b/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js
new file mode 100644
index 0000000000..cbc9456369
--- /dev/null
+++ b/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js
@@ -0,0 +1,39 @@
+// flow-typed signature: fbb08e23f7242a89b0a6d84fe3c2686c
+// flow-typed version: <<STUB>>/babel-plugin-transform-runtime_v^6.22.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-plugin-transform-runtime'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-plugin-transform-runtime' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-plugin-transform-runtime/lib/definitions' {
+ declare module.exports: any;
+}
+
+declare module 'babel-plugin-transform-runtime/lib/index' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-plugin-transform-runtime/lib/definitions.js' {
+ declare module.exports: $Exports<'babel-plugin-transform-runtime/lib/definitions'>;
+}
+declare module 'babel-plugin-transform-runtime/lib/index.js' {
+ declare module.exports: $Exports<'babel-plugin-transform-runtime/lib/index'>;
+}
diff --git a/flow-typed/npm/babel-preset-es2015_vx.x.x.js b/flow-typed/npm/babel-preset-es2015_vx.x.x.js
new file mode 100644
index 0000000000..bedb9e8f79
--- /dev/null
+++ b/flow-typed/npm/babel-preset-es2015_vx.x.x.js
@@ -0,0 +1,32 @@
+// flow-typed signature: 0099da7fa337e927e4580cd10ad2c3ac
+// flow-typed version: <<STUB>>/babel-preset-es2015_v^6.1.18/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-preset-es2015'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-preset-es2015' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-preset-es2015/lib/index' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-preset-es2015/lib/index.js' {
+ declare module.exports: $Exports<'babel-preset-es2015/lib/index'>;
+}
diff --git a/flow-typed/npm/babel-preset-react_vx.x.x.js b/flow-typed/npm/babel-preset-react_vx.x.x.js
new file mode 100644
index 0000000000..7ea4ff0300
--- /dev/null
+++ b/flow-typed/npm/babel-preset-react_vx.x.x.js
@@ -0,0 +1,32 @@
+// flow-typed signature: c7883c65a706b865dc60632823074ace
+// flow-typed version: <<STUB>>/babel-preset-react_v^6.22.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-preset-react'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-preset-react' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-preset-react/lib/index' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-preset-react/lib/index.js' {
+ declare module.exports: $Exports<'babel-preset-react/lib/index'>;
+}
diff --git a/flow-typed/npm/babel-preset-stage-0_vx.x.x.js b/flow-typed/npm/babel-preset-stage-0_vx.x.x.js
new file mode 100644
index 0000000000..432f9bce84
--- /dev/null
+++ b/flow-typed/npm/babel-preset-stage-0_vx.x.x.js
@@ -0,0 +1,32 @@
+// flow-typed signature: c23722099a04d51475c95d0c41cb62f3
+// flow-typed version: <<STUB>>/babel-preset-stage-0_v^6.1.18/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-preset-stage-0'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-preset-stage-0' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-preset-stage-0/lib/index' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-preset-stage-0/lib/index.js' {
+ declare module.exports: $Exports<'babel-preset-stage-0/lib/index'>;
+}
diff --git a/flow-typed/npm/babel-runtime_vx.x.x.js b/flow-typed/npm/babel-runtime_vx.x.x.js
new file mode 100644
index 0000000000..5dd826a084
--- /dev/null
+++ b/flow-typed/npm/babel-runtime_vx.x.x.js
@@ -0,0 +1,1691 @@
+// flow-typed signature: 255f2bc362a6d25d1d3bccb19af2ad69
+// flow-typed version: <<STUB>>/babel-runtime_v^6.22.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'babel-runtime'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-runtime' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-runtime/core-js' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/concat' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/copy-within' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/entries' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/every' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/fill' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/filter' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/find-index' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/find' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/for-each' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/from' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/includes' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/index-of' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/join' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/keys' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/last-index-of' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/map' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/of' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/pop' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/push' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/reduce-right' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/reduce' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/reverse' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/shift' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/slice' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/some' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/sort' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/splice' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/unshift' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/array/values' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/asap' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/clear-immediate' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/error/is-error' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/get-iterator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/is-iterable' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/json/stringify' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/map' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/acosh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/asinh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/atanh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/cbrt' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/clz32' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/cosh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/expm1' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/fround' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/hypot' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/iaddh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/imul' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/imulh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/isubh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/log10' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/log1p' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/log2' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/sign' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/sinh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/tanh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/trunc' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/math/umulh' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/epsilon' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/is-finite' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/is-integer' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/is-nan' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/is-safe-integer' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/max-safe-integer' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/min-safe-integer' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/parse-float' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/number/parse-int' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/assign' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/create' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/define-properties' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/define-property' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/entries' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/freeze' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/get-own-property-descriptor' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/get-own-property-descriptors' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/get-own-property-names' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/get-own-property-symbols' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/get-prototype-of' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/is-extensible' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/is-frozen' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/is-sealed' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/is' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/keys' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/prevent-extensions' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/seal' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/set-prototype-of' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/object/values' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/observable' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/promise' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/apply' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/construct' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/define-metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/define-property' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/delete-metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/delete-property' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/enumerate' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/get-metadata-keys' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/get-metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/get-own-metadata-keys' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/get-own-metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/get-own-property-descriptor' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/get-prototype-of' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/get' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/has-metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/has-own-metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/has' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/is-extensible' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/metadata' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/own-keys' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/prevent-extensions' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/set-prototype-of' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/reflect/set' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/regexp/escape' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/set-immediate' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/set' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/at' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/code-point-at' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/ends-with' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/from-code-point' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/includes' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/match-all' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/pad-end' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/pad-left' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/pad-right' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/pad-start' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/raw' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/repeat' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/starts-with' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/trim-end' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/trim-left' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/trim-right' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/trim-start' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/string/trim' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/async-iterator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/for' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/has-instance' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/is-concat-spreadable' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/iterator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/key-for' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/match' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/observable' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/replace' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/search' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/species' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/split' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/to-primitive' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/to-string-tag' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/symbol/unscopables' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/system/global' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/weak-map' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/core-js/weak-set' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_async-generator-delegate' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_async-generator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_async-iterator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_async-to-generator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_class-call-check' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_create-class' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_defaults' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_define-enumerable-properties' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_define-property' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_extends' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_get' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_inherits' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_instanceof' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_interop-require-default' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_interop-require-wildcard' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_jsx' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_new-arrow-check' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_object-destructuring-empty' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_object-without-properties' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_possible-constructor-return' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_self-global' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_set' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_sliced-to-array-loose' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_sliced-to-array' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_tagged-template-literal-loose' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_tagged-template-literal' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_temporal-ref' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_temporal-undefined' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_to-array' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_to-consumable-array' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/_typeof' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/async-generator-delegate' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/async-generator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/async-iterator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/async-to-generator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/asyncGenerator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/asyncGeneratorDelegate' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/asyncIterator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/asyncToGenerator' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/class-call-check' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/classCallCheck' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/create-class' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/createClass' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/defaults' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/define-enumerable-properties' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/define-property' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/defineEnumerableProperties' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/defineProperty' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/extends' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/get' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/inherits' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/instanceof' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/interop-require-default' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/interop-require-wildcard' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/interopRequireDefault' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/interopRequireWildcard' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/jsx' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/new-arrow-check' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/newArrowCheck' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/object-destructuring-empty' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/object-without-properties' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/objectDestructuringEmpty' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/objectWithoutProperties' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/possible-constructor-return' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/possibleConstructorReturn' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/self-global' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/selfGlobal' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/set' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/sliced-to-array-loose' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/sliced-to-array' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/slicedToArray' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/slicedToArrayLoose' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/tagged-template-literal-loose' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/tagged-template-literal' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/taggedTemplateLiteral' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/taggedTemplateLiteralLoose' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/temporal-ref' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/temporal-undefined' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/temporalRef' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/temporalUndefined' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/to-array' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/to-consumable-array' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/toArray' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/toConsumableArray' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/helpers/typeof' {
+ declare module.exports: any;
+}
+
+declare module 'babel-runtime/regenerator/index' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-runtime/core-js.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js'>;
+}
+declare module 'babel-runtime/core-js/array/concat.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/concat'>;
+}
+declare module 'babel-runtime/core-js/array/copy-within.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/copy-within'>;
+}
+declare module 'babel-runtime/core-js/array/entries.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/entries'>;
+}
+declare module 'babel-runtime/core-js/array/every.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/every'>;
+}
+declare module 'babel-runtime/core-js/array/fill.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/fill'>;
+}
+declare module 'babel-runtime/core-js/array/filter.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/filter'>;
+}
+declare module 'babel-runtime/core-js/array/find-index.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/find-index'>;
+}
+declare module 'babel-runtime/core-js/array/find.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/find'>;
+}
+declare module 'babel-runtime/core-js/array/for-each.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/for-each'>;
+}
+declare module 'babel-runtime/core-js/array/from.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/from'>;
+}
+declare module 'babel-runtime/core-js/array/includes.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/includes'>;
+}
+declare module 'babel-runtime/core-js/array/index-of.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/index-of'>;
+}
+declare module 'babel-runtime/core-js/array/join.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/join'>;
+}
+declare module 'babel-runtime/core-js/array/keys.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/keys'>;
+}
+declare module 'babel-runtime/core-js/array/last-index-of.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/last-index-of'>;
+}
+declare module 'babel-runtime/core-js/array/map.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/map'>;
+}
+declare module 'babel-runtime/core-js/array/of.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/of'>;
+}
+declare module 'babel-runtime/core-js/array/pop.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/pop'>;
+}
+declare module 'babel-runtime/core-js/array/push.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/push'>;
+}
+declare module 'babel-runtime/core-js/array/reduce-right.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/reduce-right'>;
+}
+declare module 'babel-runtime/core-js/array/reduce.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/reduce'>;
+}
+declare module 'babel-runtime/core-js/array/reverse.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/reverse'>;
+}
+declare module 'babel-runtime/core-js/array/shift.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/shift'>;
+}
+declare module 'babel-runtime/core-js/array/slice.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/slice'>;
+}
+declare module 'babel-runtime/core-js/array/some.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/some'>;
+}
+declare module 'babel-runtime/core-js/array/sort.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/sort'>;
+}
+declare module 'babel-runtime/core-js/array/splice.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/splice'>;
+}
+declare module 'babel-runtime/core-js/array/unshift.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/unshift'>;
+}
+declare module 'babel-runtime/core-js/array/values.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/array/values'>;
+}
+declare module 'babel-runtime/core-js/asap.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/asap'>;
+}
+declare module 'babel-runtime/core-js/clear-immediate.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/clear-immediate'>;
+}
+declare module 'babel-runtime/core-js/error/is-error.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/error/is-error'>;
+}
+declare module 'babel-runtime/core-js/get-iterator.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/get-iterator'>;
+}
+declare module 'babel-runtime/core-js/is-iterable.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/is-iterable'>;
+}
+declare module 'babel-runtime/core-js/json/stringify.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/json/stringify'>;
+}
+declare module 'babel-runtime/core-js/map.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/map'>;
+}
+declare module 'babel-runtime/core-js/math/acosh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/acosh'>;
+}
+declare module 'babel-runtime/core-js/math/asinh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/asinh'>;
+}
+declare module 'babel-runtime/core-js/math/atanh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/atanh'>;
+}
+declare module 'babel-runtime/core-js/math/cbrt.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/cbrt'>;
+}
+declare module 'babel-runtime/core-js/math/clz32.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/clz32'>;
+}
+declare module 'babel-runtime/core-js/math/cosh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/cosh'>;
+}
+declare module 'babel-runtime/core-js/math/expm1.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/expm1'>;
+}
+declare module 'babel-runtime/core-js/math/fround.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/fround'>;
+}
+declare module 'babel-runtime/core-js/math/hypot.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/hypot'>;
+}
+declare module 'babel-runtime/core-js/math/iaddh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/iaddh'>;
+}
+declare module 'babel-runtime/core-js/math/imul.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/imul'>;
+}
+declare module 'babel-runtime/core-js/math/imulh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/imulh'>;
+}
+declare module 'babel-runtime/core-js/math/isubh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/isubh'>;
+}
+declare module 'babel-runtime/core-js/math/log10.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/log10'>;
+}
+declare module 'babel-runtime/core-js/math/log1p.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/log1p'>;
+}
+declare module 'babel-runtime/core-js/math/log2.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/log2'>;
+}
+declare module 'babel-runtime/core-js/math/sign.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/sign'>;
+}
+declare module 'babel-runtime/core-js/math/sinh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/sinh'>;
+}
+declare module 'babel-runtime/core-js/math/tanh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/tanh'>;
+}
+declare module 'babel-runtime/core-js/math/trunc.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/trunc'>;
+}
+declare module 'babel-runtime/core-js/math/umulh.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/math/umulh'>;
+}
+declare module 'babel-runtime/core-js/number/epsilon.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/epsilon'>;
+}
+declare module 'babel-runtime/core-js/number/is-finite.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/is-finite'>;
+}
+declare module 'babel-runtime/core-js/number/is-integer.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/is-integer'>;
+}
+declare module 'babel-runtime/core-js/number/is-nan.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/is-nan'>;
+}
+declare module 'babel-runtime/core-js/number/is-safe-integer.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/is-safe-integer'>;
+}
+declare module 'babel-runtime/core-js/number/max-safe-integer.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/max-safe-integer'>;
+}
+declare module 'babel-runtime/core-js/number/min-safe-integer.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/min-safe-integer'>;
+}
+declare module 'babel-runtime/core-js/number/parse-float.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/parse-float'>;
+}
+declare module 'babel-runtime/core-js/number/parse-int.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/number/parse-int'>;
+}
+declare module 'babel-runtime/core-js/object/assign.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/assign'>;
+}
+declare module 'babel-runtime/core-js/object/create.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/create'>;
+}
+declare module 'babel-runtime/core-js/object/define-properties.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/define-properties'>;
+}
+declare module 'babel-runtime/core-js/object/define-property.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/define-property'>;
+}
+declare module 'babel-runtime/core-js/object/entries.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/entries'>;
+}
+declare module 'babel-runtime/core-js/object/freeze.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/freeze'>;
+}
+declare module 'babel-runtime/core-js/object/get-own-property-descriptor.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-descriptor'>;
+}
+declare module 'babel-runtime/core-js/object/get-own-property-descriptors.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-descriptors'>;
+}
+declare module 'babel-runtime/core-js/object/get-own-property-names.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-names'>;
+}
+declare module 'babel-runtime/core-js/object/get-own-property-symbols.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-symbols'>;
+}
+declare module 'babel-runtime/core-js/object/get-prototype-of.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/get-prototype-of'>;
+}
+declare module 'babel-runtime/core-js/object/is-extensible.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/is-extensible'>;
+}
+declare module 'babel-runtime/core-js/object/is-frozen.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/is-frozen'>;
+}
+declare module 'babel-runtime/core-js/object/is-sealed.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/is-sealed'>;
+}
+declare module 'babel-runtime/core-js/object/is.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/is'>;
+}
+declare module 'babel-runtime/core-js/object/keys.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/keys'>;
+}
+declare module 'babel-runtime/core-js/object/prevent-extensions.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/prevent-extensions'>;
+}
+declare module 'babel-runtime/core-js/object/seal.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/seal'>;
+}
+declare module 'babel-runtime/core-js/object/set-prototype-of.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/set-prototype-of'>;
+}
+declare module 'babel-runtime/core-js/object/values.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/object/values'>;
+}
+declare module 'babel-runtime/core-js/observable.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/observable'>;
+}
+declare module 'babel-runtime/core-js/promise.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/promise'>;
+}
+declare module 'babel-runtime/core-js/reflect/apply.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/apply'>;
+}
+declare module 'babel-runtime/core-js/reflect/construct.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/construct'>;
+}
+declare module 'babel-runtime/core-js/reflect/define-metadata.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/define-metadata'>;
+}
+declare module 'babel-runtime/core-js/reflect/define-property.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/define-property'>;
+}
+declare module 'babel-runtime/core-js/reflect/delete-metadata.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/delete-metadata'>;
+}
+declare module 'babel-runtime/core-js/reflect/delete-property.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/delete-property'>;
+}
+declare module 'babel-runtime/core-js/reflect/enumerate.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/enumerate'>;
+}
+declare module 'babel-runtime/core-js/reflect/get-metadata-keys.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-metadata-keys'>;
+}
+declare module 'babel-runtime/core-js/reflect/get-metadata.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-metadata'>;
+}
+declare module 'babel-runtime/core-js/reflect/get-own-metadata-keys.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-own-metadata-keys'>;
+}
+declare module 'babel-runtime/core-js/reflect/get-own-metadata.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-own-metadata'>;
+}
+declare module 'babel-runtime/core-js/reflect/get-own-property-descriptor.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-own-property-descriptor'>;
+}
+declare module 'babel-runtime/core-js/reflect/get-prototype-of.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-prototype-of'>;
+}
+declare module 'babel-runtime/core-js/reflect/get.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/get'>;
+}
+declare module 'babel-runtime/core-js/reflect/has-metadata.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/has-metadata'>;
+}
+declare module 'babel-runtime/core-js/reflect/has-own-metadata.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/has-own-metadata'>;
+}
+declare module 'babel-runtime/core-js/reflect/has.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/has'>;
+}
+declare module 'babel-runtime/core-js/reflect/is-extensible.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/is-extensible'>;
+}
+declare module 'babel-runtime/core-js/reflect/metadata.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/metadata'>;
+}
+declare module 'babel-runtime/core-js/reflect/own-keys.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/own-keys'>;
+}
+declare module 'babel-runtime/core-js/reflect/prevent-extensions.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/prevent-extensions'>;
+}
+declare module 'babel-runtime/core-js/reflect/set-prototype-of.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/set-prototype-of'>;
+}
+declare module 'babel-runtime/core-js/reflect/set.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/reflect/set'>;
+}
+declare module 'babel-runtime/core-js/regexp/escape.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/regexp/escape'>;
+}
+declare module 'babel-runtime/core-js/set-immediate.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/set-immediate'>;
+}
+declare module 'babel-runtime/core-js/set.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/set'>;
+}
+declare module 'babel-runtime/core-js/string/at.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/at'>;
+}
+declare module 'babel-runtime/core-js/string/code-point-at.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/code-point-at'>;
+}
+declare module 'babel-runtime/core-js/string/ends-with.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/ends-with'>;
+}
+declare module 'babel-runtime/core-js/string/from-code-point.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/from-code-point'>;
+}
+declare module 'babel-runtime/core-js/string/includes.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/includes'>;
+}
+declare module 'babel-runtime/core-js/string/match-all.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/match-all'>;
+}
+declare module 'babel-runtime/core-js/string/pad-end.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/pad-end'>;
+}
+declare module 'babel-runtime/core-js/string/pad-left.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/pad-left'>;
+}
+declare module 'babel-runtime/core-js/string/pad-right.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/pad-right'>;
+}
+declare module 'babel-runtime/core-js/string/pad-start.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/pad-start'>;
+}
+declare module 'babel-runtime/core-js/string/raw.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/raw'>;
+}
+declare module 'babel-runtime/core-js/string/repeat.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/repeat'>;
+}
+declare module 'babel-runtime/core-js/string/starts-with.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/starts-with'>;
+}
+declare module 'babel-runtime/core-js/string/trim-end.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/trim-end'>;
+}
+declare module 'babel-runtime/core-js/string/trim-left.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/trim-left'>;
+}
+declare module 'babel-runtime/core-js/string/trim-right.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/trim-right'>;
+}
+declare module 'babel-runtime/core-js/string/trim-start.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/trim-start'>;
+}
+declare module 'babel-runtime/core-js/string/trim.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/string/trim'>;
+}
+declare module 'babel-runtime/core-js/symbol.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol'>;
+}
+declare module 'babel-runtime/core-js/symbol/async-iterator.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/async-iterator'>;
+}
+declare module 'babel-runtime/core-js/symbol/for.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/for'>;
+}
+declare module 'babel-runtime/core-js/symbol/has-instance.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/has-instance'>;
+}
+declare module 'babel-runtime/core-js/symbol/is-concat-spreadable.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/is-concat-spreadable'>;
+}
+declare module 'babel-runtime/core-js/symbol/iterator.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/iterator'>;
+}
+declare module 'babel-runtime/core-js/symbol/key-for.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/key-for'>;
+}
+declare module 'babel-runtime/core-js/symbol/match.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/match'>;
+}
+declare module 'babel-runtime/core-js/symbol/observable.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/observable'>;
+}
+declare module 'babel-runtime/core-js/symbol/replace.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/replace'>;
+}
+declare module 'babel-runtime/core-js/symbol/search.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/search'>;
+}
+declare module 'babel-runtime/core-js/symbol/species.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/species'>;
+}
+declare module 'babel-runtime/core-js/symbol/split.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/split'>;
+}
+declare module 'babel-runtime/core-js/symbol/to-primitive.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/to-primitive'>;
+}
+declare module 'babel-runtime/core-js/symbol/to-string-tag.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/to-string-tag'>;
+}
+declare module 'babel-runtime/core-js/symbol/unscopables.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/symbol/unscopables'>;
+}
+declare module 'babel-runtime/core-js/system/global.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/system/global'>;
+}
+declare module 'babel-runtime/core-js/weak-map.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/weak-map'>;
+}
+declare module 'babel-runtime/core-js/weak-set.js' {
+ declare module.exports: $Exports<'babel-runtime/core-js/weak-set'>;
+}
+declare module 'babel-runtime/helpers/_async-generator-delegate.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_async-generator-delegate'>;
+}
+declare module 'babel-runtime/helpers/_async-generator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_async-generator'>;
+}
+declare module 'babel-runtime/helpers/_async-iterator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_async-iterator'>;
+}
+declare module 'babel-runtime/helpers/_async-to-generator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_async-to-generator'>;
+}
+declare module 'babel-runtime/helpers/_class-call-check.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_class-call-check'>;
+}
+declare module 'babel-runtime/helpers/_create-class.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_create-class'>;
+}
+declare module 'babel-runtime/helpers/_defaults.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_defaults'>;
+}
+declare module 'babel-runtime/helpers/_define-enumerable-properties.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_define-enumerable-properties'>;
+}
+declare module 'babel-runtime/helpers/_define-property.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_define-property'>;
+}
+declare module 'babel-runtime/helpers/_extends.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_extends'>;
+}
+declare module 'babel-runtime/helpers/_get.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_get'>;
+}
+declare module 'babel-runtime/helpers/_inherits.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_inherits'>;
+}
+declare module 'babel-runtime/helpers/_instanceof.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_instanceof'>;
+}
+declare module 'babel-runtime/helpers/_interop-require-default.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_interop-require-default'>;
+}
+declare module 'babel-runtime/helpers/_interop-require-wildcard.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_interop-require-wildcard'>;
+}
+declare module 'babel-runtime/helpers/_jsx.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_jsx'>;
+}
+declare module 'babel-runtime/helpers/_new-arrow-check.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_new-arrow-check'>;
+}
+declare module 'babel-runtime/helpers/_object-destructuring-empty.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_object-destructuring-empty'>;
+}
+declare module 'babel-runtime/helpers/_object-without-properties.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_object-without-properties'>;
+}
+declare module 'babel-runtime/helpers/_possible-constructor-return.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_possible-constructor-return'>;
+}
+declare module 'babel-runtime/helpers/_self-global.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_self-global'>;
+}
+declare module 'babel-runtime/helpers/_set.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_set'>;
+}
+declare module 'babel-runtime/helpers/_sliced-to-array-loose.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_sliced-to-array-loose'>;
+}
+declare module 'babel-runtime/helpers/_sliced-to-array.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_sliced-to-array'>;
+}
+declare module 'babel-runtime/helpers/_tagged-template-literal-loose.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_tagged-template-literal-loose'>;
+}
+declare module 'babel-runtime/helpers/_tagged-template-literal.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_tagged-template-literal'>;
+}
+declare module 'babel-runtime/helpers/_temporal-ref.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_temporal-ref'>;
+}
+declare module 'babel-runtime/helpers/_temporal-undefined.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_temporal-undefined'>;
+}
+declare module 'babel-runtime/helpers/_to-array.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_to-array'>;
+}
+declare module 'babel-runtime/helpers/_to-consumable-array.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_to-consumable-array'>;
+}
+declare module 'babel-runtime/helpers/_typeof.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/_typeof'>;
+}
+declare module 'babel-runtime/helpers/async-generator-delegate.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/async-generator-delegate'>;
+}
+declare module 'babel-runtime/helpers/async-generator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/async-generator'>;
+}
+declare module 'babel-runtime/helpers/async-iterator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/async-iterator'>;
+}
+declare module 'babel-runtime/helpers/async-to-generator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/async-to-generator'>;
+}
+declare module 'babel-runtime/helpers/asyncGenerator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/asyncGenerator'>;
+}
+declare module 'babel-runtime/helpers/asyncGeneratorDelegate.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/asyncGeneratorDelegate'>;
+}
+declare module 'babel-runtime/helpers/asyncIterator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/asyncIterator'>;
+}
+declare module 'babel-runtime/helpers/asyncToGenerator.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/asyncToGenerator'>;
+}
+declare module 'babel-runtime/helpers/class-call-check.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/class-call-check'>;
+}
+declare module 'babel-runtime/helpers/classCallCheck.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/classCallCheck'>;
+}
+declare module 'babel-runtime/helpers/create-class.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/create-class'>;
+}
+declare module 'babel-runtime/helpers/createClass.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/createClass'>;
+}
+declare module 'babel-runtime/helpers/defaults.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/defaults'>;
+}
+declare module 'babel-runtime/helpers/define-enumerable-properties.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/define-enumerable-properties'>;
+}
+declare module 'babel-runtime/helpers/define-property.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/define-property'>;
+}
+declare module 'babel-runtime/helpers/defineEnumerableProperties.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/defineEnumerableProperties'>;
+}
+declare module 'babel-runtime/helpers/defineProperty.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/defineProperty'>;
+}
+declare module 'babel-runtime/helpers/extends.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/extends'>;
+}
+declare module 'babel-runtime/helpers/get.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/get'>;
+}
+declare module 'babel-runtime/helpers/inherits.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/inherits'>;
+}
+declare module 'babel-runtime/helpers/instanceof.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/instanceof'>;
+}
+declare module 'babel-runtime/helpers/interop-require-default.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/interop-require-default'>;
+}
+declare module 'babel-runtime/helpers/interop-require-wildcard.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/interop-require-wildcard'>;
+}
+declare module 'babel-runtime/helpers/interopRequireDefault.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/interopRequireDefault'>;
+}
+declare module 'babel-runtime/helpers/interopRequireWildcard.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/interopRequireWildcard'>;
+}
+declare module 'babel-runtime/helpers/jsx.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/jsx'>;
+}
+declare module 'babel-runtime/helpers/new-arrow-check.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/new-arrow-check'>;
+}
+declare module 'babel-runtime/helpers/newArrowCheck.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/newArrowCheck'>;
+}
+declare module 'babel-runtime/helpers/object-destructuring-empty.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/object-destructuring-empty'>;
+}
+declare module 'babel-runtime/helpers/object-without-properties.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/object-without-properties'>;
+}
+declare module 'babel-runtime/helpers/objectDestructuringEmpty.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/objectDestructuringEmpty'>;
+}
+declare module 'babel-runtime/helpers/objectWithoutProperties.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/objectWithoutProperties'>;
+}
+declare module 'babel-runtime/helpers/possible-constructor-return.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/possible-constructor-return'>;
+}
+declare module 'babel-runtime/helpers/possibleConstructorReturn.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/possibleConstructorReturn'>;
+}
+declare module 'babel-runtime/helpers/self-global.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/self-global'>;
+}
+declare module 'babel-runtime/helpers/selfGlobal.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/selfGlobal'>;
+}
+declare module 'babel-runtime/helpers/set.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/set'>;
+}
+declare module 'babel-runtime/helpers/sliced-to-array-loose.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/sliced-to-array-loose'>;
+}
+declare module 'babel-runtime/helpers/sliced-to-array.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/sliced-to-array'>;
+}
+declare module 'babel-runtime/helpers/slicedToArray.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/slicedToArray'>;
+}
+declare module 'babel-runtime/helpers/slicedToArrayLoose.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/slicedToArrayLoose'>;
+}
+declare module 'babel-runtime/helpers/tagged-template-literal-loose.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/tagged-template-literal-loose'>;
+}
+declare module 'babel-runtime/helpers/tagged-template-literal.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/tagged-template-literal'>;
+}
+declare module 'babel-runtime/helpers/taggedTemplateLiteral.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/taggedTemplateLiteral'>;
+}
+declare module 'babel-runtime/helpers/taggedTemplateLiteralLoose.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/taggedTemplateLiteralLoose'>;
+}
+declare module 'babel-runtime/helpers/temporal-ref.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/temporal-ref'>;
+}
+declare module 'babel-runtime/helpers/temporal-undefined.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/temporal-undefined'>;
+}
+declare module 'babel-runtime/helpers/temporalRef.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/temporalRef'>;
+}
+declare module 'babel-runtime/helpers/temporalUndefined.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/temporalUndefined'>;
+}
+declare module 'babel-runtime/helpers/to-array.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/to-array'>;
+}
+declare module 'babel-runtime/helpers/to-consumable-array.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/to-consumable-array'>;
+}
+declare module 'babel-runtime/helpers/toArray.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/toArray'>;
+}
+declare module 'babel-runtime/helpers/toConsumableArray.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/toConsumableArray'>;
+}
+declare module 'babel-runtime/helpers/typeof.js' {
+ declare module.exports: $Exports<'babel-runtime/helpers/typeof'>;
+}
+declare module 'babel-runtime/regenerator/index.js' {
+ declare module.exports: $Exports<'babel-runtime/regenerator/index'>;
+}
diff --git a/flow-typed/npm/browser-sync_vx.x.x.js b/flow-typed/npm/browser-sync_vx.x.x.js
new file mode 100644
index 0000000000..b26c29d6fe
--- /dev/null
+++ b/flow-typed/npm/browser-sync_vx.x.x.js
@@ -0,0 +1,339 @@
+// flow-typed signature: 6cc3fa32fab30915eda78a454a3711e1
+// flow-typed version: <<STUB>>/browser-sync_v^2.9.3/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'browser-sync'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'browser-sync' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'browser-sync/bin/browser-sync' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/args' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/async-tasks' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/async' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/browser-sync' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/cli/cli-info' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/cli/cli-options' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/cli/cli-template' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/cli/command.init' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/cli/command.recipe' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/cli/command.reload' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/cli/command.start' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/config' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/connect-utils' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/default-config' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/file-event-handler' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/file-utils' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/file-watcher' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/hooks' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/http-protocol' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/internal-events' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/logger' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/options' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/plugins' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/exit' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/init' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/notify' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/pause' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/public-utils' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/reload' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/resume' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/socket.io.min.1.6.0' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/public/stream' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/server/index' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/server/proxy-server' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/server/proxy-utils' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/server/snippet-server' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/server/static-server' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/server/utils' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/snippet' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/sockets' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/tunnel' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lib/utils' {
+ declare module.exports: any;
+}
+
+declare module 'browser-sync/lodash.custom' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'browser-sync/bin/browser-sync.js' {
+ declare module.exports: $Exports<'browser-sync/bin/browser-sync'>;
+}
+declare module 'browser-sync/index' {
+ declare module.exports: $Exports<'browser-sync'>;
+}
+declare module 'browser-sync/index.js' {
+ declare module.exports: $Exports<'browser-sync'>;
+}
+declare module 'browser-sync/lib/args.js' {
+ declare module.exports: $Exports<'browser-sync/lib/args'>;
+}
+declare module 'browser-sync/lib/async-tasks.js' {
+ declare module.exports: $Exports<'browser-sync/lib/async-tasks'>;
+}
+declare module 'browser-sync/lib/async.js' {
+ declare module.exports: $Exports<'browser-sync/lib/async'>;
+}
+declare module 'browser-sync/lib/browser-sync.js' {
+ declare module.exports: $Exports<'browser-sync/lib/browser-sync'>;
+}
+declare module 'browser-sync/lib/cli/cli-info.js' {
+ declare module.exports: $Exports<'browser-sync/lib/cli/cli-info'>;
+}
+declare module 'browser-sync/lib/cli/cli-options.js' {
+ declare module.exports: $Exports<'browser-sync/lib/cli/cli-options'>;
+}
+declare module 'browser-sync/lib/cli/cli-template.js' {
+ declare module.exports: $Exports<'browser-sync/lib/cli/cli-template'>;
+}
+declare module 'browser-sync/lib/cli/command.init.js' {
+ declare module.exports: $Exports<'browser-sync/lib/cli/command.init'>;
+}
+declare module 'browser-sync/lib/cli/command.recipe.js' {
+ declare module.exports: $Exports<'browser-sync/lib/cli/command.recipe'>;
+}
+declare module 'browser-sync/lib/cli/command.reload.js' {
+ declare module.exports: $Exports<'browser-sync/lib/cli/command.reload'>;
+}
+declare module 'browser-sync/lib/cli/command.start.js' {
+ declare module.exports: $Exports<'browser-sync/lib/cli/command.start'>;
+}
+declare module 'browser-sync/lib/config.js' {
+ declare module.exports: $Exports<'browser-sync/lib/config'>;
+}
+declare module 'browser-sync/lib/connect-utils.js' {
+ declare module.exports: $Exports<'browser-sync/lib/connect-utils'>;
+}
+declare module 'browser-sync/lib/default-config.js' {
+ declare module.exports: $Exports<'browser-sync/lib/default-config'>;
+}
+declare module 'browser-sync/lib/file-event-handler.js' {
+ declare module.exports: $Exports<'browser-sync/lib/file-event-handler'>;
+}
+declare module 'browser-sync/lib/file-utils.js' {
+ declare module.exports: $Exports<'browser-sync/lib/file-utils'>;
+}
+declare module 'browser-sync/lib/file-watcher.js' {
+ declare module.exports: $Exports<'browser-sync/lib/file-watcher'>;
+}
+declare module 'browser-sync/lib/hooks.js' {
+ declare module.exports: $Exports<'browser-sync/lib/hooks'>;
+}
+declare module 'browser-sync/lib/http-protocol.js' {
+ declare module.exports: $Exports<'browser-sync/lib/http-protocol'>;
+}
+declare module 'browser-sync/lib/internal-events.js' {
+ declare module.exports: $Exports<'browser-sync/lib/internal-events'>;
+}
+declare module 'browser-sync/lib/logger.js' {
+ declare module.exports: $Exports<'browser-sync/lib/logger'>;
+}
+declare module 'browser-sync/lib/options.js' {
+ declare module.exports: $Exports<'browser-sync/lib/options'>;
+}
+declare module 'browser-sync/lib/plugins.js' {
+ declare module.exports: $Exports<'browser-sync/lib/plugins'>;
+}
+declare module 'browser-sync/lib/public/exit.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/exit'>;
+}
+declare module 'browser-sync/lib/public/init.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/init'>;
+}
+declare module 'browser-sync/lib/public/notify.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/notify'>;
+}
+declare module 'browser-sync/lib/public/pause.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/pause'>;
+}
+declare module 'browser-sync/lib/public/public-utils.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/public-utils'>;
+}
+declare module 'browser-sync/lib/public/reload.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/reload'>;
+}
+declare module 'browser-sync/lib/public/resume.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/resume'>;
+}
+declare module 'browser-sync/lib/public/socket.io.min.1.6.0.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/socket.io.min.1.6.0'>;
+}
+declare module 'browser-sync/lib/public/stream.js' {
+ declare module.exports: $Exports<'browser-sync/lib/public/stream'>;
+}
+declare module 'browser-sync/lib/server/index.js' {
+ declare module.exports: $Exports<'browser-sync/lib/server/index'>;
+}
+declare module 'browser-sync/lib/server/proxy-server.js' {
+ declare module.exports: $Exports<'browser-sync/lib/server/proxy-server'>;
+}
+declare module 'browser-sync/lib/server/proxy-utils.js' {
+ declare module.exports: $Exports<'browser-sync/lib/server/proxy-utils'>;
+}
+declare module 'browser-sync/lib/server/snippet-server.js' {
+ declare module.exports: $Exports<'browser-sync/lib/server/snippet-server'>;
+}
+declare module 'browser-sync/lib/server/static-server.js' {
+ declare module.exports: $Exports<'browser-sync/lib/server/static-server'>;
+}
+declare module 'browser-sync/lib/server/utils.js' {
+ declare module.exports: $Exports<'browser-sync/lib/server/utils'>;
+}
+declare module 'browser-sync/lib/snippet.js' {
+ declare module.exports: $Exports<'browser-sync/lib/snippet'>;
+}
+declare module 'browser-sync/lib/sockets.js' {
+ declare module.exports: $Exports<'browser-sync/lib/sockets'>;
+}
+declare module 'browser-sync/lib/tunnel.js' {
+ declare module.exports: $Exports<'browser-sync/lib/tunnel'>;
+}
+declare module 'browser-sync/lib/utils.js' {
+ declare module.exports: $Exports<'browser-sync/lib/utils'>;
+}
+declare module 'browser-sync/lodash.custom.js' {
+ declare module.exports: $Exports<'browser-sync/lodash.custom'>;
+}
diff --git a/flow-typed/npm/chai_v4.x.x.js b/flow-typed/npm/chai_v4.x.x.js
new file mode 100644
index 0000000000..56cc062e32
--- /dev/null
+++ b/flow-typed/npm/chai_v4.x.x.js
@@ -0,0 +1,223 @@
+// flow-typed signature: f4c38ee453c1a780b0ce642321a96131
+// flow-typed version: 147ab6243c/chai_v4.x.x/flow_>=v0.15.0
+
+declare module "chai" {
+
+ declare type ExpectChain<T> = {
+ and: ExpectChain<T>,
+ at: ExpectChain<T>,
+ be: ExpectChain<T>,
+ been: ExpectChain<T>,
+ have: ExpectChain<T>,
+ has: ExpectChain<T>,
+ is: ExpectChain<T>,
+ of: ExpectChain<T>,
+ same: ExpectChain<T>,
+ that: ExpectChain<T>,
+ to: ExpectChain<T>,
+ which: ExpectChain<T>,
+ with: ExpectChain<T>,
+
+ not: ExpectChain<T>,
+ deep: ExpectChain<T>,
+ any: ExpectChain<T>,
+ all: ExpectChain<T>,
+
+ a: ExpectChain<T> & (type: string) => ExpectChain<T>,
+ an: ExpectChain<T> & (type: string) => ExpectChain<T>,
+
+ include: ExpectChain<T> & (value: mixed) => ExpectChain<T>,
+ includes: ExpectChain<T> & (value: mixed) => ExpectChain<T>,
+ contain: ExpectChain<T> & (value: mixed) => ExpectChain<T>,
+ contains: ExpectChain<T> & (value: mixed) => ExpectChain<T>,
+
+ eql: (value: T) => ExpectChain<T>,
+ equal: (value: T) => ExpectChain<T>,
+ equals: (value: T) => ExpectChain<T>,
+
+ above: (value: T & number) => ExpectChain<T>,
+ least: (value: T & number) => ExpectChain<T>,
+ below: (value: T & number) => ExpectChain<T>,
+ most: (value: T & number) => ExpectChain<T>,
+ within: (start: T & number, finish: T & number) => ExpectChain<T>,
+
+ instanceof: (constructor: mixed) => ExpectChain<T>,
+ property: (
+ <P>(name: string, value?: P) => ExpectChain<P>
+ & (name: string) => ExpectChain<mixed>
+ ),
+
+ length: (value: number) => ExpectChain<T> | ExpectChain<number>,
+ lengthOf: (value: number) => ExpectChain<T>,
+
+ match: (regex: RegExp) => ExpectChain<T>,
+ string: (string: string) => ExpectChain<T>,
+
+ key: (key: string) => ExpectChain<T>,
+ keys: (key: string | Array<string>, ...keys: Array<string>) => ExpectChain<T>,
+
+ throw: <E>(
+ err?: Class<E> | Error | RegExp | string,
+ errMsgMatcher?: RegExp | string,
+ msg?: string) => ExpectChain<T>,
+
+ respondTo: (method: string) => ExpectChain<T>,
+ itself: ExpectChain<T>,
+
+ satisfy: (method: (value: T) => bool) => ExpectChain<T>,
+
+ closeTo: (expected: T & number, delta: number) => ExpectChain<T>,
+
+ members: (set: mixed) => ExpectChain<T>,
+ oneOf: (list: Array<T>) => ExpectChain<T>,
+
+ change: (obj: mixed, key: string) => ExpectChain<T>,
+ increase: (obj: mixed, key: string) => ExpectChain<T>,
+ decrease: (obj: mixed, key: string) => ExpectChain<T>,
+
+ // dirty-chai
+ ok: () => ExpectChain<T>,
+ true: () => ExpectChain<T>,
+ false: () => ExpectChain<T>,
+ null: () => ExpectChain<T>,
+ undefined: () => ExpectChain<T>,
+ exist: () => ExpectChain<T>,
+ empty: () => ExpectChain<T>,
+
+ extensible: () => ExpectChain<T>,
+ sealed: () => ExpectChain<T>,
+ frozen: () => ExpectChain<T>,
+
+ // chai-immutable
+ size: (n: number) => ExpectChain<T>,
+
+ // sinon-chai
+ called: () => ExpectChain<T>,
+ callCount: (n: number) => ExpectChain<T>,
+ calledOnce: () => ExpectChain<T>,
+ calledTwice: () => ExpectChain<T>,
+ calledThrice: () => ExpectChain<T>,
+ calledBefore: (spy: mixed) => ExpectChain<T>,
+ calledAfter: (spy: mixed) => ExpectChain<T>,
+ calledWith: (...args: Array<mixed>) => ExpectChain<T>,
+ calledWithMatch: (...args: Array<mixed>) => ExpectChain<T>,
+ calledWithExactly: (...args: Array<mixed>) => ExpectChain<T>,
+
+ // chai-as-promised
+ eventually: ExpectChain<T>,
+ resolvedWith: (value: mixed) => Promise<mixed> & ExpectChain<T>,
+ resolved: () => Promise<mixed> & ExpectChain<T>,
+ rejectedWith: (value: mixed) => Promise<mixed> & ExpectChain<T>,
+ rejected: () => Promise<mixed> & ExpectChain<T>,
+ notify: (callback: () => mixed) => ExpectChain<T>,
+ fulfilled: () => Promise<mixed> & ExpectChain<T>,
+
+ // chai-subset
+ containSubset: (obj: Object | Object[]) => ExpectChain<T>
+ };
+
+ declare function expect<T>(actual: T): ExpectChain<T>;
+
+ declare function use(plugin: (chai: Object, utils: Object) => void): void;
+
+ declare class assert {
+ static(expression: mixed, message?: string): void;
+ static fail(actual: mixed, expected: mixed, message?: string, operator?: string): void;
+
+ static isOk(object: mixed, message?: string): void;
+ static isNotOk(object: mixed, message?: string): void;
+
+ static equal(actual: mixed, expected: mixed, message?: string): void;
+ static notEqual(actual: mixed, expected: mixed, message?: string): void;
+
+ static strictEqual(act: mixed, exp: mixed, msg?: string): void;
+ static notStrictEqual(act: mixed, exp: mixed, msg?: string): void;
+
+ static deepEqual(act: mixed, exp: mixed, msg?: string): void;
+ static notDeepEqual(act: mixed, exp: mixed, msg?: string): void;
+
+ static ok(val: mixed, msg?: string): void;
+ static isTrue(val: mixed, msg?: string): void;
+ static isNotTrue(val: mixed, msg?: string): void;
+ static isFalse(val: mixed, msg?: string): void;
+ static isNotFalse(val: mixed, msg?: string): void;
+
+ static isNull(val: mixed, msg?: string): void;
+ static isNotNull(val: mixed, msg?: string): void;
+
+ static isUndefined(val: mixed, msg?: string): void;
+ static isDefined(val: mixed, msg?: string): void;
+
+ static isNaN(val: mixed, msg?: string): void;
+ static isNotNaN(val: mixed, msg?: string): void;
+
+ static isAbove(val: number, abv: number, msg?: string): void;
+ static isBelow(val: number, blw: number, msg?: string): void;
+
+ static isAtMost(val: number, atmst: number, msg?: string): void;
+ static isAtLeast(val: number, atlst: number, msg?: string): void;
+
+ static isFunction(val: mixed, msg?: string): void;
+ static isNotFunction(val: mixed, msg?: string): void;
+
+ static isObject(val: mixed, msg?: string): void;
+ static isNotObject(val: mixed, msg?: string): void;
+
+ static isArray(val: mixed, msg?: string): void;
+ static isNotArray(val: mixed, msg?: string): void;
+
+ static isString(val: mixed, msg?: string): void;
+ static isNotString(val: mixed, msg?: string): void;
+
+ static isNumber(val: mixed, msg?: string): void;
+ static isNotNumber(val: mixed, msg?: string): void;
+
+ static isBoolean(val: mixed, msg?: string): void;
+ static isNotBoolean(val: mixed, msg?: string): void;
+
+ static typeOf(val: mixed, type: string, msg?: string): void;
+ static notTypeOf(val: mixed, type: string, msg?: string): void;
+
+ static instanceOf(val: mixed, constructor: Function, msg?: string): void;
+ static notInstanceOf(val: mixed, constructor: Function, msg?: string): void;
+
+ static include(exp: string, inc: mixed, msg?: string): void;
+ static include<T>(exp: Array<T>, inc: T, msg?: string): void;
+
+ static notInclude(exp: string, inc: mixed, msg?: string): void;
+ static notInclude<T>(exp: Array<T>, inc: T, msg?: string): void;
+
+ static match(exp: mixed, re: RegExp, msg?: string): void;
+ static notMatch(exp: mixed, re: RegExp, msg?: string): void;
+
+ static property(obj: Object, prop: string, msg?: string): void;
+ static notProperty(obj: Object, prop: string, msg?: string): void;
+ static deepProperty(obj: Object, prop: string, msg?: string): void;
+ static notDeepProperty(obj: Object, prop: string, msg?: string): void;
+
+ static propertyVal(obj: Object, prop: string, val: mixed, msg?: string): void;
+ static propertyNotVal(obj: Object, prop: string, val: mixed, msg?: string): void;
+
+ static deepPropertyVal(obj: Object, prop: string, val: mixed, msg?: string): void;
+ static deepPropertyNotVal(obj: Object, prop: string, val: mixed, msg?: string): void;
+
+ static lengthOf(exp: mixed, len: number, msg?: string): void;
+
+ static throws<E>(
+ func: () => any,
+ err?: Class<E> | Error | RegExp | string,
+ errorMsgMatcher?: string | RegExp,
+ msg?: string): void;
+ static doesNotThrow<E>(
+ func: () => any,
+ err?: Class<E> | Error | RegExp | string,
+ errorMsgMatcher?: string | RegExp,
+ msg?: string): void;
+ }
+
+ declare var config: {
+ includeStack: boolean,
+ showDiff: boolean,
+ truncateThreshold: number
+ };
+}
diff --git a/flow-typed/npm/chai_vx.x.x.js b/flow-typed/npm/chai_vx.x.x.js
new file mode 100644
index 0000000000..0c1c090f17
--- /dev/null
+++ b/flow-typed/npm/chai_vx.x.x.js
@@ -0,0 +1,255 @@
+// flow-typed signature: bafe8dde0fe02d1e7067b10d4e4ae513
+// flow-typed version: <<STUB>>/chai_v^3.4.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'chai'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'chai' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'chai/chai' {
+ declare module.exports: any;
+}
+
+declare module 'chai/karma.conf' {
+ declare module.exports: any;
+}
+
+declare module 'chai/karma.sauce' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/assertion' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/config' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/core/assertions' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/interface/assert' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/interface/expect' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/interface/should' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/addChainableMethod' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/addMethod' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/addProperty' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/expectTypes' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/flag' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/getActual' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/getEnumerableProperties' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/getMessage' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/getName' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/getPathInfo' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/getPathValue' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/getProperties' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/hasProperty' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/index' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/inspect' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/objDisplay' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/overwriteChainableMethod' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/overwriteMethod' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/overwriteProperty' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/test' {
+ declare module.exports: any;
+}
+
+declare module 'chai/lib/chai/utils/transferFlags' {
+ declare module.exports: any;
+}
+
+declare module 'chai/sauce.browsers' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'chai/chai.js' {
+ declare module.exports: $Exports<'chai/chai'>;
+}
+declare module 'chai/index' {
+ declare module.exports: $Exports<'chai'>;
+}
+declare module 'chai/index.js' {
+ declare module.exports: $Exports<'chai'>;
+}
+declare module 'chai/karma.conf.js' {
+ declare module.exports: $Exports<'chai/karma.conf'>;
+}
+declare module 'chai/karma.sauce.js' {
+ declare module.exports: $Exports<'chai/karma.sauce'>;
+}
+declare module 'chai/lib/chai.js' {
+ declare module.exports: $Exports<'chai/lib/chai'>;
+}
+declare module 'chai/lib/chai/assertion.js' {
+ declare module.exports: $Exports<'chai/lib/chai/assertion'>;
+}
+declare module 'chai/lib/chai/config.js' {
+ declare module.exports: $Exports<'chai/lib/chai/config'>;
+}
+declare module 'chai/lib/chai/core/assertions.js' {
+ declare module.exports: $Exports<'chai/lib/chai/core/assertions'>;
+}
+declare module 'chai/lib/chai/interface/assert.js' {
+ declare module.exports: $Exports<'chai/lib/chai/interface/assert'>;
+}
+declare module 'chai/lib/chai/interface/expect.js' {
+ declare module.exports: $Exports<'chai/lib/chai/interface/expect'>;
+}
+declare module 'chai/lib/chai/interface/should.js' {
+ declare module.exports: $Exports<'chai/lib/chai/interface/should'>;
+}
+declare module 'chai/lib/chai/utils/addChainableMethod.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/addChainableMethod'>;
+}
+declare module 'chai/lib/chai/utils/addMethod.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/addMethod'>;
+}
+declare module 'chai/lib/chai/utils/addProperty.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/addProperty'>;
+}
+declare module 'chai/lib/chai/utils/expectTypes.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/expectTypes'>;
+}
+declare module 'chai/lib/chai/utils/flag.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/flag'>;
+}
+declare module 'chai/lib/chai/utils/getActual.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/getActual'>;
+}
+declare module 'chai/lib/chai/utils/getEnumerableProperties.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/getEnumerableProperties'>;
+}
+declare module 'chai/lib/chai/utils/getMessage.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/getMessage'>;
+}
+declare module 'chai/lib/chai/utils/getName.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/getName'>;
+}
+declare module 'chai/lib/chai/utils/getPathInfo.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/getPathInfo'>;
+}
+declare module 'chai/lib/chai/utils/getPathValue.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/getPathValue'>;
+}
+declare module 'chai/lib/chai/utils/getProperties.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/getProperties'>;
+}
+declare module 'chai/lib/chai/utils/hasProperty.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/hasProperty'>;
+}
+declare module 'chai/lib/chai/utils/index.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/index'>;
+}
+declare module 'chai/lib/chai/utils/inspect.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/inspect'>;
+}
+declare module 'chai/lib/chai/utils/objDisplay.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/objDisplay'>;
+}
+declare module 'chai/lib/chai/utils/overwriteChainableMethod.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/overwriteChainableMethod'>;
+}
+declare module 'chai/lib/chai/utils/overwriteMethod.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/overwriteMethod'>;
+}
+declare module 'chai/lib/chai/utils/overwriteProperty.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/overwriteProperty'>;
+}
+declare module 'chai/lib/chai/utils/test.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/test'>;
+}
+declare module 'chai/lib/chai/utils/transferFlags.js' {
+ declare module.exports: $Exports<'chai/lib/chai/utils/transferFlags'>;
+}
+declare module 'chai/sauce.browsers.js' {
+ declare module.exports: $Exports<'chai/sauce.browsers'>;
+}
diff --git a/flow-typed/npm/cheap-ruler_vx.x.x.js b/flow-typed/npm/cheap-ruler_vx.x.x.js
new file mode 100644
index 0000000000..5e78363225
--- /dev/null
+++ b/flow-typed/npm/cheap-ruler_vx.x.x.js
@@ -0,0 +1,129 @@
+// flow-typed signature: e7017f9366203bd73443e30caf1e45e6
+// flow-typed version: <<STUB>>/cheap-ruler_v^2.4.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'cheap-ruler'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'cheap-ruler' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'cheap-ruler/bench/bench-along' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-area' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-bearing' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-buffer-point' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-destination' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-distance' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-inside-bbox' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-line-slice-along' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-line-slice' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-point-on-line' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/bench/bench-run' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/cheap-ruler' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/test/precision' {
+ declare module.exports: any;
+}
+
+declare module 'cheap-ruler/test/test' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'cheap-ruler/bench/bench-along.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-along'>;
+}
+declare module 'cheap-ruler/bench/bench-area.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-area'>;
+}
+declare module 'cheap-ruler/bench/bench-bearing.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-bearing'>;
+}
+declare module 'cheap-ruler/bench/bench-buffer-point.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-buffer-point'>;
+}
+declare module 'cheap-ruler/bench/bench-destination.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-destination'>;
+}
+declare module 'cheap-ruler/bench/bench-distance.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-distance'>;
+}
+declare module 'cheap-ruler/bench/bench-inside-bbox.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-inside-bbox'>;
+}
+declare module 'cheap-ruler/bench/bench-line-slice-along.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-line-slice-along'>;
+}
+declare module 'cheap-ruler/bench/bench-line-slice.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-line-slice'>;
+}
+declare module 'cheap-ruler/bench/bench-point-on-line.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-point-on-line'>;
+}
+declare module 'cheap-ruler/bench/bench-run.js' {
+ declare module.exports: $Exports<'cheap-ruler/bench/bench-run'>;
+}
+declare module 'cheap-ruler/cheap-ruler.js' {
+ declare module.exports: $Exports<'cheap-ruler/cheap-ruler'>;
+}
+declare module 'cheap-ruler/index' {
+ declare module.exports: $Exports<'cheap-ruler'>;
+}
+declare module 'cheap-ruler/index.js' {
+ declare module.exports: $Exports<'cheap-ruler'>;
+}
+declare module 'cheap-ruler/test/precision.js' {
+ declare module.exports: $Exports<'cheap-ruler/test/precision'>;
+}
+declare module 'cheap-ruler/test/test.js' {
+ declare module.exports: $Exports<'cheap-ruler/test/test'>;
+}
diff --git a/flow-typed/npm/electron-builder_vx.x.x.js b/flow-typed/npm/electron-builder_vx.x.x.js
new file mode 100644
index 0000000000..b77e6101ca
--- /dev/null
+++ b/flow-typed/npm/electron-builder_vx.x.x.js
@@ -0,0 +1,333 @@
+// flow-typed signature: da3893e4d9a99d4c3728d5e4b9038c87
+// flow-typed version: <<STUB>>/electron-builder_v^15.6.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'electron-builder'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'electron-builder' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'electron-builder/out/appInfo' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/asar' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/asarUtil' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/builder' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/cli/build-cli' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/cli/cliOptions' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/cli/create-self-signed-cert' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/cli/install-app-deps' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/cli/node-gyp-rebuild' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/codeSign' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/errorMessages' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/fileMatcher' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/index' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/linuxPackager' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/macPackager' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/metadata' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/options/linuxOptions' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/options/macOptions' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/options/winOptions' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/packager' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/packager/dirPackager' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/packager/mac' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/packagerApi' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/platformPackager' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/publish/PublishManager' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/readInstalled' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/repositoryInfo' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/appImage' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/appx' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/archive' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/ArchiveTarget' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/dmg' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/fpm' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/LinuxTargetHelper' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/nsis' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/pkg' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/snap' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/targetFactory' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/targets/WebInstaller' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/util/filter' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/util/readPackageJson' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/windowsCodeSign' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/winPackager' {
+ declare module.exports: any;
+}
+
+declare module 'electron-builder/out/yarn' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'electron-builder/out/appInfo.js' {
+ declare module.exports: $Exports<'electron-builder/out/appInfo'>;
+}
+declare module 'electron-builder/out/asar.js' {
+ declare module.exports: $Exports<'electron-builder/out/asar'>;
+}
+declare module 'electron-builder/out/asarUtil.js' {
+ declare module.exports: $Exports<'electron-builder/out/asarUtil'>;
+}
+declare module 'electron-builder/out/builder.js' {
+ declare module.exports: $Exports<'electron-builder/out/builder'>;
+}
+declare module 'electron-builder/out/cli/build-cli.js' {
+ declare module.exports: $Exports<'electron-builder/out/cli/build-cli'>;
+}
+declare module 'electron-builder/out/cli/cliOptions.js' {
+ declare module.exports: $Exports<'electron-builder/out/cli/cliOptions'>;
+}
+declare module 'electron-builder/out/cli/create-self-signed-cert.js' {
+ declare module.exports: $Exports<'electron-builder/out/cli/create-self-signed-cert'>;
+}
+declare module 'electron-builder/out/cli/install-app-deps.js' {
+ declare module.exports: $Exports<'electron-builder/out/cli/install-app-deps'>;
+}
+declare module 'electron-builder/out/cli/node-gyp-rebuild.js' {
+ declare module.exports: $Exports<'electron-builder/out/cli/node-gyp-rebuild'>;
+}
+declare module 'electron-builder/out/codeSign.js' {
+ declare module.exports: $Exports<'electron-builder/out/codeSign'>;
+}
+declare module 'electron-builder/out/errorMessages.js' {
+ declare module.exports: $Exports<'electron-builder/out/errorMessages'>;
+}
+declare module 'electron-builder/out/fileMatcher.js' {
+ declare module.exports: $Exports<'electron-builder/out/fileMatcher'>;
+}
+declare module 'electron-builder/out/index.js' {
+ declare module.exports: $Exports<'electron-builder/out/index'>;
+}
+declare module 'electron-builder/out/linuxPackager.js' {
+ declare module.exports: $Exports<'electron-builder/out/linuxPackager'>;
+}
+declare module 'electron-builder/out/macPackager.js' {
+ declare module.exports: $Exports<'electron-builder/out/macPackager'>;
+}
+declare module 'electron-builder/out/metadata.js' {
+ declare module.exports: $Exports<'electron-builder/out/metadata'>;
+}
+declare module 'electron-builder/out/options/linuxOptions.js' {
+ declare module.exports: $Exports<'electron-builder/out/options/linuxOptions'>;
+}
+declare module 'electron-builder/out/options/macOptions.js' {
+ declare module.exports: $Exports<'electron-builder/out/options/macOptions'>;
+}
+declare module 'electron-builder/out/options/winOptions.js' {
+ declare module.exports: $Exports<'electron-builder/out/options/winOptions'>;
+}
+declare module 'electron-builder/out/packager.js' {
+ declare module.exports: $Exports<'electron-builder/out/packager'>;
+}
+declare module 'electron-builder/out/packager/dirPackager.js' {
+ declare module.exports: $Exports<'electron-builder/out/packager/dirPackager'>;
+}
+declare module 'electron-builder/out/packager/mac.js' {
+ declare module.exports: $Exports<'electron-builder/out/packager/mac'>;
+}
+declare module 'electron-builder/out/packagerApi.js' {
+ declare module.exports: $Exports<'electron-builder/out/packagerApi'>;
+}
+declare module 'electron-builder/out/platformPackager.js' {
+ declare module.exports: $Exports<'electron-builder/out/platformPackager'>;
+}
+declare module 'electron-builder/out/publish/PublishManager.js' {
+ declare module.exports: $Exports<'electron-builder/out/publish/PublishManager'>;
+}
+declare module 'electron-builder/out/readInstalled.js' {
+ declare module.exports: $Exports<'electron-builder/out/readInstalled'>;
+}
+declare module 'electron-builder/out/repositoryInfo.js' {
+ declare module.exports: $Exports<'electron-builder/out/repositoryInfo'>;
+}
+declare module 'electron-builder/out/targets/appImage.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/appImage'>;
+}
+declare module 'electron-builder/out/targets/appx.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/appx'>;
+}
+declare module 'electron-builder/out/targets/archive.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/archive'>;
+}
+declare module 'electron-builder/out/targets/ArchiveTarget.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/ArchiveTarget'>;
+}
+declare module 'electron-builder/out/targets/dmg.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/dmg'>;
+}
+declare module 'electron-builder/out/targets/fpm.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/fpm'>;
+}
+declare module 'electron-builder/out/targets/LinuxTargetHelper.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/LinuxTargetHelper'>;
+}
+declare module 'electron-builder/out/targets/nsis.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/nsis'>;
+}
+declare module 'electron-builder/out/targets/pkg.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/pkg'>;
+}
+declare module 'electron-builder/out/targets/snap.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/snap'>;
+}
+declare module 'electron-builder/out/targets/targetFactory.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/targetFactory'>;
+}
+declare module 'electron-builder/out/targets/WebInstaller.js' {
+ declare module.exports: $Exports<'electron-builder/out/targets/WebInstaller'>;
+}
+declare module 'electron-builder/out/util/filter.js' {
+ declare module.exports: $Exports<'electron-builder/out/util/filter'>;
+}
+declare module 'electron-builder/out/util/readPackageJson.js' {
+ declare module.exports: $Exports<'electron-builder/out/util/readPackageJson'>;
+}
+declare module 'electron-builder/out/windowsCodeSign.js' {
+ declare module.exports: $Exports<'electron-builder/out/windowsCodeSign'>;
+}
+declare module 'electron-builder/out/winPackager.js' {
+ declare module.exports: $Exports<'electron-builder/out/winPackager'>;
+}
+declare module 'electron-builder/out/yarn.js' {
+ declare module.exports: $Exports<'electron-builder/out/yarn'>;
+}
diff --git a/flow-typed/npm/electron-devtools-installer_vx.x.x.js b/flow-typed/npm/electron-devtools-installer_vx.x.x.js
new file mode 100644
index 0000000000..7a896b9030
--- /dev/null
+++ b/flow-typed/npm/electron-devtools-installer_vx.x.x.js
@@ -0,0 +1,67 @@
+// flow-typed signature: 4b568a6b4f76b5a6274861ff21e9fd8e
+// flow-typed version: <<STUB>>/electron-devtools-installer_v^2.1.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'electron-devtools-installer'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'electron-devtools-installer' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'electron-devtools-installer/dist/downloadChromeExtension' {
+ declare module.exports: any;
+}
+
+declare module 'electron-devtools-installer/dist/index' {
+ declare module.exports: any;
+}
+
+declare module 'electron-devtools-installer/dist/utils' {
+ declare module.exports: any;
+}
+
+declare module 'electron-devtools-installer/src/downloadChromeExtension' {
+ declare module.exports: any;
+}
+
+declare module 'electron-devtools-installer/src/index' {
+ declare module.exports: any;
+}
+
+declare module 'electron-devtools-installer/src/utils' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'electron-devtools-installer/dist/downloadChromeExtension.js' {
+ declare module.exports: $Exports<'electron-devtools-installer/dist/downloadChromeExtension'>;
+}
+declare module 'electron-devtools-installer/dist/index.js' {
+ declare module.exports: $Exports<'electron-devtools-installer/dist/index'>;
+}
+declare module 'electron-devtools-installer/dist/utils.js' {
+ declare module.exports: $Exports<'electron-devtools-installer/dist/utils'>;
+}
+declare module 'electron-devtools-installer/src/downloadChromeExtension.js' {
+ declare module.exports: $Exports<'electron-devtools-installer/src/downloadChromeExtension'>;
+}
+declare module 'electron-devtools-installer/src/index.js' {
+ declare module.exports: $Exports<'electron-devtools-installer/src/index'>;
+}
+declare module 'electron-devtools-installer/src/utils.js' {
+ declare module.exports: $Exports<'electron-devtools-installer/src/utils'>;
+}
diff --git a/flow-typed/npm/electron-log_vx.x.x.js b/flow-typed/npm/electron-log_vx.x.x.js
new file mode 100644
index 0000000000..ea47a182aa
--- /dev/null
+++ b/flow-typed/npm/electron-log_vx.x.x.js
@@ -0,0 +1,101 @@
+// flow-typed signature: a2b1f23f2fe8286d15c43e28d1f28578
+// flow-typed version: <<STUB>>/electron-log_v2.2.6/flow_v0.48.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'electron-log'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'electron-log' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'electron-log/lib/format' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/lib/log' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/lib/transports/console' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/lib/transports/file/find-log-path' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/lib/transports/file/get-app-name' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/lib/transports/file/index' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/lib/transports/log-s' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/lib/transports/renderer-console' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/main' {
+ declare module.exports: any;
+}
+
+declare module 'electron-log/renderer' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'electron-log/index' {
+ declare module.exports: $Exports<'electron-log'>;
+}
+declare module 'electron-log/index.js' {
+ declare module.exports: $Exports<'electron-log'>;
+}
+declare module 'electron-log/lib/format.js' {
+ declare module.exports: $Exports<'electron-log/lib/format'>;
+}
+declare module 'electron-log/lib/log.js' {
+ declare module.exports: $Exports<'electron-log/lib/log'>;
+}
+declare module 'electron-log/lib/transports/console.js' {
+ declare module.exports: $Exports<'electron-log/lib/transports/console'>;
+}
+declare module 'electron-log/lib/transports/file/find-log-path.js' {
+ declare module.exports: $Exports<'electron-log/lib/transports/file/find-log-path'>;
+}
+declare module 'electron-log/lib/transports/file/get-app-name.js' {
+ declare module.exports: $Exports<'electron-log/lib/transports/file/get-app-name'>;
+}
+declare module 'electron-log/lib/transports/file/index.js' {
+ declare module.exports: $Exports<'electron-log/lib/transports/file/index'>;
+}
+declare module 'electron-log/lib/transports/log-s.js' {
+ declare module.exports: $Exports<'electron-log/lib/transports/log-s'>;
+}
+declare module 'electron-log/lib/transports/renderer-console.js' {
+ declare module.exports: $Exports<'electron-log/lib/transports/renderer-console'>;
+}
+declare module 'electron-log/main.js' {
+ declare module.exports: $Exports<'electron-log/main'>;
+}
+declare module 'electron-log/renderer.js' {
+ declare module.exports: $Exports<'electron-log/renderer'>;
+}
diff --git a/flow-typed/npm/electron-mocha_vx.x.x.js b/flow-typed/npm/electron-mocha_vx.x.x.js
new file mode 100644
index 0000000000..49d9e54919
--- /dev/null
+++ b/flow-typed/npm/electron-mocha_vx.x.x.js
@@ -0,0 +1,59 @@
+// flow-typed signature: 4bfee460567353b81760578fb4aa901f
+// flow-typed version: <<STUB>>/electron-mocha_v^3.3.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'electron-mocha'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'electron-mocha' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'electron-mocha/args' {
+ declare module.exports: any;
+}
+
+declare module 'electron-mocha/mocha' {
+ declare module.exports: any;
+}
+
+declare module 'electron-mocha/renderer/console' {
+ declare module.exports: any;
+}
+
+declare module 'electron-mocha/renderer/run' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'electron-mocha/args.js' {
+ declare module.exports: $Exports<'electron-mocha/args'>;
+}
+declare module 'electron-mocha/index' {
+ declare module.exports: $Exports<'electron-mocha'>;
+}
+declare module 'electron-mocha/index.js' {
+ declare module.exports: $Exports<'electron-mocha'>;
+}
+declare module 'electron-mocha/mocha.js' {
+ declare module.exports: $Exports<'electron-mocha/mocha'>;
+}
+declare module 'electron-mocha/renderer/console.js' {
+ declare module.exports: $Exports<'electron-mocha/renderer/console'>;
+}
+declare module 'electron-mocha/renderer/run.js' {
+ declare module.exports: $Exports<'electron-mocha/renderer/run'>;
+}
diff --git a/flow-typed/npm/electron_vx.x.x.js b/flow-typed/npm/electron_vx.x.x.js
new file mode 100644
index 0000000000..60b1282fc3
--- /dev/null
+++ b/flow-typed/npm/electron_vx.x.x.js
@@ -0,0 +1,59 @@
+// flow-typed signature: 158694da210626f22fe02594ffbc3674
+// flow-typed version: <<STUB>>/electron_v^1.6.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'electron'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'electron' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'electron/cli' {
+ declare module.exports: any;
+}
+
+declare module 'electron/install' {
+ declare module.exports: any;
+}
+
+declare module 'electron/test/errors' {
+ declare module.exports: any;
+}
+
+declare module 'electron/test/index' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'electron/cli.js' {
+ declare module.exports: $Exports<'electron/cli'>;
+}
+declare module 'electron/index' {
+ declare module.exports: $Exports<'electron'>;
+}
+declare module 'electron/index.js' {
+ declare module.exports: $Exports<'electron'>;
+}
+declare module 'electron/install.js' {
+ declare module.exports: $Exports<'electron/install'>;
+}
+declare module 'electron/test/errors.js' {
+ declare module.exports: $Exports<'electron/test/errors'>;
+}
+declare module 'electron/test/index.js' {
+ declare module.exports: $Exports<'electron/test/index'>;
+}
diff --git a/flow-typed/npm/enzyme_v2.3.x.js b/flow-typed/npm/enzyme_v2.3.x.js
new file mode 100644
index 0000000000..3898acbe2e
--- /dev/null
+++ b/flow-typed/npm/enzyme_v2.3.x.js
@@ -0,0 +1,85 @@
+// flow-typed signature: 67cf88555a22019251c4870d6e78a462
+// flow-typed version: 60d0f06df5/enzyme_v2.3.x/flow_>=v0.28.x
+
+declare module 'enzyme' {
+ declare type PredicateFunction<T: Wrapper> = (wrapper: T, index: number) => boolean;
+ declare type NodeOrNodes = React$Element<any> | Array<React$Element<any>>;
+ declare type EnzymeSelector = string | ReactClass<any> | Object;
+
+ // CheerioWrapper is a type alias for an actual cheerio instance
+ // TODO: Reference correct type from cheerio's type declarations
+ declare type CheerioWrapper = any;
+
+ declare class Wrapper {
+ find(selector: EnzymeSelector): this;
+ findWhere(predicate: PredicateFunction<this>): this;
+ filter(selector: EnzymeSelector): this;
+ filterWhere(predicate: PredicateFunction<this>): this;
+ contains(nodeOrNodes: NodeOrNodes): boolean;
+ containsMatchingElement(node: React$Element<any>): boolean;
+ containsAllMatchingElements(nodes: NodeOrNodes): boolean;
+ containsAnyMatchingElements(nodes: NodeOrNodes): boolean;
+ dive(option?: { context?: Object }): this;
+ exists(): boolean;
+ matchesElement(node: React$Element<any>): boolean;
+ hasClass(className: string): boolean;
+ is(selector: EnzymeSelector): boolean;
+ isEmpty(): boolean;
+ not(selector: EnzymeSelector): this;
+ children(selector?: EnzymeSelector): this;
+ childAt(index: number): this;
+ parents(selector?: EnzymeSelector): this;
+ parent(): this;
+ closest(selector: EnzymeSelector): this;
+ render(): CheerioWrapper;
+ unmount(): this;
+ text(): string;
+ html(): string;
+ get(index: number): React$Element<any>;
+ getNode(): React$Element<any>;
+ getNodes(): Array<React$Element<any>>;
+ getDOMNode(): HTMLElement | HTMLInputElement;
+ at(index: number): this;
+ first(): this;
+ last(): this;
+ state(key?: string): any;
+ context(key?: string): any;
+ props(): Object;
+ prop(key: string): any;
+ key(): string;
+ simulate(event: string, ...args: Array<any>): this;
+ setState(state: {}, callback?: Function): this,
+ setProps(props: {}): this;
+ setContext(context: Object): this;
+ instance(): React$Component<*, *, *>;
+ update(): this;
+ debug(): string;
+ type(): string | Function | null;
+ name(): string;
+ forEach(fn: (node: this, index: number) => mixed): this;
+ map<T>(fn: (node: this, index: number) => T): Array<T>;
+ reduce<T>(fn: (value: T, node: this, index: number) => T, initialValue?: T): Array<T>;
+ reduceRight<T>(fn: (value: T, node: this, index: number) => T, initialValue?: T): Array<T>;
+ some(selector: EnzymeSelector): boolean;
+ someWhere(predicate: PredicateFunction<this>): boolean;
+ every(selector: EnzymeSelector): boolean;
+ everyWhere(predicate: PredicateFunction<this>): boolean;
+ length: number;
+ }
+
+ declare export class ReactWrapper extends Wrapper {
+ constructor(nodes: NodeOrNodes, root: any, options?: ?Object): ReactWrapper;
+ mount(): this;
+ ref(refName: string): this;
+ detach(): void;
+ }
+
+ declare export class ShallowWrapper extends Wrapper {
+ equals(node: React$Element<any>): boolean;
+ shallow(options?: { context?: Object }): ShallowWrapper;
+ }
+
+ declare export function shallow(node: React$Element<any>, options?: { context?: Object }): ShallowWrapper;
+ declare export function mount(node: React$Element<any>, options?: { context?: Object, attachTo?: HTMLElement, childContextTypes?: Object }): ReactWrapper;
+ declare export function render(node: React$Element<any>, options?: { context?: Object }): CheerioWrapper;
+}
diff --git a/flow-typed/npm/esdoc_vx.x.x.js b/flow-typed/npm/esdoc_vx.x.x.js
new file mode 100644
index 0000000000..1c695059ad
--- /dev/null
+++ b/flow-typed/npm/esdoc_vx.x.x.js
@@ -0,0 +1,417 @@
+// flow-typed signature: b8f0a996b5556af2e69d8a12dc223841
+// flow-typed version: <<STUB>>/esdoc_v^0.5.2/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'esdoc'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'esdoc' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'esdoc/out/src/BuiltinExternal/ECMAScriptExternal' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/BuiltinExternal/WebAPIExternal' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/AbstractDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/AssignmentDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/ClassDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/ClassPropertyDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/ExternalDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/FileDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/FunctionDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/MemberDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/MethodDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/TestDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/TestFileDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/TypedefDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Doc/VariableDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/ESDoc' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/ESDocCLI' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Factory/DocFactory' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Factory/TestDocFactory' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Parser/CommentParser' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Parser/ESParser' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Parser/ParamParser' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Plugin/Plugin' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/ASTDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/ClassDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/CoverageBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/DocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/DocResolver' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/FileDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/IdentifiersDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/IndexDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/LintDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/ManualDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/SearchIndexBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/SingleDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/SourceDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/StaticFileBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/inherited-summary' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/inner-link' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/manual' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/patch-for-local' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/prettify/prettify' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/pretty-print' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/search' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/template/script/test-summary' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/TestDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/TestFileDocBuilder' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/Builder/util' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Publisher/publish' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Typedef/typedef' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Util/ASTNodeContainer' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Util/ASTUtil' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Util/InvalidCodeLogger' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Util/NamingUtil' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Util/NPMUtil' {
+ declare module.exports: any;
+}
+
+declare module 'esdoc/out/src/Util/PathResolver' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'esdoc/out/src/BuiltinExternal/ECMAScriptExternal.js' {
+ declare module.exports: $Exports<'esdoc/out/src/BuiltinExternal/ECMAScriptExternal'>;
+}
+declare module 'esdoc/out/src/BuiltinExternal/WebAPIExternal.js' {
+ declare module.exports: $Exports<'esdoc/out/src/BuiltinExternal/WebAPIExternal'>;
+}
+declare module 'esdoc/out/src/Doc/AbstractDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/AbstractDoc'>;
+}
+declare module 'esdoc/out/src/Doc/AssignmentDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/AssignmentDoc'>;
+}
+declare module 'esdoc/out/src/Doc/ClassDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/ClassDoc'>;
+}
+declare module 'esdoc/out/src/Doc/ClassPropertyDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/ClassPropertyDoc'>;
+}
+declare module 'esdoc/out/src/Doc/ExternalDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/ExternalDoc'>;
+}
+declare module 'esdoc/out/src/Doc/FileDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/FileDoc'>;
+}
+declare module 'esdoc/out/src/Doc/FunctionDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/FunctionDoc'>;
+}
+declare module 'esdoc/out/src/Doc/MemberDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/MemberDoc'>;
+}
+declare module 'esdoc/out/src/Doc/MethodDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/MethodDoc'>;
+}
+declare module 'esdoc/out/src/Doc/TestDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/TestDoc'>;
+}
+declare module 'esdoc/out/src/Doc/TestFileDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/TestFileDoc'>;
+}
+declare module 'esdoc/out/src/Doc/TypedefDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/TypedefDoc'>;
+}
+declare module 'esdoc/out/src/Doc/VariableDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Doc/VariableDoc'>;
+}
+declare module 'esdoc/out/src/ESDoc.js' {
+ declare module.exports: $Exports<'esdoc/out/src/ESDoc'>;
+}
+declare module 'esdoc/out/src/ESDocCLI.js' {
+ declare module.exports: $Exports<'esdoc/out/src/ESDocCLI'>;
+}
+declare module 'esdoc/out/src/Factory/DocFactory.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Factory/DocFactory'>;
+}
+declare module 'esdoc/out/src/Factory/TestDocFactory.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Factory/TestDocFactory'>;
+}
+declare module 'esdoc/out/src/Parser/CommentParser.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Parser/CommentParser'>;
+}
+declare module 'esdoc/out/src/Parser/ESParser.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Parser/ESParser'>;
+}
+declare module 'esdoc/out/src/Parser/ParamParser.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Parser/ParamParser'>;
+}
+declare module 'esdoc/out/src/Plugin/Plugin.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Plugin/Plugin'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/ASTDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/ASTDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/ClassDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/ClassDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/CoverageBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/CoverageBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/DocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/DocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/DocResolver.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/DocResolver'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/FileDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/FileDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/IdentifiersDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/IdentifiersDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/IndexDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/IndexDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/LintDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/LintDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/ManualDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/ManualDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/SearchIndexBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/SearchIndexBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/SingleDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/SingleDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/SourceDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/SourceDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/StaticFileBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/StaticFileBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/inherited-summary.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/inherited-summary'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/inner-link.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/inner-link'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/manual.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/manual'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/patch-for-local.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/patch-for-local'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/prettify/prettify.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/prettify/prettify'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/pretty-print.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/pretty-print'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/search.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/search'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/template/script/test-summary.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/template/script/test-summary'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/TestDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/TestDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/TestFileDocBuilder.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/TestFileDocBuilder'>;
+}
+declare module 'esdoc/out/src/Publisher/Builder/util.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/Builder/util'>;
+}
+declare module 'esdoc/out/src/Publisher/publish.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Publisher/publish'>;
+}
+declare module 'esdoc/out/src/Typedef/typedef.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Typedef/typedef'>;
+}
+declare module 'esdoc/out/src/Util/ASTNodeContainer.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Util/ASTNodeContainer'>;
+}
+declare module 'esdoc/out/src/Util/ASTUtil.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Util/ASTUtil'>;
+}
+declare module 'esdoc/out/src/Util/InvalidCodeLogger.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Util/InvalidCodeLogger'>;
+}
+declare module 'esdoc/out/src/Util/NamingUtil.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Util/NamingUtil'>;
+}
+declare module 'esdoc/out/src/Util/NPMUtil.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Util/NPMUtil'>;
+}
+declare module 'esdoc/out/src/Util/PathResolver.js' {
+ declare module.exports: $Exports<'esdoc/out/src/Util/PathResolver'>;
+}
diff --git a/flow-typed/npm/eslint-plugin-react_vx.x.x.js b/flow-typed/npm/eslint-plugin-react_vx.x.x.js
new file mode 100644
index 0000000000..0de43138b6
--- /dev/null
+++ b/flow-typed/npm/eslint-plugin-react_vx.x.x.js
@@ -0,0 +1,500 @@
+// flow-typed signature: f4ee3210d982573b70506b9eda2ea699
+// flow-typed version: <<STUB>>/eslint-plugin-react_v^6.9.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'eslint-plugin-react'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'eslint-plugin-react' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'eslint-plugin-react/lib/rules/display-name' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/forbid-component-props' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/forbid-elements' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/forbid-foreign-prop-types' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/forbid-prop-types' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-boolean-value' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-closing-bracket-location' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-curly-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-equals-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-filename-extension' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-first-prop-new-line' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-handler-names' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-indent-props' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-indent' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-key' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-max-props-per-line' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-no-bind' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-no-duplicate-props' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-no-literals' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-no-target-blank' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-no-undef' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-pascal-case' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-sort-props' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-space-before-closing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-tag-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-uses-react' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-uses-vars' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/jsx-wrap-multilines' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-array-index-key' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-children-prop' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-comment-textnodes' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-danger-with-children' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-danger' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-deprecated' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-did-mount-set-state' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-did-update-set-state' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-direct-mutation-state' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-find-dom-node' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-is-mounted' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-multi-comp' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-render-return-value' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-set-state' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-string-refs' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-unescaped-entities' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-unknown-property' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/no-unused-prop-types' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/prefer-es6-class' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/prefer-stateless-function' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/prop-types' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/react-in-jsx-scope' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/require-default-props' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/require-extension' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/require-optimization' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/require-render-return' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/self-closing-comp' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/sort-comp' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/sort-prop-types' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/style-prop-object' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/void-dom-elements-no-children' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/rules/wrap-multilines' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/util/annotations' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/util/Components' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/util/pragma' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/util/variable' {
+ declare module.exports: any;
+}
+
+declare module 'eslint-plugin-react/lib/util/version' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'eslint-plugin-react/index' {
+ declare module.exports: $Exports<'eslint-plugin-react'>;
+}
+declare module 'eslint-plugin-react/index.js' {
+ declare module.exports: $Exports<'eslint-plugin-react'>;
+}
+declare module 'eslint-plugin-react/lib/rules/display-name.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/display-name'>;
+}
+declare module 'eslint-plugin-react/lib/rules/forbid-component-props.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-component-props'>;
+}
+declare module 'eslint-plugin-react/lib/rules/forbid-elements.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-elements'>;
+}
+declare module 'eslint-plugin-react/lib/rules/forbid-foreign-prop-types.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-foreign-prop-types'>;
+}
+declare module 'eslint-plugin-react/lib/rules/forbid-prop-types.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-prop-types'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-boolean-value.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-boolean-value'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-closing-bracket-location.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-closing-bracket-location'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-curly-spacing.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-curly-spacing'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-equals-spacing.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-equals-spacing'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-filename-extension.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-filename-extension'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-first-prop-new-line.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-first-prop-new-line'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-handler-names.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-handler-names'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-indent-props.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-indent-props'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-indent.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-indent'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-key.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-key'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-max-props-per-line.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-max-props-per-line'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-no-bind.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-bind'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-no-duplicate-props.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-duplicate-props'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-no-literals.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-literals'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-no-target-blank.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-target-blank'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-no-undef.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-undef'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-pascal-case.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-pascal-case'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-sort-props.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-sort-props'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-space-before-closing.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-space-before-closing'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-tag-spacing.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-tag-spacing'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-uses-react.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-uses-react'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-uses-vars.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-uses-vars'>;
+}
+declare module 'eslint-plugin-react/lib/rules/jsx-wrap-multilines.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-wrap-multilines'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-array-index-key.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-array-index-key'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-children-prop.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-children-prop'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-comment-textnodes.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-comment-textnodes'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-danger-with-children.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-danger-with-children'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-danger.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-danger'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-deprecated.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-deprecated'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-did-mount-set-state.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-did-mount-set-state'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-did-update-set-state.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-did-update-set-state'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-direct-mutation-state.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-direct-mutation-state'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-find-dom-node.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-find-dom-node'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-is-mounted.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-is-mounted'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-multi-comp.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-multi-comp'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-render-return-value.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-render-return-value'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-set-state.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-set-state'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-string-refs.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-string-refs'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-unescaped-entities.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unescaped-entities'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-unknown-property.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unknown-property'>;
+}
+declare module 'eslint-plugin-react/lib/rules/no-unused-prop-types.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unused-prop-types'>;
+}
+declare module 'eslint-plugin-react/lib/rules/prefer-es6-class.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prefer-es6-class'>;
+}
+declare module 'eslint-plugin-react/lib/rules/prefer-stateless-function.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prefer-stateless-function'>;
+}
+declare module 'eslint-plugin-react/lib/rules/prop-types.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prop-types'>;
+}
+declare module 'eslint-plugin-react/lib/rules/react-in-jsx-scope.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/react-in-jsx-scope'>;
+}
+declare module 'eslint-plugin-react/lib/rules/require-default-props.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-default-props'>;
+}
+declare module 'eslint-plugin-react/lib/rules/require-extension.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-extension'>;
+}
+declare module 'eslint-plugin-react/lib/rules/require-optimization.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-optimization'>;
+}
+declare module 'eslint-plugin-react/lib/rules/require-render-return.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-render-return'>;
+}
+declare module 'eslint-plugin-react/lib/rules/self-closing-comp.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/self-closing-comp'>;
+}
+declare module 'eslint-plugin-react/lib/rules/sort-comp.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/sort-comp'>;
+}
+declare module 'eslint-plugin-react/lib/rules/sort-prop-types.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/sort-prop-types'>;
+}
+declare module 'eslint-plugin-react/lib/rules/style-prop-object.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/style-prop-object'>;
+}
+declare module 'eslint-plugin-react/lib/rules/void-dom-elements-no-children.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/void-dom-elements-no-children'>;
+}
+declare module 'eslint-plugin-react/lib/rules/wrap-multilines.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/rules/wrap-multilines'>;
+}
+declare module 'eslint-plugin-react/lib/util/annotations.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/util/annotations'>;
+}
+declare module 'eslint-plugin-react/lib/util/Components.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/util/Components'>;
+}
+declare module 'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket'>;
+}
+declare module 'eslint-plugin-react/lib/util/pragma.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/util/pragma'>;
+}
+declare module 'eslint-plugin-react/lib/util/variable.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/util/variable'>;
+}
+declare module 'eslint-plugin-react/lib/util/version.js' {
+ declare module.exports: $Exports<'eslint-plugin-react/lib/util/version'>;
+}
diff --git a/flow-typed/npm/eslint_vx.x.x.js b/flow-typed/npm/eslint_vx.x.x.js
new file mode 100644
index 0000000000..d0d1669f7a
--- /dev/null
+++ b/flow-typed/npm/eslint_vx.x.x.js
@@ -0,0 +1,2293 @@
+// flow-typed signature: a409041b94aac632b985b51f2a33f91d
+// flow-typed version: <<STUB>>/eslint_v^3.14.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'eslint'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'eslint' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'eslint/bin/eslint' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/conf/cli-options' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/conf/environments' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/conf/eslint-all' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/conf/eslint-recommended' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/api' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/ast-utils' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/cli-engine' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/cli' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/code-path-analysis/code-path-analyzer' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/code-path-analysis/code-path-segment' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/code-path-analysis/code-path-state' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/code-path-analysis/code-path' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/code-path-analysis/debug-helpers' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/code-path-analysis/fork-context' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/code-path-analysis/id-generator' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/autoconfig' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/config-file' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/config-initializer' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/config-ops' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/config-rule' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/config-validator' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/environments' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/config/plugins' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/eslint' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/file-finder' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/checkstyle' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/codeframe' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/compact' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/html' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/jslint-xml' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/json' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/junit' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/stylish' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/table' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/tap' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/unix' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/formatters/visualstudio' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/ignored-paths' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/internal-rules/internal-consistent-docs-description' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/internal-rules/internal-no-invalid-meta' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/load-rules' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/logging' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/options' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rule-context' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/accessor-pairs' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/array-bracket-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/array-callback-return' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/arrow-body-style' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/arrow-parens' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/arrow-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/block-scoped-var' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/block-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/brace-style' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/callback-return' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/camelcase' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/capitalized-comments' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/class-methods-use-this' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/comma-dangle' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/comma-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/comma-style' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/complexity' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/computed-property-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/consistent-return' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/consistent-this' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/constructor-super' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/curly' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/default-case' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/dot-location' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/dot-notation' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/eol-last' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/eqeqeq' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/func-call-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/func-name-matching' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/func-names' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/func-style' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/generator-star-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/global-require' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/guard-for-in' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/handle-callback-err' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/id-blacklist' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/id-length' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/id-match' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/indent' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/init-declarations' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/jsx-quotes' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/key-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/keyword-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/line-comment-position' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/linebreak-style' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/lines-around-comment' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/lines-around-directive' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/max-depth' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/max-len' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/max-lines' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/max-nested-callbacks' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/max-params' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/max-statements-per-line' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/max-statements' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/multiline-ternary' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/new-cap' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/new-parens' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/newline-after-var' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/newline-before-return' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/newline-per-chained-call' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-alert' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-array-constructor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-await-in-loop' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-bitwise' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-caller' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-case-declarations' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-catch-shadow' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-class-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-compare-neg-zero' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-cond-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-confusing-arrow' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-console' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-const-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-constant-condition' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-continue' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-control-regex' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-debugger' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-delete-var' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-div-regex' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-dupe-args' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-dupe-class-members' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-dupe-keys' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-duplicate-case' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-duplicate-imports' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-else-return' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-empty-character-class' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-empty-function' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-empty-pattern' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-empty' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-eq-null' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-eval' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-ex-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-extend-native' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-extra-bind' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-extra-boolean-cast' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-extra-label' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-extra-parens' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-extra-semi' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-fallthrough' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-floating-decimal' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-func-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-global-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-implicit-coercion' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-implicit-globals' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-implied-eval' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-inline-comments' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-inner-declarations' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-invalid-regexp' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-invalid-this' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-irregular-whitespace' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-iterator' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-label-var' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-labels' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-lone-blocks' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-lonely-if' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-loop-func' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-magic-numbers' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-mixed-operators' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-mixed-requires' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-mixed-spaces-and-tabs' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-multi-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-multi-spaces' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-multi-str' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-multiple-empty-lines' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-native-reassign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-negated-condition' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-negated-in-lhs' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-nested-ternary' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-new-func' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-new-object' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-new-require' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-new-symbol' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-new-wrappers' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-new' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-obj-calls' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-octal-escape' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-octal' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-param-reassign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-path-concat' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-plusplus' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-process-env' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-process-exit' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-proto' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-prototype-builtins' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-redeclare' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-regex-spaces' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-restricted-globals' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-restricted-imports' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-restricted-modules' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-restricted-properties' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-restricted-syntax' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-return-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-return-await' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-script-url' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-self-assign' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-self-compare' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-sequences' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-shadow-restricted-names' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-shadow' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-spaced-func' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-sparse-arrays' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-sync' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-tabs' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-template-curly-in-string' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-ternary' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-this-before-super' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-throw-literal' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-trailing-spaces' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-undef-init' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-undef' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-undefined' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-underscore-dangle' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unexpected-multiline' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unmodified-loop-condition' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unneeded-ternary' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unreachable' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unsafe-finally' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unsafe-negation' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unused-expressions' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unused-labels' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-unused-vars' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-use-before-define' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-useless-call' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-useless-computed-key' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-useless-concat' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-useless-constructor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-useless-escape' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-useless-rename' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-useless-return' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-var' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-void' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-warning-comments' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-whitespace-before-property' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/no-with' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/nonblock-statement-body-position' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/object-curly-newline' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/object-curly-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/object-property-newline' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/object-shorthand' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/one-var-declaration-per-line' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/one-var' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/operator-assignment' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/operator-linebreak' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/padded-blocks' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-arrow-callback' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-const' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-destructuring' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-numeric-literals' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-promise-reject-errors' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-reflect' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-rest-params' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-spread' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/prefer-template' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/quote-props' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/quotes' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/radix' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/require-await' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/require-jsdoc' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/require-yield' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/rest-spread-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/semi-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/semi' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/sort-imports' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/sort-keys' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/sort-vars' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/space-before-blocks' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/space-before-function-paren' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/space-in-parens' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/space-infix-ops' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/space-unary-ops' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/spaced-comment' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/strict' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/symbol-description' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/template-curly-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/template-tag-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/unicode-bom' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/use-isnan' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/valid-jsdoc' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/valid-typeof' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/vars-on-top' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/wrap-iife' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/wrap-regex' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/yield-star-spacing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/rules/yoda' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/testers/event-generator-tester' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/testers/rule-tester' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/timing' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/backward-token-comment-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/backward-token-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/cursors' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/decorative-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/filter-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/forward-token-comment-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/forward-token-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/index' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/limit-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/padded-token-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/skip-cursor' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/token-store/utils' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/comment-event-generator' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/fix-tracker' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/glob-util' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/glob' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/hash' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/keywords' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/module-resolver' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/node-event-generator' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/npm-util' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/path-util' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/patterns/letters' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/rule-fixer' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/source-code-fixer' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/source-code-util' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/source-code' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/traverser' {
+ declare module.exports: any;
+}
+
+declare module 'eslint/lib/util/xml-escape' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'eslint/bin/eslint.js' {
+ declare module.exports: $Exports<'eslint/bin/eslint'>;
+}
+declare module 'eslint/conf/cli-options.js' {
+ declare module.exports: $Exports<'eslint/conf/cli-options'>;
+}
+declare module 'eslint/conf/environments.js' {
+ declare module.exports: $Exports<'eslint/conf/environments'>;
+}
+declare module 'eslint/conf/eslint-all.js' {
+ declare module.exports: $Exports<'eslint/conf/eslint-all'>;
+}
+declare module 'eslint/conf/eslint-recommended.js' {
+ declare module.exports: $Exports<'eslint/conf/eslint-recommended'>;
+}
+declare module 'eslint/lib/api.js' {
+ declare module.exports: $Exports<'eslint/lib/api'>;
+}
+declare module 'eslint/lib/ast-utils.js' {
+ declare module.exports: $Exports<'eslint/lib/ast-utils'>;
+}
+declare module 'eslint/lib/cli-engine.js' {
+ declare module.exports: $Exports<'eslint/lib/cli-engine'>;
+}
+declare module 'eslint/lib/cli.js' {
+ declare module.exports: $Exports<'eslint/lib/cli'>;
+}
+declare module 'eslint/lib/code-path-analysis/code-path-analyzer.js' {
+ declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-analyzer'>;
+}
+declare module 'eslint/lib/code-path-analysis/code-path-segment.js' {
+ declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-segment'>;
+}
+declare module 'eslint/lib/code-path-analysis/code-path-state.js' {
+ declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-state'>;
+}
+declare module 'eslint/lib/code-path-analysis/code-path.js' {
+ declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path'>;
+}
+declare module 'eslint/lib/code-path-analysis/debug-helpers.js' {
+ declare module.exports: $Exports<'eslint/lib/code-path-analysis/debug-helpers'>;
+}
+declare module 'eslint/lib/code-path-analysis/fork-context.js' {
+ declare module.exports: $Exports<'eslint/lib/code-path-analysis/fork-context'>;
+}
+declare module 'eslint/lib/code-path-analysis/id-generator.js' {
+ declare module.exports: $Exports<'eslint/lib/code-path-analysis/id-generator'>;
+}
+declare module 'eslint/lib/config.js' {
+ declare module.exports: $Exports<'eslint/lib/config'>;
+}
+declare module 'eslint/lib/config/autoconfig.js' {
+ declare module.exports: $Exports<'eslint/lib/config/autoconfig'>;
+}
+declare module 'eslint/lib/config/config-file.js' {
+ declare module.exports: $Exports<'eslint/lib/config/config-file'>;
+}
+declare module 'eslint/lib/config/config-initializer.js' {
+ declare module.exports: $Exports<'eslint/lib/config/config-initializer'>;
+}
+declare module 'eslint/lib/config/config-ops.js' {
+ declare module.exports: $Exports<'eslint/lib/config/config-ops'>;
+}
+declare module 'eslint/lib/config/config-rule.js' {
+ declare module.exports: $Exports<'eslint/lib/config/config-rule'>;
+}
+declare module 'eslint/lib/config/config-validator.js' {
+ declare module.exports: $Exports<'eslint/lib/config/config-validator'>;
+}
+declare module 'eslint/lib/config/environments.js' {
+ declare module.exports: $Exports<'eslint/lib/config/environments'>;
+}
+declare module 'eslint/lib/config/plugins.js' {
+ declare module.exports: $Exports<'eslint/lib/config/plugins'>;
+}
+declare module 'eslint/lib/eslint.js' {
+ declare module.exports: $Exports<'eslint/lib/eslint'>;
+}
+declare module 'eslint/lib/file-finder.js' {
+ declare module.exports: $Exports<'eslint/lib/file-finder'>;
+}
+declare module 'eslint/lib/formatters/checkstyle.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/checkstyle'>;
+}
+declare module 'eslint/lib/formatters/codeframe.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/codeframe'>;
+}
+declare module 'eslint/lib/formatters/compact.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/compact'>;
+}
+declare module 'eslint/lib/formatters/html.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/html'>;
+}
+declare module 'eslint/lib/formatters/jslint-xml.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/jslint-xml'>;
+}
+declare module 'eslint/lib/formatters/json.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/json'>;
+}
+declare module 'eslint/lib/formatters/junit.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/junit'>;
+}
+declare module 'eslint/lib/formatters/stylish.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/stylish'>;
+}
+declare module 'eslint/lib/formatters/table.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/table'>;
+}
+declare module 'eslint/lib/formatters/tap.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/tap'>;
+}
+declare module 'eslint/lib/formatters/unix.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/unix'>;
+}
+declare module 'eslint/lib/formatters/visualstudio.js' {
+ declare module.exports: $Exports<'eslint/lib/formatters/visualstudio'>;
+}
+declare module 'eslint/lib/ignored-paths.js' {
+ declare module.exports: $Exports<'eslint/lib/ignored-paths'>;
+}
+declare module 'eslint/lib/internal-rules/internal-consistent-docs-description.js' {
+ declare module.exports: $Exports<'eslint/lib/internal-rules/internal-consistent-docs-description'>;
+}
+declare module 'eslint/lib/internal-rules/internal-no-invalid-meta.js' {
+ declare module.exports: $Exports<'eslint/lib/internal-rules/internal-no-invalid-meta'>;
+}
+declare module 'eslint/lib/load-rules.js' {
+ declare module.exports: $Exports<'eslint/lib/load-rules'>;
+}
+declare module 'eslint/lib/logging.js' {
+ declare module.exports: $Exports<'eslint/lib/logging'>;
+}
+declare module 'eslint/lib/options.js' {
+ declare module.exports: $Exports<'eslint/lib/options'>;
+}
+declare module 'eslint/lib/rule-context.js' {
+ declare module.exports: $Exports<'eslint/lib/rule-context'>;
+}
+declare module 'eslint/lib/rules.js' {
+ declare module.exports: $Exports<'eslint/lib/rules'>;
+}
+declare module 'eslint/lib/rules/accessor-pairs.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/accessor-pairs'>;
+}
+declare module 'eslint/lib/rules/array-bracket-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/array-bracket-spacing'>;
+}
+declare module 'eslint/lib/rules/array-callback-return.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/array-callback-return'>;
+}
+declare module 'eslint/lib/rules/arrow-body-style.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/arrow-body-style'>;
+}
+declare module 'eslint/lib/rules/arrow-parens.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/arrow-parens'>;
+}
+declare module 'eslint/lib/rules/arrow-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/arrow-spacing'>;
+}
+declare module 'eslint/lib/rules/block-scoped-var.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/block-scoped-var'>;
+}
+declare module 'eslint/lib/rules/block-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/block-spacing'>;
+}
+declare module 'eslint/lib/rules/brace-style.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/brace-style'>;
+}
+declare module 'eslint/lib/rules/callback-return.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/callback-return'>;
+}
+declare module 'eslint/lib/rules/camelcase.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/camelcase'>;
+}
+declare module 'eslint/lib/rules/capitalized-comments.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/capitalized-comments'>;
+}
+declare module 'eslint/lib/rules/class-methods-use-this.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/class-methods-use-this'>;
+}
+declare module 'eslint/lib/rules/comma-dangle.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/comma-dangle'>;
+}
+declare module 'eslint/lib/rules/comma-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/comma-spacing'>;
+}
+declare module 'eslint/lib/rules/comma-style.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/comma-style'>;
+}
+declare module 'eslint/lib/rules/complexity.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/complexity'>;
+}
+declare module 'eslint/lib/rules/computed-property-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/computed-property-spacing'>;
+}
+declare module 'eslint/lib/rules/consistent-return.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/consistent-return'>;
+}
+declare module 'eslint/lib/rules/consistent-this.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/consistent-this'>;
+}
+declare module 'eslint/lib/rules/constructor-super.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/constructor-super'>;
+}
+declare module 'eslint/lib/rules/curly.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/curly'>;
+}
+declare module 'eslint/lib/rules/default-case.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/default-case'>;
+}
+declare module 'eslint/lib/rules/dot-location.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/dot-location'>;
+}
+declare module 'eslint/lib/rules/dot-notation.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/dot-notation'>;
+}
+declare module 'eslint/lib/rules/eol-last.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/eol-last'>;
+}
+declare module 'eslint/lib/rules/eqeqeq.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/eqeqeq'>;
+}
+declare module 'eslint/lib/rules/func-call-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/func-call-spacing'>;
+}
+declare module 'eslint/lib/rules/func-name-matching.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/func-name-matching'>;
+}
+declare module 'eslint/lib/rules/func-names.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/func-names'>;
+}
+declare module 'eslint/lib/rules/func-style.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/func-style'>;
+}
+declare module 'eslint/lib/rules/generator-star-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/generator-star-spacing'>;
+}
+declare module 'eslint/lib/rules/global-require.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/global-require'>;
+}
+declare module 'eslint/lib/rules/guard-for-in.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/guard-for-in'>;
+}
+declare module 'eslint/lib/rules/handle-callback-err.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/handle-callback-err'>;
+}
+declare module 'eslint/lib/rules/id-blacklist.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/id-blacklist'>;
+}
+declare module 'eslint/lib/rules/id-length.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/id-length'>;
+}
+declare module 'eslint/lib/rules/id-match.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/id-match'>;
+}
+declare module 'eslint/lib/rules/indent.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/indent'>;
+}
+declare module 'eslint/lib/rules/init-declarations.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/init-declarations'>;
+}
+declare module 'eslint/lib/rules/jsx-quotes.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/jsx-quotes'>;
+}
+declare module 'eslint/lib/rules/key-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/key-spacing'>;
+}
+declare module 'eslint/lib/rules/keyword-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/keyword-spacing'>;
+}
+declare module 'eslint/lib/rules/line-comment-position.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/line-comment-position'>;
+}
+declare module 'eslint/lib/rules/linebreak-style.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/linebreak-style'>;
+}
+declare module 'eslint/lib/rules/lines-around-comment.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/lines-around-comment'>;
+}
+declare module 'eslint/lib/rules/lines-around-directive.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/lines-around-directive'>;
+}
+declare module 'eslint/lib/rules/max-depth.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/max-depth'>;
+}
+declare module 'eslint/lib/rules/max-len.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/max-len'>;
+}
+declare module 'eslint/lib/rules/max-lines.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/max-lines'>;
+}
+declare module 'eslint/lib/rules/max-nested-callbacks.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/max-nested-callbacks'>;
+}
+declare module 'eslint/lib/rules/max-params.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/max-params'>;
+}
+declare module 'eslint/lib/rules/max-statements-per-line.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/max-statements-per-line'>;
+}
+declare module 'eslint/lib/rules/max-statements.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/max-statements'>;
+}
+declare module 'eslint/lib/rules/multiline-ternary.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/multiline-ternary'>;
+}
+declare module 'eslint/lib/rules/new-cap.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/new-cap'>;
+}
+declare module 'eslint/lib/rules/new-parens.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/new-parens'>;
+}
+declare module 'eslint/lib/rules/newline-after-var.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/newline-after-var'>;
+}
+declare module 'eslint/lib/rules/newline-before-return.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/newline-before-return'>;
+}
+declare module 'eslint/lib/rules/newline-per-chained-call.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/newline-per-chained-call'>;
+}
+declare module 'eslint/lib/rules/no-alert.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-alert'>;
+}
+declare module 'eslint/lib/rules/no-array-constructor.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-array-constructor'>;
+}
+declare module 'eslint/lib/rules/no-await-in-loop.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-await-in-loop'>;
+}
+declare module 'eslint/lib/rules/no-bitwise.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-bitwise'>;
+}
+declare module 'eslint/lib/rules/no-caller.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-caller'>;
+}
+declare module 'eslint/lib/rules/no-case-declarations.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-case-declarations'>;
+}
+declare module 'eslint/lib/rules/no-catch-shadow.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-catch-shadow'>;
+}
+declare module 'eslint/lib/rules/no-class-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-class-assign'>;
+}
+declare module 'eslint/lib/rules/no-compare-neg-zero.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-compare-neg-zero'>;
+}
+declare module 'eslint/lib/rules/no-cond-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-cond-assign'>;
+}
+declare module 'eslint/lib/rules/no-confusing-arrow.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-confusing-arrow'>;
+}
+declare module 'eslint/lib/rules/no-console.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-console'>;
+}
+declare module 'eslint/lib/rules/no-const-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-const-assign'>;
+}
+declare module 'eslint/lib/rules/no-constant-condition.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-constant-condition'>;
+}
+declare module 'eslint/lib/rules/no-continue.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-continue'>;
+}
+declare module 'eslint/lib/rules/no-control-regex.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-control-regex'>;
+}
+declare module 'eslint/lib/rules/no-debugger.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-debugger'>;
+}
+declare module 'eslint/lib/rules/no-delete-var.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-delete-var'>;
+}
+declare module 'eslint/lib/rules/no-div-regex.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-div-regex'>;
+}
+declare module 'eslint/lib/rules/no-dupe-args.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-dupe-args'>;
+}
+declare module 'eslint/lib/rules/no-dupe-class-members.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-dupe-class-members'>;
+}
+declare module 'eslint/lib/rules/no-dupe-keys.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-dupe-keys'>;
+}
+declare module 'eslint/lib/rules/no-duplicate-case.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-case'>;
+}
+declare module 'eslint/lib/rules/no-duplicate-imports.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-imports'>;
+}
+declare module 'eslint/lib/rules/no-else-return.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-else-return'>;
+}
+declare module 'eslint/lib/rules/no-empty-character-class.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-empty-character-class'>;
+}
+declare module 'eslint/lib/rules/no-empty-function.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-empty-function'>;
+}
+declare module 'eslint/lib/rules/no-empty-pattern.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-empty-pattern'>;
+}
+declare module 'eslint/lib/rules/no-empty.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-empty'>;
+}
+declare module 'eslint/lib/rules/no-eq-null.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-eq-null'>;
+}
+declare module 'eslint/lib/rules/no-eval.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-eval'>;
+}
+declare module 'eslint/lib/rules/no-ex-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-ex-assign'>;
+}
+declare module 'eslint/lib/rules/no-extend-native.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-extend-native'>;
+}
+declare module 'eslint/lib/rules/no-extra-bind.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-extra-bind'>;
+}
+declare module 'eslint/lib/rules/no-extra-boolean-cast.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-extra-boolean-cast'>;
+}
+declare module 'eslint/lib/rules/no-extra-label.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-extra-label'>;
+}
+declare module 'eslint/lib/rules/no-extra-parens.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-extra-parens'>;
+}
+declare module 'eslint/lib/rules/no-extra-semi.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-extra-semi'>;
+}
+declare module 'eslint/lib/rules/no-fallthrough.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-fallthrough'>;
+}
+declare module 'eslint/lib/rules/no-floating-decimal.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-floating-decimal'>;
+}
+declare module 'eslint/lib/rules/no-func-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-func-assign'>;
+}
+declare module 'eslint/lib/rules/no-global-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-global-assign'>;
+}
+declare module 'eslint/lib/rules/no-implicit-coercion.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-implicit-coercion'>;
+}
+declare module 'eslint/lib/rules/no-implicit-globals.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-implicit-globals'>;
+}
+declare module 'eslint/lib/rules/no-implied-eval.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-implied-eval'>;
+}
+declare module 'eslint/lib/rules/no-inline-comments.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-inline-comments'>;
+}
+declare module 'eslint/lib/rules/no-inner-declarations.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-inner-declarations'>;
+}
+declare module 'eslint/lib/rules/no-invalid-regexp.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-invalid-regexp'>;
+}
+declare module 'eslint/lib/rules/no-invalid-this.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-invalid-this'>;
+}
+declare module 'eslint/lib/rules/no-irregular-whitespace.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-irregular-whitespace'>;
+}
+declare module 'eslint/lib/rules/no-iterator.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-iterator'>;
+}
+declare module 'eslint/lib/rules/no-label-var.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-label-var'>;
+}
+declare module 'eslint/lib/rules/no-labels.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-labels'>;
+}
+declare module 'eslint/lib/rules/no-lone-blocks.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-lone-blocks'>;
+}
+declare module 'eslint/lib/rules/no-lonely-if.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-lonely-if'>;
+}
+declare module 'eslint/lib/rules/no-loop-func.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-loop-func'>;
+}
+declare module 'eslint/lib/rules/no-magic-numbers.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-magic-numbers'>;
+}
+declare module 'eslint/lib/rules/no-mixed-operators.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-mixed-operators'>;
+}
+declare module 'eslint/lib/rules/no-mixed-requires.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-mixed-requires'>;
+}
+declare module 'eslint/lib/rules/no-mixed-spaces-and-tabs.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-mixed-spaces-and-tabs'>;
+}
+declare module 'eslint/lib/rules/no-multi-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-multi-assign'>;
+}
+declare module 'eslint/lib/rules/no-multi-spaces.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-multi-spaces'>;
+}
+declare module 'eslint/lib/rules/no-multi-str.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-multi-str'>;
+}
+declare module 'eslint/lib/rules/no-multiple-empty-lines.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-multiple-empty-lines'>;
+}
+declare module 'eslint/lib/rules/no-native-reassign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-native-reassign'>;
+}
+declare module 'eslint/lib/rules/no-negated-condition.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-negated-condition'>;
+}
+declare module 'eslint/lib/rules/no-negated-in-lhs.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-negated-in-lhs'>;
+}
+declare module 'eslint/lib/rules/no-nested-ternary.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-nested-ternary'>;
+}
+declare module 'eslint/lib/rules/no-new-func.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-new-func'>;
+}
+declare module 'eslint/lib/rules/no-new-object.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-new-object'>;
+}
+declare module 'eslint/lib/rules/no-new-require.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-new-require'>;
+}
+declare module 'eslint/lib/rules/no-new-symbol.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-new-symbol'>;
+}
+declare module 'eslint/lib/rules/no-new-wrappers.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-new-wrappers'>;
+}
+declare module 'eslint/lib/rules/no-new.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-new'>;
+}
+declare module 'eslint/lib/rules/no-obj-calls.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-obj-calls'>;
+}
+declare module 'eslint/lib/rules/no-octal-escape.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-octal-escape'>;
+}
+declare module 'eslint/lib/rules/no-octal.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-octal'>;
+}
+declare module 'eslint/lib/rules/no-param-reassign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-param-reassign'>;
+}
+declare module 'eslint/lib/rules/no-path-concat.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-path-concat'>;
+}
+declare module 'eslint/lib/rules/no-plusplus.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-plusplus'>;
+}
+declare module 'eslint/lib/rules/no-process-env.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-process-env'>;
+}
+declare module 'eslint/lib/rules/no-process-exit.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-process-exit'>;
+}
+declare module 'eslint/lib/rules/no-proto.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-proto'>;
+}
+declare module 'eslint/lib/rules/no-prototype-builtins.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-prototype-builtins'>;
+}
+declare module 'eslint/lib/rules/no-redeclare.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-redeclare'>;
+}
+declare module 'eslint/lib/rules/no-regex-spaces.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-regex-spaces'>;
+}
+declare module 'eslint/lib/rules/no-restricted-globals.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-restricted-globals'>;
+}
+declare module 'eslint/lib/rules/no-restricted-imports.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-restricted-imports'>;
+}
+declare module 'eslint/lib/rules/no-restricted-modules.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-restricted-modules'>;
+}
+declare module 'eslint/lib/rules/no-restricted-properties.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-restricted-properties'>;
+}
+declare module 'eslint/lib/rules/no-restricted-syntax.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-restricted-syntax'>;
+}
+declare module 'eslint/lib/rules/no-return-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-return-assign'>;
+}
+declare module 'eslint/lib/rules/no-return-await.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-return-await'>;
+}
+declare module 'eslint/lib/rules/no-script-url.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-script-url'>;
+}
+declare module 'eslint/lib/rules/no-self-assign.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-self-assign'>;
+}
+declare module 'eslint/lib/rules/no-self-compare.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-self-compare'>;
+}
+declare module 'eslint/lib/rules/no-sequences.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-sequences'>;
+}
+declare module 'eslint/lib/rules/no-shadow-restricted-names.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-shadow-restricted-names'>;
+}
+declare module 'eslint/lib/rules/no-shadow.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-shadow'>;
+}
+declare module 'eslint/lib/rules/no-spaced-func.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-spaced-func'>;
+}
+declare module 'eslint/lib/rules/no-sparse-arrays.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-sparse-arrays'>;
+}
+declare module 'eslint/lib/rules/no-sync.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-sync'>;
+}
+declare module 'eslint/lib/rules/no-tabs.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-tabs'>;
+}
+declare module 'eslint/lib/rules/no-template-curly-in-string.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-template-curly-in-string'>;
+}
+declare module 'eslint/lib/rules/no-ternary.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-ternary'>;
+}
+declare module 'eslint/lib/rules/no-this-before-super.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-this-before-super'>;
+}
+declare module 'eslint/lib/rules/no-throw-literal.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-throw-literal'>;
+}
+declare module 'eslint/lib/rules/no-trailing-spaces.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-trailing-spaces'>;
+}
+declare module 'eslint/lib/rules/no-undef-init.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-undef-init'>;
+}
+declare module 'eslint/lib/rules/no-undef.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-undef'>;
+}
+declare module 'eslint/lib/rules/no-undefined.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-undefined'>;
+}
+declare module 'eslint/lib/rules/no-underscore-dangle.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-underscore-dangle'>;
+}
+declare module 'eslint/lib/rules/no-unexpected-multiline.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unexpected-multiline'>;
+}
+declare module 'eslint/lib/rules/no-unmodified-loop-condition.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unmodified-loop-condition'>;
+}
+declare module 'eslint/lib/rules/no-unneeded-ternary.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unneeded-ternary'>;
+}
+declare module 'eslint/lib/rules/no-unreachable.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unreachable'>;
+}
+declare module 'eslint/lib/rules/no-unsafe-finally.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-finally'>;
+}
+declare module 'eslint/lib/rules/no-unsafe-negation.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-negation'>;
+}
+declare module 'eslint/lib/rules/no-unused-expressions.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unused-expressions'>;
+}
+declare module 'eslint/lib/rules/no-unused-labels.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unused-labels'>;
+}
+declare module 'eslint/lib/rules/no-unused-vars.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-unused-vars'>;
+}
+declare module 'eslint/lib/rules/no-use-before-define.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-use-before-define'>;
+}
+declare module 'eslint/lib/rules/no-useless-call.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-useless-call'>;
+}
+declare module 'eslint/lib/rules/no-useless-computed-key.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-useless-computed-key'>;
+}
+declare module 'eslint/lib/rules/no-useless-concat.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-useless-concat'>;
+}
+declare module 'eslint/lib/rules/no-useless-constructor.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-useless-constructor'>;
+}
+declare module 'eslint/lib/rules/no-useless-escape.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-useless-escape'>;
+}
+declare module 'eslint/lib/rules/no-useless-rename.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-useless-rename'>;
+}
+declare module 'eslint/lib/rules/no-useless-return.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-useless-return'>;
+}
+declare module 'eslint/lib/rules/no-var.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-var'>;
+}
+declare module 'eslint/lib/rules/no-void.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-void'>;
+}
+declare module 'eslint/lib/rules/no-warning-comments.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-warning-comments'>;
+}
+declare module 'eslint/lib/rules/no-whitespace-before-property.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-whitespace-before-property'>;
+}
+declare module 'eslint/lib/rules/no-with.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/no-with'>;
+}
+declare module 'eslint/lib/rules/nonblock-statement-body-position.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/nonblock-statement-body-position'>;
+}
+declare module 'eslint/lib/rules/object-curly-newline.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/object-curly-newline'>;
+}
+declare module 'eslint/lib/rules/object-curly-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/object-curly-spacing'>;
+}
+declare module 'eslint/lib/rules/object-property-newline.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/object-property-newline'>;
+}
+declare module 'eslint/lib/rules/object-shorthand.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/object-shorthand'>;
+}
+declare module 'eslint/lib/rules/one-var-declaration-per-line.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/one-var-declaration-per-line'>;
+}
+declare module 'eslint/lib/rules/one-var.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/one-var'>;
+}
+declare module 'eslint/lib/rules/operator-assignment.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/operator-assignment'>;
+}
+declare module 'eslint/lib/rules/operator-linebreak.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/operator-linebreak'>;
+}
+declare module 'eslint/lib/rules/padded-blocks.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/padded-blocks'>;
+}
+declare module 'eslint/lib/rules/prefer-arrow-callback.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-arrow-callback'>;
+}
+declare module 'eslint/lib/rules/prefer-const.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-const'>;
+}
+declare module 'eslint/lib/rules/prefer-destructuring.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-destructuring'>;
+}
+declare module 'eslint/lib/rules/prefer-numeric-literals.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-numeric-literals'>;
+}
+declare module 'eslint/lib/rules/prefer-promise-reject-errors.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-promise-reject-errors'>;
+}
+declare module 'eslint/lib/rules/prefer-reflect.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-reflect'>;
+}
+declare module 'eslint/lib/rules/prefer-rest-params.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-rest-params'>;
+}
+declare module 'eslint/lib/rules/prefer-spread.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-spread'>;
+}
+declare module 'eslint/lib/rules/prefer-template.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/prefer-template'>;
+}
+declare module 'eslint/lib/rules/quote-props.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/quote-props'>;
+}
+declare module 'eslint/lib/rules/quotes.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/quotes'>;
+}
+declare module 'eslint/lib/rules/radix.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/radix'>;
+}
+declare module 'eslint/lib/rules/require-await.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/require-await'>;
+}
+declare module 'eslint/lib/rules/require-jsdoc.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/require-jsdoc'>;
+}
+declare module 'eslint/lib/rules/require-yield.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/require-yield'>;
+}
+declare module 'eslint/lib/rules/rest-spread-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/rest-spread-spacing'>;
+}
+declare module 'eslint/lib/rules/semi-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/semi-spacing'>;
+}
+declare module 'eslint/lib/rules/semi.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/semi'>;
+}
+declare module 'eslint/lib/rules/sort-imports.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/sort-imports'>;
+}
+declare module 'eslint/lib/rules/sort-keys.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/sort-keys'>;
+}
+declare module 'eslint/lib/rules/sort-vars.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/sort-vars'>;
+}
+declare module 'eslint/lib/rules/space-before-blocks.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/space-before-blocks'>;
+}
+declare module 'eslint/lib/rules/space-before-function-paren.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/space-before-function-paren'>;
+}
+declare module 'eslint/lib/rules/space-in-parens.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/space-in-parens'>;
+}
+declare module 'eslint/lib/rules/space-infix-ops.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/space-infix-ops'>;
+}
+declare module 'eslint/lib/rules/space-unary-ops.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/space-unary-ops'>;
+}
+declare module 'eslint/lib/rules/spaced-comment.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/spaced-comment'>;
+}
+declare module 'eslint/lib/rules/strict.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/strict'>;
+}
+declare module 'eslint/lib/rules/symbol-description.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/symbol-description'>;
+}
+declare module 'eslint/lib/rules/template-curly-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/template-curly-spacing'>;
+}
+declare module 'eslint/lib/rules/template-tag-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/template-tag-spacing'>;
+}
+declare module 'eslint/lib/rules/unicode-bom.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/unicode-bom'>;
+}
+declare module 'eslint/lib/rules/use-isnan.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/use-isnan'>;
+}
+declare module 'eslint/lib/rules/valid-jsdoc.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/valid-jsdoc'>;
+}
+declare module 'eslint/lib/rules/valid-typeof.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/valid-typeof'>;
+}
+declare module 'eslint/lib/rules/vars-on-top.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/vars-on-top'>;
+}
+declare module 'eslint/lib/rules/wrap-iife.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/wrap-iife'>;
+}
+declare module 'eslint/lib/rules/wrap-regex.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/wrap-regex'>;
+}
+declare module 'eslint/lib/rules/yield-star-spacing.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/yield-star-spacing'>;
+}
+declare module 'eslint/lib/rules/yoda.js' {
+ declare module.exports: $Exports<'eslint/lib/rules/yoda'>;
+}
+declare module 'eslint/lib/testers/event-generator-tester.js' {
+ declare module.exports: $Exports<'eslint/lib/testers/event-generator-tester'>;
+}
+declare module 'eslint/lib/testers/rule-tester.js' {
+ declare module.exports: $Exports<'eslint/lib/testers/rule-tester'>;
+}
+declare module 'eslint/lib/timing.js' {
+ declare module.exports: $Exports<'eslint/lib/timing'>;
+}
+declare module 'eslint/lib/token-store/backward-token-comment-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/backward-token-comment-cursor'>;
+}
+declare module 'eslint/lib/token-store/backward-token-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/backward-token-cursor'>;
+}
+declare module 'eslint/lib/token-store/cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/cursor'>;
+}
+declare module 'eslint/lib/token-store/cursors.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/cursors'>;
+}
+declare module 'eslint/lib/token-store/decorative-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/decorative-cursor'>;
+}
+declare module 'eslint/lib/token-store/filter-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/filter-cursor'>;
+}
+declare module 'eslint/lib/token-store/forward-token-comment-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/forward-token-comment-cursor'>;
+}
+declare module 'eslint/lib/token-store/forward-token-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/forward-token-cursor'>;
+}
+declare module 'eslint/lib/token-store/index.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/index'>;
+}
+declare module 'eslint/lib/token-store/limit-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/limit-cursor'>;
+}
+declare module 'eslint/lib/token-store/padded-token-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/padded-token-cursor'>;
+}
+declare module 'eslint/lib/token-store/skip-cursor.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/skip-cursor'>;
+}
+declare module 'eslint/lib/token-store/utils.js' {
+ declare module.exports: $Exports<'eslint/lib/token-store/utils'>;
+}
+declare module 'eslint/lib/util/comment-event-generator.js' {
+ declare module.exports: $Exports<'eslint/lib/util/comment-event-generator'>;
+}
+declare module 'eslint/lib/util/fix-tracker.js' {
+ declare module.exports: $Exports<'eslint/lib/util/fix-tracker'>;
+}
+declare module 'eslint/lib/util/glob-util.js' {
+ declare module.exports: $Exports<'eslint/lib/util/glob-util'>;
+}
+declare module 'eslint/lib/util/glob.js' {
+ declare module.exports: $Exports<'eslint/lib/util/glob'>;
+}
+declare module 'eslint/lib/util/hash.js' {
+ declare module.exports: $Exports<'eslint/lib/util/hash'>;
+}
+declare module 'eslint/lib/util/keywords.js' {
+ declare module.exports: $Exports<'eslint/lib/util/keywords'>;
+}
+declare module 'eslint/lib/util/module-resolver.js' {
+ declare module.exports: $Exports<'eslint/lib/util/module-resolver'>;
+}
+declare module 'eslint/lib/util/node-event-generator.js' {
+ declare module.exports: $Exports<'eslint/lib/util/node-event-generator'>;
+}
+declare module 'eslint/lib/util/npm-util.js' {
+ declare module.exports: $Exports<'eslint/lib/util/npm-util'>;
+}
+declare module 'eslint/lib/util/path-util.js' {
+ declare module.exports: $Exports<'eslint/lib/util/path-util'>;
+}
+declare module 'eslint/lib/util/patterns/letters.js' {
+ declare module.exports: $Exports<'eslint/lib/util/patterns/letters'>;
+}
+declare module 'eslint/lib/util/rule-fixer.js' {
+ declare module.exports: $Exports<'eslint/lib/util/rule-fixer'>;
+}
+declare module 'eslint/lib/util/source-code-fixer.js' {
+ declare module.exports: $Exports<'eslint/lib/util/source-code-fixer'>;
+}
+declare module 'eslint/lib/util/source-code-util.js' {
+ declare module.exports: $Exports<'eslint/lib/util/source-code-util'>;
+}
+declare module 'eslint/lib/util/source-code.js' {
+ declare module.exports: $Exports<'eslint/lib/util/source-code'>;
+}
+declare module 'eslint/lib/util/traverser.js' {
+ declare module.exports: $Exports<'eslint/lib/util/traverser'>;
+}
+declare module 'eslint/lib/util/xml-escape.js' {
+ declare module.exports: $Exports<'eslint/lib/util/xml-escape'>;
+}
diff --git a/flow-typed/npm/flow-bin_v0.x.x.js b/flow-typed/npm/flow-bin_v0.x.x.js
new file mode 100644
index 0000000000..c538e2086f
--- /dev/null
+++ b/flow-typed/npm/flow-bin_v0.x.x.js
@@ -0,0 +1,6 @@
+// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583
+// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x
+
+declare module "flow-bin" {
+ declare module.exports: string;
+}
diff --git a/flow-typed/npm/flow-typed_vx.x.x.js b/flow-typed/npm/flow-typed_vx.x.x.js
new file mode 100644
index 0000000000..80d4d09957
--- /dev/null
+++ b/flow-typed/npm/flow-typed_vx.x.x.js
@@ -0,0 +1,193 @@
+// flow-typed signature: 8898603ed592b58f9cb89fd30a371a09
+// flow-typed version: <<STUB>>/flow-typed_v^2.1.2/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'flow-typed'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'flow-typed' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'flow-typed/dist/cli' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/create-stub' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/install' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/runTests' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/search' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/update-cache' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/update' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/validateDefs' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/commands/version' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/cacheRepoUtils' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/codeSign' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/fileUtils' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/flowProjectUtils' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/flowVersion' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/git' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/github' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/isInFlowTypedRepo' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/libDefs' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/node' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/npm/npmLibDefs' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/npm/npmProjectUtils' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/semver' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/stubUtils' {
+ declare module.exports: any;
+}
+
+declare module 'flow-typed/dist/lib/validationErrors' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'flow-typed/dist/cli.js' {
+ declare module.exports: $Exports<'flow-typed/dist/cli'>;
+}
+declare module 'flow-typed/dist/commands/create-stub.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/create-stub'>;
+}
+declare module 'flow-typed/dist/commands/install.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/install'>;
+}
+declare module 'flow-typed/dist/commands/runTests.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/runTests'>;
+}
+declare module 'flow-typed/dist/commands/search.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/search'>;
+}
+declare module 'flow-typed/dist/commands/update-cache.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/update-cache'>;
+}
+declare module 'flow-typed/dist/commands/update.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/update'>;
+}
+declare module 'flow-typed/dist/commands/validateDefs.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/validateDefs'>;
+}
+declare module 'flow-typed/dist/commands/version.js' {
+ declare module.exports: $Exports<'flow-typed/dist/commands/version'>;
+}
+declare module 'flow-typed/dist/lib/cacheRepoUtils.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/cacheRepoUtils'>;
+}
+declare module 'flow-typed/dist/lib/codeSign.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/codeSign'>;
+}
+declare module 'flow-typed/dist/lib/fileUtils.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/fileUtils'>;
+}
+declare module 'flow-typed/dist/lib/flowProjectUtils.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/flowProjectUtils'>;
+}
+declare module 'flow-typed/dist/lib/flowVersion.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/flowVersion'>;
+}
+declare module 'flow-typed/dist/lib/git.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/git'>;
+}
+declare module 'flow-typed/dist/lib/github.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/github'>;
+}
+declare module 'flow-typed/dist/lib/isInFlowTypedRepo.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/isInFlowTypedRepo'>;
+}
+declare module 'flow-typed/dist/lib/libDefs.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/libDefs'>;
+}
+declare module 'flow-typed/dist/lib/node.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/node'>;
+}
+declare module 'flow-typed/dist/lib/npm/npmLibDefs.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmLibDefs'>;
+}
+declare module 'flow-typed/dist/lib/npm/npmProjectUtils.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmProjectUtils'>;
+}
+declare module 'flow-typed/dist/lib/semver.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/semver'>;
+}
+declare module 'flow-typed/dist/lib/stubUtils.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/stubUtils'>;
+}
+declare module 'flow-typed/dist/lib/validationErrors.js' {
+ declare module.exports: $Exports<'flow-typed/dist/lib/validationErrors'>;
+}
diff --git a/flow-typed/npm/history_vx.x.x.js b/flow-typed/npm/history_vx.x.x.js
new file mode 100644
index 0000000000..affde2a8ba
--- /dev/null
+++ b/flow-typed/npm/history_vx.x.x.js
@@ -0,0 +1,150 @@
+// flow-typed signature: c3e4bafa900535d1e526ed6771daa719
+// flow-typed version: <<STUB>>/history_v^4.6.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'history'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'history' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'history/createBrowserHistory' {
+ declare module.exports: any;
+}
+
+declare module 'history/createHashHistory' {
+ declare module.exports: any;
+}
+
+declare module 'history/createMemoryHistory' {
+ declare module.exports: any;
+}
+
+declare module 'history/createTransitionManager' {
+ declare module.exports: any;
+}
+
+declare module 'history/DOMUtils' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/createBrowserHistory' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/createHashHistory' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/createMemoryHistory' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/createTransitionManager' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/DOMUtils' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/index' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/LocationUtils' {
+ declare module.exports: any;
+}
+
+declare module 'history/es/PathUtils' {
+ declare module.exports: any;
+}
+
+declare module 'history/LocationUtils' {
+ declare module.exports: any;
+}
+
+declare module 'history/PathUtils' {
+ declare module.exports: any;
+}
+
+declare module 'history/umd/history' {
+ declare module.exports: any;
+}
+
+declare module 'history/umd/history.min' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'history/createBrowserHistory.js' {
+ declare module.exports: $Exports<'history/createBrowserHistory'>;
+}
+declare module 'history/createHashHistory.js' {
+ declare module.exports: $Exports<'history/createHashHistory'>;
+}
+declare module 'history/createMemoryHistory.js' {
+ declare module.exports: $Exports<'history/createMemoryHistory'>;
+}
+declare module 'history/createTransitionManager.js' {
+ declare module.exports: $Exports<'history/createTransitionManager'>;
+}
+declare module 'history/DOMUtils.js' {
+ declare module.exports: $Exports<'history/DOMUtils'>;
+}
+declare module 'history/es/createBrowserHistory.js' {
+ declare module.exports: $Exports<'history/es/createBrowserHistory'>;
+}
+declare module 'history/es/createHashHistory.js' {
+ declare module.exports: $Exports<'history/es/createHashHistory'>;
+}
+declare module 'history/es/createMemoryHistory.js' {
+ declare module.exports: $Exports<'history/es/createMemoryHistory'>;
+}
+declare module 'history/es/createTransitionManager.js' {
+ declare module.exports: $Exports<'history/es/createTransitionManager'>;
+}
+declare module 'history/es/DOMUtils.js' {
+ declare module.exports: $Exports<'history/es/DOMUtils'>;
+}
+declare module 'history/es/index.js' {
+ declare module.exports: $Exports<'history/es/index'>;
+}
+declare module 'history/es/LocationUtils.js' {
+ declare module.exports: $Exports<'history/es/LocationUtils'>;
+}
+declare module 'history/es/PathUtils.js' {
+ declare module.exports: $Exports<'history/es/PathUtils'>;
+}
+declare module 'history/index' {
+ declare module.exports: $Exports<'history'>;
+}
+declare module 'history/index.js' {
+ declare module.exports: $Exports<'history'>;
+}
+declare module 'history/LocationUtils.js' {
+ declare module.exports: $Exports<'history/LocationUtils'>;
+}
+declare module 'history/PathUtils.js' {
+ declare module.exports: $Exports<'history/PathUtils'>;
+}
+declare module 'history/umd/history.js' {
+ declare module.exports: $Exports<'history/umd/history'>;
+}
+declare module 'history/umd/history.min.js' {
+ declare module.exports: $Exports<'history/umd/history.min'>;
+}
diff --git a/flow-typed/npm/jsonrpc-lite_vx.x.x.js b/flow-typed/npm/jsonrpc-lite_vx.x.x.js
new file mode 100644
index 0000000000..aa9d265ffe
--- /dev/null
+++ b/flow-typed/npm/jsonrpc-lite_vx.x.x.js
@@ -0,0 +1,32 @@
+// flow-typed signature: 84dfb2625a302eb80d469e7ded1bfbd2
+// flow-typed version: <<STUB>>/jsonrpc-lite_v^1.2.3/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'jsonrpc-lite'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'jsonrpc-lite' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'jsonrpc-lite/jsonrpc' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'jsonrpc-lite/jsonrpc.js' {
+ declare module.exports: $Exports<'jsonrpc-lite/jsonrpc'>;
+}
diff --git a/flow-typed/npm/mapbox-gl_vx.x.x.js b/flow-typed/npm/mapbox-gl_vx.x.x.js
new file mode 100644
index 0000000000..0c8b784d4b
--- /dev/null
+++ b/flow-typed/npm/mapbox-gl_vx.x.x.js
@@ -0,0 +1,2482 @@
+// flow-typed signature: eb5aef29afac5d644471e80989739475
+// flow-typed version: <<STUB>>/mapbox-gl_v^0.36.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'mapbox-gl'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'mapbox-gl' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'mapbox-gl/dist/mapbox-gl-dev' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/dist/mapbox-gl' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/flow-interfaces/mapbox-gl-js-test' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/flow-interfaces/point-geometry' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/flow-interfaces/unitbezier' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/plugins/src/mapbox-gl-directions/v3.1.1/mapbox-gl-directions' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/array_group' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/bucket' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/bucket/circle_bucket' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/bucket/fill_bucket' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/bucket/fill_extrusion_bucket' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/bucket/line_bucket' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/bucket/symbol_bucket' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/buffer_group' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/buffer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/element_array_type' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/extent' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/feature_index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/load_geometry' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/pos_array' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/program_configuration' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/raster_bounds_array' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/data/vertex_array_type' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/geo/coordinate' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/geo/lng_lat_bounds' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/geo/lng_lat' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/geo/transform' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_background' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_circle' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_collision_debug' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_debug' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_fill_extrusion' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_fill' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_line' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_raster' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/draw_symbol' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/frame_history' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/line_atlas' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/painter' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/pattern' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/shaders' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/render/vertex_array_object' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/shaders/encode_attribute' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/canvas_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/geojson_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/geojson_worker_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/geojson_wrapper' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/image_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/load_tilejson' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/pixels_to_tile_units' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/query_features' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/raster_tile_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/rtl_text_plugin' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/source_cache' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/tile_bounds' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/tile_coord' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/tile' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/vector_tile_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/vector_tile_worker_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/video_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/worker_tile' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/source/worker' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/composite' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/declass' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/deref' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/diff' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/error/parsing_error' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/error/validation_error' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/feature_filter/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/format' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/function/color_spaces' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/function/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/group_by_layout' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/migrate' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/migrate/v7' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/migrate/v8' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/migrate/v9' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/minifyify_style_spec' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/ansi-styles/ansi-styles' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/chalk/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/csscolorparser/csscolorparser' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/fixtures/final-boss-undefined' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/fixtures/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/fastest' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/valid' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/util/eachRecursive' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/has-color/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/cli' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/formatter' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/jsonlint' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/scripts/bundle' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/test/all-tests' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/web/json2' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/web/jsonlint' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Chain' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Dumper' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Hash' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Link' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Namespace' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Opt' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Reflection' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/String' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Testrun' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/FOODOC' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/DomReader' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocComment' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsPlate' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Lang' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Parser' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/PluginManager' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/SymbolSet' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TextStream' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Token' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenReader' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenStream' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Util' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Walker' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/main' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/commentSrcJson' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/frameworkPrototype' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/functionCall' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/publishSrcHilite' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/symbolLink' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/tagParamConfig' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/tagSynonyms' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/run' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/t/runner' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/t/TestDoc' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/addon' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/anon_inner' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/augments' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/augments2' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/borrows' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/borrows2' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/config' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/constructs' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/encoding_other' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/encoding' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/event' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/exports' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/functions_anon' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/functions_nested' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/global' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/globals' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/ignore' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/inner' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/jsdoc_test' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/lend' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof_constructor' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof2' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof3' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/module' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/multi_methods' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/name' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/namespace_nested' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/nocode' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/oblit_anon' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/overview' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/param_inline' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/params_optional' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_nested' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit_constructor' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/public' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/scripts/code' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shared' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shared2' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shortcuts' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/static_this' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/synonyms' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/tosource' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/variable_redefine' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/publish' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/codeview/javascript/wbos.csstools.mediaqueryfallback' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/codeview/publish' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/publish' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/environments' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-01' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-02' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-03' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/jsv' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/uri/schemes/urn' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/uri/uri' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/qunit' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests3' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests3b' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash._baseisequal/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash._bindcallback/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash._getnative/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.isarguments/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.isarray/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.isequal/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.istypedarray/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.keys/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/example/parse' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/dash' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/default_bool' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/dotted' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/long' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/parse_modified' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/parse' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/short' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/whitespace' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/nomnom' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/callback' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/commands' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/expected' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/matching' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/option' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/transform' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/usage' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/values' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/dash' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/decode' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/encode' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/read-file-sync' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/read-file' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/write-file-sync' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/write-file' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-asc/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-asc/test' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-desc/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-desc/test' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-object/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-object/test' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/strip-ansi/cli' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/strip-ansi/index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/underscore/underscore-min' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/node_modules/underscore/underscore' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/reference/latest' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/util/extend' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/util/get_type' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/util/interpolate' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/util/parse_color' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/util/ref_properties' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/util/unbundle_jsonlint' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate_style' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate_style.min' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/latest' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_array' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_boolean' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_color' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_constants' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_enum' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_filter' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_function' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_glyphs_url' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_layer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_layout_property' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_light' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_number' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_object' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_paint_property' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_property' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate_string' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style-spec/validate/validate' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/animation_loop' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/image_sprite' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/light' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_declaration' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_layer_index' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_layer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_layer/circle_style_layer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_layer/fill_extrusion_style_layer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_layer/fill_style_layer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_layer/line_style_layer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_layer/symbol_style_layer' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style_transition' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/style' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/style/validate_style' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/anchor' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/check_max_angle' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/clip_line' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/collision_box' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/collision_feature' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/collision_tile' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/get_anchors' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/glyph_atlas' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/glyph_source' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/mergelines' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/quads' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/shaping' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/sprite_atlas' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/symbol/transform_text' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/bind_handlers' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/camera' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/control/attribution_control' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/control/fullscreen_control' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/control/geolocate_control' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/control/logo_control' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/control/navigation_control' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/control/scale_control' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/handler/box_zoom' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/handler/dblclick_zoom' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/handler/drag_pan' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/handler/drag_rotate' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/handler/keyboard' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/handler/scroll_zoom' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/handler/touch_zoom_rotate' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/hash' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/map' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/marker' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/ui/popup' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/actor' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/ajax' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/browser' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/browser/web_worker' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/browser/window' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/classify_rings' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/config' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/dictionary_coder' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/dispatcher' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/dom' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/evented' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/find_pole_of_inaccessibility' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/global_worker_pool' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/glyphs' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/intersection_tests' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/is_char_in_unicode_block' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/lru_cache' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/mapbox' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/script_detection' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/struct_array' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/token' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/util' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/vectortile_to_geojson' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/verticalize_punctuation' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/web_worker' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/window' {
+ declare module.exports: any;
+}
+
+declare module 'mapbox-gl/src/util/worker_pool' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'mapbox-gl/dist/mapbox-gl-dev.js' {
+ declare module.exports: $Exports<'mapbox-gl/dist/mapbox-gl-dev'>;
+}
+declare module 'mapbox-gl/dist/mapbox-gl.js' {
+ declare module.exports: $Exports<'mapbox-gl/dist/mapbox-gl'>;
+}
+declare module 'mapbox-gl/flow-interfaces/mapbox-gl-js-test.js' {
+ declare module.exports: $Exports<'mapbox-gl/flow-interfaces/mapbox-gl-js-test'>;
+}
+declare module 'mapbox-gl/flow-interfaces/point-geometry.js' {
+ declare module.exports: $Exports<'mapbox-gl/flow-interfaces/point-geometry'>;
+}
+declare module 'mapbox-gl/flow-interfaces/unitbezier.js' {
+ declare module.exports: $Exports<'mapbox-gl/flow-interfaces/unitbezier'>;
+}
+declare module 'mapbox-gl/plugins/src/mapbox-gl-directions/v3.1.1/mapbox-gl-directions.js' {
+ declare module.exports: $Exports<'mapbox-gl/plugins/src/mapbox-gl-directions/v3.1.1/mapbox-gl-directions'>;
+}
+declare module 'mapbox-gl/src/data/array_group.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/array_group'>;
+}
+declare module 'mapbox-gl/src/data/bucket.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/bucket'>;
+}
+declare module 'mapbox-gl/src/data/bucket/circle_bucket.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/bucket/circle_bucket'>;
+}
+declare module 'mapbox-gl/src/data/bucket/fill_bucket.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/bucket/fill_bucket'>;
+}
+declare module 'mapbox-gl/src/data/bucket/fill_extrusion_bucket.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/bucket/fill_extrusion_bucket'>;
+}
+declare module 'mapbox-gl/src/data/bucket/line_bucket.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/bucket/line_bucket'>;
+}
+declare module 'mapbox-gl/src/data/bucket/symbol_bucket.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/bucket/symbol_bucket'>;
+}
+declare module 'mapbox-gl/src/data/buffer_group.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/buffer_group'>;
+}
+declare module 'mapbox-gl/src/data/buffer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/buffer'>;
+}
+declare module 'mapbox-gl/src/data/element_array_type.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/element_array_type'>;
+}
+declare module 'mapbox-gl/src/data/extent.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/extent'>;
+}
+declare module 'mapbox-gl/src/data/feature_index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/feature_index'>;
+}
+declare module 'mapbox-gl/src/data/load_geometry.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/load_geometry'>;
+}
+declare module 'mapbox-gl/src/data/pos_array.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/pos_array'>;
+}
+declare module 'mapbox-gl/src/data/program_configuration.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/program_configuration'>;
+}
+declare module 'mapbox-gl/src/data/raster_bounds_array.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/raster_bounds_array'>;
+}
+declare module 'mapbox-gl/src/data/vertex_array_type.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/data/vertex_array_type'>;
+}
+declare module 'mapbox-gl/src/geo/coordinate.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/geo/coordinate'>;
+}
+declare module 'mapbox-gl/src/geo/lng_lat_bounds.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/geo/lng_lat_bounds'>;
+}
+declare module 'mapbox-gl/src/geo/lng_lat.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/geo/lng_lat'>;
+}
+declare module 'mapbox-gl/src/geo/transform.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/geo/transform'>;
+}
+declare module 'mapbox-gl/src/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/index'>;
+}
+declare module 'mapbox-gl/src/render/draw_background.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_background'>;
+}
+declare module 'mapbox-gl/src/render/draw_circle.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_circle'>;
+}
+declare module 'mapbox-gl/src/render/draw_collision_debug.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_collision_debug'>;
+}
+declare module 'mapbox-gl/src/render/draw_debug.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_debug'>;
+}
+declare module 'mapbox-gl/src/render/draw_fill_extrusion.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_fill_extrusion'>;
+}
+declare module 'mapbox-gl/src/render/draw_fill.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_fill'>;
+}
+declare module 'mapbox-gl/src/render/draw_line.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_line'>;
+}
+declare module 'mapbox-gl/src/render/draw_raster.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_raster'>;
+}
+declare module 'mapbox-gl/src/render/draw_symbol.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/draw_symbol'>;
+}
+declare module 'mapbox-gl/src/render/frame_history.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/frame_history'>;
+}
+declare module 'mapbox-gl/src/render/line_atlas.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/line_atlas'>;
+}
+declare module 'mapbox-gl/src/render/painter.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/painter'>;
+}
+declare module 'mapbox-gl/src/render/pattern.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/pattern'>;
+}
+declare module 'mapbox-gl/src/render/shaders.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/shaders'>;
+}
+declare module 'mapbox-gl/src/render/vertex_array_object.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/render/vertex_array_object'>;
+}
+declare module 'mapbox-gl/src/shaders/encode_attribute.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/shaders/encode_attribute'>;
+}
+declare module 'mapbox-gl/src/source/canvas_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/canvas_source'>;
+}
+declare module 'mapbox-gl/src/source/geojson_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/geojson_source'>;
+}
+declare module 'mapbox-gl/src/source/geojson_worker_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/geojson_worker_source'>;
+}
+declare module 'mapbox-gl/src/source/geojson_wrapper.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/geojson_wrapper'>;
+}
+declare module 'mapbox-gl/src/source/image_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/image_source'>;
+}
+declare module 'mapbox-gl/src/source/load_tilejson.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/load_tilejson'>;
+}
+declare module 'mapbox-gl/src/source/pixels_to_tile_units.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/pixels_to_tile_units'>;
+}
+declare module 'mapbox-gl/src/source/query_features.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/query_features'>;
+}
+declare module 'mapbox-gl/src/source/raster_tile_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/raster_tile_source'>;
+}
+declare module 'mapbox-gl/src/source/rtl_text_plugin.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/rtl_text_plugin'>;
+}
+declare module 'mapbox-gl/src/source/source_cache.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/source_cache'>;
+}
+declare module 'mapbox-gl/src/source/source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/source'>;
+}
+declare module 'mapbox-gl/src/source/tile_bounds.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/tile_bounds'>;
+}
+declare module 'mapbox-gl/src/source/tile_coord.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/tile_coord'>;
+}
+declare module 'mapbox-gl/src/source/tile.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/tile'>;
+}
+declare module 'mapbox-gl/src/source/vector_tile_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/vector_tile_source'>;
+}
+declare module 'mapbox-gl/src/source/vector_tile_worker_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/vector_tile_worker_source'>;
+}
+declare module 'mapbox-gl/src/source/video_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/video_source'>;
+}
+declare module 'mapbox-gl/src/source/worker_tile.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/worker_tile'>;
+}
+declare module 'mapbox-gl/src/source/worker.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/source/worker'>;
+}
+declare module 'mapbox-gl/src/style-spec/composite.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/composite'>;
+}
+declare module 'mapbox-gl/src/style-spec/declass.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/declass'>;
+}
+declare module 'mapbox-gl/src/style-spec/deref.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/deref'>;
+}
+declare module 'mapbox-gl/src/style-spec/diff.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/diff'>;
+}
+declare module 'mapbox-gl/src/style-spec/error/parsing_error.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/error/parsing_error'>;
+}
+declare module 'mapbox-gl/src/style-spec/error/validation_error.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/error/validation_error'>;
+}
+declare module 'mapbox-gl/src/style-spec/feature_filter/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/feature_filter/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/format.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/format'>;
+}
+declare module 'mapbox-gl/src/style-spec/function/color_spaces.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/function/color_spaces'>;
+}
+declare module 'mapbox-gl/src/style-spec/function/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/function/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/group_by_layout.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/group_by_layout'>;
+}
+declare module 'mapbox-gl/src/style-spec/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/migrate.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/migrate'>;
+}
+declare module 'mapbox-gl/src/style-spec/migrate/v7.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/migrate/v7'>;
+}
+declare module 'mapbox-gl/src/style-spec/migrate/v8.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/migrate/v8'>;
+}
+declare module 'mapbox-gl/src/style-spec/migrate/v9.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/migrate/v9'>;
+}
+declare module 'mapbox-gl/src/style-spec/minifyify_style_spec.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/minifyify_style_spec'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/ansi-styles/ansi-styles.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/ansi-styles/ansi-styles'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/chalk/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/chalk/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/csscolorparser/csscolorparser.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/csscolorparser/csscolorparser'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/fixtures/final-boss-undefined.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/fixtures/final-boss-undefined'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/fixtures/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/fixtures/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/fastest.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/fastest'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/valid.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/test/valid'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/util/eachRecursive.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/fast-stable-stringify/util/eachRecursive'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/has-color/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/has-color/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/cli.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/cli'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/formatter.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/formatter'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/jsonlint.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/lib/jsonlint'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/scripts/bundle.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/scripts/bundle'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/test/all-tests.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/test/all-tests'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/web/json2.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/web/json2'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/web/jsonlint.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/jsonlint-lines-primitives/web/jsonlint'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Chain.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Chain'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Dumper.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Dumper'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Hash.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Hash'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Link.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Link'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Namespace.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Namespace'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Opt.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Opt'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Reflection.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Reflection'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/String.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/String'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Testrun.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/frame/Testrun'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/FOODOC.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/FOODOC'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/DomReader'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocComment.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocComment'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsPlate'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Lang.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Lang'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Parser.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Parser'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/PluginManager'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/SymbolSet'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TextStream.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TextStream'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Token.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Token'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenReader'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenStream'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Util.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Util'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Walker.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Walker'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/main.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/main'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/commentSrcJson.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/commentSrcJson'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/frameworkPrototype.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/frameworkPrototype'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/functionCall.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/functionCall'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/publishSrcHilite.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/publishSrcHilite'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/symbolLink.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/symbolLink'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/tagParamConfig.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/tagParamConfig'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/tagSynonyms.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/plugins/tagSynonyms'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/run.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/run'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/t/runner.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/t/runner'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/t/TestDoc.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/t/TestDoc'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/addon.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/addon'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/anon_inner.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/anon_inner'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/augments.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/augments'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/augments2.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/augments2'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/borrows.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/borrows'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/borrows2.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/borrows2'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/config.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/config'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/constructs.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/constructs'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/encoding_other.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/encoding_other'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/encoding.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/encoding'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/event.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/event'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/exports.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/exports'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/functions_anon.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/functions_anon'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/functions_nested.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/functions_nested'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/global.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/global'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/globals.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/globals'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/ignore.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/ignore'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/inner.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/inner'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/jsdoc_test.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/jsdoc_test'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/lend.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/lend'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof_constructor.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof_constructor'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof2.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof2'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof3.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/memberof3'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/module.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/module'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/multi_methods.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/multi_methods'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/name.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/name'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/namespace_nested.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/namespace_nested'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/nocode.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/nocode'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/oblit_anon.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/oblit_anon'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/overview.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/overview'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/param_inline.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/param_inline'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/params_optional.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/params_optional'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_nested.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_nested'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit_constructor.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit_constructor'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/prototype'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/public.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/public'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/scripts/code.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/scripts/code'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shared.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shared'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shared2.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shared2'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shortcuts.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/shortcuts'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/static_this.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/static_this'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/synonyms.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/synonyms'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/tosource.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/tosource'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/variable_redefine.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/app/test/variable_redefine'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/publish.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/publish'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/codeview/javascript/wbos.csstools.mediaqueryfallback.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/codeview/javascript/wbos.csstools.mediaqueryfallback'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/codeview/publish.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/codeview/publish'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/publish.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/publish'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/environments.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/lib/environments'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-01.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-01'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-02.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-02'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-03.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/lib/json-schema-draft-03'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/jsv.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/lib/jsv'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/uri/schemes/urn.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/lib/uri/schemes/urn'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/lib/uri/uri.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/lib/uri/uri'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/qunit.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/tests/qunit'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests3.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests3'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests3b.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/JSV/tests/tests3b'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash._baseisequal/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash._baseisequal/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash._bindcallback/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash._bindcallback/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash._getnative/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash._getnative/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.isarguments/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash.isarguments/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.isarray/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash.isarray/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.isequal/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash.isequal/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.istypedarray/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash.istypedarray/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/lodash.keys/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/lodash.keys/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/example/parse.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/example/parse'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/dash.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/dash'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/default_bool.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/default_bool'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/dotted.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/dotted'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/long.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/long'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/parse_modified.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/parse_modified'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/parse.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/parse'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/short.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/short'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/minimist/test/whitespace.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/minimist/test/whitespace'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/nomnom.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/nomnom'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/callback.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/callback'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/commands.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/commands'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/expected.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/expected'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/matching.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/matching'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/option.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/option'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/transform.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/transform'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/usage.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/usage'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/nomnom/test/values.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/nomnom/test/values'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/dash.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/dash'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/decode.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/decode'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/encode.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/encode'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/read-file-sync.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/read-file-sync'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/read-file.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/read-file'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/write-file-sync.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/write-file-sync'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/write-file.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/rw/lib/rw/write-file'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-asc/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/sort-asc/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-asc/test.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/sort-asc/test'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-desc/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/sort-desc/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-desc/test.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/sort-desc/test'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-object/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/sort-object/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/sort-object/test.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/sort-object/test'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/strip-ansi/cli.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/strip-ansi/cli'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/strip-ansi/index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/strip-ansi/index'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/underscore/underscore-min.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/underscore/underscore-min'>;
+}
+declare module 'mapbox-gl/src/style-spec/node_modules/underscore/underscore.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/node_modules/underscore/underscore'>;
+}
+declare module 'mapbox-gl/src/style-spec/reference/latest.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/reference/latest'>;
+}
+declare module 'mapbox-gl/src/style-spec/util/extend.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/util/extend'>;
+}
+declare module 'mapbox-gl/src/style-spec/util/get_type.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/util/get_type'>;
+}
+declare module 'mapbox-gl/src/style-spec/util/interpolate.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/util/interpolate'>;
+}
+declare module 'mapbox-gl/src/style-spec/util/parse_color.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/util/parse_color'>;
+}
+declare module 'mapbox-gl/src/style-spec/util/ref_properties.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/util/ref_properties'>;
+}
+declare module 'mapbox-gl/src/style-spec/util/unbundle_jsonlint.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/util/unbundle_jsonlint'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate_style.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate_style'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate_style.min.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate_style.min'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/latest.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/latest'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_array.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_array'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_boolean.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_boolean'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_color.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_color'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_constants.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_constants'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_enum.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_enum'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_filter.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_filter'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_function.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_function'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_glyphs_url.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_glyphs_url'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_layer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_layer'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_layout_property.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_layout_property'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_light.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_light'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_number.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_number'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_object.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_object'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_paint_property.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_paint_property'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_property.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_property'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_source'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate_string.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate_string'>;
+}
+declare module 'mapbox-gl/src/style-spec/validate/validate.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style-spec/validate/validate'>;
+}
+declare module 'mapbox-gl/src/style/animation_loop.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/animation_loop'>;
+}
+declare module 'mapbox-gl/src/style/image_sprite.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/image_sprite'>;
+}
+declare module 'mapbox-gl/src/style/light.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/light'>;
+}
+declare module 'mapbox-gl/src/style/style_declaration.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_declaration'>;
+}
+declare module 'mapbox-gl/src/style/style_layer_index.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_layer_index'>;
+}
+declare module 'mapbox-gl/src/style/style_layer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_layer'>;
+}
+declare module 'mapbox-gl/src/style/style_layer/circle_style_layer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_layer/circle_style_layer'>;
+}
+declare module 'mapbox-gl/src/style/style_layer/fill_extrusion_style_layer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_layer/fill_extrusion_style_layer'>;
+}
+declare module 'mapbox-gl/src/style/style_layer/fill_style_layer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_layer/fill_style_layer'>;
+}
+declare module 'mapbox-gl/src/style/style_layer/line_style_layer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_layer/line_style_layer'>;
+}
+declare module 'mapbox-gl/src/style/style_layer/symbol_style_layer.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_layer/symbol_style_layer'>;
+}
+declare module 'mapbox-gl/src/style/style_transition.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style_transition'>;
+}
+declare module 'mapbox-gl/src/style/style.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/style'>;
+}
+declare module 'mapbox-gl/src/style/validate_style.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/style/validate_style'>;
+}
+declare module 'mapbox-gl/src/symbol/anchor.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/anchor'>;
+}
+declare module 'mapbox-gl/src/symbol/check_max_angle.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/check_max_angle'>;
+}
+declare module 'mapbox-gl/src/symbol/clip_line.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/clip_line'>;
+}
+declare module 'mapbox-gl/src/symbol/collision_box.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/collision_box'>;
+}
+declare module 'mapbox-gl/src/symbol/collision_feature.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/collision_feature'>;
+}
+declare module 'mapbox-gl/src/symbol/collision_tile.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/collision_tile'>;
+}
+declare module 'mapbox-gl/src/symbol/get_anchors.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/get_anchors'>;
+}
+declare module 'mapbox-gl/src/symbol/glyph_atlas.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/glyph_atlas'>;
+}
+declare module 'mapbox-gl/src/symbol/glyph_source.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/glyph_source'>;
+}
+declare module 'mapbox-gl/src/symbol/mergelines.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/mergelines'>;
+}
+declare module 'mapbox-gl/src/symbol/quads.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/quads'>;
+}
+declare module 'mapbox-gl/src/symbol/shaping.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/shaping'>;
+}
+declare module 'mapbox-gl/src/symbol/sprite_atlas.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/sprite_atlas'>;
+}
+declare module 'mapbox-gl/src/symbol/transform_text.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/symbol/transform_text'>;
+}
+declare module 'mapbox-gl/src/ui/bind_handlers.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/bind_handlers'>;
+}
+declare module 'mapbox-gl/src/ui/camera.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/camera'>;
+}
+declare module 'mapbox-gl/src/ui/control/attribution_control.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/control/attribution_control'>;
+}
+declare module 'mapbox-gl/src/ui/control/fullscreen_control.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/control/fullscreen_control'>;
+}
+declare module 'mapbox-gl/src/ui/control/geolocate_control.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/control/geolocate_control'>;
+}
+declare module 'mapbox-gl/src/ui/control/logo_control.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/control/logo_control'>;
+}
+declare module 'mapbox-gl/src/ui/control/navigation_control.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/control/navigation_control'>;
+}
+declare module 'mapbox-gl/src/ui/control/scale_control.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/control/scale_control'>;
+}
+declare module 'mapbox-gl/src/ui/handler/box_zoom.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/handler/box_zoom'>;
+}
+declare module 'mapbox-gl/src/ui/handler/dblclick_zoom.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/handler/dblclick_zoom'>;
+}
+declare module 'mapbox-gl/src/ui/handler/drag_pan.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/handler/drag_pan'>;
+}
+declare module 'mapbox-gl/src/ui/handler/drag_rotate.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/handler/drag_rotate'>;
+}
+declare module 'mapbox-gl/src/ui/handler/keyboard.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/handler/keyboard'>;
+}
+declare module 'mapbox-gl/src/ui/handler/scroll_zoom.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/handler/scroll_zoom'>;
+}
+declare module 'mapbox-gl/src/ui/handler/touch_zoom_rotate.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/handler/touch_zoom_rotate'>;
+}
+declare module 'mapbox-gl/src/ui/hash.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/hash'>;
+}
+declare module 'mapbox-gl/src/ui/map.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/map'>;
+}
+declare module 'mapbox-gl/src/ui/marker.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/marker'>;
+}
+declare module 'mapbox-gl/src/ui/popup.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/ui/popup'>;
+}
+declare module 'mapbox-gl/src/util/actor.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/actor'>;
+}
+declare module 'mapbox-gl/src/util/ajax.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/ajax'>;
+}
+declare module 'mapbox-gl/src/util/browser.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/browser'>;
+}
+declare module 'mapbox-gl/src/util/browser/web_worker.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/browser/web_worker'>;
+}
+declare module 'mapbox-gl/src/util/browser/window.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/browser/window'>;
+}
+declare module 'mapbox-gl/src/util/classify_rings.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/classify_rings'>;
+}
+declare module 'mapbox-gl/src/util/config.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/config'>;
+}
+declare module 'mapbox-gl/src/util/dictionary_coder.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/dictionary_coder'>;
+}
+declare module 'mapbox-gl/src/util/dispatcher.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/dispatcher'>;
+}
+declare module 'mapbox-gl/src/util/dom.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/dom'>;
+}
+declare module 'mapbox-gl/src/util/evented.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/evented'>;
+}
+declare module 'mapbox-gl/src/util/find_pole_of_inaccessibility.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/find_pole_of_inaccessibility'>;
+}
+declare module 'mapbox-gl/src/util/global_worker_pool.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/global_worker_pool'>;
+}
+declare module 'mapbox-gl/src/util/glyphs.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/glyphs'>;
+}
+declare module 'mapbox-gl/src/util/intersection_tests.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/intersection_tests'>;
+}
+declare module 'mapbox-gl/src/util/is_char_in_unicode_block.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/is_char_in_unicode_block'>;
+}
+declare module 'mapbox-gl/src/util/lru_cache.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/lru_cache'>;
+}
+declare module 'mapbox-gl/src/util/mapbox.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/mapbox'>;
+}
+declare module 'mapbox-gl/src/util/script_detection.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/script_detection'>;
+}
+declare module 'mapbox-gl/src/util/struct_array.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/struct_array'>;
+}
+declare module 'mapbox-gl/src/util/token.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/token'>;
+}
+declare module 'mapbox-gl/src/util/util.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/util'>;
+}
+declare module 'mapbox-gl/src/util/vectortile_to_geojson.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/vectortile_to_geojson'>;
+}
+declare module 'mapbox-gl/src/util/verticalize_punctuation.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/verticalize_punctuation'>;
+}
+declare module 'mapbox-gl/src/util/web_worker.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/web_worker'>;
+}
+declare module 'mapbox-gl/src/util/window.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/window'>;
+}
+declare module 'mapbox-gl/src/util/worker_pool.js' {
+ declare module.exports: $Exports<'mapbox-gl/src/util/worker_pool'>;
+}
diff --git a/flow-typed/npm/mocha_v3.1.x.js b/flow-typed/npm/mocha_v3.1.x.js
new file mode 100644
index 0000000000..1a35f6e448
--- /dev/null
+++ b/flow-typed/npm/mocha_v3.1.x.js
@@ -0,0 +1,221 @@
+// flow-typed signature: 58fb316c623a4f7918b0e2529256be8c
+// flow-typed version: 0ef6a9a08b/mocha_v3.1.x/flow_>=v0.28.x
+
+declare interface $npm$mocha$SetupOptions {
+ slow?: number;
+ timeout?: number;
+ ui?: string;
+ globals?: Array<any>;
+ reporter?: any;
+ bail?: boolean;
+ ignoreLeaks?: boolean;
+ grep?: any;
+}
+
+declare type $npm$mocha$done = (error?: any) => any;
+
+// declare interface $npm$mocha$SuiteCallbackContext {
+// timeout(ms: number): void;
+// retries(n: number): void;
+// slow(ms: number): void;
+// }
+
+// declare interface $npm$mocha$TestCallbackContext {
+// skip(): void;
+// timeout(ms: number): void;
+// retries(n: number): void;
+// slow(ms: number): void;
+// [index: string]: any;
+// }
+
+declare interface $npm$mocha$Suite {
+ parent: $npm$mocha$Suite;
+ title: string;
+ fullTitle(): string;
+}
+
+declare interface $npm$mocha$ContextDefinition {
+ (description: string, callback: (/* this: $npm$mocha$SuiteCallbackContext */) => void): $npm$mocha$Suite;
+ only(description: string, callback: (/* this: $npm$mocha$SuiteCallbackContext */) => void): $npm$mocha$Suite;
+ skip(description: string, callback: (/* this: $npm$mocha$SuiteCallbackContext */) => void): void;
+ timeout(ms: number): void;
+}
+
+declare interface $npm$mocha$TestDefinition {
+ (expectation: string, callback?: (/* this: $npm$mocha$TestCallbackContext, */ done: $npm$mocha$done) => mixed): $npm$mocha$Test;
+ only(expectation: string, callback?: (/* this: $npm$mocha$TestCallbackContext, */ done: $npm$mocha$done) => mixed): $npm$mocha$Test;
+ skip(expectation: string, callback?: (/* this: $npm$mocha$TestCallbackContext, */ done: $npm$mocha$done) => mixed): void;
+ timeout(ms: number): void;
+ state: 'failed' | 'passed';
+}
+
+declare interface $npm$mocha$Runner {}
+
+declare class $npm$mocha$BaseReporter {
+ stats: {
+ suites: number;
+ tests: number;
+ passes: number;
+ pending: number;
+ failures: number;
+ };
+
+ constructor(runner: $npm$mocha$Runner): $npm$mocha$BaseReporter;
+}
+
+declare class $npm$mocha$DocReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$DotReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$HTMLReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$HTMLCovReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$JSONReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$JSONCovReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$JSONStreamReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$LandingReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$ListReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$MarkdownReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$MinReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$NyanReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$ProgressReporter extends $npm$mocha$BaseReporter {
+ constructor(runner: $npm$mocha$Runner, options?: {
+ open?: string;
+ complete?: string;
+ incomplete?: string;
+ close?: string;
+ }): $npm$mocha$ProgressReporter;
+}
+declare class $npm$mocha$SpecReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$TAPReporter extends $npm$mocha$BaseReporter {}
+declare class $npm$mocha$XUnitReporter extends $npm$mocha$BaseReporter {
+ constructor(runner: $npm$mocha$Runner, options?: any): $npm$mocha$XUnitReporter;
+}
+
+declare class $npm$mocha$Mocha {
+ currentTest: $npm$mocha$TestDefinition;
+ constructor(options?: {
+ grep?: RegExp;
+ ui?: string;
+ reporter?: string;
+ timeout?: number;
+ reporterOptions?: any;
+ slow?: number;
+ bail?: boolean;
+ }): $npm$mocha$Mocha;
+ setup(options: $npm$mocha$SetupOptions): this;
+ bail(value?: boolean): this;
+ addFile(file: string): this;
+ reporter(name: string): this;
+ reporter(reporter: (runner: $npm$mocha$Runner, options: any) => any): this;
+ ui(value: string): this;
+ grep(value: string): this;
+ grep(value: RegExp): this;
+ invert(): this;
+ ignoreLeaks(value: boolean): this;
+ checkLeaks(): this;
+ throwError(error: Error): void;
+ growl(): this;
+ globals(value: string): this;
+ globals(values: Array<string>): this;
+ useColors(value: boolean): this;
+ useInlineDiffs(value: boolean): this;
+ timeout(value: number): this;
+ slow(value: number): this;
+ enableTimeouts(value: boolean): this;
+ asyncOnly(value: boolean): this;
+ noHighlighting(value: boolean): this;
+ run(onComplete?: (failures: number) => void): $npm$mocha$Runner;
+
+ static reporters: {
+ Doc: $npm$mocha$DocReporter,
+ Dot: $npm$mocha$DotReporter,
+ HTML: $npm$mocha$HTMLReporter,
+ HTMLCov: $npm$mocha$HTMLCovReporter,
+ JSON: $npm$mocha$JSONReporter,
+ JSONCov: $npm$mocha$JSONCovReporter,
+ JSONStream: $npm$mocha$JSONStreamReporter,
+ Landing: $npm$mocha$LandingReporter,
+ List: $npm$mocha$ListReporter,
+ Markdown: $npm$mocha$MarkdownReporter,
+ Min: $npm$mocha$MinReporter,
+ Nyan: $npm$mocha$NyanReporter,
+ Progress: $npm$mocha$ProgressReporter,
+ };
+}
+
+// declare interface $npm$mocha$HookCallbackContext {
+// skip(): void;
+// timeout(ms: number): void;
+// [index: string]: any;
+// }
+
+declare interface $npm$mocha$Runnable {
+ title: string;
+ fn: Function;
+ async: boolean;
+ sync: boolean;
+ timedOut: boolean;
+}
+
+declare interface $npm$mocha$Test extends $npm$mocha$Runnable {
+ parent: $npm$mocha$Suite;
+ pending: boolean;
+ state: 'failed' | 'passed' | void;
+ fullTitle(): string;
+}
+
+// declare interface $npm$mocha$BeforeAndAfterContext extends $npm$mocha$HookCallbackContext {
+// currentTest: $npm$mocha$Test;
+// }
+
+declare var mocha: $npm$mocha$Mocha;
+declare var describe: $npm$mocha$ContextDefinition;
+declare var xdescribe: $npm$mocha$ContextDefinition;
+declare var context: $npm$mocha$ContextDefinition;
+declare var suite: $npm$mocha$ContextDefinition;
+declare var it: $npm$mocha$TestDefinition;
+declare var xit: $npm$mocha$TestDefinition;
+declare var test: $npm$mocha$TestDefinition;
+declare var specify: $npm$mocha$TestDefinition;
+
+declare function run(): void;
+
+declare function setup(callback: (/* this: $npm$mocha$BeforeAndAfterContext, */ done: $npm$mocha$done) => mixed): void;
+declare function teardown(callback: (/* this: $npm$mocha$BeforeAndAfterContext, */ done: $npm$mocha$done) => mixed): void;
+declare function suiteSetup(callback: (/* this: $npm$mocha$HookCallbackContext, */ done: $npm$mocha$done) => mixed): void;
+declare function suiteTeardown(callback: (/* this: $npm$mocha$HookCallbackContext, */ done: $npm$mocha$done) => mixed): void;
+declare function before(callback: (/* this: $npm$mocha$HookCallbackContext, */ done: $npm$mocha$done) => mixed): void;
+declare function before(description: string, callback: (/* this: $npm$mocha$HookCallbackContext, */ done: $npm$mocha$done) => mixed): void;
+declare function after(callback: (/* this: $npm$mocha$HookCallbackContext, */ done: $npm$mocha$done) => mixed): void;
+declare function after(description: string, callback: (/* this: $npm$mocha$HookCallbackContext, */ done: $npm$mocha$done) => mixed): void;
+declare function beforeEach(callback: (/* this: $npm$mocha$BeforeAndAfterContext, */ done: $npm$mocha$done) => mixed): void;
+declare function beforeEach(description: string, callback: (/* this: $npm$mocha$BeforeAndAfterContext, */ done: $npm$mocha$done) => mixed): void;
+declare function afterEach(callback: (/* this: $npm$mocha$BeforeAndAfterContext, */ done: $npm$mocha$done) => mixed): void;
+declare function afterEach(description: string, callback: (/* this: $npm$mocha$BeforeAndAfterContext, */ done: $npm$mocha$done) => mixed): void;
+
+declare module "mocha" {
+ declare export var mocha: typeof mocha;
+ declare export var describe: typeof describe;
+ declare export var xdescribe: typeof xdescribe;
+ declare export var context: typeof context;
+ declare export var suite: typeof suite;
+ declare export var it: typeof it;
+ declare export var xit: typeof xit;
+ declare export var test: typeof test;
+ declare export var specify: typeof specify;
+
+ declare export var run: typeof run;
+
+ declare export var setup: typeof setup;
+ declare export var teardown: typeof teardown;
+ declare export var suiteSetup: typeof suiteSetup;
+ declare export var suiteTeardown: typeof suiteTeardown;
+ declare export var before: typeof before;
+ declare export var before: typeof before;
+ declare export var after: typeof after;
+ declare export var after: typeof after;
+ declare export var beforeEach: typeof beforeEach;
+ declare export var beforeEach: typeof beforeEach;
+ declare export var afterEach: typeof afterEach;
+ declare export var afterEach: typeof afterEach;
+
+ declare export default $npm$mocha$Mocha;
+}
diff --git a/flow-typed/npm/moment_v2.x.x.js b/flow-typed/npm/moment_v2.x.x.js
new file mode 100644
index 0000000000..29fd88a5be
--- /dev/null
+++ b/flow-typed/npm/moment_v2.x.x.js
@@ -0,0 +1,244 @@
+// flow-typed signature: 18b0758a665cf7eb72bdb60fb6713aca
+// flow-typed version: 5eb011abdd/moment_v2.x.x/flow_>=v0.34.x
+
+type moment$MomentOptions = {
+ y?: number|string,
+ year?: number|string,
+ years?: number|string,
+ M?: number|string,
+ month?: number|string,
+ months?: number|string,
+ d?: number|string,
+ day?: number|string,
+ days?: number|string,
+ date?: number|string,
+ h?: number|string,
+ hour?: number|string,
+ hours?: number|string,
+ m?: number|string,
+ minute?: number|string,
+ minutes?: number|string,
+ s?: number|string,
+ second?: number|string,
+ seconds?: number|string,
+ ms?: number|string,
+ millisecond?: number|string,
+ milliseconds?: number|string,
+};
+
+type moment$MomentObject = {
+ years: number,
+ months: number,
+ date: number,
+ hours: number,
+ minutes: number,
+ seconds: number,
+ milliseconds: number,
+};
+
+type moment$MomentCreationData = {
+ input: string,
+ format: string,
+ locale: Object,
+ isUTC: bool,
+ strict: bool,
+};
+
+type moment$CalendarFormat = string | (moment: moment$Moment) => string;
+
+type moment$CalendarFormats = {
+ sameDay?: moment$CalendarFormat,
+ nextDay?: moment$CalendarFormat,
+ nextWeek?: moment$CalendarFormat,
+ lastDay?: moment$CalendarFormat,
+ lastWeek?: moment$CalendarFormat,
+ sameElse?: moment$CalendarFormat,
+};
+
+type moment$Inclusivity = '()' | '[)' | '()' | '(]' | '[]'
+
+declare class moment$LocaleData {
+ months(moment: moment$Moment): string;
+ monthsShort(moment: moment$Moment): string;
+ monthsParse(month: string): number;
+ weekdays(moment: moment$Moment): string;
+ weekdaysShort(moment: moment$Moment): string;
+ weekdaysMin(moment: moment$Moment): string;
+ weekdaysParse(weekDay: string): number;
+ longDateFormat(dateFormat: string): string;
+ isPM(date: string): bool;
+ meridiem(hours: number, minutes: number, isLower: bool): string;
+ calendar(key: 'sameDay'|'nextDay'|'lastDay'|'nextWeek'|'prevWeek'|'sameElse', moment: moment$Moment): string;
+ relativeTime(number: number, withoutSuffix: bool, key: 's'|'m'|'mm'|'h'|'hh'|'d'|'dd'|'M'|'MM'|'y'|'yy', isFuture: bool): string;
+ pastFuture(diff: any, relTime: string): string;
+ ordinal(number: number): string;
+ preparse(str: string): any;
+ postformat(str: string): any;
+ week(moment: moment$Moment): string;
+ invalidDate(): string;
+ firstDayOfWeek(): number;
+ firstDayOfYear(): number;
+}
+declare class moment$MomentDuration {
+ humanize(suffix?: bool): string;
+ milliseconds(): number;
+ asMilliseconds(): number;
+ seconds(): number;
+ asSeconds(): number;
+ minutes(): number;
+ asMinutes(): number;
+ hours(): number;
+ asHours(): number;
+ days(): number;
+ asDays(): number;
+ months(): number;
+ asMonths(): number;
+ years(): number;
+ asYears(): number;
+ add(value: number|moment$MomentDuration|Object, unit?: string): this;
+ subtract(value: number|moment$MomentDuration|Object, unit?: string): this;
+ as(unit: string): number;
+ get(unit: string): number;
+ toJSON(): string;
+ toISOString(): string;
+}
+declare class moment$Moment {
+ static ISO_8601: string;
+ static (string?: string, format?: string|Array<string>, locale?: string, strict?: bool): moment$Moment;
+ static (
+ initDate: ?Object|number|Date|Array<number>|moment$Moment|string,
+ validFormats?: ?Array<string>|string,
+ locale?: ?boolean|string,
+ strict?: ?boolean|string
+ ): moment$Moment;
+ static unix(seconds: number): moment$Moment;
+ static utc(): moment$Moment;
+ static utc(number: number|Array<number>): moment$Moment;
+ static utc(str: string, str2?: string|Array<string>, str3?: string): moment$Moment;
+ static utc(moment: moment$Moment): moment$Moment;
+ static utc(date: Date): moment$Moment;
+ static parseZone(rawDate: string): moment$Moment;
+ isValid(): bool;
+ invalidAt(): 0|1|2|3|4|5|6;
+ creationData(): moment$MomentCreationData;
+ millisecond(number: number): this;
+ milliseconds(number: number): this;
+ millisecond(): number;
+ milliseconds(): number;
+ second(number: number): this;
+ seconds(number: number): this;
+ second(): number;
+ seconds(): number;
+ minute(number: number): this;
+ minutes(number: number): this;
+ minute(): number;
+ minutes(): number;
+ hour(number: number): this;
+ hours(number: number): this;
+ hour(): number;
+ hours(): number;
+ date(number: number): this;
+ dates(number: number): this;
+ date(): number;
+ dates(): number;
+ day(day: number|string): this;
+ days(day: number|string): this;
+ day(): number;
+ days(): number;
+ weekday(number: number): this;
+ weekday(): number;
+ isoWeekday(number: number): this;
+ isoWeekday(): number;
+ dayOfYear(number: number): this;
+ dayOfYear(): number;
+ week(number: number): this;
+ weeks(number: number): this;
+ week(): number;
+ weeks(): number;
+ isoWeek(number: number): this;
+ isoWeeks(number: number): this;
+ isoWeek(): number;
+ isoWeeks(): number;
+ month(number: number): this;
+ months(number: number): this;
+ month(): number;
+ months(): number;
+ quarter(number: number): this;
+ quarter(): number;
+ year(number: number): this;
+ years(number: number): this;
+ year(): number;
+ years(): number;
+ weekYear(number: number): this;
+ weekYear(): number;
+ isoWeekYear(number: number): this;
+ isoWeekYear(): number;
+ weeksInYear(): number;
+ isoWeeksInYear(): number;
+ get(string: string): number;
+ set(unit: string, value: number): this;
+ set(options: { [unit: string]: number }): this;
+ static max(...dates: Array<moment$Moment>): moment$Moment;
+ static max(dates: Array<moment$Moment>): moment$Moment;
+ static min(...dates: Array<moment$Moment>): moment$Moment;
+ static min(dates: Array<moment$Moment>): moment$Moment;
+ add(value: number|moment$MomentDuration|moment$Moment|Object, unit?: string): this;
+ subtract(value: number|moment$MomentDuration|moment$Moment|string|Object, unit?: string): this;
+ startOf(unit: string): this;
+ endOf(unit: string): this;
+ local(): this;
+ utc(): this;
+ utcOffset(offset: number|string, keepLocalTime?: boolean, keepMinutes?: boolean): this;
+ utcOffset(): number;
+ format(format?: string): string;
+ fromNow(removeSuffix?: bool): string;
+ from(value: moment$Moment|string|number|Date|Array<number>, removePrefix?: bool): string;
+ toNow(removePrefix?: bool): string;
+ to(value: moment$Moment|string|number|Date|Array<number>, removePrefix?: bool): string;
+ calendar(refTime?: any, formats?: moment$CalendarFormats): string;
+ diff(date: moment$Moment|string|number|Date|Array<number>, format?: string, floating?: bool): number;
+ valueOf(): number;
+ unix(): number;
+ daysInMonth(): number;
+ toDate(): Date;
+ toArray(): Array<number>;
+ toJSON(): string;
+ toISOString(): string;
+ toObject(): moment$MomentObject;
+ isBetween(from: moment$Moment|string|number|Date|Array<number>, to: moment$Moment|string|number|Date|Array<number>, units?: string, inclusivity?: moment$Inclusivity): bool;
+ isBefore(date?: moment$Moment|string|number|Date|Array<number>, units?: ?string): bool;
+ isSame(date?: moment$Moment|string|number|Date|Array<number>, units?: ?string): bool;
+ isAfter(date?: moment$Moment|string|number|Date|Array<number>, units?: ?string): bool;
+ isSameOrBefore(date?: moment$Moment|string|number|Date|Array<number>, units?: ?string): bool;
+ isSameOrAfter(date?: moment$Moment|string|number|Date|Array<number>, units?: ?string): bool;
+ isDST(): bool;
+ isDSTShifted(): bool;
+ isLeapYear(): bool;
+ clone(): moment$Moment;
+ static isMoment(obj: any): bool;
+ static isDate(obj: any): bool;
+ static locale(locale: string, localeData?: Object): string;
+ static updateLocale(locale: string, localeData?: ?Object): void;
+ static locale(locales: Array<string>): string;
+ locale(locale: string, customization?: Object|null): moment$Moment;
+ locale(): string;
+ static months(): Array<string>;
+ static monthsShort(): Array<string>;
+ static weekdays(): Array<string>;
+ static weekdaysShort(): Array<string>;
+ static weekdaysMin(): Array<string>;
+ static months(): string;
+ static monthsShort(): string;
+ static weekdays(): string;
+ static weekdaysShort(): string;
+ static weekdaysMin(): string;
+ static localeData(key?: string): moment$LocaleData;
+ static duration(value: number|Object|string, unit?: string): moment$MomentDuration;
+ static isDuration(obj: any): bool;
+ static normalizeUnits(unit: string): string;
+ static invalid(object: any): moment$Moment;
+}
+
+declare module 'moment' {
+ declare module.exports: Class<moment$Moment>;
+}
diff --git a/flow-typed/npm/npm-run-all_vx.x.x.js b/flow-typed/npm/npm-run-all_vx.x.x.js
new file mode 100644
index 0000000000..c7f5b2784e
--- /dev/null
+++ b/flow-typed/npm/npm-run-all_vx.x.x.js
@@ -0,0 +1,186 @@
+// flow-typed signature: b914711491af3a3a2bd1457a79f58ad1
+// flow-typed version: <<STUB>>/npm-run-all_v^4.0.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'npm-run-all'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'npm-run-all' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'npm-run-all/bin/common/bootstrap' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/common/parse-cli-args' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/common/version' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/npm-run-all/help' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/npm-run-all/index' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/npm-run-all/main' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/run-p/help' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/run-p/index' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/run-p/main' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/run-s/help' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/run-s/index' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/bin/run-s/main' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/create-header' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/create-prefix-transform-stream' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/index' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/match-tasks' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/npm-run-all-error' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/read-package-json' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/run-task' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/run-tasks' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/spawn-posix' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/spawn-win32' {
+ declare module.exports: any;
+}
+
+declare module 'npm-run-all/lib/spawn' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'npm-run-all/bin/common/bootstrap.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/common/bootstrap'>;
+}
+declare module 'npm-run-all/bin/common/parse-cli-args.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/common/parse-cli-args'>;
+}
+declare module 'npm-run-all/bin/common/version.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/common/version'>;
+}
+declare module 'npm-run-all/bin/npm-run-all/help.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/npm-run-all/help'>;
+}
+declare module 'npm-run-all/bin/npm-run-all/index.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/npm-run-all/index'>;
+}
+declare module 'npm-run-all/bin/npm-run-all/main.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/npm-run-all/main'>;
+}
+declare module 'npm-run-all/bin/run-p/help.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/run-p/help'>;
+}
+declare module 'npm-run-all/bin/run-p/index.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/run-p/index'>;
+}
+declare module 'npm-run-all/bin/run-p/main.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/run-p/main'>;
+}
+declare module 'npm-run-all/bin/run-s/help.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/run-s/help'>;
+}
+declare module 'npm-run-all/bin/run-s/index.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/run-s/index'>;
+}
+declare module 'npm-run-all/bin/run-s/main.js' {
+ declare module.exports: $Exports<'npm-run-all/bin/run-s/main'>;
+}
+declare module 'npm-run-all/lib/create-header.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/create-header'>;
+}
+declare module 'npm-run-all/lib/create-prefix-transform-stream.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/create-prefix-transform-stream'>;
+}
+declare module 'npm-run-all/lib/index.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/index'>;
+}
+declare module 'npm-run-all/lib/match-tasks.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/match-tasks'>;
+}
+declare module 'npm-run-all/lib/npm-run-all-error.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/npm-run-all-error'>;
+}
+declare module 'npm-run-all/lib/read-package-json.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/read-package-json'>;
+}
+declare module 'npm-run-all/lib/run-task.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/run-task'>;
+}
+declare module 'npm-run-all/lib/run-tasks.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/run-tasks'>;
+}
+declare module 'npm-run-all/lib/spawn-posix.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/spawn-posix'>;
+}
+declare module 'npm-run-all/lib/spawn-win32.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/spawn-win32'>;
+}
+declare module 'npm-run-all/lib/spawn.js' {
+ declare module.exports: $Exports<'npm-run-all/lib/spawn'>;
+}
diff --git a/flow-typed/npm/react-addons-test-utils_v15.x.x.js b/flow-typed/npm/react-addons-test-utils_v15.x.x.js
new file mode 100644
index 0000000000..b4d753d888
--- /dev/null
+++ b/flow-typed/npm/react-addons-test-utils_v15.x.x.js
@@ -0,0 +1,28 @@
+// flow-typed signature: 323fcc1a3353d5f7a36c5f1edcd963ef
+// flow-typed version: 41f45a7d8c/react-addons-test-utils_v15.x.x/flow_>=v0.23.x
+
+declare type ReactAddonTest$FunctionOrComponentClass = React$Component<any, any, any> | Function;
+declare module 'react-addons-test-utils' {
+ declare var Simulate: {
+ [eventName: string]: (element: Element, eventData?: Object) => void;
+ };
+ declare function renderIntoDocument(instance: React$Element<any>): React$Component<any, any, any>;
+ declare function mockComponent(componentClass: ReactAddonTest$FunctionOrComponentClass, mockTagName?: string): Object;
+ declare function isElement(element: React$Element<any>): boolean;
+ declare function isElementOfType(element: React$Element<any>, componentClass: ReactAddonTest$FunctionOrComponentClass): boolean;
+ declare function isDOMComponent(instance: React$Component<any, any, any>): boolean;
+ declare function isCompositeComponent(instance: React$Component<any, any, any>): boolean;
+ declare function isCompositeComponentWithType(instance: React$Component<any, any, any>, componentClass: ReactAddonTest$FunctionOrComponentClass): boolean;
+ declare function findAllInRenderedTree(tree: React$Component<any, any, any>, test: (child: React$Component<any, any, any>) => boolean): Array<React$Component<any, any, any>>;
+ declare function scryRenderedDOMComponentsWithClass(tree: React$Component<any, any, any>, className: string): Array<Element>;
+ declare function findRenderedDOMComponentWithClass(tree: React$Component<any, any, any>, className: string): ?Element;
+ declare function scryRenderedDOMComponentsWithTag(tree: React$Component<any, any, any>, tagName: string): Array<Element>;
+ declare function findRenderedDOMComponentWithTag(tree: React$Component<any, any, any>, tagName: string): ?Element;
+ declare function scryRenderedComponentsWithType(tree: React$Component<any, any, any>, componentClass: ReactAddonTest$FunctionOrComponentClass): Array<React$Component<any, any, any>>;
+ declare function findRenderedComponentWithType(tree: React$Component<any, any, any>, componentClass: ReactAddonTest$FunctionOrComponentClass): ?React$Component<any, any, any>;
+ declare class ReactShallowRender {
+ render(element: React$Element<any>): void;
+ getRenderOutput(): React$Element<any>;
+ }
+ declare function createRenderer(): ReactShallowRender;
+}
diff --git a/flow-typed/npm/react-custom-scrollbars_vx.x.x.js b/flow-typed/npm/react-custom-scrollbars_vx.x.x.js
new file mode 100644
index 0000000000..a6b289d239
--- /dev/null
+++ b/flow-typed/npm/react-custom-scrollbars_vx.x.x.js
@@ -0,0 +1,130 @@
+// flow-typed signature: 0af573e427704d64cb9745d9a74ac55c
+// flow-typed version: <<STUB>>/react-custom-scrollbars_v^4.0.2/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'react-custom-scrollbars'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-custom-scrollbars' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-custom-scrollbars/dist/react-custom-scrollbars' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/dist/react-custom-scrollbars.min' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/karma.conf' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/index' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/Scrollbars/defaultRenderElements' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/Scrollbars/index' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/Scrollbars/styles' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/utils/getInnerHeight' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/utils/getInnerWidth' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/utils/getScrollbarWidth' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/utils/isString' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/lib/utils/returnFalse' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/prepublish' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/test' {
+ declare module.exports: any;
+}
+
+declare module 'react-custom-scrollbars/webpack.config' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-custom-scrollbars/dist/react-custom-scrollbars.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/dist/react-custom-scrollbars'>;
+}
+declare module 'react-custom-scrollbars/dist/react-custom-scrollbars.min.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/dist/react-custom-scrollbars.min'>;
+}
+declare module 'react-custom-scrollbars/karma.conf.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/karma.conf'>;
+}
+declare module 'react-custom-scrollbars/lib/index.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/index'>;
+}
+declare module 'react-custom-scrollbars/lib/Scrollbars/defaultRenderElements.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/Scrollbars/defaultRenderElements'>;
+}
+declare module 'react-custom-scrollbars/lib/Scrollbars/index.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/Scrollbars/index'>;
+}
+declare module 'react-custom-scrollbars/lib/Scrollbars/styles.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/Scrollbars/styles'>;
+}
+declare module 'react-custom-scrollbars/lib/utils/getInnerHeight.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/utils/getInnerHeight'>;
+}
+declare module 'react-custom-scrollbars/lib/utils/getInnerWidth.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/utils/getInnerWidth'>;
+}
+declare module 'react-custom-scrollbars/lib/utils/getScrollbarWidth.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/utils/getScrollbarWidth'>;
+}
+declare module 'react-custom-scrollbars/lib/utils/isString.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/utils/isString'>;
+}
+declare module 'react-custom-scrollbars/lib/utils/returnFalse.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/lib/utils/returnFalse'>;
+}
+declare module 'react-custom-scrollbars/prepublish.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/prepublish'>;
+}
+declare module 'react-custom-scrollbars/test.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/test'>;
+}
+declare module 'react-custom-scrollbars/webpack.config.js' {
+ declare module.exports: $Exports<'react-custom-scrollbars/webpack.config'>;
+}
diff --git a/flow-typed/npm/react-if_vx.x.x.js b/flow-typed/npm/react-if_vx.x.x.js
new file mode 100644
index 0000000000..c87797d6d7
--- /dev/null
+++ b/flow-typed/npm/react-if_vx.x.x.js
@@ -0,0 +1,39 @@
+// flow-typed signature: 0cb41c6df9a7c34bc9a8ce5b16d966ad
+// flow-typed version: <<STUB>>/react-if_v^2.1.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'react-if'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-if' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-if/lib/ReactIf' {
+ declare module.exports: any;
+}
+
+declare module 'react-if/test/ReactIf' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-if/lib/ReactIf.js' {
+ declare module.exports: $Exports<'react-if/lib/ReactIf'>;
+}
+declare module 'react-if/test/ReactIf.js' {
+ declare module.exports: $Exports<'react-if/test/ReactIf'>;
+}
diff --git a/flow-typed/npm/react-mapbox-gl_vx.x.x.js b/flow-typed/npm/react-mapbox-gl_vx.x.x.js
new file mode 100644
index 0000000000..50372dcaa1
--- /dev/null
+++ b/flow-typed/npm/react-mapbox-gl_vx.x.x.js
@@ -0,0 +1,158 @@
+// flow-typed signature: 6c9ff59d72e6d2ece94605b586c5d5e3
+// flow-typed version: <<STUB>>/react-mapbox-gl_v^1.3.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'react-mapbox-gl'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-mapbox-gl' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-mapbox-gl/lib/cluster' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/constants/css' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/feature' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/geojson-layer' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/index' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/layer' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/map' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/marker' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/popup' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/projected-layer' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/scale-control' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/source' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/util/classname' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/util/diff' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/util/inject-css' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/util/overlays' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/util/types' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/util/uid' {
+ declare module.exports: any;
+}
+
+declare module 'react-mapbox-gl/lib/zoom-control' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-mapbox-gl/lib/cluster.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/cluster'>;
+}
+declare module 'react-mapbox-gl/lib/constants/css.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/constants/css'>;
+}
+declare module 'react-mapbox-gl/lib/feature.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/feature'>;
+}
+declare module 'react-mapbox-gl/lib/geojson-layer.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/geojson-layer'>;
+}
+declare module 'react-mapbox-gl/lib/index.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/index'>;
+}
+declare module 'react-mapbox-gl/lib/layer.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/layer'>;
+}
+declare module 'react-mapbox-gl/lib/map.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/map'>;
+}
+declare module 'react-mapbox-gl/lib/marker.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/marker'>;
+}
+declare module 'react-mapbox-gl/lib/popup.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/popup'>;
+}
+declare module 'react-mapbox-gl/lib/projected-layer.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/projected-layer'>;
+}
+declare module 'react-mapbox-gl/lib/scale-control.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/scale-control'>;
+}
+declare module 'react-mapbox-gl/lib/source.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/source'>;
+}
+declare module 'react-mapbox-gl/lib/util/classname.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/util/classname'>;
+}
+declare module 'react-mapbox-gl/lib/util/diff.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/util/diff'>;
+}
+declare module 'react-mapbox-gl/lib/util/inject-css.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/util/inject-css'>;
+}
+declare module 'react-mapbox-gl/lib/util/overlays.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/util/overlays'>;
+}
+declare module 'react-mapbox-gl/lib/util/types.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/util/types'>;
+}
+declare module 'react-mapbox-gl/lib/util/uid.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/util/uid'>;
+}
+declare module 'react-mapbox-gl/lib/zoom-control.js' {
+ declare module.exports: $Exports<'react-mapbox-gl/lib/zoom-control'>;
+}
diff --git a/flow-typed/npm/react-redux_v5.x.x.js b/flow-typed/npm/react-redux_v5.x.x.js
new file mode 100644
index 0000000000..fa3b907ca7
--- /dev/null
+++ b/flow-typed/npm/react-redux_v5.x.x.js
@@ -0,0 +1,98 @@
+// flow-typed signature: 8db7b853f57c51094bf0ab8b2650fd9c
+// flow-typed version: ab8db5f14d/react-redux_v5.x.x/flow_>=v0.30.x
+
+import type { Dispatch, Store } from 'redux'
+
+declare module 'react-redux' {
+
+ /*
+
+ S = State
+ A = Action
+ OP = OwnProps
+ SP = StateProps
+ DP = DispatchProps
+
+ */
+
+ declare type MapStateToProps<S, OP: Object, SP: Object> = (state: S, ownProps: OP) => SP | MapStateToProps<S, OP, SP>;
+
+ declare type MapDispatchToProps<A, OP: Object, DP: Object> = ((dispatch: Dispatch<A>, ownProps: OP) => DP) | DP;
+
+ declare type MergeProps<SP, DP: Object, OP: Object, P: Object> = (stateProps: SP, dispatchProps: DP, ownProps: OP) => P;
+
+ declare type Context = { store: Store<*, *> };
+
+ declare type StatelessComponent<P> = (props: P, context: Context) => ?React$Element<any>;
+
+ declare class ConnectedComponent<OP, P, Def, St> extends React$Component<void, OP, void> {
+ static WrappedComponent: Class<React$Component<Def, P, St>>;
+ getWrappedInstance(): React$Component<Def, P, St>;
+ static defaultProps: void;
+ props: OP;
+ state: void;
+ }
+
+ declare type ConnectedComponentClass<OP, P, Def, St> = Class<ConnectedComponent<OP, P, Def, St>>;
+
+ declare type Connector<OP, P> = {
+ (component: StatelessComponent<P>): ConnectedComponentClass<OP, P, void, void>;
+ <Def, St>(component: Class<React$Component<Def, P, St>>): ConnectedComponentClass<OP, P, Def, St>;
+ };
+
+ declare class Provider<S, A> extends React$Component<void, { store: Store<S, A>, children?: any }, void> { }
+
+ declare type ConnectOptions = {
+ pure?: boolean,
+ withRef?: boolean
+ };
+
+ declare type Null = null | void;
+
+ declare function connect<A, OP>(
+ ...rest: Array<void> // <= workaround for https://github.com/facebook/flow/issues/2360
+ ): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;
+
+ declare function connect<A, OP>(
+ mapStateToProps: Null,
+ mapDispatchToProps: Null,
+ mergeProps: Null,
+ options: ConnectOptions
+ ): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;
+
+ declare function connect<S, A, OP, SP>(
+ mapStateToProps: MapStateToProps<S, OP, SP>,
+ mapDispatchToProps: Null,
+ mergeProps: Null,
+ options?: ConnectOptions
+ ): Connector<OP, $Supertype<SP & { dispatch: Dispatch<A> } & OP>>;
+
+ declare function connect<A, OP, DP>(
+ mapStateToProps: Null,
+ mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
+ mergeProps: Null,
+ options?: ConnectOptions
+ ): Connector<OP, $Supertype<DP & OP>>;
+
+ declare function connect<S, A, OP, SP, DP>(
+ mapStateToProps: MapStateToProps<S, OP, SP>,
+ mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
+ mergeProps: Null,
+ options?: ConnectOptions
+ ): Connector<OP, $Supertype<SP & DP & OP>>;
+
+ declare function connect<S, A, OP, SP, DP, P>(
+ mapStateToProps: MapStateToProps<S, OP, SP>,
+ mapDispatchToProps: Null,
+ mergeProps: MergeProps<SP, DP, OP, P>,
+ options?: ConnectOptions
+ ): Connector<OP, P>;
+
+ declare function connect<S, A, OP, SP, DP, P>(
+ mapStateToProps: MapStateToProps<S, OP, SP>,
+ mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
+ mergeProps: MergeProps<SP, DP, OP, P>,
+ options?: ConnectOptions
+ ): Connector<OP, P>;
+
+}
diff --git a/flow-typed/npm/react-router-redux_vx.x.x.js b/flow-typed/npm/react-router-redux_vx.x.x.js
new file mode 100644
index 0000000000..99213d282b
--- /dev/null
+++ b/flow-typed/npm/react-router-redux_vx.x.x.js
@@ -0,0 +1,108 @@
+// flow-typed signature: a0594052469d7a0a02eaec4a0ff90587
+// flow-typed version: <<STUB>>/react-router-redux_v5.0.0-alpha.6/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'react-router-redux'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-router-redux' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-router-redux/actions' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/ConnectedRouter' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/es/actions' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/es/ConnectedRouter' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/es/index' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/es/middleware' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/es/reducer' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/middleware' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/reducer' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/umd/react-router-redux' {
+ declare module.exports: any;
+}
+
+declare module 'react-router-redux/umd/react-router-redux.min' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-router-redux/actions.js' {
+ declare module.exports: $Exports<'react-router-redux/actions'>;
+}
+declare module 'react-router-redux/ConnectedRouter.js' {
+ declare module.exports: $Exports<'react-router-redux/ConnectedRouter'>;
+}
+declare module 'react-router-redux/es/actions.js' {
+ declare module.exports: $Exports<'react-router-redux/es/actions'>;
+}
+declare module 'react-router-redux/es/ConnectedRouter.js' {
+ declare module.exports: $Exports<'react-router-redux/es/ConnectedRouter'>;
+}
+declare module 'react-router-redux/es/index.js' {
+ declare module.exports: $Exports<'react-router-redux/es/index'>;
+}
+declare module 'react-router-redux/es/middleware.js' {
+ declare module.exports: $Exports<'react-router-redux/es/middleware'>;
+}
+declare module 'react-router-redux/es/reducer.js' {
+ declare module.exports: $Exports<'react-router-redux/es/reducer'>;
+}
+declare module 'react-router-redux/index' {
+ declare module.exports: $Exports<'react-router-redux'>;
+}
+declare module 'react-router-redux/index.js' {
+ declare module.exports: $Exports<'react-router-redux'>;
+}
+declare module 'react-router-redux/middleware.js' {
+ declare module.exports: $Exports<'react-router-redux/middleware'>;
+}
+declare module 'react-router-redux/reducer.js' {
+ declare module.exports: $Exports<'react-router-redux/reducer'>;
+}
+declare module 'react-router-redux/umd/react-router-redux.js' {
+ declare module.exports: $Exports<'react-router-redux/umd/react-router-redux'>;
+}
+declare module 'react-router-redux/umd/react-router-redux.min.js' {
+ declare module.exports: $Exports<'react-router-redux/umd/react-router-redux.min'>;
+}
diff --git a/flow-typed/npm/react-router_v4.x.x.js b/flow-typed/npm/react-router_v4.x.x.js
new file mode 100644
index 0000000000..564b558b51
--- /dev/null
+++ b/flow-typed/npm/react-router_v4.x.x.js
@@ -0,0 +1,128 @@
+// flow-typed signature: 6754d868bed664ee0e73f1799c67e2a1
+// flow-typed version: 777f182c85/react-router_v4.x.x/flow_>=v0.38.x
+
+declare module 'react-router' {
+ // NOTE: many of these are re-exported by react-router-dom and
+ // react-router-native, so when making changes, please be sure to update those
+ // as well.
+ declare export type Location = {
+ pathname: string,
+ search: string,
+ hash: string,
+ state?: any,
+ key?: string,
+ }
+
+ declare export type LocationShape = {
+ pathname?: string,
+ search?: string,
+ hash?: string,
+ state?: any,
+ }
+
+ declare export type HistoryAction = 'PUSH' | 'REPLACE' | 'POP'
+
+ declare export type RouterHistory = {
+ length: number,
+ location: Location,
+ action: HistoryAction,
+ listen(callback: (location: Location, action: HistoryAction) => void): () => void,
+ push(path: string | LocationShape, state?: any): void,
+ replace(path: string | LocationShape, state?: any): void,
+ go(n: number): void,
+ goBack(): void,
+ goForward(): void,
+ canGo?: (n: number) => bool,
+ block(callback: (location: Location, action: HistoryAction) => boolean): void,
+ // createMemoryHistory
+ index?: number,
+ entries?: Array<Location>,
+ }
+
+ declare export type Match = {
+ params: Object,
+ isExact: boolean,
+ path: string,
+ url: string,
+ }
+
+ declare export type ContextRouter = {
+ history: RouterHistory,
+ location: Location,
+ match: Match,
+ }
+
+ declare export type GetUserConfirmation =
+ (message: string, callback: (confirmed: boolean) => void) => void
+
+ declare type StaticRouterContext = {
+ url?: string,
+ }
+
+ declare export class StaticRouter extends React$Component {
+ props: {
+ basename?: string,
+ location?: string | Location,
+ context: StaticRouterContext,
+ children?: React$Element<*>,
+ }
+ }
+
+ declare export class MemoryRouter extends React$Component {
+ props: {
+ initialEntries?: Array<LocationShape | string>,
+ initialIndex?: number,
+ getUserConfirmation?: GetUserConfirmation,
+ keyLength?: number,
+ children?: React$Element<*>,
+ }
+ }
+
+ declare export class Router extends React$Component {
+ props: {
+ history: RouterHistory,
+ children?: React$Element<*>,
+ }
+ }
+
+ declare export class Prompt extends React$Component {
+ props: {
+ message: string | (location: Location) => string | true,
+ when?: boolean,
+ }
+ }
+
+ declare export class Redirect extends React$Component {
+ props: {
+ to: string | LocationShape,
+ push?: boolean,
+ }
+ }
+
+ declare export class Route extends React$Component {
+ props: {
+ component?: ReactClass<*>,
+ render?: (router: ContextRouter) => React$Element<*>,
+ children?: (router: ContextRouter) => React$Element<*>,
+ path?: string,
+ exact?: bool,
+ strict?: bool,
+ }
+ }
+
+ declare export class Switch extends React$Component {
+ props: {
+ children?: Array<React$Element<*>>,
+ }
+ }
+
+ declare type FunctionComponent<P> = (props: P) => ?React$Element<any>;
+ declare type ClassComponent<D, P, S> = Class<React$Component<D, P, S>>;
+ declare export function withRouter<D, P, S>(Component: ClassComponent<D, P, S> | FunctionComponent<P>): ClassComponent<D, $Diff<P, ContextRouter>, S>;
+
+ declare type MatchPathOptions = {
+ exact?: boolean,
+ strict?: boolean,
+ }
+ declare export function matchPath(pathname: string, path: string, options?: MatchPathOptions): null | Match
+}
diff --git a/flow-typed/npm/react-router_vx.x.x.js b/flow-typed/npm/react-router_vx.x.x.js
new file mode 100644
index 0000000000..8598b1cdb6
--- /dev/null
+++ b/flow-typed/npm/react-router_vx.x.x.js
@@ -0,0 +1,501 @@
+// flow-typed signature: faad4d2c4743ac30e07eab9c30da7d57
+// flow-typed version: <<STUB>>/react-router_v^3.0.2/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'react-router'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-router' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-router/es/applyRouterMiddleware' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/AsyncUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/browserHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/computeChangedRoutes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/ContextUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/createMemoryHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/createRouterHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/createTransitionManager' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/getComponents' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/getRouteParams' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/hashHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/index' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/IndexLink' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/IndexRedirect' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/IndexRoute' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/InternalPropTypes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/isActive' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/Link' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/match' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/matchRoutes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/PatternUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/PromiseUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/PropTypes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/Redirect' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/Route' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/Router' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/RouterContext' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/RouterUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/routerWarning' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/RouteUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/TransitionUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/useRouterHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/es/withRouter' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/applyRouterMiddleware' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/AsyncUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/browserHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/computeChangedRoutes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/ContextUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/createMemoryHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/createRouterHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/createTransitionManager' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/getComponents' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/getRouteParams' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/hashHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/index' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/IndexLink' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/IndexRedirect' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/IndexRoute' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/InternalPropTypes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/isActive' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/Link' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/match' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/matchRoutes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/PatternUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/PromiseUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/PropTypes' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/Redirect' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/Route' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/Router' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/RouterContext' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/RouterUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/routerWarning' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/RouteUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/TransitionUtils' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/useRouterHistory' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/lib/withRouter' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/umd/ReactRouter' {
+ declare module.exports: any;
+}
+
+declare module 'react-router/umd/ReactRouter.min' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-router/es/applyRouterMiddleware.js' {
+ declare module.exports: $Exports<'react-router/es/applyRouterMiddleware'>;
+}
+declare module 'react-router/es/AsyncUtils.js' {
+ declare module.exports: $Exports<'react-router/es/AsyncUtils'>;
+}
+declare module 'react-router/es/browserHistory.js' {
+ declare module.exports: $Exports<'react-router/es/browserHistory'>;
+}
+declare module 'react-router/es/computeChangedRoutes.js' {
+ declare module.exports: $Exports<'react-router/es/computeChangedRoutes'>;
+}
+declare module 'react-router/es/ContextUtils.js' {
+ declare module.exports: $Exports<'react-router/es/ContextUtils'>;
+}
+declare module 'react-router/es/createMemoryHistory.js' {
+ declare module.exports: $Exports<'react-router/es/createMemoryHistory'>;
+}
+declare module 'react-router/es/createRouterHistory.js' {
+ declare module.exports: $Exports<'react-router/es/createRouterHistory'>;
+}
+declare module 'react-router/es/createTransitionManager.js' {
+ declare module.exports: $Exports<'react-router/es/createTransitionManager'>;
+}
+declare module 'react-router/es/getComponents.js' {
+ declare module.exports: $Exports<'react-router/es/getComponents'>;
+}
+declare module 'react-router/es/getRouteParams.js' {
+ declare module.exports: $Exports<'react-router/es/getRouteParams'>;
+}
+declare module 'react-router/es/hashHistory.js' {
+ declare module.exports: $Exports<'react-router/es/hashHistory'>;
+}
+declare module 'react-router/es/index.js' {
+ declare module.exports: $Exports<'react-router/es/index'>;
+}
+declare module 'react-router/es/IndexLink.js' {
+ declare module.exports: $Exports<'react-router/es/IndexLink'>;
+}
+declare module 'react-router/es/IndexRedirect.js' {
+ declare module.exports: $Exports<'react-router/es/IndexRedirect'>;
+}
+declare module 'react-router/es/IndexRoute.js' {
+ declare module.exports: $Exports<'react-router/es/IndexRoute'>;
+}
+declare module 'react-router/es/InternalPropTypes.js' {
+ declare module.exports: $Exports<'react-router/es/InternalPropTypes'>;
+}
+declare module 'react-router/es/isActive.js' {
+ declare module.exports: $Exports<'react-router/es/isActive'>;
+}
+declare module 'react-router/es/Link.js' {
+ declare module.exports: $Exports<'react-router/es/Link'>;
+}
+declare module 'react-router/es/match.js' {
+ declare module.exports: $Exports<'react-router/es/match'>;
+}
+declare module 'react-router/es/matchRoutes.js' {
+ declare module.exports: $Exports<'react-router/es/matchRoutes'>;
+}
+declare module 'react-router/es/PatternUtils.js' {
+ declare module.exports: $Exports<'react-router/es/PatternUtils'>;
+}
+declare module 'react-router/es/PromiseUtils.js' {
+ declare module.exports: $Exports<'react-router/es/PromiseUtils'>;
+}
+declare module 'react-router/es/PropTypes.js' {
+ declare module.exports: $Exports<'react-router/es/PropTypes'>;
+}
+declare module 'react-router/es/Redirect.js' {
+ declare module.exports: $Exports<'react-router/es/Redirect'>;
+}
+declare module 'react-router/es/Route.js' {
+ declare module.exports: $Exports<'react-router/es/Route'>;
+}
+declare module 'react-router/es/Router.js' {
+ declare module.exports: $Exports<'react-router/es/Router'>;
+}
+declare module 'react-router/es/RouterContext.js' {
+ declare module.exports: $Exports<'react-router/es/RouterContext'>;
+}
+declare module 'react-router/es/RouterUtils.js' {
+ declare module.exports: $Exports<'react-router/es/RouterUtils'>;
+}
+declare module 'react-router/es/routerWarning.js' {
+ declare module.exports: $Exports<'react-router/es/routerWarning'>;
+}
+declare module 'react-router/es/RouteUtils.js' {
+ declare module.exports: $Exports<'react-router/es/RouteUtils'>;
+}
+declare module 'react-router/es/TransitionUtils.js' {
+ declare module.exports: $Exports<'react-router/es/TransitionUtils'>;
+}
+declare module 'react-router/es/useRouterHistory.js' {
+ declare module.exports: $Exports<'react-router/es/useRouterHistory'>;
+}
+declare module 'react-router/es/withRouter.js' {
+ declare module.exports: $Exports<'react-router/es/withRouter'>;
+}
+declare module 'react-router/lib/applyRouterMiddleware.js' {
+ declare module.exports: $Exports<'react-router/lib/applyRouterMiddleware'>;
+}
+declare module 'react-router/lib/AsyncUtils.js' {
+ declare module.exports: $Exports<'react-router/lib/AsyncUtils'>;
+}
+declare module 'react-router/lib/browserHistory.js' {
+ declare module.exports: $Exports<'react-router/lib/browserHistory'>;
+}
+declare module 'react-router/lib/computeChangedRoutes.js' {
+ declare module.exports: $Exports<'react-router/lib/computeChangedRoutes'>;
+}
+declare module 'react-router/lib/ContextUtils.js' {
+ declare module.exports: $Exports<'react-router/lib/ContextUtils'>;
+}
+declare module 'react-router/lib/createMemoryHistory.js' {
+ declare module.exports: $Exports<'react-router/lib/createMemoryHistory'>;
+}
+declare module 'react-router/lib/createRouterHistory.js' {
+ declare module.exports: $Exports<'react-router/lib/createRouterHistory'>;
+}
+declare module 'react-router/lib/createTransitionManager.js' {
+ declare module.exports: $Exports<'react-router/lib/createTransitionManager'>;
+}
+declare module 'react-router/lib/getComponents.js' {
+ declare module.exports: $Exports<'react-router/lib/getComponents'>;
+}
+declare module 'react-router/lib/getRouteParams.js' {
+ declare module.exports: $Exports<'react-router/lib/getRouteParams'>;
+}
+declare module 'react-router/lib/hashHistory.js' {
+ declare module.exports: $Exports<'react-router/lib/hashHistory'>;
+}
+declare module 'react-router/lib/index.js' {
+ declare module.exports: $Exports<'react-router/lib/index'>;
+}
+declare module 'react-router/lib/IndexLink.js' {
+ declare module.exports: $Exports<'react-router/lib/IndexLink'>;
+}
+declare module 'react-router/lib/IndexRedirect.js' {
+ declare module.exports: $Exports<'react-router/lib/IndexRedirect'>;
+}
+declare module 'react-router/lib/IndexRoute.js' {
+ declare module.exports: $Exports<'react-router/lib/IndexRoute'>;
+}
+declare module 'react-router/lib/InternalPropTypes.js' {
+ declare module.exports: $Exports<'react-router/lib/InternalPropTypes'>;
+}
+declare module 'react-router/lib/isActive.js' {
+ declare module.exports: $Exports<'react-router/lib/isActive'>;
+}
+declare module 'react-router/lib/Link.js' {
+ declare module.exports: $Exports<'react-router/lib/Link'>;
+}
+declare module 'react-router/lib/match.js' {
+ declare module.exports: $Exports<'react-router/lib/match'>;
+}
+declare module 'react-router/lib/matchRoutes.js' {
+ declare module.exports: $Exports<'react-router/lib/matchRoutes'>;
+}
+declare module 'react-router/lib/PatternUtils.js' {
+ declare module.exports: $Exports<'react-router/lib/PatternUtils'>;
+}
+declare module 'react-router/lib/PromiseUtils.js' {
+ declare module.exports: $Exports<'react-router/lib/PromiseUtils'>;
+}
+declare module 'react-router/lib/PropTypes.js' {
+ declare module.exports: $Exports<'react-router/lib/PropTypes'>;
+}
+declare module 'react-router/lib/Redirect.js' {
+ declare module.exports: $Exports<'react-router/lib/Redirect'>;
+}
+declare module 'react-router/lib/Route.js' {
+ declare module.exports: $Exports<'react-router/lib/Route'>;
+}
+declare module 'react-router/lib/Router.js' {
+ declare module.exports: $Exports<'react-router/lib/Router'>;
+}
+declare module 'react-router/lib/RouterContext.js' {
+ declare module.exports: $Exports<'react-router/lib/RouterContext'>;
+}
+declare module 'react-router/lib/RouterUtils.js' {
+ declare module.exports: $Exports<'react-router/lib/RouterUtils'>;
+}
+declare module 'react-router/lib/routerWarning.js' {
+ declare module.exports: $Exports<'react-router/lib/routerWarning'>;
+}
+declare module 'react-router/lib/RouteUtils.js' {
+ declare module.exports: $Exports<'react-router/lib/RouteUtils'>;
+}
+declare module 'react-router/lib/TransitionUtils.js' {
+ declare module.exports: $Exports<'react-router/lib/TransitionUtils'>;
+}
+declare module 'react-router/lib/useRouterHistory.js' {
+ declare module.exports: $Exports<'react-router/lib/useRouterHistory'>;
+}
+declare module 'react-router/lib/withRouter.js' {
+ declare module.exports: $Exports<'react-router/lib/withRouter'>;
+}
+declare module 'react-router/umd/ReactRouter.js' {
+ declare module.exports: $Exports<'react-router/umd/ReactRouter'>;
+}
+declare module 'react-router/umd/ReactRouter.min.js' {
+ declare module.exports: $Exports<'react-router/umd/ReactRouter.min'>;
+}
diff --git a/flow-typed/npm/react-transition-group_vx.x.x.js b/flow-typed/npm/react-transition-group_vx.x.x.js
new file mode 100644
index 0000000000..66c45704be
--- /dev/null
+++ b/flow-typed/npm/react-transition-group_vx.x.x.js
@@ -0,0 +1,73 @@
+// flow-typed signature: 250ad9533acea554a1e8e9e81c42d04d
+// flow-typed version: <<STUB>>/react-transition-group_v^1.1.3/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'react-transition-group'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-transition-group' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-transition-group/CSSTransitionGroup' {
+ declare module.exports: any;
+}
+
+declare module 'react-transition-group/CSSTransitionGroupChild' {
+ declare module.exports: any;
+}
+
+declare module 'react-transition-group/dist/react-transition-group' {
+ declare module.exports: any;
+}
+
+declare module 'react-transition-group/TransitionGroup' {
+ declare module.exports: any;
+}
+
+declare module 'react-transition-group/utils/ChildMapping' {
+ declare module.exports: any;
+}
+
+declare module 'react-transition-group/utils/PropTypes' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-transition-group/CSSTransitionGroup.js' {
+ declare module.exports: $Exports<'react-transition-group/CSSTransitionGroup'>;
+}
+declare module 'react-transition-group/CSSTransitionGroupChild.js' {
+ declare module.exports: $Exports<'react-transition-group/CSSTransitionGroupChild'>;
+}
+declare module 'react-transition-group/dist/react-transition-group.js' {
+ declare module.exports: $Exports<'react-transition-group/dist/react-transition-group'>;
+}
+declare module 'react-transition-group/index' {
+ declare module.exports: $Exports<'react-transition-group'>;
+}
+declare module 'react-transition-group/index.js' {
+ declare module.exports: $Exports<'react-transition-group'>;
+}
+declare module 'react-transition-group/TransitionGroup.js' {
+ declare module.exports: $Exports<'react-transition-group/TransitionGroup'>;
+}
+declare module 'react-transition-group/utils/ChildMapping.js' {
+ declare module.exports: $Exports<'react-transition-group/utils/ChildMapping'>;
+}
+declare module 'react-transition-group/utils/PropTypes.js' {
+ declare module.exports: $Exports<'react-transition-group/utils/PropTypes'>;
+}
diff --git a/flow-typed/npm/redux-actions_v2.x.x.js b/flow-typed/npm/redux-actions_v2.x.x.js
new file mode 100644
index 0000000000..6ad82117b0
--- /dev/null
+++ b/flow-typed/npm/redux-actions_v2.x.x.js
@@ -0,0 +1,93 @@
+// flow-typed signature: 6c119bee4c19ddc7f2e88a6eaae67dd9
+// flow-typed version: e8ca1e6a1a/redux-actions_v2.x.x/flow_>=v0.34.x
+
+declare module 'redux-actions' {
+
+ /*
+ * Use `ActionType` to get the type of the action created by a given action
+ * creator. For example:
+ *
+ * import { creatAction, type ActionType } from 'redux-actions'
+ *
+ * const increment = createAction(INCREMENT, (count: number) => count)
+ *
+ * function myReducer(state: State = initState, action: ActionType<typeof increment>): State {
+ * // Flow will infer that the type of `action.payload` is `number`
+ * }
+ */
+ declare type ActionType<ActionCreator> = _ActionType<*, ActionCreator>;
+ declare type _ActionType<R, Fn: (payload: *, ...rest: any[]) => R> = R;
+
+
+ /*
+ * To get the most from Flow type checking use a `payloadCreator` argument
+ * with `createAction`. Make sure that Flow can infer the argument type of the
+ * `payloadCreator`. That will allow Flow to infer the payload type of actions
+ * created by that action creator in other parts of the program. For example:
+ *
+ * const increment = createAction(INCREMENT, (count: number) => count)
+ *
+ */
+ declare function createAction<T, P>(
+ type: T,
+ $?: empty // hack to force Flow to not use this signature when more than one argument is given
+ ): (payload: P, ...rest: any[]) => { type: T, payload: P, error?: boolean };
+
+ declare function createAction<T, P, P2>(
+ type: T,
+ payloadCreator: (_: P) => P2,
+ $?: empty
+ ): (payload: P, ...rest: any[]) => { type: T, payload: P2, error?: boolean };
+
+ declare function createAction<T, P, P2, M>(
+ type: T,
+ payloadCreator: (_: P) => P2,
+ metaCreator: (_: P) => M
+ ): (payload: P, ...rest: any[]) => { type: T, payload: P2, error?: boolean, meta: M };
+
+ declare function createAction<T, P, M>(
+ type: T,
+ payloadCreator: null | void,
+ metaCreator: (_: P) => M
+ ): (payload: P, ...rest: any[]) => { type: T, payload: P, error?: boolean, meta: M };
+
+ // `createActions` is quite difficult to write a type for. Maybe try not to
+ // use this one?
+ declare function createActions(actionMap: Object, ...identityActions: string[]): Object;
+ declare function createActions(...identityActions: string[]): Object;
+
+ declare type Reducer<S, A> = (state: S, action: A) => S;
+
+ declare type ReducerMap<S, A> =
+ | { next: Reducer<S, A> }
+ | { throw: Reducer<S, A> }
+ | { next: Reducer<S, A>, throw: Reducer<S, A> }
+
+ /*
+ * To get full advantage from Flow, use a type annotation on the action
+ * argument to your reducer when creating a reducer with `handleAction` or
+ * `handleActions`. For example:
+ *
+ * import { type Reducer } from 'redux'
+ * import { createAction, handleAction, type Action } from 'redux-actions'
+ *
+ * const increment = createAction(INCREMENT, (count: number) => count)
+ *
+ * const reducer = handleAction(INCREMENT, (state, { payload }: ActionType<typeof increment>) => {
+ * // Flow infers that the type of `payload` is number
+ * }, defaultState)
+ */
+ declare function handleAction<Type, State, Action: { type: Type }>(
+ type: Type,
+ reducer: Reducer<State, Action> | ReducerMap<State, Action>,
+ defaultState: State
+ ): Reducer<State, Action>;
+
+ declare function handleActions<State, Action>(
+ reducers: { [key: string]: Reducer<State, Action> | ReducerMap<State, Action> },
+ defaultState?: State
+ ): Reducer<State, Action>;
+
+ declare function combineActions(...types: (string | Symbol | Function)[]) : string;
+
+}
diff --git a/flow-typed/npm/redux-actions_vx.x.x.js b/flow-typed/npm/redux-actions_vx.x.x.js
new file mode 100644
index 0000000000..892c6a8cbe
--- /dev/null
+++ b/flow-typed/npm/redux-actions_vx.x.x.js
@@ -0,0 +1,179 @@
+// flow-typed signature: 6c31eee0d09c73ddc4aab4774ddc82e2
+// flow-typed version: <<STUB>>/redux-actions_v^2.0.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'redux-actions'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'redux-actions' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'redux-actions/dist/redux-actions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/dist/redux-actions.min' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/arrayToObject' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/camelCase' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/combineActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/createAction' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/createActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/handleAction' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/handleActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/index' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/namespaceActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/es/ownKeys' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/arrayToObject' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/camelCase' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/combineActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/createAction' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/createActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/handleAction' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/handleActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/index' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/namespaceActions' {
+ declare module.exports: any;
+}
+
+declare module 'redux-actions/lib/ownKeys' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'redux-actions/dist/redux-actions.js' {
+ declare module.exports: $Exports<'redux-actions/dist/redux-actions'>;
+}
+declare module 'redux-actions/dist/redux-actions.min.js' {
+ declare module.exports: $Exports<'redux-actions/dist/redux-actions.min'>;
+}
+declare module 'redux-actions/es/arrayToObject.js' {
+ declare module.exports: $Exports<'redux-actions/es/arrayToObject'>;
+}
+declare module 'redux-actions/es/camelCase.js' {
+ declare module.exports: $Exports<'redux-actions/es/camelCase'>;
+}
+declare module 'redux-actions/es/combineActions.js' {
+ declare module.exports: $Exports<'redux-actions/es/combineActions'>;
+}
+declare module 'redux-actions/es/createAction.js' {
+ declare module.exports: $Exports<'redux-actions/es/createAction'>;
+}
+declare module 'redux-actions/es/createActions.js' {
+ declare module.exports: $Exports<'redux-actions/es/createActions'>;
+}
+declare module 'redux-actions/es/handleAction.js' {
+ declare module.exports: $Exports<'redux-actions/es/handleAction'>;
+}
+declare module 'redux-actions/es/handleActions.js' {
+ declare module.exports: $Exports<'redux-actions/es/handleActions'>;
+}
+declare module 'redux-actions/es/index.js' {
+ declare module.exports: $Exports<'redux-actions/es/index'>;
+}
+declare module 'redux-actions/es/namespaceActions.js' {
+ declare module.exports: $Exports<'redux-actions/es/namespaceActions'>;
+}
+declare module 'redux-actions/es/ownKeys.js' {
+ declare module.exports: $Exports<'redux-actions/es/ownKeys'>;
+}
+declare module 'redux-actions/lib/arrayToObject.js' {
+ declare module.exports: $Exports<'redux-actions/lib/arrayToObject'>;
+}
+declare module 'redux-actions/lib/camelCase.js' {
+ declare module.exports: $Exports<'redux-actions/lib/camelCase'>;
+}
+declare module 'redux-actions/lib/combineActions.js' {
+ declare module.exports: $Exports<'redux-actions/lib/combineActions'>;
+}
+declare module 'redux-actions/lib/createAction.js' {
+ declare module.exports: $Exports<'redux-actions/lib/createAction'>;
+}
+declare module 'redux-actions/lib/createActions.js' {
+ declare module.exports: $Exports<'redux-actions/lib/createActions'>;
+}
+declare module 'redux-actions/lib/handleAction.js' {
+ declare module.exports: $Exports<'redux-actions/lib/handleAction'>;
+}
+declare module 'redux-actions/lib/handleActions.js' {
+ declare module.exports: $Exports<'redux-actions/lib/handleActions'>;
+}
+declare module 'redux-actions/lib/index.js' {
+ declare module.exports: $Exports<'redux-actions/lib/index'>;
+}
+declare module 'redux-actions/lib/namespaceActions.js' {
+ declare module.exports: $Exports<'redux-actions/lib/namespaceActions'>;
+}
+declare module 'redux-actions/lib/ownKeys.js' {
+ declare module.exports: $Exports<'redux-actions/lib/ownKeys'>;
+}
diff --git a/flow-typed/npm/redux-localstorage_vx.x.x.js b/flow-typed/npm/redux-localstorage_vx.x.x.js
new file mode 100644
index 0000000000..ca1372273b
--- /dev/null
+++ b/flow-typed/npm/redux-localstorage_vx.x.x.js
@@ -0,0 +1,60 @@
+// flow-typed signature: 07ff2ccecd3a47bde262d4e316144d59
+// flow-typed version: <<STUB>>/redux-localstorage_v^0.4.1/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'redux-localstorage'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'redux-localstorage' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'redux-localstorage/lib/createSlicer' {
+ declare module.exports: any;
+}
+
+declare module 'redux-localstorage/lib/getSubset' {
+ declare module.exports: any;
+}
+
+declare module 'redux-localstorage/lib/persistState' {
+ declare module.exports: any;
+}
+
+declare module 'redux-localstorage/lib/util/mergeState' {
+ declare module.exports: any;
+}
+
+declare module 'redux-localstorage/lib/util/typeOf' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'redux-localstorage/lib/createSlicer.js' {
+ declare module.exports: $Exports<'redux-localstorage/lib/createSlicer'>;
+}
+declare module 'redux-localstorage/lib/getSubset.js' {
+ declare module.exports: $Exports<'redux-localstorage/lib/getSubset'>;
+}
+declare module 'redux-localstorage/lib/persistState.js' {
+ declare module.exports: $Exports<'redux-localstorage/lib/persistState'>;
+}
+declare module 'redux-localstorage/lib/util/mergeState.js' {
+ declare module.exports: $Exports<'redux-localstorage/lib/util/mergeState'>;
+}
+declare module 'redux-localstorage/lib/util/typeOf.js' {
+ declare module.exports: $Exports<'redux-localstorage/lib/util/typeOf'>;
+}
diff --git a/flow-typed/npm/redux-mock-store_v1.2.x.js b/flow-typed/npm/redux-mock-store_v1.2.x.js
new file mode 100644
index 0000000000..f2ed57b83e
--- /dev/null
+++ b/flow-typed/npm/redux-mock-store_v1.2.x.js
@@ -0,0 +1,31 @@
+// flow-typed signature: 6cd2c212efe8f38ffcd607e71c7151bb
+// flow-typed version: 5e08ae257c/redux-mock-store_v1.2.x/flow_>=v0.34.x
+
+declare module 'redux-mock-store' {
+ /*
+ S = State
+ A = Action
+ */
+
+ declare type mockStore = {
+ <S, A>(state: S): mockStoreWithoutMiddleware<S, A>
+ };
+ declare type mockStoreWithoutMiddleware<S, A> = {
+ getState(): S,
+ getActions(): Array<A>,
+ dispatch(action: A): A,
+ clearActions(): void,
+ subscribe(callback: Function): void,
+ replaceReducer(nextReducer: Function): void
+ };
+
+ declare function exports(middlewares: ?Array<Function>): mockStore;
+}
+
+// Filename aliases
+declare module 'redux-mock-store/src/index' {
+ declare module.exports: $Exports<'redux-mock-store'>;
+}
+declare module 'redux-mock-store/src/index.js' {
+ declare module.exports: $Exports<'redux-mock-store'>;
+}
diff --git a/flow-typed/npm/redux-thunk_vx.x.x.js b/flow-typed/npm/redux-thunk_vx.x.x.js
new file mode 100644
index 0000000000..d0d11d993a
--- /dev/null
+++ b/flow-typed/npm/redux-thunk_vx.x.x.js
@@ -0,0 +1,60 @@
+// flow-typed signature: 944a1150d22721dc5aeb940c62aa9231
+// flow-typed version: <<STUB>>/redux-thunk_v^2.2.0/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'redux-thunk'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'redux-thunk' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'redux-thunk/dist/redux-thunk' {
+ declare module.exports: any;
+}
+
+declare module 'redux-thunk/dist/redux-thunk.min' {
+ declare module.exports: any;
+}
+
+declare module 'redux-thunk/es/index' {
+ declare module.exports: any;
+}
+
+declare module 'redux-thunk/lib/index' {
+ declare module.exports: any;
+}
+
+declare module 'redux-thunk/src/index' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'redux-thunk/dist/redux-thunk.js' {
+ declare module.exports: $Exports<'redux-thunk/dist/redux-thunk'>;
+}
+declare module 'redux-thunk/dist/redux-thunk.min.js' {
+ declare module.exports: $Exports<'redux-thunk/dist/redux-thunk.min'>;
+}
+declare module 'redux-thunk/es/index.js' {
+ declare module.exports: $Exports<'redux-thunk/es/index'>;
+}
+declare module 'redux-thunk/lib/index.js' {
+ declare module.exports: $Exports<'redux-thunk/lib/index'>;
+}
+declare module 'redux-thunk/src/index.js' {
+ declare module.exports: $Exports<'redux-thunk/src/index'>;
+}
diff --git a/flow-typed/npm/redux_v3.x.x.js b/flow-typed/npm/redux_v3.x.x.js
new file mode 100644
index 0000000000..f6445d9cf4
--- /dev/null
+++ b/flow-typed/npm/redux_v3.x.x.js
@@ -0,0 +1,109 @@
+// flow-typed signature: 86993bd000012d3e1ef10d757d16952d
+// flow-typed version: a165222d28/redux_v3.x.x/flow_>=v0.33.x
+
+declare module 'redux' {
+
+ /*
+
+ S = State
+ A = Action
+ D = Dispatch
+
+ */
+
+ declare type DispatchAPI<A> = (action: A) => A;
+ declare type Dispatch<A: { type: $Subtype<string> }> = DispatchAPI<A>;
+
+ declare type MiddlewareAPI<S, A, D = Dispatch<A>> = {
+ dispatch: D;
+ getState(): S;
+ };
+
+ declare type Store<S, A, D = Dispatch<A>> = {
+ // rewrite MiddlewareAPI members in order to get nicer error messages (intersections produce long messages)
+ dispatch: D;
+ getState(): S;
+ subscribe(listener: () => void): () => void;
+ replaceReducer(nextReducer: Reducer<S, A>): void
+ };
+
+ declare type Reducer<S, A> = (state: S, action: A) => S;
+
+ declare type CombinedReducer<S, A> = (state: $Shape<S> & {} | void, action: A) => S;
+
+ declare type Middleware<S, A, D = Dispatch<A>> =
+ (api: MiddlewareAPI<S, A, D>) =>
+ (next: D) => D;
+
+ declare type StoreCreator<S, A, D = Dispatch<A>> = {
+ (reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A, D>): Store<S, A, D>;
+ (reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A, D>): Store<S, A, D>;
+ };
+
+ declare type StoreEnhancer<S, A, D = Dispatch<A>> = (next: StoreCreator<S, A, D>) => StoreCreator<S, A, D>;
+
+ declare function createStore<S, A, D>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A, D>): Store<S, A, D>;
+ declare function createStore<S, A, D>(reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A, D>): Store<S, A, D>;
+
+ declare function applyMiddleware<S, A, D>(...middlewares: Array<Middleware<S, A, D>>): StoreEnhancer<S, A, D>;
+
+ declare type ActionCreator<A, B> = (...args: Array<B>) => A;
+ declare type ActionCreators<K, A> = { [key: K]: ActionCreator<A, any> };
+
+ declare function bindActionCreators<A, C: ActionCreator<A, any>, D: DispatchAPI<A>>(actionCreator: C, dispatch: D): C;
+ declare function bindActionCreators<A, K, C: ActionCreators<K, A>, D: DispatchAPI<A>>(actionCreators: C, dispatch: D): C;
+
+ declare function combineReducers<O: Object, A>(reducers: O): CombinedReducer<$ObjMap<O, <S>(r: Reducer<S, any>) => S>, A>;
+
+ declare function compose<A, B>(ab: (a: A) => B): (a: A) => B
+ declare function compose<A, B, C>(
+ bc: (b: B) => C,
+ ab: (a: A) => B
+ ): (a: A) => C
+ declare function compose<A, B, C, D>(
+ cd: (c: C) => D,
+ bc: (b: B) => C,
+ ab: (a: A) => B
+ ): (a: A) => D
+ declare function compose<A, B, C, D, E>(
+ de: (d: D) => E,
+ cd: (c: C) => D,
+ bc: (b: B) => C,
+ ab: (a: A) => B
+ ): (a: A) => E
+ declare function compose<A, B, C, D, E, F>(
+ ef: (e: E) => F,
+ de: (d: D) => E,
+ cd: (c: C) => D,
+ bc: (b: B) => C,
+ ab: (a: A) => B
+ ): (a: A) => F
+ declare function compose<A, B, C, D, E, F, G>(
+ fg: (f: F) => G,
+ ef: (e: E) => F,
+ de: (d: D) => E,
+ cd: (c: C) => D,
+ bc: (b: B) => C,
+ ab: (a: A) => B
+ ): (a: A) => G
+ declare function compose<A, B, C, D, E, F, G, H>(
+ gh: (g: G) => H,
+ fg: (f: F) => G,
+ ef: (e: E) => F,
+ de: (d: D) => E,
+ cd: (c: C) => D,
+ bc: (b: B) => C,
+ ab: (a: A) => B
+ ): (a: A) => H
+ declare function compose<A, B, C, D, E, F, G, H, I>(
+ hi: (h: H) => I,
+ gh: (g: G) => H,
+ fg: (f: F) => G,
+ ef: (e: E) => F,
+ de: (d: D) => E,
+ cd: (c: C) => D,
+ bc: (b: B) => C,
+ ab: (a: A) => B
+ ): (a: A) => I
+
+}
diff --git a/flow-typed/npm/rimraf_vx.x.x.js b/flow-typed/npm/rimraf_vx.x.x.js
new file mode 100644
index 0000000000..ef943721db
--- /dev/null
+++ b/flow-typed/npm/rimraf_vx.x.x.js
@@ -0,0 +1,39 @@
+// flow-typed signature: f7bb6829a3dc5082a6d04c621f0e6fff
+// flow-typed version: <<STUB>>/rimraf_v^2.5.4/flow_v0.46.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'rimraf'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'rimraf' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'rimraf/bin' {
+ declare module.exports: any;
+}
+
+declare module 'rimraf/rimraf' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'rimraf/bin.js' {
+ declare module.exports: $Exports<'rimraf/bin'>;
+}
+declare module 'rimraf/rimraf.js' {
+ declare module.exports: $Exports<'rimraf/rimraf'>;
+}
diff --git a/flow-typed/npm/sinon_vx.x.x.js b/flow-typed/npm/sinon_vx.x.x.js
new file mode 100644
index 0000000000..1c51e0099c
--- /dev/null
+++ b/flow-typed/npm/sinon_vx.x.x.js
@@ -0,0 +1,333 @@
+// flow-typed signature: 0ff5f095b5512c194789f6356e524e5b
+// flow-typed version: <<STUB>>/sinon_v^3.2.1/flow_v0.50.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'sinon'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'sinon' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'sinon/lib/sinon' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/assert' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/behavior' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/blob' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/call' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/collect-own-methods' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/collection' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/color' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/default-behaviors' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/match' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/mock-expectation' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/mock' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/sandbox-stub' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/sandbox' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/spy-formatters' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/spy' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/stub-entire-object' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/stub-non-function-property' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/stub' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/throw-on-falsy-object' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/called-in-order' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/deep-equal' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/default-config' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/deprecated' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/every' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/extend' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/format' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/function-name' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/function-to-string' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/get-config' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/get-property-descriptor' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/iterable-to-string' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/order-by-first-call' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/restore' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/times-in-words' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/typeOf' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/value-to-string' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/walk' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/core/wrap-method' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/lib/sinon/util/fake_timers' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/pkg/sinon-3.2.1' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/pkg/sinon-no-sourcemaps-3.2.1' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/pkg/sinon-no-sourcemaps' {
+ declare module.exports: any;
+}
+
+declare module 'sinon/pkg/sinon' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'sinon/lib/sinon.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon'>;
+}
+declare module 'sinon/lib/sinon/assert.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/assert'>;
+}
+declare module 'sinon/lib/sinon/behavior.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/behavior'>;
+}
+declare module 'sinon/lib/sinon/blob.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/blob'>;
+}
+declare module 'sinon/lib/sinon/call.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/call'>;
+}
+declare module 'sinon/lib/sinon/collect-own-methods.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/collect-own-methods'>;
+}
+declare module 'sinon/lib/sinon/collection.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/collection'>;
+}
+declare module 'sinon/lib/sinon/color.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/color'>;
+}
+declare module 'sinon/lib/sinon/default-behaviors.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/default-behaviors'>;
+}
+declare module 'sinon/lib/sinon/match.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/match'>;
+}
+declare module 'sinon/lib/sinon/mock-expectation.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/mock-expectation'>;
+}
+declare module 'sinon/lib/sinon/mock.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/mock'>;
+}
+declare module 'sinon/lib/sinon/sandbox-stub.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/sandbox-stub'>;
+}
+declare module 'sinon/lib/sinon/sandbox.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/sandbox'>;
+}
+declare module 'sinon/lib/sinon/spy-formatters.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/spy-formatters'>;
+}
+declare module 'sinon/lib/sinon/spy.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/spy'>;
+}
+declare module 'sinon/lib/sinon/stub-entire-object.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/stub-entire-object'>;
+}
+declare module 'sinon/lib/sinon/stub-non-function-property.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/stub-non-function-property'>;
+}
+declare module 'sinon/lib/sinon/stub.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/stub'>;
+}
+declare module 'sinon/lib/sinon/throw-on-falsy-object.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/throw-on-falsy-object'>;
+}
+declare module 'sinon/lib/sinon/util/core/called-in-order.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/called-in-order'>;
+}
+declare module 'sinon/lib/sinon/util/core/deep-equal.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/deep-equal'>;
+}
+declare module 'sinon/lib/sinon/util/core/default-config.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/default-config'>;
+}
+declare module 'sinon/lib/sinon/util/core/deprecated.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/deprecated'>;
+}
+declare module 'sinon/lib/sinon/util/core/every.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/every'>;
+}
+declare module 'sinon/lib/sinon/util/core/extend.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/extend'>;
+}
+declare module 'sinon/lib/sinon/util/core/format.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/format'>;
+}
+declare module 'sinon/lib/sinon/util/core/function-name.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/function-name'>;
+}
+declare module 'sinon/lib/sinon/util/core/function-to-string.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/function-to-string'>;
+}
+declare module 'sinon/lib/sinon/util/core/get-config.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/get-config'>;
+}
+declare module 'sinon/lib/sinon/util/core/get-property-descriptor.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/get-property-descriptor'>;
+}
+declare module 'sinon/lib/sinon/util/core/iterable-to-string.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/iterable-to-string'>;
+}
+declare module 'sinon/lib/sinon/util/core/order-by-first-call.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/order-by-first-call'>;
+}
+declare module 'sinon/lib/sinon/util/core/restore.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/restore'>;
+}
+declare module 'sinon/lib/sinon/util/core/times-in-words.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/times-in-words'>;
+}
+declare module 'sinon/lib/sinon/util/core/typeOf.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/typeOf'>;
+}
+declare module 'sinon/lib/sinon/util/core/value-to-string.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/value-to-string'>;
+}
+declare module 'sinon/lib/sinon/util/core/walk.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/walk'>;
+}
+declare module 'sinon/lib/sinon/util/core/wrap-method.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/core/wrap-method'>;
+}
+declare module 'sinon/lib/sinon/util/fake_timers.js' {
+ declare module.exports: $Exports<'sinon/lib/sinon/util/fake_timers'>;
+}
+declare module 'sinon/pkg/sinon-3.2.1.js' {
+ declare module.exports: $Exports<'sinon/pkg/sinon-3.2.1'>;
+}
+declare module 'sinon/pkg/sinon-no-sourcemaps-3.2.1.js' {
+ declare module.exports: $Exports<'sinon/pkg/sinon-no-sourcemaps-3.2.1'>;
+}
+declare module 'sinon/pkg/sinon-no-sourcemaps.js' {
+ declare module.exports: $Exports<'sinon/pkg/sinon-no-sourcemaps'>;
+}
+declare module 'sinon/pkg/sinon.js' {
+ declare module.exports: $Exports<'sinon/pkg/sinon'>;
+}
diff --git a/flow-typed/npm/sudo-prompt_vx.x.x.js b/flow-typed/npm/sudo-prompt_vx.x.x.js
new file mode 100644
index 0000000000..3c762d1dca
--- /dev/null
+++ b/flow-typed/npm/sudo-prompt_vx.x.x.js
@@ -0,0 +1,45 @@
+// flow-typed signature: ff03b3d5b4912b377eef1ed260d6968f
+// flow-typed version: <<STUB>>/sudo-prompt_v7.0.0/flow_v0.48.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ * 'sudo-prompt'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'sudo-prompt' {
+ declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'sudo-prompt/test-concurrent' {
+ declare module.exports: any;
+}
+
+declare module 'sudo-prompt/test' {
+ declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'sudo-prompt/index' {
+ declare module.exports: $Exports<'sudo-prompt'>;
+}
+declare module 'sudo-prompt/index.js' {
+ declare module.exports: $Exports<'sudo-prompt'>;
+}
+declare module 'sudo-prompt/test-concurrent.js' {
+ declare module.exports: $Exports<'sudo-prompt/test-concurrent'>;
+}
+declare module 'sudo-prompt/test.js' {
+ declare module.exports: $Exports<'sudo-prompt/test'>;
+}
diff --git a/flow-typed/npm/uuid_v3.x.x.js b/flow-typed/npm/uuid_v3.x.x.js
new file mode 100644
index 0000000000..0bf9195010
--- /dev/null
+++ b/flow-typed/npm/uuid_v3.x.x.js
@@ -0,0 +1,15 @@
+// flow-typed signature: c07f382c8238bb78e545b60dd4f097a6
+// flow-typed version: 27f92307d3/uuid_v3.x.x/flow_>=v0.33.x
+
+declare module 'uuid' {
+ declare function v1(options?: {|
+ node?: number[],
+ clockseq?: number,
+ msecs?: number | Date,
+ nsecs?: number,
+ |}, buffer?: number[] | Buffer, offset?: number): string;
+ declare function v4(options?: {|
+ random?: number[],
+ rng?: () => number[] | Buffer,
+ |}, buffer?: number[] | Buffer, offset?: number): string;
+}
diff --git a/init.js b/init.js
new file mode 100644
index 0000000000..0304e4341a
--- /dev/null
+++ b/init.js
@@ -0,0 +1 @@
+require('./build/main'); \ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000..c5479ec8bc
--- /dev/null
+++ b/package.json
@@ -0,0 +1,89 @@
+{
+ "name": "mullvad-vpn",
+ "version": "2017.1.0-beta6",
+ "description": "Mullvad VPN client",
+ "main": "init.js",
+ "author": {
+ "name": "Mullvad VPN",
+ "email": "support@mullvad.net"
+ },
+ "repository": "https://github.com/mullvad/vpnclient-gui",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "cheap-ruler": "^2.4.1",
+ "electron-log": "^2.2.8",
+ "electron-sudo": "https://github.com/eriklarko/electron-sudo.git",
+ "history": "^4.6.1",
+ "jsonrpc-lite": "^1.2.3",
+ "mapbox-gl": "^0.37.0",
+ "mkdirp": "^0.5.1",
+ "moment": "^2.17.1",
+ "prop-types": "^15.5.10",
+ "react": "^15.6.1",
+ "react-custom-scrollbars": "^4.0.2",
+ "react-dom": "^15.6.1",
+ "react-if": "^2.2.1",
+ "react-mapbox-gl": "^2.1.0",
+ "react-redux": "^5.0.2",
+ "react-router": "^4.1.1",
+ "react-router-redux": "5.0.0-alpha.6",
+ "react-transition-group": "^1.2.0",
+ "redux": "^3.0.0",
+ "redux-thunk": "^2.2.0",
+ "shell-escape": "^0.2.0",
+ "uuid": "^3.0.1",
+ "validated": "^1.1.0"
+ },
+ "optionalDependencies": {
+ "nseventmonitor": "git+https://github.com/pronebird/NSEventMonitor.git"
+ },
+ "devDependencies": {
+ "babel-cli": "^6.22.2",
+ "babel-core": "^6.25.0",
+ "babel-eslint": "^7.1.1",
+ "babel-plugin-inline-react-svg": "^0.4.0",
+ "babel-plugin-transform-runtime": "^6.22.0",
+ "babel-preset-es2015": "^6.1.18",
+ "babel-preset-react": "^6.22.0",
+ "babel-preset-stage-0": "^6.1.18",
+ "browser-sync": "^2.9.3",
+ "chai": "^4.1.0",
+ "electron": "^1.7.9",
+ "electron-builder": "^19.37.2",
+ "electron-devtools-installer": "^2.1.0",
+ "electron-mocha": "^3.3.0",
+ "enzyme": "^2.9.1",
+ "eslint": "^4.1.1",
+ "eslint-plugin-flowtype": "^2.34.1",
+ "eslint-plugin-react": "^7.1.0",
+ "flow-bin": "^0.50.0",
+ "flow-typed": "^2.1.5",
+ "npm-run-all": "^4.0.1",
+ "react-test-renderer": "^15.6.1",
+ "redux-mock-store": "^1.2.2",
+ "rimraf": "^2.5.4",
+ "sinon": "^3.2.1"
+ },
+ "scripts": {
+ "postinstall": "electron-builder install-app-deps",
+ "develop": "npm run private:compile -- --source-maps true && npm run private:service-worker && run-p -r private:watch private:serve",
+ "test": "electron-mocha --renderer -R spec --compilers js:babel-core/register --require-main test/setup/main.js test/*.spec.js test/**/*.spec.js",
+ "lint": "eslint --no-ignore scripts app test *.js",
+ "flow": "flow",
+ "pack": "run-s private:clean private:compile private:service-worker private:build:all",
+ "pack:mac": "./pre-mac-sign.sh && run-s private:clean private:compile private:service-worker private:build:mac",
+ "pack:win": "run-s private:clean private:compile private:service-worker private:build:win",
+ "pack:linux": "run-s private:clean private:compile private:service-worker private:build:linux",
+ "private:build:all": "npm run private:build -- -mwl",
+ "private:build:mac": "npm run private:build -- --mac",
+ "private:build:win": "npm run private:build -- --win",
+ "private:build:linux": "npm run private:build -- --linux",
+ "private:build": "electron-builder",
+ "private:watch": "npm run private:compile -- --source-maps true --watch --skip-initial-build",
+ "private:serve": "babel-node scripts/serve.js",
+ "private:compile": "babel app/ --copy-files --ignore *.sw.js --out-dir build",
+ "private:service-worker": "cp app/*.sw.js build",
+ "private:clean": "rimraf build"
+ }
+}
diff --git a/pre-mac-sign.sh b/pre-mac-sign.sh
new file mode 100755
index 0000000000..a30a58f77e
--- /dev/null
+++ b/pre-mac-sign.sh
@@ -0,0 +1,5 @@
+#! /bin/bash
+
+set -eux
+
+rm -f node_modules/electron-sudo/{src,dist}/bin/applet.app/LICENSE
diff --git a/scripts/serve.js b/scripts/serve.js
new file mode 100644
index 0000000000..57b006da1e
--- /dev/null
+++ b/scripts/serve.js
@@ -0,0 +1,52 @@
+import { spawn } from 'child_process';
+import electron from 'electron';
+import browserSync from 'browser-sync';
+import browserSyncConnectUtils from 'browser-sync/lib/connect-utils';
+
+const bsync = browserSync.create();
+
+const getRootUrl = (options) => {
+ const port = options.get('port');
+ return `http://localhost:${port}`;
+};
+
+const getClientUrl = (options) => {
+ const pathname = browserSyncConnectUtils.clientScript(options);
+ return getRootUrl(options) + pathname;
+};
+
+bsync.init({
+ ui: false,
+ // Port 35829 = LiveReload's default port 35729 + 100.
+ // If the port is occupied, Browsersync uses next free port automatically.
+ port: 35829,
+ ghostMode: false,
+ open: false,
+ notify: false,
+ logSnippet: false,
+ socket: {
+ // Use the actual port here.
+ domain: getRootUrl
+ }
+}, (err, bs) => {
+ if (err) return console.error(err);
+
+ const child = spawn(electron, ['.', '--enable-logging'], {
+ env: {
+ ...{
+ NODE_ENV: 'development',
+ BROWSER_SYNC_CLIENT_URL: getClientUrl(bs.options)
+ },
+ ...process.env
+ },
+ stdio: 'inherit'
+ });
+
+ child.on('close', () => {
+ process.exit();
+ });
+
+ bsync
+ .watch('build/**/*')
+ .on('change', bsync.reload);
+});
diff --git a/test/auth.spec.js b/test/auth.spec.js
new file mode 100644
index 0000000000..c3fd78c83d
--- /dev/null
+++ b/test/auth.spec.js
@@ -0,0 +1,56 @@
+// @flow
+
+import { expect } from 'chai';
+import { setupIpcAndStore, setupBackendAndStore, failFast, checkNextTick } from './helpers/ipc-helpers';
+import { IpcChain } from './helpers/IpcChain';
+import { Backend } from '../app/lib/backend';
+
+describe('authentication', () => {
+
+ it('authenticates before ipc call if unauthenticated', (done) => {
+ const { store, mockIpc } = setupIpcAndStore();
+ const credentials = {
+ sharedSecret: 'foo',
+ connectionString: '',
+ };
+
+
+ const chain = new IpcChain(mockIpc);
+ chain.require('authenticate')
+ .withInputValidation( secret => {
+ expect(secret).to.equal(credentials.sharedSecret);
+ })
+ .done();
+
+ chain.require('connect')
+ .done();
+
+ chain.onSuccessOrFailure(done);
+
+
+ const backend = new Backend(store, credentials, mockIpc);
+ backend.connect();
+ });
+
+ it('reauthenticates on reconnect', (done) => {
+ const { mockIpc, backend } = setupBackendAndStore();
+
+ let authCount = 0;
+ mockIpc.authenticate = () => {
+ authCount++;
+ return Promise.resolve();
+ };
+
+
+ mockIpc.killWebSocket();
+ failFast(() => {
+ expect(authCount).to.equal(0);
+ }, done);
+
+
+ backend.connect();
+ checkNextTick(() => {
+ expect(authCount).to.equal(1);
+ }, done);
+ });
+});
diff --git a/test/autologin.spec.js b/test/autologin.spec.js
new file mode 100644
index 0000000000..5821166eff
--- /dev/null
+++ b/test/autologin.spec.js
@@ -0,0 +1,124 @@
+// @flow
+
+import { expect } from 'chai';
+import { setupBackendAndStore, setupBackendAndMockStore, getLocation } from './helpers/ipc-helpers';
+import { IpcChain } from './helpers/IpcChain';
+
+describe('autologin', () => {
+
+ it('should send get_account then get_account_data if an account is set', (done) => {
+ const { mockIpc, backend } = setupBackendAndStore();
+
+ const randomAccountToken = '12345';
+
+ const chain = new IpcChain(mockIpc);
+ chain.require('getAccount')
+ .withReturnValue(randomAccountToken)
+ .done();
+
+ chain.require('getAccountData')
+ .withInputValidation((num) => {
+ expect(num).to.equal(randomAccountToken);
+ })
+ .done();
+
+ chain.onSuccessOrFailure(done);
+
+ backend.autologin();
+ });
+
+ it('should redirect to the login page if no account is set', () => {
+ const { store, backend, mockIpc } = setupBackendAndMockStore();
+
+ mockIpc.getAccount = () => new Promise((_, reject) => reject('NO_ACCOUNT'));
+
+ return backend.autologin()
+ .then( () => {
+ expect(getLocation(store)).to.equal('/');
+ })
+ .catch( (e) => {
+ if (e !== 'NO_ACCOUNT') {
+ throw e;
+ }
+ });
+ });
+
+ it('should redirect to the login page for non-existing accounts', () => {
+ const { store, backend, mockIpc } = setupBackendAndMockStore();
+
+ mockIpc.getAccount = () => new Promise(r => r('123'));
+ mockIpc.getAccountData = () => new Promise((_, reject) => reject('NO_ACCOUNT'));
+
+ return backend.autologin()
+ .then( () => {
+ expect(getLocation(store)).to.equal('/');
+ })
+ .catch( (e) => {
+ if (e !== 'NO_ACCOUNT') {
+ throw e;
+ }
+ });
+ });
+
+ it('should mark the state as not logged in if no account is set', () => {
+ const { store, backend, mockIpc } = setupBackendAndStore();
+
+ mockIpc.getAccount = () => new Promise(r => r(null));
+
+ return backend.autologin()
+ .catch( () => {}) // ignore errors
+ .then( () => {
+ const state = store.getState().account;
+
+ expect(state.status).to.equal('none');
+ expect(state.accountToken).to.be.null;
+ expect(state.error).to.be.null;
+ });
+ });
+
+ it('should mark the state as not logged in for non-existing accounts', () => {
+ const { store, backend, mockIpc } = setupBackendAndStore();
+
+ mockIpc.getAccount = () => new Promise(r => r('123'));
+ mockIpc.getAccountData = () => new Promise((_, reject) => reject('NO ACCOUNT'));
+
+ return backend.autologin()
+ .catch( () => {}) // ignore errors
+ .then( () => {
+ const state = store.getState().account;
+
+ expect(state.status).to.equal('none');
+ expect(state.error).to.be.null;
+ });
+ });
+
+ it('should put the account data in the state for existing accounts', () => {
+ const { store, backend, mockIpc } = setupBackendAndStore();
+ mockIpc.getAccount = () => new Promise(r => r('123'));
+ mockIpc.getAccountData = () => new Promise(r => r({
+ expiry: '2001-01-01T00:00:00Z',
+ }));
+
+ return backend.autologin()
+ .then( () => {
+ const state = store.getState().account;
+ expect(state.status).to.equal('ok');
+ expect(state.accountToken).to.equal('123');
+ expect(state.expiry).to.equal('2001-01-01T00:00:00Z');
+ });
+ });
+
+ it('should redirect to /connect for existing accounts', () => {
+ const { store, backend, mockIpc } = setupBackendAndMockStore();
+
+ mockIpc.getAccount = () => new Promise(r => r('123'));
+ mockIpc.getAccountData = () => new Promise(r => r({
+ expiry: '2001-01-01T00:00:00Z',
+ }));
+
+ return backend.autologin()
+ .then( () => {
+ expect(getLocation(store)).to.equal('/connect');
+ });
+ });
+});
diff --git a/test/components/Account.spec.js b/test/components/Account.spec.js
new file mode 100644
index 0000000000..4f574ae6d7
--- /dev/null
+++ b/test/components/Account.spec.js
@@ -0,0 +1,76 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import ReactTestUtils, { Simulate } from 'react-dom/test-utils';
+import Account from '../../app/components/Account';
+
+import type { AccountReduxState } from '../../app/redux/account/reducers';
+import type { AccountProps } from '../../app/components/Account';
+
+describe('components/Account', () => {
+ const state: AccountReduxState = {
+ accountToken: '1234',
+ expiry: (new Date('2038-01-01')).toISOString(),
+ status: 'none',
+ error: null
+ };
+
+ const makeProps = (state: AccountReduxState, mergeProps: $Shape<AccountProps>): AccountProps => {
+ const defaultProps: AccountProps = {
+ account: state,
+ onClose: () => {},
+ onLogout: () => {},
+ onBuyMore: () => {}
+ };
+ return Object.assign({}, defaultProps, mergeProps);
+ };
+
+ const render = (props: AccountProps): Account => {
+ return ReactTestUtils.renderIntoDocument(
+ <Account { ...props } />
+ );
+ };
+
+ it('should call close callback', (done) => {
+ const props = makeProps(state, {
+ onClose: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'account__close');
+ Simulate.click(domNode);
+ });
+
+ it('should call logout callback', (done) => {
+ const props = makeProps(state, {
+ onLogout: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'account__logout');
+ Simulate.click(domNode);
+ });
+
+ it('should call "buy more" callback', (done) => {
+ const props = makeProps(state, {
+ onBuyMore: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'account__buymore');
+ Simulate.click(domNode);
+ });
+
+ it('should display "out of time" message when account expired', () => {
+ const expiredState: AccountReduxState = {
+ accountToken: '1234',
+ expiry: (new Date('2001-01-01')).toISOString(),
+ status: 'none',
+ error: null
+ };
+ const props = makeProps(expiredState, {});
+ ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'account__out-of-time');
+ });
+
+ it('should not display "out of time" message when account is active', () => {
+ const props = makeProps(state, {});
+ const domNodes = ReactTestUtils.scryRenderedDOMComponentsWithClass(render(props), 'account__out-of-time');
+ expect(domNodes.length).to.be.equal(0);
+ });
+
+});
diff --git a/test/components/AccountInput.spec.js b/test/components/AccountInput.spec.js
new file mode 100644
index 0000000000..ee73323950
--- /dev/null
+++ b/test/components/AccountInput.spec.js
@@ -0,0 +1,178 @@
+// @flow
+import { expect } from 'chai';
+import { createKeyEvent } from '../helpers/dom-events';
+import React from 'react';
+import ReactTestUtils, { Simulate } from 'react-dom/test-utils';
+import AccountInput from '../../app/components/AccountInput';
+
+import type { AccountInputProps } from '../../app/components/AccountInput';
+
+describe('components/AccountInput', () => {
+ const getInputRef = (component: AccountInput): HTMLInputElement => {
+ return ReactTestUtils.findRenderedDOMComponentWithTag(component, 'input');
+ };
+
+ const render = (mergeProps: $Shape<AccountInputProps>) => {
+ const defaultProps: AccountInputProps = {
+ value: '',
+ onEnter: null,
+ onChange: null
+ };
+ const props = Object.assign({}, defaultProps, mergeProps);
+ return ReactTestUtils.renderIntoDocument(
+ <AccountInput { ...props } />
+ );
+ };
+
+ it('should call onEnter', (done) => {
+ const component = render({
+ onEnter: () => done()
+ });
+ Simulate.keyUp(getInputRef(component), createKeyEvent('Enter'));
+ });
+
+ it('should call onChange', (done) => {
+ const component = render({
+ onChange: (val) => {
+ expect(val).to.be.equal('1');
+ done();
+ }
+ });
+ Simulate.keyDown(getInputRef(component), createKeyEvent('1'));
+ });
+
+ it('should format input properly', () => {
+ const cases = [
+ '1111111111111',
+ '1111 1111 1111',
+ '1111 1111 111',
+ '1111 1111 11',
+ '1111 1111 1',
+ '1111 1111',
+ '1111 111',
+ '1111 11',
+ '1111 1',
+ '1111',
+ '111',
+ '11',
+ '1',
+ ''
+ ];
+
+ for(const value of cases) {
+ const component = render({ value });
+ expect(getInputRef(component).value).to.be.equal(value);
+ }
+ });
+
+ it('should remove last character', (done) => {
+ const component = render({
+ value: '1234',
+ onChange: (val) => {
+ expect(val).to.be.equal('123');
+ done();
+ }
+ });
+ Simulate.keyDown(getInputRef(component), createKeyEvent('Backspace'));
+ });
+
+ it('should remove first character', (done) => {
+ const component = render({
+ value: '1234',
+ onChange: (val) => {
+ expect(val).to.be.equal('234');
+ done();
+ }
+ });
+ component.setState({ selectionRange: [1, 1] }, () => {
+ Simulate.keyDown(getInputRef(component), createKeyEvent('Backspace'));
+ });
+ });
+
+ it('should remove all characters', (done) => {
+ const component = render({
+ value: '12345678',
+ onChange: (val) => {
+ expect(val).to.be.empty;
+ done();
+ }
+ });
+ component.setState({ selectionRange: [0, 8] }, () => {
+ Simulate.keyDown(getInputRef(component), createKeyEvent('Backspace'));
+ });
+ });
+
+ it('should remove selection', (done) => {
+ const component = render({
+ value: '1234 5678 9999',
+ onChange: (val) => {
+ expect(val).to.be.equal('12349999');
+ done();
+ }
+ });
+ component.setState({ selectionRange: [4, 8] }, () => {
+ Simulate.keyDown(getInputRef(component), createKeyEvent('Backspace'));
+ });
+ });
+
+ it('should replace selection', (done) => {
+ const component = render({
+ value: '0000'
+ });
+
+ component.setState({ selectionRange: [1, 3] }, () => {
+ Simulate.keyDown(getInputRef(component), createKeyEvent('1'));
+
+ component.setState({}, () => {
+ expect(component.state.value).to.be.equal('010');
+ expect(component.state.selectionRange).to.deep.equal([2, 2]);
+ done();
+ });
+ });
+ });
+
+ it('should keep selection in the back', (done) => {
+ const component = render({ value: '' });
+
+ for(let i = 0; i < 12; i++) {
+ Simulate.keyDown(getInputRef(component), createKeyEvent('1'));
+ }
+
+ component.setState({}, () => {
+ expect(component.state.value).to.be.equal('111111111111');
+ expect(component.state.selectionRange).to.deep.equal([12, 12]);
+ done();
+ });
+ });
+
+ it('should advance selection on insertion', (done) => {
+ const component = render({
+ value: '0000'
+ });
+ component.setState({ selectionRange: [1, 1]}, () => {
+ Simulate.keyDown(getInputRef(component), createKeyEvent('1'));
+
+ component.setState({}, () => {
+ expect(component.state.value).to.be.equal('01000');
+ expect(component.state.selectionRange).to.deep.equal([2, 2]);
+ done();
+ });
+ });
+ });
+
+ it('should not do anything when nothing to remove', (done) => {
+ const component = render({
+ value: '0000'
+ });
+ component.setState({ selectionRange: [0, 0] }, () => {
+ Simulate.keyDown(getInputRef(component), createKeyEvent('Backspace'));
+
+ component.setState({}, () => {
+ expect(component.state.value).to.be.equal('0000');
+ expect(component.state.selectionRange).to.deep.equal([0, 0]);
+ done();
+ });
+ });
+ });
+
+}); \ No newline at end of file
diff --git a/test/components/Connect.spec.js b/test/components/Connect.spec.js
new file mode 100644
index 0000000000..4b84b3b8da
--- /dev/null
+++ b/test/components/Connect.spec.js
@@ -0,0 +1,196 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import { mount } from 'enzyme';
+
+import Connect from '../../app/components/Connect';
+import Header from '../../app/components/HeaderBar';
+
+import type { ReactWrapper } from 'enzyme';
+
+describe('components/Connect', () => {
+
+ it('shows unsecured hints when not connected', () => {
+ const component = renderNotConnected();
+
+ const header = component.find(Header);
+ const securityMessage = component.find('.connect__status-security--unsecured');
+ const connectButton = component.find('.button .button--positive');
+
+ expect(header.prop('style')).to.equal('error');
+ expect(securityMessage.text().toLowerCase()).to.contain('unsecured');
+ expect(connectButton.text()).to.equal('Secure my connection');
+ });
+
+ it('shows secured hints when connected', () => {
+ const component = renderConnected();
+
+ const header = component.find(Header);
+ const securityMessage = component.find('.connect__status-security--secure');
+ const disconnectButton = component.find('.button .button--negative-light');
+
+ expect(header.prop('style')).to.equal('success');
+ expect(securityMessage.text().toLowerCase()).to.contain('secure');
+ expect(disconnectButton.text()).to.equal('Disconnect');
+ });
+
+ it('shows the connection location when connecting', () => {
+ const component = renderConnecting({
+ getServerInfo: (_s) => ({
+ address: '185.65.132.102',
+ name: '',
+ location: [0, 0],
+ country: 'norway',
+ city: 'oslo',
+ }),
+ }, {
+ clientIp: '185.65.132.102',
+ });
+ const countryAndCity = component.find('.connect__status-location');
+ const ipAddr = component.find('.connect__status-ipaddress');
+
+ expect(countryAndCity.text()).to.contain('norway');
+ expect(countryAndCity.text()).not.to.contain('oslo');
+ expect(ipAddr.text()).to.be.empty;
+ });
+
+ it('shows the connection location when connected', () => {
+ const component = renderConnected({
+ getServerInfo: (_s) => ({
+ address: '185.65.132.102',
+ name: '',
+ location: [0, 0],
+ country: 'sweden',
+ city: 'gothenburg',
+ }),
+ }, {
+ clientIp: '185.65.132.102',
+ });
+ const countryAndCity = component.find('.connect__status-location');
+ const ipAddr = component.find('.connect__status-ipaddress');
+
+ expect(countryAndCity.text()).to.contain('sweden');
+ expect(countryAndCity.text()).to.contain('gothenburg');
+ expect(ipAddr.text()).to.contain('185.65.132.102');
+ });
+
+ it('shows the connection location when disconnected', () => {
+ const component = renderNotConnected({
+ getServerInfo: (_s) => ({
+ address: '\u2003',
+ name: '',
+ location: [0, 0],
+ country: 'sweden',
+ city: 'gothenburg',
+ }),
+ }, {
+ clientIp: '\u2003',
+ });
+ const countryAndCity = component.find('.connect__status-location');
+ const ipAddr = component.find('.connect__status-ipaddress');
+
+ expect(countryAndCity.text()).to.contain('\u2002');
+ expect(countryAndCity.text()).to.not.contain('\u2003');
+ expect(ipAddr.text()).to.contain('\u2003');
+ });
+
+ it('shows the country name in the location switcher', () => {
+ const servers = {
+ 'se1.mullvad.net': { name: 'Sweden' },
+ };
+ const getServerInfo = (key) => servers[key] || defaultServer;
+ const component = renderNotConnected({
+ getServerInfo: getServerInfo,
+ });
+ const locationSwitcher = component.find('.connect__server');
+
+ component.setProps({
+ settings: {
+ relayConstraints: {
+ host: 'se1.mullvad.net',
+ },
+ },
+ });
+ expect(locationSwitcher.text()).to.contain(servers['se1.mullvad.net'].name);
+ });
+
+ it('invokes the onConnect prop', (done) => {
+ const component = renderNotConnected({
+ onConnect: () => done(),
+ });
+ const connectButton = component.find('.button .button--positive');
+
+ connectButton.simulate('click');
+ });
+});
+
+function renderNotConnected(customProps, customConnectionProps) {
+ const connection = Object.assign({}, defaultConnection, {
+ status: 'disconnected',
+ }, customConnectionProps);
+
+ const props = Object.assign({}, customProps, {connection});
+ return renderWithProps(props);
+}
+
+function renderConnecting(customProps, customConnectionProps) {
+ const connection = Object.assign({}, defaultConnection, {
+ status: 'connecting',
+ }, customConnectionProps);
+
+ const props = Object.assign({}, customProps, {connection});
+ return renderWithProps(props);
+}
+
+function renderConnected(customProps, customConnectionProps) {
+ const connection = Object.assign({}, defaultConnection, {
+ status: 'connected',
+ }, customConnectionProps);
+
+ const props = Object.assign({}, customProps, {connection});
+ return renderWithProps(props);
+}
+
+function renderWithProps(customProps): ReactWrapper {
+ const props = Object.assign({}, defaultProps, customProps);
+ return mount( <Connect { ...props } /> );
+}
+
+const noop = () => {};
+const defaultServer = {
+ address: '',
+ name: '',
+ city: '',
+ country: '',
+ location: [0, 0],
+};
+const defaultConnection = {
+ status: 'disconnected',
+ isOnline: true,
+ serverAddress: null,
+ clientIp: null,
+ location: null,
+ country: null,
+ city: null,
+};
+
+const defaultProps = {
+ onSettings: noop,
+ onSelectLocation: noop,
+ onConnect: noop,
+ onCopyIP: noop,
+ onDisconnect: noop,
+ onExternalLink: noop,
+ getServerInfo: (_) => { return defaultServer; },
+
+ accountExpiry: '',
+ settings: {
+ relayConstraints: {
+ host: 'www.example.com',
+ port: 'any',
+ protocol: 'any',
+ },
+ },
+ connection: defaultConnection,
+};
diff --git a/test/components/HeaderBar.spec.js b/test/components/HeaderBar.spec.js
new file mode 100644
index 0000000000..f739ed9ab0
--- /dev/null
+++ b/test/components/HeaderBar.spec.js
@@ -0,0 +1,48 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import ReactTestUtils, { Simulate } from 'react-dom/test-utils';
+import HeaderBar from '../../app/components/HeaderBar';
+
+describe('components/HeaderBar', () => {
+
+ it('should display headerbar', () => {
+ const component = ReactTestUtils.renderIntoDocument(
+ <HeaderBar hidden={ false } />
+ );
+ ReactTestUtils.findRenderedDOMComponentWithClass(component, 'headerbar__container');
+ });
+
+ it('should not display headerbar', () => {
+ const component = ReactTestUtils.renderIntoDocument(
+ <HeaderBar hidden={ true } />
+ );
+ const domNodes = ReactTestUtils.scryRenderedDOMComponentsWithClass(component, 'headerbar__container');
+ expect(domNodes.length).to.be.equal(0);
+ });
+
+ it('should display settings button', () => {
+ const component = ReactTestUtils.renderIntoDocument(
+ <HeaderBar showSettings={ true } />
+ );
+ ReactTestUtils.findRenderedDOMComponentWithClass(component, 'headerbar__settings');
+ });
+
+ it('should not display settings button', () => {
+ const component = ReactTestUtils.renderIntoDocument(
+ <HeaderBar showSettings={ false } />
+ );
+ const domNodes = ReactTestUtils.scryRenderedDOMComponentsWithClass(component, 'headerbar__settings');
+ expect(domNodes.length).to.be.equal(0);
+ });
+
+ it('should call settings callback', (done) => {
+ const component = ReactTestUtils.renderIntoDocument(
+ <HeaderBar showSettings={ true } onSettings={ () => done() } />
+ );
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'headerbar__settings');
+ Simulate.click(domNode);
+ });
+
+}); \ No newline at end of file
diff --git a/test/components/Login.spec.js b/test/components/Login.spec.js
new file mode 100644
index 0000000000..9918dc6e1c
--- /dev/null
+++ b/test/components/Login.spec.js
@@ -0,0 +1,135 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import { shallow } from 'enzyme';
+import sinon from 'sinon';
+
+import Login from '../../app/components/Login';
+import AccountInput from '../../app/components/AccountInput';
+
+import type { ShallowWrapper } from 'enzyme';
+
+describe('components/Login', () => {
+
+ it('notifies on the first change after failure', () => {
+
+ let callback = sinon.spy();
+ const props = {
+ onFirstChangeAfterFailure: callback,
+ };
+
+ const component = renderWithProps( props );
+ const accountInput = component.find(AccountInput);
+
+ // Change the props to a failed state
+ component.setProps({ account: {
+ status: 'failed',
+ }});
+
+
+ // Write something in the input field
+ setInputText(accountInput, 'foo');
+ expect(callback.calledOnce).to.be.true;
+
+
+ // Reset the test state
+ callback.reset();
+
+ // Write some other thing in the input field
+ setInputText(accountInput, 'bar');
+ expect(callback.calledOnce).to.be.false;
+ });
+
+ it('doesn\'t show the footer when logging in', () => {
+ const component = renderLoggingIn();
+
+ const footer = component.find('.login-footer');
+ expect(footer.hasClass('login-footer--invisible')).to.be.true;
+ });
+
+ it('shows the footer and account input when not logged in', () => {
+ const component = renderNotLoggedIn();
+
+ const footer = component.find('.login-footer');
+ expect(footer.hasClass('login-footer--invisible')).to.be.false;
+ expect(component.find(AccountInput).exists()).to.be.true;
+ });
+
+ it('doesn\'t show the footer nor account input when logged in', () => {
+ const component = renderLoggedIn();
+
+ const footer = component.find('.login-footer');
+ expect(footer.hasClass('login-footer--invisible')).to.be.true;
+ expect(component.find('.login-form__fields').hasClass('login-form__fields--invisible')).to.be.true;
+ });
+
+ it('logs in with the entered account number when clicking the login icon', (done) => {
+ const component = renderNotLoggedIn();
+ component.setProps({
+ account: {
+ accountToken: '12345',
+ },
+ onLogin: (an) => {
+ try {
+ expect(an).to.equal('12345');
+ done();
+ } catch (e) {
+ done(e);
+ }
+ },
+ });
+
+ component.find('.login-form__submit').simulate('click');
+ });
+});
+
+const defaultAccount = {
+ accountToken: null,
+ expiry: null,
+ status: 'none',
+ error: null,
+};
+
+const defaultProps = {
+ account: defaultAccount,
+ onLogin: () => {},
+ onSettings: () => {},
+ onChange: () => {},
+ onFirstChangeAfterFailure: () => {},
+ onExternalLink: () => {},
+ onAccountTokenChange: () => {},
+};
+
+function renderLoggedIn() {
+ return renderWithProps({
+ account: Object.assign(defaultAccount, {
+ status: 'ok',
+ }),
+ });
+}
+
+function renderLoggingIn() {
+ return renderWithProps({
+ account: Object.assign(defaultAccount, {
+ status: 'logging in',
+ }),
+ });
+}
+
+function renderNotLoggedIn() {
+ return renderWithProps({
+ account: Object.assign(defaultAccount, {
+ status: 'none',
+ }),
+ });
+}
+
+function renderWithProps(customProps): ShallowWrapper {
+ const props = Object.assign({}, defaultProps, customProps);
+ return shallow( <Login { ...props } /> );
+}
+
+function setInputText(input: ShallowWrapper, text: string) {
+ input.simulate('change', text);
+}
diff --git a/test/components/SelectLocation.spec.js b/test/components/SelectLocation.spec.js
new file mode 100644
index 0000000000..28c9299807
--- /dev/null
+++ b/test/components/SelectLocation.spec.js
@@ -0,0 +1,52 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import ReactTestUtils, { Simulate } from 'react-dom/test-utils';
+import SelectLocation from '../../app/components/SelectLocation';
+
+import type { SettingsReduxState } from '../../app/redux/settings/reducers';
+import type { SelectLocationProps } from '../../app/components/SelectLocation';
+
+describe('components/SelectLocation', () => {
+ const state: SettingsReduxState = {
+ relayConstraints: {
+ host: 'any',
+ port: 'any',
+ protocol: 'any',
+ },
+ };
+
+ const makeProps = (state: SettingsReduxState, mergeProps: $Shape<SelectLocationProps>): SelectLocationProps => {
+ const defaultProps: SelectLocationProps = {
+ settings: state,
+ onClose: () => {},
+ onSelect: (_server) => {}
+ };
+ return Object.assign({}, defaultProps, mergeProps);
+ };
+
+ const render = (props: SelectLocationProps): SelectLocation => {
+ return ReactTestUtils.renderIntoDocument(
+ <SelectLocation { ...props } />
+ );
+ };
+
+ it('should call close callback', (done) => {
+ const props = makeProps(state, {
+ onClose: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'select-location__close');
+ Simulate.click(domNode);
+ });
+
+ it('should call select callback', (done) => {
+ const props = makeProps(state, {
+ onSelect: (_server) => done()
+ });
+ const elements = ReactTestUtils.scryRenderedDOMComponentsWithClass(render(props), 'select-location__cell');
+ expect(elements).to.have.length.greaterThan(1);
+ Simulate.click(elements[1]);
+ });
+
+});
diff --git a/test/components/Settings.spec.js b/test/components/Settings.spec.js
new file mode 100644
index 0000000000..85fd72ece5
--- /dev/null
+++ b/test/components/Settings.spec.js
@@ -0,0 +1,158 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import ReactTestUtils, { Simulate } from 'react-dom/test-utils';
+import Settings from '../../app/components/Settings';
+
+import type { AccountReduxState } from '../../app/redux/account/reducers';
+import type { SettingsReduxState } from '../../app/redux/settings/reducers';
+import type { SettingsProps } from '../../app/components/Settings';
+
+describe('components/Settings', () => {
+ const loggedOutAccountState: AccountReduxState = {
+ accountToken: null,
+ expiry: null,
+ status: 'none',
+ error: null
+ };
+
+ const loggedInAccountState: AccountReduxState = {
+ accountToken: '1234',
+ expiry: (new Date('2038-01-01')).toISOString(),
+ status: 'ok',
+ error: null
+ };
+
+ const unpaidAccountState: AccountReduxState = {
+ accountToken: '1234',
+ expiry: (new Date('2001-01-01')).toISOString(),
+ status: 'ok',
+ error: null
+ };
+
+ const settingsState: SettingsReduxState = {
+ relayConstraints: {
+ host: 'any',
+ port: 'any',
+ protocol: 'any',
+ },
+ };
+
+ const makeProps = (anAccountState: AccountReduxState, aSettingsState: SettingsReduxState, mergeProps: $Shape<SettingsProps> = {}): SettingsProps => {
+ const defaultProps: SettingsProps = {
+ account: anAccountState,
+ settings: aSettingsState,
+ onQuit: () => {},
+ onClose: () => {},
+ onViewAccount: () => {},
+ onViewSupport: () => {},
+ onViewAdvancedSettings: () => {},
+ onExternalLink: (_type) => {}
+ };
+ return Object.assign({}, defaultProps, mergeProps);
+ };
+
+ const render = (props: SettingsProps): Settings => {
+ return ReactTestUtils.renderIntoDocument(
+ <Settings { ...props } />
+ );
+ };
+
+ it('should show quit button when logged out', () => {
+ const props = makeProps(loggedOutAccountState, settingsState);
+ ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__quit');
+ });
+
+ it('should show quit button when logged in', () => {
+ const props = makeProps(loggedInAccountState, settingsState);
+ ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__quit');
+ });
+
+ it('should show external links when logged out', () => {
+ const props = makeProps(loggedOutAccountState, settingsState);
+ ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__external');
+ });
+
+ it('should show external links when logged in', () => {
+ const props = makeProps(loggedInAccountState, settingsState);
+ ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__external');
+ });
+
+ it('should show account section when logged in', () => {
+ const props = makeProps(loggedInAccountState, settingsState);
+ ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__account');
+ });
+
+ it('should hide account section when logged out', () => {
+ const props = makeProps(loggedOutAccountState, settingsState);
+ const elements = ReactTestUtils.scryRenderedDOMComponentsWithClass(render(props), 'settings__account');
+ expect(elements).to.be.empty;
+ });
+
+ it('should hide account link when not logged in', () => {
+ const props = makeProps(loggedOutAccountState, settingsState);
+ const elements = ReactTestUtils.scryRenderedDOMComponentsWithClass(render(props), 'settings__view-account');
+ expect(elements).to.be.empty;
+ });
+
+ it('should show out-of-time message for unpaid account', () => {
+ const props = makeProps(unpaidAccountState, settingsState);
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__account-paid-until-label');
+ expect(domNode.textContent).to.contain('OUT OF TIME');
+ });
+
+ it('should hide out-of-time message for paid account', () => {
+ const props = makeProps(loggedInAccountState, settingsState);
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__account-paid-until-label');
+ expect(domNode.textContent).to.not.contain('OUT OF TIME');
+ });
+
+ it('should call close callback', (done) => {
+ const props = makeProps(loggedOutAccountState, settingsState, {
+ onClose: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__close');
+ Simulate.click(domNode);
+ });
+
+ it('should call quit callback', (done) => {
+ const props = makeProps(loggedOutAccountState, settingsState, {
+ onQuit: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__quit');
+ Simulate.click(domNode);
+ });
+
+ it('should call account callback', (done) => {
+ const props = makeProps(loggedInAccountState, settingsState, {
+ onViewAccount: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__view-account');
+ Simulate.click(domNode);
+ });
+
+ it('should call support callback', (done) => {
+ const props = makeProps(loggedInAccountState, settingsState, {
+ onViewSupport: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__view-support');
+ Simulate.click(domNode);
+ });
+
+ it('should call external links callback', () => {
+ let collectedExternalLinkTypes: Array<string> = [];
+ const props = makeProps(loggedOutAccountState, settingsState, {
+ onExternalLink: (type) => {
+ collectedExternalLinkTypes.push(type);
+ }
+ });
+ const container = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'settings__external');
+ Array.from(container.childNodes)
+ .filter((elm: HTMLElement) => elm.classList.contains('settings__cell'))
+ .forEach((elm) => Simulate.click(elm));
+
+ expect(collectedExternalLinkTypes).to.include.ordered.members(['faq', 'guides']);
+ });
+
+});
diff --git a/test/components/Support.spec.js b/test/components/Support.spec.js
new file mode 100644
index 0000000000..b5b9b3d24b
--- /dev/null
+++ b/test/components/Support.spec.js
@@ -0,0 +1,126 @@
+// @flow
+
+import { expect } from 'chai';
+import sinon from 'sinon';
+import React from 'react';
+import ReactTestUtils, { Simulate } from 'react-dom/test-utils';
+import Support from '../../app/components/Support';
+
+import type { SupportProps } from '../../app/components/Support';
+
+describe('components/Support', () => {
+
+ const makeProps = (mergeProps: $Shape<SupportProps> = {}): SupportProps => {
+ const defaultProps: SupportProps = {
+ account: {
+ accountToken: null,
+ error: null,
+ expiry: null,
+ status: 'none',
+ },
+ onClose: () => {},
+ onViewLog: (_path) => {},
+ onCollectLog: () => Promise.resolve('/tmp/mullvad_problem_report.log'),
+ onSend: (_report) => {}
+ };
+ return Object.assign({}, defaultProps, mergeProps);
+ };
+
+ const render = (props: SupportProps): Support => {
+ return ReactTestUtils.renderIntoDocument(
+ <Support { ...props } />
+ );
+ };
+
+ it('should call close callback', (done) => {
+ const props = makeProps({
+ onClose: () => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'support__close');
+ Simulate.click(domNode);
+ });
+
+ it('should call view logs callback', (done) => {
+ const props = makeProps({
+ onViewLog: (_path) => done()
+ });
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithClass(render(props), 'support__form-view-logs');
+ Simulate.click(domNode);
+ });
+
+ it('should call send callback when description filled in', (done) => {
+ const props = makeProps({
+ onSend: (_report) => done()
+ });
+
+ const component = render(props);
+
+ const descriptionField = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'support__form-message');
+ descriptionField.value = 'Lorem Ipsum';
+ Simulate.change(descriptionField);
+
+ const sendButton = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'support__form-send');
+ expect(sendButton.disabled).to.be.false;
+ Simulate.click(sendButton);
+ });
+
+ it('should not call send callback when description is empty', () => {
+ const component = render(makeProps());
+
+ const descriptionField = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'support__form-message');
+ descriptionField.value = '';
+ Simulate.change(descriptionField);
+
+ const sendButton = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'support__form-send');
+ expect(sendButton.disabled).to.be.true;
+ });
+
+ it('should not collect report twice', (done) => {
+ const collectCallback = sinon.spy(() => Promise.resolve('non-falsy'));
+ const props = makeProps({
+ onCollectLog: collectCallback
+ });
+
+ const component = render(props);
+ const viewLogButton = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'support__form-view-logs');
+ Simulate.click(viewLogButton);
+
+ setTimeout(() => {
+ Simulate.click(viewLogButton);
+ });
+
+ setTimeout(() => {
+ try {
+ expect(collectCallback.callCount).to.equal(1);
+ done();
+ } catch (e) {
+ done(e);
+ }
+ });
+ });
+
+ it('should collect report on submission', (done) => {
+ const collectCallback = sinon.spy(() => Promise.resolve(''));
+ const props = makeProps({
+ onCollectLog: collectCallback,
+ onSend: (_report) => {
+ try {
+ expect(collectCallback.calledOnce).to.be.true;
+ done();
+ } catch (e) {
+ done(e);
+ }
+ }
+ });
+
+ const component = render(props);
+
+ const descriptionField = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'support__form-message');
+ descriptionField.value = 'Lorem Ipsum';
+ Simulate.change(descriptionField);
+
+ const sendButton = ReactTestUtils.findRenderedDOMComponentWithClass(component, 'support__form-send');
+ Simulate.click(sendButton);
+ });
+
+});
diff --git a/test/components/Switch.spec.js b/test/components/Switch.spec.js
new file mode 100644
index 0000000000..db7fe8d8c4
--- /dev/null
+++ b/test/components/Switch.spec.js
@@ -0,0 +1,126 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import ReactTestUtils, { Simulate } from 'react-dom/test-utils';
+import Switch from '../../app/components/Switch';
+
+describe('components/Switch', () => {
+
+ let container: ?HTMLElement;
+
+ function renderIntoDocument(instance: React.Element<*>): React.Component<*, *, *> {
+ if(container) {
+ throw new Error('Unmount previously rendered component first.');
+ }
+
+ container = document.createElement('div');
+ if(!document.documentElement) {
+ throw new Error('document.documentElement cannot be null.');
+ }
+
+ document.documentElement.appendChild(container);
+
+ return ReactDOM.render(instance, container);
+ }
+
+ // unmount container and clean up DOM
+ afterEach(() => {
+ if(container) {
+ ReactDOM.unmountComponentAtNode(container);
+ container = null;
+ }
+ });
+
+ it('should switch on', (done) => {
+ const onChange = (isOn) => {
+ expect(isOn).to.be.true;
+ done();
+ };
+ const component = renderIntoDocument(
+ <Switch isOn={ false } onChange={ onChange } />
+ );
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithTag(component, 'input');
+
+ Simulate.mouseDown(domNode, { clientX: 100, clientY: 0 });
+ Simulate.mouseUp(domNode, { clientX: 100, clientY: 0 });
+ Simulate.change(domNode, { target: { checked: true } });
+ });
+
+ it('should switch off', (done) => {
+ const onChange = (isOn) => {
+ expect(isOn).to.be.false;
+ done();
+ };
+ const component = renderIntoDocument(
+ <Switch isOn={ true } onChange={ onChange } />
+ );
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithTag(component, 'input');
+
+ Simulate.mouseDown(domNode, { clientX: 100, clientY: 0 });
+ Simulate.mouseUp(domNode, { clientX: 100, clientY: 0 });
+ Simulate.change(domNode, { target: { checked: false } });
+ });
+
+ it('should handle left to right swipe', (done) => {
+ const onChange = (isOn) => {
+ expect(isOn).to.be.true;
+ done();
+ };
+ const component = renderIntoDocument(
+ <Switch isOn={ false } onChange={ onChange } />
+ );
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithTag(component, 'input');
+
+ Simulate.mouseDown(domNode, { clientX: 100, clientY: 0 });
+
+ // Switch listens to events on document
+ document.dispatchEvent(new MouseEvent('mousemove', { clientX: 150, clientY: 0 }));
+ document.dispatchEvent(new MouseEvent('mouseup', { clientX: 150, clientY: 0 }));
+ });
+
+ it('should handle right to left swipe', (done) => {
+ const onChange = (isOn) => {
+ expect(isOn).to.be.false;
+ done();
+ };
+ const component = renderIntoDocument(
+ <Switch isOn={ true } onChange={ onChange } />
+ );
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithTag(component, 'input');
+
+ Simulate.mouseDown(domNode, { clientX: 150, clientY: 0 });
+
+ // Switch listens to events on document
+ document.dispatchEvent(new MouseEvent('mousemove', { clientX: 100, clientY: 0 }));
+ document.dispatchEvent(new MouseEvent('mouseup', { clientX: 100, clientY: 0 }));
+ });
+
+ it('should timeout when user holds knob for too long without moving', (done) => {
+ const onChange = () => {
+ throw new Error('onChange should not be called on timeout.');
+ };
+
+ const component = renderIntoDocument(
+ <Switch isOn={ false } onChange={ onChange } />
+ );
+ const domNode = ReactTestUtils.findRenderedDOMComponentWithTag(component, 'input');
+
+ Simulate.mouseDown(domNode, { clientX: 100, clientY: 0 });
+
+ setTimeout(() => {
+ // Switch listens to events on document
+ document.dispatchEvent(new MouseEvent('mouseup', { clientX: 100, clientY: 0 }));
+
+ try {
+ // should not trigger onChange()
+ Simulate.change(domNode);
+ done();
+ } catch(e) {
+ done(e);
+ }
+ }, 1000);
+ });
+
+}); \ No newline at end of file
diff --git a/test/connect.spec.js b/test/connect.spec.js
new file mode 100644
index 0000000000..586df45980
--- /dev/null
+++ b/test/connect.spec.js
@@ -0,0 +1,95 @@
+// @flow
+
+import { expect } from 'chai';
+import connectionActions from '../app/redux/connection/actions';
+import { setupBackendAndStore, checkNextTick } from './helpers/ipc-helpers';
+import { IpcChain } from './helpers/IpcChain';
+
+describe('connect', () => {
+
+ it('should invoke update_relay_constraints and then connect in the backend', (done) => {
+ const { store, mockIpc, backend } = setupBackendAndStore();
+
+ const chain = new IpcChain(mockIpc);
+ chain.require('updateRelayConstraints')
+ .withInputValidation(
+ relayEndpoint => {
+ if (relayEndpoint) {
+ expect(relayEndpoint.host.only).to.equal(arbitraryRelay);
+ } else {
+ expect.fail();
+ }
+ },
+ )
+ .done();
+
+ chain.require('connect')
+ .done();
+
+ chain.onSuccessOrFailure(done);
+
+ store.dispatch(connectionActions.connect(backend, arbitraryRelay));
+ });
+
+ it('should set the connection state to \'disconnected\' on failed attempts', (done) => {
+ const { store, mockIpc, backend } = setupBackendAndStore();
+
+ mockIpc.connect = () => new Promise((_, reject) => reject('Some error'));
+
+ store.dispatch(connectionActions.connected());
+
+
+ expect(store.getState().connection.status).not.to.equal('disconnected');
+
+ store.dispatch(connectionActions.connect(backend, arbitraryRelay));
+
+
+ checkNextTick(() => {
+ expect(store.getState().connection.status).to.equal('disconnected');
+ }, done);
+ });
+
+ it('should update the state with the server address', () => {
+ const { store, backend } = setupBackendAndStore();
+
+ return backend.connect('www.example.com')
+ .then( () => {
+ const state = store.getState().connection;
+ expect(state.status).to.equal('connecting');
+ expect(state.serverAddress).to.equal('www.example.com');
+ });
+ });
+
+ it('should correctly deduce \'connected\' from backend states', (done) => {
+ const { store, mockIpc } = setupBackendAndStore();
+
+ checkNextTick( () => {
+ expect(store.getState().connection.status).not.to.equal('connected');
+ mockIpc.sendNewState({ state: 'secured', target_state: 'secured' });
+ expect(store.getState().connection.status).to.equal('connected');
+ }, done);
+ });
+
+ it('should correctly deduce \'connecting\' from backend states', (done) => {
+ const { store, mockIpc } = setupBackendAndStore();
+
+ checkNextTick( () => {
+ expect(store.getState().connection.status).not.to.equal('connecting');
+ mockIpc.sendNewState({ state: 'unsecured', target_state: 'secured' });
+ expect(store.getState().connection.status).to.equal('connecting');
+ }, done);
+ });
+
+ it('should correctly deduce \'disconnected\' from backend states', (done) => {
+ const { store, mockIpc } = setupBackendAndStore();
+ store.dispatch(connectionActions.connected());
+
+ checkNextTick( () => {
+ expect(store.getState().connection.status).not.to.equal('disconnected');
+ mockIpc.sendNewState({ state: 'unsecured', target_state: 'unsecured' });
+ expect(store.getState().connection.status).to.equal('disconnected');
+ }, done);
+ });
+});
+
+const arbitraryRelay = 'www.example.com';
diff --git a/test/connection-info.spec.js b/test/connection-info.spec.js
new file mode 100644
index 0000000000..76a97a35f7
--- /dev/null
+++ b/test/connection-info.spec.js
@@ -0,0 +1,46 @@
+// @flow
+
+import { expect } from 'chai';
+import { createMemoryHistory } from 'history';
+import configureStore from '../app/redux/store';
+import connectionActions from '../app/redux/connection/actions';
+
+describe('The connection state', () => {
+
+ it('should contain the latest IP', () => {
+ const store = createStore();
+
+ store.dispatch(connectionActions.newPublicIp('1.2.3.4'));
+ store.dispatch(connectionActions.newPublicIp('5.6.7.8'));
+
+ expect(store.getState().connection.clientIp).to.equal('5.6.7.8');
+ });
+
+ it('should contain the latest location', () => {
+ const store = createStore();
+
+ const firstLoc = {
+ location: [1, 2],
+ city: 'a',
+ country: 'b',
+ };
+ const secondLoc = {
+ location: [3, 4],
+ city: 'c',
+ country: 'd',
+ };
+
+ store.dispatch(connectionActions.newLocation(firstLoc));
+ store.dispatch(connectionActions.newLocation(secondLoc));
+
+ const { location, city, country } = store.getState().connection;
+ expect(location).to.equal(secondLoc.location);
+ expect(city).to.equal(secondLoc.city);
+ expect(country).to.equal(secondLoc.country);
+ });
+});
+
+function createStore() {
+ const memoryHistory = createMemoryHistory();
+ return configureStore(null, memoryHistory);
+}
diff --git a/test/helpers/IpcChain.js b/test/helpers/IpcChain.js
new file mode 100644
index 0000000000..a62626a6a6
--- /dev/null
+++ b/test/helpers/IpcChain.js
@@ -0,0 +1,104 @@
+// @flow
+
+import { expect } from 'chai';
+import { check, failFast } from './ipc-helpers';
+
+export class IpcChain {
+ _expectedCalls: Array<string>;
+ _recordedCalls: Array<string>;
+ _mockIpc: {};
+ _done: (*) => void;
+ _aborted: boolean;
+
+ constructor(mockIpc: {}) {
+ this._expectedCalls = [];
+ this._recordedCalls = [];
+ this._mockIpc = mockIpc;
+ this._aborted = false;
+ }
+
+ require(ipcCall: string): StepBuilder {
+ this._expectedCalls.push(ipcCall);
+ return new StepBuilder(ipcCall, this._addStep.bind(this));
+ }
+
+ _addStep(step: StepBuilder) {
+ const me = this;
+ this._mockIpc[step.ipcCall] = function() {
+ return new Promise(r => me._stepPromiseCallback(step, r, arguments));
+ };
+ }
+
+ _stepPromiseCallback(step, resolve, args) {
+ if (this._aborted) {
+ return;
+ }
+
+ this._registerCall(step.ipcCall);
+
+ if (step.inputValidation) {
+ const failedInputValidation = failFast(() => {
+ step.inputValidation(...args);
+ }, this._done);
+
+ if (failedInputValidation) {
+ this._abort();
+ return;
+ }
+ }
+
+ if (this._isLastCall()) {
+ this._ensureChainCalledCorrectly();
+ }
+
+ resolve(step.returnValue);
+ }
+
+ _abort() {
+ this._aborted = true;
+ }
+
+ _isLastCall(): boolean {
+ return this._recordedCalls.length === this._expectedCalls.length;
+ }
+
+ _ensureChainCalledCorrectly() {
+ check(() => {
+ expect(this._expectedCalls).to.deep.equal(this._recordedCalls);
+ }, this._done);
+ }
+
+ _registerCall(ipcCall: string) {
+ this._recordedCalls.push(ipcCall);
+ }
+
+ onSuccessOrFailure(done: (*) => void) {
+ this._done = done;
+ }
+}
+
+class StepBuilder {
+ ipcCall: string;
+ inputValidation: () => void;
+ returnValue: *;
+ _cb: (StepBuilder) => void;
+
+ constructor(ipcCall: string, cb: (StepBuilder)=> void) {
+ this.ipcCall = ipcCall;
+ this._cb = cb;
+ }
+
+ withInputValidation(iv: () => void): StepBuilder {
+ this.inputValidation = iv;
+ return this;
+ }
+
+ withReturnValue(rv: *): StepBuilder {
+ this.returnValue = rv;
+ return this;
+ }
+
+ done() {
+ this._cb(this);
+ }
+}
diff --git a/test/helpers/dom-events.js b/test/helpers/dom-events.js
new file mode 100644
index 0000000000..9a02ad167c
--- /dev/null
+++ b/test/helpers/dom-events.js
@@ -0,0 +1,22 @@
+// @flow
+const keycodes = {
+ '1': { which: 49, keyCode: 49 },
+ '2': { which: 50, keyCode: 50 },
+ '3': { which: 51, keyCode: 51 },
+ '4': { which: 52, keyCode: 52 },
+ '5': { which: 53, keyCode: 53 },
+ '6': { which: 54, keyCode: 54 },
+ '7': { which: 55, keyCode: 55 },
+ '8': { which: 56, keyCode: 56 },
+ '9': { which: 57, keyCode: 57 },
+ '0': { which: 48, keyCode: 48 },
+ Tab: { which: 9, keyCode: 9 },
+ Enter: { which: 13, keyCode: 13 },
+ Backspace: { which: 8, keyCode: 8 }
+};
+
+export type Keycode = $Keys<typeof keycodes>;
+
+export function createKeyEvent(key: Keycode): Object {
+ return Object.assign({}, { key }, keycodes[key]);
+}
diff --git a/test/helpers/ipc-helpers.js b/test/helpers/ipc-helpers.js
new file mode 100644
index 0000000000..e2a578973b
--- /dev/null
+++ b/test/helpers/ipc-helpers.js
@@ -0,0 +1,100 @@
+// @flow
+
+import { Backend } from '../../app/lib/backend';
+import { newMockIpc } from '../mocks/ipc';
+import configureStore from '../../app/redux/store';
+import { createMemoryHistory } from 'history';
+import { mockState, mockStore } from '../mocks/redux';
+
+type DoneCallback = (?mixed) => void;
+type Check = () => void;
+
+export function setupIpcAndStore() {
+ const memoryHistory = createMemoryHistory();
+ const store = configureStore(null, memoryHistory);
+
+ const mockIpc = newMockIpc();
+
+ return { store, mockIpc };
+}
+
+export function setupBackendAndStore() {
+
+ const { store, mockIpc } = setupIpcAndStore();
+
+ const credentials = {
+ sharedSecret: '',
+ connectionString: '',
+ };
+ const backend = new Backend(store, credentials, mockIpc);
+
+ return { store, mockIpc, backend };
+}
+
+export function setupBackendAndMockStore() {
+ const store = mockStore(mockState());
+ const mockIpc = newMockIpc();
+ const credentials = {
+ sharedSecret: '',
+ connectionString: '',
+ };
+ const backend = new Backend(store, credentials, mockIpc);
+ return { store, mockIpc, backend };
+}
+
+// chai and async aren't the best of friends. To allow us
+// to get the assertion error in the output of failed async
+// tests we need to do this try-catch thing.
+export function check(fn: Check, done: DoneCallback) {
+ try {
+ fn();
+ done();
+ } catch (e) {
+ done(e);
+ }
+}
+
+// Sometimes with redux we cannot know when all reducers have
+// finished running. This function puts the check at the end
+// of the execution queue, hopefully resulting in the check being
+// run after the reducers are finished
+export function checkNextTick(fn: Check, done: DoneCallback) {
+ setTimeout(() => {
+ check(fn, done);
+ }, 1);
+}
+
+
+// In async tests where we want to test a chain of IPC messages
+// we can only invoke `done` for the last message. This function
+// is for the intermediate messages.
+export function failFast(fn: Check, done: DoneCallback): boolean {
+ try {
+ fn();
+ return false;
+ } catch(e) {
+ done(e);
+ return true;
+ }
+}
+export function failFastNextTick(fn: Check, done: DoneCallback) {
+ setTimeout(() => {
+ failFast(fn, done);
+ }, 1);
+}
+
+type MockStore = {
+ getActions: () => Array<{type: string, payload: Object}>,
+}
+// Parses the action log to find out which URL we most recently navigated to
+// Note that this cannot be done with the real redux store, but rather must be
+// done with the mock store.
+export function getLocation(store: MockStore): ?string {
+ const navigations = store.getActions().filter(action => action.type === '@@router/CALL_HISTORY_METHOD');
+ if (navigations.length === 0) {
+ return null;
+ }
+
+ return navigations[navigations.length - 1].payload.args[0];
+}
+
diff --git a/test/ipc.spec.js b/test/ipc.spec.js
new file mode 100644
index 0000000000..6e02ab94b1
--- /dev/null
+++ b/test/ipc.spec.js
@@ -0,0 +1,138 @@
+// @flow
+
+import Ipc from '../app/lib/jsonrpc-ws-ipc.js';
+import jsonrpc from 'jsonrpc-lite';
+import { expect } from 'chai';
+import assert from 'assert';
+import type { JsonRpcMessage } from '../app/lib/jsonrpc-ws-ipc.js';
+
+describe('The IPC server', () => {
+
+ it('should send as soon as the websocket connects', () => {
+ const { ws, ipc } = setupIpc();
+ ws.close();
+
+ let sent = false;
+ const p = ipc.send('hello')
+ .then(() => {
+ expect(sent).to.be.true;
+ });
+
+ ws.on('hello', (msg) => {
+ sent = true;
+
+ ws.replyOk(msg.id);
+ });
+ ws.acceptConnection();
+
+ return p;
+ });
+
+ it('should reject failed jsonrpc requests', () => {
+ const { ws, ipc } = setupIpc();
+ ws.on('WHAT_IS_THIS', (msg) => {
+ ws.replyFail(msg.id, 'Method not found', -32601);
+ });
+
+ return ipc.send('WHAT_IS_THIS')
+ .catch((e) => {
+ expect(e.code).to.equal(-32601);
+ expect(e.message).to.contain('Method not found');
+ });
+ });
+
+ it('should route reply to correct promise', () => {
+ const { ws, ipc } = setupIpc();
+
+ ws.on('a message', (msg) => ws.replyOk(msg.id, 'a reply'));
+
+ const decoy = ipc.send('a decoy', [], 1)
+ .then(() => assert(false, 'Should not be called'))
+ .catch(e => {
+ if (e.name !== 'TimeOutError') {
+ throw e;
+ }
+ });
+ const message = ipc.send('a message', [], 1)
+ .then((reply) => expect(reply).to.equal('a reply'));
+
+ return Promise.all([message, decoy]);
+ });
+
+ it('should timeout if no response is returned', () => {
+ const { ipc } = setupIpc();
+
+ return ipc.send('a message', [], 1)
+ .catch((e) => {
+ expect(e.name).to.equal('TimeOutError');
+ expect(e.message).to.contain('timed out');
+ });
+ });
+
+ it('should route notifications', (done) => {
+ const { ws, ipc } = setupIpc();
+
+ const eventListener = (event) => {
+ try {
+ expect(event).to.equal('an event!');
+ done();
+ } catch (ex) {
+ done(ex);
+ }
+ };
+
+ ws.on('event_subscribe', (msg) => ws.replyOk(msg.id, 1));
+ ipc.on('event', eventListener)
+ .then(() => {
+ ws.reply(jsonrpc.notification('event', {subscription:1, result: 'an event!'}));
+ })
+ .catch((e) => done(e));
+ });
+});
+
+function mockWebsocket() {
+ const ws : any = {
+ listeners: {},
+ readyState: 1,
+ };
+
+ ws.on = (event, listener) => ws.listeners[event] = listener;
+ ws.send = (data) => {
+ const listener = ws.listeners[data.method];
+ if (listener) {
+ listener(data);
+ }
+ };
+
+ ws.factory = () => ws;
+
+ ws.acceptConnection = () => {
+ ws.readyState = 1;
+ ws.onopen();
+ };
+ ws.close = () => {
+ ws.readyState = 3;
+ ws.onclose();
+ };
+
+ ws.reply = (msg: JsonRpcMessage) => {
+ ws.onmessage({data: JSON.stringify(msg)});
+ };
+ ws.replyOk = (id: string, msg) => {
+ ws.reply(jsonrpc.success(id, msg || ''));
+ };
+ ws.replyFail = (id: string, msg: string, code: number) => {
+ ws.reply(jsonrpc.error(id, new jsonrpc.JsonRpcError(msg, code)));
+ };
+
+ return ws;
+}
+
+function setupIpc() {
+ const ws = mockWebsocket();
+ return {
+ ws: ws,
+ ipc: new Ipc('1.2.3.4', ws.factory),
+ };
+}
+
diff --git a/test/keyframe-animation.spec.js b/test/keyframe-animation.spec.js
new file mode 100644
index 0000000000..539efb858c
--- /dev/null
+++ b/test/keyframe-animation.spec.js
@@ -0,0 +1,250 @@
+import { expect } from 'chai';
+import KeyframeAnimation from '../app/lib/keyframe-animation';
+import { nativeImage } from 'electron';
+
+describe('lib/keyframe-animation', function() {
+ this.timeout(1000);
+
+ const newAnimation = () => {
+ const images = [1, 2, 3, 4, 5].map(() => nativeImage.createEmpty());
+ const animation = new KeyframeAnimation(images);
+ animation.speed = 1;
+ return animation;
+ };
+
+ it('should play sequence', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([0, 1, 2, 3, 4]);
+ expect(animation._currentFrame).to.be.equal(4);
+ done();
+ };
+
+ animation.play();
+ });
+
+ it('should play one frame', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([3]);
+ expect(animation._currentFrame).to.be.equal(3);
+ done();
+ };
+
+ animation.play({ startFrame: 3, endFrame: 3 });
+ });
+
+ it('should play sequence with custom frames', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([2, 3, 4]);
+ expect(animation._currentFrame).to.be.equal(4);
+ done();
+ };
+
+ animation.play({
+ startFrame: 2,
+ endFrame: 4
+ });
+ });
+
+ it('should play sequence with custom frames in reverse', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([4, 3, 2]);
+ expect(animation._currentFrame).to.be.equal(2);
+ done();
+ };
+
+ animation.reverse = true;
+ animation.play({
+ startFrame: 4,
+ endFrame: 2
+ });
+ });
+
+ it('should begin from current state starting below range', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([0, 1, 2, 3, 4]);
+ expect(animation._currentFrame).to.be.equal(4);
+ done();
+ };
+
+ animation._currentFrame = 0;
+ animation._isFirstRun = false;
+
+ animation.play({
+ beginFromCurrentState: true,
+ startFrame: 3,
+ endFrame: 4
+ });
+ });
+
+ it('should begin from current state starting below range reverse', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([0, 1, 2, 3]);
+ expect(animation._currentFrame).to.be.equal(3);
+ done();
+ };
+
+ animation._currentFrame = 0;
+ animation._isFirstRun = false;
+ animation.reverse = true;
+
+ animation.play({
+ beginFromCurrentState: true,
+ startFrame: 3,
+ endFrame: 4
+ });
+ });
+
+ it('should begin from current state starting above range', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([4, 3, 2]);
+ expect(animation._currentFrame).to.be.equal(2);
+ done();
+ };
+
+ animation._currentFrame = 4;
+ animation._isFirstRun = false;
+
+ animation.play({
+ beginFromCurrentState: true,
+ startFrame: 1,
+ endFrame: 2
+ });
+ });
+
+ it('should begin from current state starting above range reverse', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([4, 3, 2, 1]);
+ expect(animation._currentFrame).to.be.equal(1);
+ done();
+ };
+
+ animation._currentFrame = 4;
+ animation._isFirstRun = false;
+ animation.reverse = true;
+
+ animation.play({
+ beginFromCurrentState: true,
+ startFrame: 1,
+ endFrame: 3
+ });
+ });
+
+ it('should play sequence in reverse', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ animation.onFrame = () => seq.push(animation._currentFrame);
+ animation.onFinish = () => {
+ expect(seq).to.be.deep.equal([4, 3, 2, 1, 0]);
+ expect(animation._currentFrame).to.be.equal(0);
+ done();
+ };
+
+ animation.reverse = true;
+ animation.play();
+ });
+
+ it('should play sequence on repeat', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ const expectedFrames = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4];
+
+ animation.onFrame = () => {
+ if(seq.length === expectedFrames.length) {
+ animation.stop();
+ expect(seq).to.be.deep.equal(expectedFrames);
+ done();
+ } else {
+ seq.push(animation._currentFrame);
+ }
+ };
+
+ animation.repeat = true;
+ animation.play();
+ });
+
+ it('should play sequence on repeat in reverse', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ const expectedFrames = [4, 3, 2, 1, 0, 4, 3, 2, 1, 0];
+
+ animation.onFrame = () => {
+ if(seq.length === expectedFrames.length) {
+ animation.stop();
+ expect(seq).to.be.deep.equal(expectedFrames);
+ done();
+ } else {
+ seq.push(animation._currentFrame);
+ }
+ };
+
+ animation.repeat = true;
+ animation.reverse = true;
+ animation.play();
+ });
+
+ it('should alternate sequence', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ const expectedFrames = [0, 1, 2, 3, 4, 3, 2, 1, 0];
+
+ animation.onFrame = () => {
+ if(seq.length === expectedFrames.length) {
+ animation.stop();
+ expect(seq).to.be.deep.equal(expectedFrames);
+ done();
+ } else {
+ seq.push(animation._currentFrame);
+ }
+ };
+
+ animation.repeat = true;
+ animation.alternate = true;
+ animation.play();
+ });
+
+ it('should alternate reverse sequence', (done) => {
+ let seq = [];
+ const animation = newAnimation();
+ const expectedFrames = [4, 3, 2, 1, 0, 1, 2, 3, 4];
+
+ animation.onFrame = () => {
+ if(seq.length === expectedFrames.length) {
+ animation.stop();
+ expect(seq).to.be.deep.equal(expectedFrames);
+ done();
+ } else {
+ seq.push(animation._currentFrame);
+ }
+ };
+
+ animation.repeat = true;
+ animation.reverse = true;
+ animation.alternate = true;
+ animation.play();
+ });
+
+}); \ No newline at end of file
diff --git a/test/login.spec.js b/test/login.spec.js
new file mode 100644
index 0000000000..1efe89ae38
--- /dev/null
+++ b/test/login.spec.js
@@ -0,0 +1,85 @@
+// @flow
+
+import { expect } from 'chai';
+import { setupBackendAndStore, setupBackendAndMockStore, checkNextTick, getLocation, failFast, check } from './helpers/ipc-helpers';
+import { IpcChain } from './helpers/IpcChain';
+import accountActions from '../app/redux/account/actions';
+
+describe('Logging in', () => {
+
+ it('should validate the account number and then set it in the backend', (done) => {
+ const { store, mockIpc, backend } = setupBackendAndStore();
+
+ const chain = new IpcChain(mockIpc);
+ chain.require('getAccountData')
+ .withInputValidation((an) => {
+ expect(an).to.equal('123');
+ })
+ .done();
+
+ chain.require('setAccount')
+ .withInputValidation((an) => {
+ expect(an).to.equal('123');
+ })
+ .done();
+
+ chain.onSuccessOrFailure(done);
+
+ store.dispatch(accountActions.login(backend, '123'));
+ });
+
+ it('should put the account data in the state', () => {
+ const { store, backend, mockIpc } = setupBackendAndStore();
+ mockIpc.getAccountData = () => new Promise(r => r({
+ expiry: '2001-01-01T00:00:00Z',
+ }));
+
+ return backend.login('123')
+ .then( () => {
+ const state = store.getState().account;
+ expect(state.status).to.equal('ok');
+ expect(state.accountToken).to.equal('123');
+ expect(state.expiry).to.equal('2001-01-01T00:00:00Z');
+ });
+ });
+
+ it('should indicate failure for non-existing accounts', (done) => {
+ const { store, mockIpc, backend } = setupBackendAndStore();
+
+ mockIpc.getAccountData = (_num) => new Promise((_, reject) => {
+ reject('NO SUCH ACCOUNT');
+ });
+
+
+ store.dispatch(accountActions.login(backend, '123'));
+
+ checkNextTick(() => {
+ const state = store.getState().account;
+ expect(state.status).to.equal('failed');
+ expect(state.error).to.not.be.null;
+ }, done);
+ });
+
+ it('should redirect to /connect after 1s after successful login', (done) => {
+ const { store, backend } = setupBackendAndMockStore();
+
+ store.dispatch(accountActions.login(backend, '123'));
+
+ setTimeout(() => {
+
+ failFast(() => {
+ expect(getLocation(store)).not.to.equal('/connect');
+ }, done);
+
+ }, 100);
+
+
+ setTimeout(() => {
+
+ check(() => {
+ expect(getLocation(store)).to.equal('/connect');
+ }, done);
+
+ }, 1100);
+ });
+});
diff --git a/test/logout.spec.js b/test/logout.spec.js
new file mode 100644
index 0000000000..0e295aef9b
--- /dev/null
+++ b/test/logout.spec.js
@@ -0,0 +1,66 @@
+// @flow
+
+import { expect } from 'chai';
+import { setupBackendAndStore, setupBackendAndMockStore, getLocation, checkNextTick, failFastNextTick } from './helpers/ipc-helpers';
+import { IpcChain } from './helpers/IpcChain';
+import accountActions from '../app/redux/account/actions';
+
+describe('logging out', () => {
+
+ it('should set the account to null and then disconnect', (done) => {
+ const { mockIpc, backend } = setupBackendAndStore();
+
+ const chain = new IpcChain(mockIpc);
+ chain.require('setAccount')
+ .withInputValidation((num) => {
+ expect(num).to.be.null;
+ })
+ .done();
+ chain.require('disconnect')
+ .done();
+ chain.onSuccessOrFailure(done);
+
+ backend.logout();
+ });
+
+
+ it('should remove the account number from the store', (done) => {
+
+ const { store, backend, mockIpc } = setupBackendAndStore();
+ mockIpc.getAccountData = () => new Promise(r => r({
+ expiry: '2001-01-01T00:00:00.000Z',
+ }));
+ const action: any = accountActions.login(backend, '123');
+ store.dispatch(action);
+
+ const expectedLogoutState = {
+ status: 'none',
+ accountToken: null,
+ expiry: null,
+ error: null,
+ };
+
+ failFastNextTick(() => {
+ let state = store.getState().account;
+ expect(state).not.to.include(expectedLogoutState);
+
+ backend.logout();
+
+ checkNextTick(() => {
+ state = store.getState().account;
+ expect(state).to.include(expectedLogoutState);
+ }, done);
+ }, done);
+ });
+
+
+ it('should redirect to / on logout', (done) => {
+ const { store, backend } = setupBackendAndMockStore();
+
+ backend.logout();
+
+ checkNextTick(() => {
+ expect(getLocation(store)).to.equal('/');
+ }, done);
+ });
+});
diff --git a/test/mocks/ipc.js b/test/mocks/ipc.js
new file mode 100644
index 0000000000..67c11c7366
--- /dev/null
+++ b/test/mocks/ipc.js
@@ -0,0 +1,84 @@
+// @flow
+import type { IpcFacade, BackendState } from '../../app/lib/ipc-facade';
+
+interface MockIpc {
+ sendNewState: (BackendState) => void;
+ killWebSocket: () => void;
+ -getAccountData: *;
+ -connect: *;
+ -getAccount: *;
+ -authenticate: *;
+}
+
+export function newMockIpc() {
+
+ const stateListeners = [];
+ const connectionCloseListeners = [];
+
+ const mockIpc: IpcFacade & MockIpc = {
+
+ setConnectionString: (_str: string) => {},
+
+ getAccountData: (accountToken) => Promise.resolve({
+ accountToken: accountToken,
+ expiry: '',
+ }),
+
+ getAccount: () => Promise.resolve('1111'),
+
+ setAccount: () => Promise.resolve(),
+
+ updateRelayConstraints: () => Promise.resolve(),
+
+ getRelayContraints: () => Promise.resolve({
+ host: { only: 'www.example.com' },
+ tunnel: { openvpn: {
+ port: 'any',
+ protocol: 'any',
+ }},
+ }),
+
+ connect: () => Promise.resolve(),
+
+ disconnect: () => Promise.resolve(),
+
+ shutdown: () => Promise.resolve(),
+
+ getIp: () => Promise.resolve('1.2.3.4'),
+
+ getLocation: () => Promise.resolve({
+ city: '',
+ country: '',
+ latlong: [0, 0],
+ }),
+
+ getState: () => Promise.resolve({
+ state: 'unsecured',
+ target_state:'unsecured',
+ }),
+
+ registerStateListener: (listener: (BackendState) => void) => {
+ stateListeners.push(listener);
+ },
+
+ sendNewState: (state: BackendState) => {
+ for(const l of stateListeners) {
+ l(state);
+ }
+ },
+
+ authenticate: (_secret: string) => Promise.resolve(),
+
+ setCloseConnectionHandler: (listener: () => void) => {
+ connectionCloseListeners.push(listener);
+ },
+
+ killWebSocket: () => {
+ for(const l of connectionCloseListeners) {
+ l();
+ }
+ }
+ };
+
+ return mockIpc;
+}
diff --git a/test/mocks/redux.js b/test/mocks/redux.js
new file mode 100644
index 0000000000..71dafc7f1f
--- /dev/null
+++ b/test/mocks/redux.js
@@ -0,0 +1,42 @@
+import configureMockStore from 'redux-mock-store';
+import thunk from 'redux-thunk';
+import { defaultServer } from '../../app/config';
+
+const middlewares = [ thunk ];
+export const mockStore = configureMockStore(middlewares);
+export const mockState = () => {
+ return {
+ account: {
+ accountToken: null,
+ status: 'none',
+ error: null
+ },
+ connection: {
+ status: 'disconnected',
+ serverAddress: null,
+ clientIp: null
+ },
+ settings: {
+ autoSecure: false,
+ preferredServer: defaultServer
+ }
+ };
+};
+
+export const filterMinorActions = (actions) => {
+ return actions.filter((action) => {
+ if(action.type === 'CONNECTION_CHANGE' && action.payload.clientIp) {
+ return false;
+ }
+
+ if(action.type === 'CONNECTION_CHANGE' && action.payload.isOnline) {
+ return false;
+ }
+
+ if(action.type === 'USER_LOGIN_CHANGE' && action.payload.city) {
+ return false;
+ }
+
+ return true;
+ });
+};
diff --git a/test/setup/main.js b/test/setup/main.js
new file mode 100644
index 0000000000..dd458a30b6
--- /dev/null
+++ b/test/setup/main.js
@@ -0,0 +1,4 @@
+const log = require('electron-log');
+
+log.transports.console.level = false;
+log.transports.file.level = false;
diff --git a/test/transition-rule.spec.js b/test/transition-rule.spec.js
new file mode 100644
index 0000000000..647517ca5d
--- /dev/null
+++ b/test/transition-rule.spec.js
@@ -0,0 +1,58 @@
+// @flow
+import { expect } from 'chai';
+import TransitionRule from '../app/lib/transition-rule';
+
+describe('TransitionRule', () => {
+ const testTransition = {
+ forward: { name: 'forward', duration: 0.25 },
+ backward: { name: 'backward', duration: 0.25 }
+ };
+
+ it('should match wildcard rule', () => {
+ const rule = new TransitionRule(null, '/route', testTransition);
+
+ expect(rule.match(null, '/route')).to.deep.equal({
+ direction: 'forward',
+ descriptor: { name: 'forward', duration: 0.25 }
+ });
+
+ expect(rule.match('/somewhere', '/route')).to.deep.equal({
+ direction: 'forward',
+ descriptor: { name: 'forward', duration: 0.25 }
+ });
+ });
+
+ it('should match wildcard rule reversion', () => {
+ const rule = new TransitionRule(null, '/route', testTransition);
+
+ expect(rule.match('/route', '/other')).to.deep.equal({
+ direction: 'backward',
+ descriptor: { name: 'backward', duration: 0.25 }
+ });
+ });
+
+ it('should match exact rule', () => {
+ const rule = new TransitionRule('/route1', '/route2', testTransition);
+
+ expect(rule.match('/other', '/route1')).to.be.null;
+ expect(rule.match('/other', '/route2')).to.be.null;
+
+ expect(rule.match('/route1', '/route2')).to.deep.equal({
+ direction: 'forward',
+ descriptor: { name: 'forward', duration: 0.25 }
+ });
+ });
+
+ it('should match exact rule reversion', () => {
+ const rule = new TransitionRule('/route1', '/route2', testTransition);
+
+ expect(rule.match('/route1', '/other')).to.be.null;
+ expect(rule.match('/route2', '/other')).to.be.null;
+
+ expect(rule.match('/route2', '/route1')).to.deep.equal({
+ direction: 'backward',
+ descriptor: { name: 'backward', duration: 0.25 }
+ });
+ });
+
+}); \ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000..c8593120de
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,6262 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"7zip-bin-linux@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/7zip-bin-linux/-/7zip-bin-linux-1.1.0.tgz#2ca309fd6a2102e18bd81e3a5d91b39db9adab71"
+
+"7zip-bin-mac@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz#3e68778bbf0926adc68159427074505d47555c02"
+
+"7zip-bin-win@^2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz#8acfc28bb34e53a9476b46ae85a97418e6035c20"
+
+"7zip-bin@^2.2.7":
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-2.2.7.tgz#724802b8d6bda0bf2cfe61a4b86a820efc8ece93"
+ optionalDependencies:
+ "7zip-bin-linux" "^1.1.0"
+ "7zip-bin-mac" "^1.0.1"
+ "7zip-bin-win" "^2.1.1"
+
+"7zip@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30"
+
+"@mapbox/gl-matrix@^0.0.1":
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/@mapbox/gl-matrix/-/gl-matrix-0.0.1.tgz#e5126aab4d64c36b81c7a97d0ae0dddde5773d2b"
+
+"@mapbox/shelf-pack@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@mapbox/shelf-pack/-/shelf-pack-3.0.0.tgz#44e284c8336eeda1e9dbbb1d61954c70e26e5766"
+
+"@mapbox/unitbezier@^0.0.0":
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e"
+
+"@mapbox/whoots-js@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.0.0.tgz#c1de4293081424da3ac30c23afa850af1019bb54"
+
+"@turf/bbox@^4.4.0":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-4.5.2.tgz#1a6c6e7d0ea03b26cbc14d46e6df408ae3ddf87a"
+ dependencies:
+ "@turf/meta" "^4.5.2"
+
+"@turf/helpers@^4.4.0":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-4.5.2.tgz#6fc6772a7b301f277b49732925c354c7fb85d1df"
+
+"@turf/meta@^4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-4.5.2.tgz#8450fc442d2a59494251a5a52ae520017e2dcf0d"
+
+"@types/node@^7.0.18":
+ version "7.0.29"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.29.tgz#ccfcec5b7135c7caf6c4ffb8c7f33102340d99df"
+
+abbrev@1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
+accepts@1.3.3, accepts@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+ dependencies:
+ mime-types "~2.1.11"
+ negotiator "0.6.1"
+
+acorn-jsx@^3.0.0, acorn-jsx@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ dependencies:
+ acorn "^3.0.4"
+
+acorn-object-spread@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-object-spread/-/acorn-object-spread-1.0.0.tgz#48ead0f4a8eb16995a17a0db9ffc6acaada4ba68"
+ dependencies:
+ acorn "^3.1.0"
+
+acorn@^1.0.3:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014"
+
+acorn@^3.0.4, acorn@^3.1.0, acorn@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.0:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
+
+add-px-to-style@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/add-px-to-style/-/add-px-to-style-1.0.0.tgz#d0c135441fa8014a8137904531096f67f28f263a"
+
+after@0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627"
+
+agent-base@2:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
+ dependencies:
+ extend "~3.0.0"
+ semver "~5.0.1"
+
+ajv-keywords@^1.0.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv-keywords@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0"
+
+ajv@^4.7.0, ajv@^4.9.1:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+ajv@^5.2.3:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2"
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ json-schema-traverse "^0.3.0"
+ json-stable-stringify "^1.0.1"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-align@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+ dependencies:
+ string-width "^2.0.0"
+
+ansi-escapes@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.1.0.tgz#09c202d5c917ec23188caa5c9cb9179cd9547750"
+ dependencies:
+ color-convert "^1.0.0"
+
+anymatch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+ dependencies:
+ arrify "^1.0.0"
+ micromatch "^2.1.5"
+
+app-package-builder@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/app-package-builder/-/app-package-builder-1.2.1.tgz#59465e88c114af32e714ce5e65fade6920dd79cf"
+ dependencies:
+ bluebird-lst "^1.0.4"
+ builder-util "^3.0.12"
+ builder-util-runtime "^2.0.1"
+ fs-extra-p "^4.4.4"
+ int64-buffer "^0.1.9"
+ js-yaml "^3.10.0"
+ rabin-bindings "~1.7.3"
+
+aproba@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arraybuffer.slice@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asar-integrity@0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.2.2.tgz#ccfacebc3e417a23c65b0549b9824f10684ad9a2"
+ dependencies:
+ bluebird-lst "^1.0.4"
+ fs-extra-p "^4.4.3"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assertion-error@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c"
+
+async-each-series@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-exit-hook@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3"
+
+async@1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-cli@^6.22.2:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283"
+ dependencies:
+ babel-core "^6.24.1"
+ babel-polyfill "^6.23.0"
+ babel-register "^6.24.1"
+ babel-runtime "^6.22.0"
+ commander "^2.8.1"
+ convert-source-map "^1.1.0"
+ fs-readdir-recursive "^1.0.0"
+ glob "^7.0.0"
+ lodash "^4.2.0"
+ output-file-sync "^1.1.0"
+ path-is-absolute "^1.0.0"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+ v8flags "^2.0.10"
+ optionalDependencies:
+ chokidar "^1.6.1"
+
+babel-code-frame@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+ dependencies:
+ chalk "^1.1.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+babel-core@^6.24.1, babel-core@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-generator "^6.25.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.25.0"
+ babel-traverse "^6.25.0"
+ babel-types "^6.25.0"
+ babylon "^6.17.2"
+ convert-source-map "^1.1.0"
+ debug "^2.1.1"
+ json5 "^0.5.0"
+ lodash "^4.2.0"
+ minimatch "^3.0.2"
+ path-is-absolute "^1.0.0"
+ private "^0.1.6"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+
+babel-eslint@^7.1.1:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-traverse "^6.23.1"
+ babel-types "^6.23.0"
+ babylon "^6.17.0"
+
+babel-generator@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.25.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.2.0"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+babel-helper-bindify-decorators@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ esutils "^2.0.0"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-explode-class@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
+ dependencies:
+ babel-helper-bindify-decorators "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-inline-react-svg@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-inline-react-svg/-/babel-plugin-inline-react-svg-0.4.0.tgz#940f77be66324f2c75a0fb64f287f459c40602a7"
+ dependencies:
+ babel-template "^6.15.0"
+ babel-traverse "^6.15.0"
+ babylon "^6.10.0"
+ lodash.isplainobject "^4.0.6"
+ resolve-from "^2.0.0"
+ svgo "^0.7.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-async-generators@^6.5.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
+
+babel-plugin-syntax-class-constructor-call@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
+
+babel-plugin-syntax-class-properties@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-decorators@^6.13.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
+
+babel-plugin-syntax-do-expressions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d"
+
+babel-plugin-syntax-dynamic-import@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-export-extensions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
+
+babel-plugin-syntax-flow@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-function-bind@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46"
+
+babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-generator-functions@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-generators "^6.5.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-class-constructor-call@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9"
+ dependencies:
+ babel-plugin-syntax-class-constructor-call "^6.18.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-class-properties@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-plugin-syntax-class-properties "^6.8.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-decorators@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
+ dependencies:
+ babel-helper-explode-class "^6.24.1"
+ babel-plugin-syntax-decorators "^6.13.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-do-expressions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb"
+ dependencies:
+ babel-plugin-syntax-do-expressions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-export-extensions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
+ dependencies:
+ babel-plugin-syntax-export-extensions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-function-bind@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97"
+ dependencies:
+ babel-plugin-syntax-function-bind "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-display-name@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-self@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+ dependencies:
+ babel-helper-builder-react-jsx "^6.24.1"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
+ dependencies:
+ regenerator-transform "0.9.11"
+
+babel-plugin-transform-runtime@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-polyfill@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-preset-es2015@^6.1.18:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.24.1"
+ babel-plugin-transform-es2015-classes "^6.24.1"
+ babel-plugin-transform-es2015-computed-properties "^6.24.1"
+ babel-plugin-transform-es2015-destructuring "^6.22.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+ babel-plugin-transform-es2015-for-of "^6.22.0"
+ babel-plugin-transform-es2015-function-name "^6.24.1"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-umd "^6.24.1"
+ babel-plugin-transform-es2015-object-super "^6.24.1"
+ babel-plugin-transform-es2015-parameters "^6.24.1"
+ babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+ babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-flow@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
+ dependencies:
+ babel-plugin-transform-flow-strip-types "^6.22.0"
+
+babel-preset-react@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.3.13"
+ babel-plugin-transform-react-display-name "^6.23.0"
+ babel-plugin-transform-react-jsx "^6.24.1"
+ babel-plugin-transform-react-jsx-self "^6.22.0"
+ babel-plugin-transform-react-jsx-source "^6.22.0"
+ babel-preset-flow "^6.23.0"
+
+babel-preset-stage-0@^6.1.18:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a"
+ dependencies:
+ babel-plugin-transform-do-expressions "^6.22.0"
+ babel-plugin-transform-function-bind "^6.22.0"
+ babel-preset-stage-1 "^6.24.1"
+
+babel-preset-stage-1@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
+ dependencies:
+ babel-plugin-transform-class-constructor-call "^6.24.1"
+ babel-plugin-transform-export-extensions "^6.22.0"
+ babel-preset-stage-2 "^6.24.1"
+
+babel-preset-stage-2@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
+ dependencies:
+ babel-plugin-syntax-dynamic-import "^6.18.0"
+ babel-plugin-transform-class-properties "^6.24.1"
+ babel-plugin-transform-decorators "^6.24.1"
+ babel-preset-stage-3 "^6.24.1"
+
+babel-preset-stage-3@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
+ dependencies:
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-generator-functions "^6.24.1"
+ babel-plugin-transform-async-to-generator "^6.24.1"
+ babel-plugin-transform-exponentiation-operator "^6.24.1"
+ babel-plugin-transform-object-rest-spread "^6.22.0"
+
+babel-register@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
+ dependencies:
+ babel-core "^6.24.1"
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.2"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-template@^6.15.0, babel-template@^6.24.1, babel-template@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.25.0"
+ babel-types "^6.25.0"
+ babylon "^6.17.2"
+ lodash "^4.2.0"
+
+babel-traverse@^6.15.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.25.0"
+ babylon "^6.17.2"
+ debug "^2.2.0"
+ globals "^9.0.0"
+ invariant "^2.2.0"
+ lodash "^4.2.0"
+
+babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^1.0.1"
+
+babylon@^6.10.0, babylon@^6.15.0, babylon@^6.17.0, babylon@^6.17.2:
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c"
+
+backo2@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+base64-arraybuffer@0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784"
+
+base64-js@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64id@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f"
+
+batch@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+ dependencies:
+ callsite "1.0.0"
+
+binary-extensions@^1.0.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
+"binary@>= 0.3.0 < 1":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79"
+ dependencies:
+ buffers "~0.1.1"
+ chainsaw "~0.1.0"
+
+bindings@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
+
+bindings@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
+
+bl@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
+ dependencies:
+ readable-stream "^2.0.5"
+
+blob@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ dependencies:
+ inherits "~2.0.0"
+
+bluebird-lst@^1.0.2, bluebird-lst@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.3.tgz#cc56c18660eff0a0b86e2c33d1659618f7005158"
+ dependencies:
+ bluebird "^3.5.0"
+
+bluebird-lst@^1.0.4, bluebird-lst@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.5.tgz#bebc83026b7e92a72871a3dc599e219cbfb002a9"
+ dependencies:
+ bluebird "^3.5.1"
+
+bluebird@^3.4.6, bluebird@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
+
+bluebird@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boom@2.x.x:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+ dependencies:
+ hoek "2.x.x"
+
+bops@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.6.tgz#082d1d55fa01e60dbdc2ebc2dba37f659554cf3a"
+ dependencies:
+ base64-js "0.0.2"
+ to-utf8 "0.0.1"
+
+boxen@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.2.tgz#3f1d4032c30ffea9d4b02c322eaf2ea741dcbce5"
+ dependencies:
+ ansi-align "^2.0.0"
+ camelcase "^4.0.0"
+ chalk "^2.0.1"
+ cli-boxes "^1.0.0"
+ string-width "^2.0.0"
+ term-size "^1.2.0"
+ widest-line "^1.0.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
+ dependencies:
+ balanced-match "^0.4.1"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+brfs@^1.4.0:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.4.3.tgz#db675d6f5e923e6df087fca5859c9090aaed3216"
+ dependencies:
+ quote-stream "^1.0.1"
+ resolve "^1.1.5"
+ static-module "^1.1.0"
+ through2 "^2.0.0"
+
+browser-stdout@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
+
+browser-sync-client@2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.5.1.tgz#ec1ad69a49c2e2d4b645b18b1c06c29b3d9af8eb"
+ dependencies:
+ etag "^1.7.0"
+ fresh "^0.3.0"
+
+browser-sync-ui@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz#640a537c180689303d5be92bc476b9ebc441c0bc"
+ dependencies:
+ async-each-series "0.1.1"
+ connect-history-api-fallback "^1.1.0"
+ immutable "^3.7.6"
+ server-destroy "1.0.1"
+ stream-throttle "^0.1.3"
+ weinre "^2.0.0-pre-I0Z7U9OV"
+
+browser-sync@^2.9.3:
+ version "2.18.12"
+ resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.12.tgz#bbaa0a17a961e2b5f0a8e760e695027186664779"
+ dependencies:
+ browser-sync-client "2.5.1"
+ browser-sync-ui "0.6.3"
+ bs-recipes "1.3.4"
+ chokidar "1.7.0"
+ connect "3.5.0"
+ dev-ip "^1.0.1"
+ easy-extender "2.3.2"
+ eazy-logger "3.0.2"
+ emitter-steward "^1.0.0"
+ fs-extra "3.0.1"
+ http-proxy "1.15.2"
+ immutable "3.8.1"
+ localtunnel "1.8.2"
+ micromatch "2.3.11"
+ opn "4.0.2"
+ portscanner "2.1.1"
+ qs "6.2.1"
+ resp-modifier "6.0.2"
+ rx "4.1.0"
+ serve-index "1.8.0"
+ serve-static "1.12.2"
+ server-destroy "1.0.1"
+ socket.io "1.6.0"
+ socket.io-client "1.6.0"
+ ua-parser-js "0.7.12"
+ yargs "6.4.0"
+
+browserify-package-json@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea"
+
+bs-recipes@1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585"
+
+buble@^0.12.0:
+ version "0.12.5"
+ resolved "https://registry.yarnpkg.com/buble/-/buble-0.12.5.tgz#c66ffe92f9f4a3c65d3256079b711e2bd0bc5013"
+ dependencies:
+ acorn "^3.1.0"
+ acorn-jsx "^3.0.1"
+ acorn-object-spread "^1.0.0"
+ chalk "^1.1.3"
+ magic-string "^0.14.0"
+ minimist "^1.2.0"
+ os-homedir "^1.0.1"
+
+buble@^0.15.1:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/buble/-/buble-0.15.2.tgz#547fc47483f8e5e8176d82aa5ebccb183b02d613"
+ dependencies:
+ acorn "^3.3.0"
+ acorn-jsx "^3.0.1"
+ acorn-object-spread "^1.0.0"
+ chalk "^1.1.3"
+ magic-string "^0.14.0"
+ minimist "^1.2.0"
+ os-homedir "^1.0.1"
+
+bubleify@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-0.5.1.tgz#f65c47cee31b80cad8b9e747bbe187d7fe51e927"
+ dependencies:
+ buble "^0.12.0"
+ object-assign "^4.0.1"
+
+bubleify@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-0.7.0.tgz#d08ea642ffd085ff8711c8843f57072f0d5eb8f6"
+ dependencies:
+ buble "^0.15.1"
+ object-assign "^4.0.1"
+
+buffer-equal@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
+
+buffers@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
+
+builder-util-runtime@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-2.1.0.tgz#82362a92e202ee8315334391bbb23b2ea9099765"
+ dependencies:
+ bluebird-lst "^1.0.4"
+ debug "^3.1.0"
+ fs-extra-p "^4.4.4"
+ sax "^1.2.4"
+
+builder-util-runtime@^2.0.1, builder-util-runtime@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-2.3.0.tgz#1d4ba8b38335907bd43e3a14ab7c8b0a701cff25"
+ dependencies:
+ bluebird-lst "^1.0.5"
+ debug "^3.1.0"
+ fs-extra-p "^4.4.4"
+ sax "^1.2.4"
+
+builder-util@3.0.12:
+ version "3.0.12"
+ resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.0.12.tgz#01e822becee89b9660b4aaa42250e11920923ab9"
+ dependencies:
+ "7zip-bin" "^2.2.7"
+ bluebird-lst "^1.0.4"
+ builder-util-runtime "^2.0.1"
+ chalk "^2.1.0"
+ debug "^3.1.0"
+ fs-extra-p "^4.4.4"
+ ini "^1.3.4"
+ is-ci "^1.0.10"
+ js-yaml "^3.10.0"
+ lazy-val "^1.0.2"
+ node-emoji "^1.8.1"
+ semver "^5.4.1"
+ source-map-support "^0.5.0"
+ stat-mode "^0.2.2"
+ temp-file "^2.0.3"
+ tunnel-agent "^0.6.0"
+
+builder-util@^3.0.12:
+ version "3.0.13"
+ resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.0.13.tgz#f35612b06c546dac4d31c44317b992290a0e6b08"
+ dependencies:
+ "7zip-bin" "^2.2.7"
+ bluebird-lst "^1.0.5"
+ builder-util-runtime "^2.3.0"
+ chalk "2.1.0"
+ debug "^3.1.0"
+ fs-extra-p "^4.4.4"
+ ini "^1.3.4"
+ is-ci "^1.0.10"
+ js-yaml "^3.10.0"
+ lazy-val "^1.0.2"
+ node-emoji "^1.8.1"
+ semver "^5.4.1"
+ source-map-support "^0.5.0"
+ stat-mode "^0.2.2"
+ temp-file "^2.0.3"
+ tunnel-agent "^0.6.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+call-matcher@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.0.1.tgz#5134d077984f712a54dad3cbf62de28dce416ca8"
+ dependencies:
+ core-js "^2.0.0"
+ deep-equal "^1.0.0"
+ espurify "^1.6.0"
+ estraverse "^4.0.0"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ dependencies:
+ callsites "^0.2.0"
+
+callsite@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.0.0, camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+capture-stack-trace@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+caseless@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+chai@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.0.tgz#331a0391b55c3af8740ae9c3b7458bc1c3805e6d"
+ dependencies:
+ assertion-error "^1.0.1"
+ check-error "^1.0.1"
+ deep-eql "^2.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.0.0"
+ type-detect "^4.0.0"
+
+chain-function@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
+
+chainsaw@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
+ dependencies:
+ traverse ">=0.3.0 <0.4"
+
+chalk@2.1.0, chalk@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e"
+ dependencies:
+ ansi-styles "^3.1.0"
+ escape-string-regexp "^1.0.5"
+ supports-color "^4.0.0"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.2.0.tgz#477b3bf2f9b8fd5ca9e429747e37f724ee7af240"
+ dependencies:
+ ansi-styles "^3.1.0"
+ escape-string-regexp "^1.0.5"
+ supports-color "^4.0.0"
+
+charenc@~0.0.1:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+
+cheap-ruler@^2.4.1:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/cheap-ruler/-/cheap-ruler-2.5.0.tgz#776df3968090d9f36dfb34569fc6d7043b1a3aab"
+
+check-error@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+
+cheerio@^0.22.0:
+ version "0.22.0"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
+ dependencies:
+ css-select "~1.2.0"
+ dom-serializer "~0.1.0"
+ entities "~1.1.1"
+ htmlparser2 "^3.9.1"
+ lodash.assignin "^4.0.9"
+ lodash.bind "^4.1.4"
+ lodash.defaults "^4.0.1"
+ lodash.filter "^4.4.0"
+ lodash.flatten "^4.2.0"
+ lodash.foreach "^4.3.0"
+ lodash.map "^4.4.0"
+ lodash.merge "^4.4.0"
+ lodash.pick "^4.2.1"
+ lodash.reduce "^4.4.0"
+ lodash.reject "^4.4.0"
+ lodash.some "^4.4.0"
+
+chokidar@1.7.0, chokidar@^1.6.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chromium-pickle-js@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
+
+ci-info@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534"
+
+circular-json@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
+
+clap@^1.0.9:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.3.tgz#b3bd36e93dd4cbfb395a3c26896352445265c05b"
+ dependencies:
+ chalk "^1.1.3"
+
+cli-boxes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
+cliui@^3.0.3, cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.2.tgz#2ba9fec3b4aa43d7a49d7e6c3561e92061b6bcec"
+ dependencies:
+ q "^1.1.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+color-convert@^1.0.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+ dependencies:
+ color-name "^1.1.1"
+
+color-convert@~0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd"
+
+color-name@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d"
+
+colors@^1.1.2, colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.9.0, commander@^2.2.0, commander@^2.8.1, commander@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+compare-version@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
+
+component-bind@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
+component-emitter@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
+
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+component-inherit@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@1.6.0, concat-stream@^1.6.0, concat-stream@~1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+concat-stream@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.2.1.tgz#f35100b6c46378bfba8b6b80f9f0d0ccdf13dc60"
+ dependencies:
+ bops "0.0.6"
+
+configstore@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1"
+ dependencies:
+ dot-prop "^4.1.0"
+ graceful-fs "^4.1.2"
+ make-dir "^1.0.0"
+ unique-string "^1.0.0"
+ write-file-atomic "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+connect-history-api-fallback@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169"
+
+connect@1.x:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807"
+ dependencies:
+ formidable "1.0.x"
+ mime ">= 0.0.1"
+ qs ">= 0.4.0"
+
+connect@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198"
+ dependencies:
+ debug "~2.2.0"
+ finalhandler "0.5.0"
+ parseurl "~1.3.1"
+ utils-merge "1.0.0"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+convert-source-map@^1.1.0, convert-source-map@^1.1.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-js@^1.0.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+
+core-js@^2.0.0, core-js@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-error-class@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+ dependencies:
+ capture-stack-trace "^1.0.0"
+
+create-react-class@^15.5.3, create-react-class@^15.6.0:
+ version "15.6.0"
+ resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.0.tgz#ab448497c26566e1e29413e883207d57cfe7bed4"
+ dependencies:
+ fbjs "^0.8.9"
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
+cross-spawn@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-unzip@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f"
+
+crypt@~0.0.1:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+
+cryptiles@2.x.x:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+ dependencies:
+ boom "2.x.x"
+
+crypto-random-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+
+css-select@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-what@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+csso@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+ dependencies:
+ clap "^1.0.9"
+ source-map "^0.5.3"
+
+cuint@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ dependencies:
+ array-find-index "^1.0.1"
+
+custom-error-instance@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/custom-error-instance/-/custom-error-instance-2.1.1.tgz#3cf6391487a6629a6247eb0ca0ce00081b7e361a"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8:
+ version "2.6.8"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
+ dependencies:
+ ms "2.0.0"
+
+debug@2.2.0, debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
+debug@2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
+ dependencies:
+ ms "0.7.2"
+
+debug@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
+ dependencies:
+ ms "0.7.2"
+
+debug@2.6.4:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
+ dependencies:
+ ms "0.7.3"
+
+debug@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decompress-response@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-eql@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a"
+ dependencies:
+ type-detect "^3.0.0"
+
+deep-equal@^1.0.0, deep-equal@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+deep-extend@~0.4.0:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+del@^2.0.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+ dependencies:
+ globby "^5.0.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.0, depd@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+dev-ip@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0"
+
+diff@3.2.0, diff@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
+
+dmg-builder@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-2.1.2.tgz#a67418839f2d35fec7c4cfe45270b3ad1e08c03a"
+ dependencies:
+ bluebird-lst "^1.0.4"
+ builder-util "^3.0.12"
+ debug "^3.1.0"
+ fs-extra-p "^4.4.4"
+ iconv-lite "^0.4.19"
+ js-yaml "^3.10.0"
+ parse-color "^1.0.0"
+
+doctrine@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+dom-css@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/dom-css/-/dom-css-2.1.0.tgz#fdbc2d5a015d0a3e1872e11472bbd0e7b9e6a202"
+ dependencies:
+ add-px-to-style "1.0.0"
+ prefix-style "2.0.1"
+ to-camel-case "1.0.0"
+
+dom-helpers@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
+
+dom-serializer@0, dom-serializer@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+domelementtype@1, domelementtype@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@^2.3.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1, domutils@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1"
+ dependencies:
+ is-obj "^1.0.0"
+
+dotenv-expand@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.0.1.tgz#68fddc1561814e0a10964111057ff138ced7d7a8"
+
+dotenv@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d"
+
+duplexer2@~0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+ dependencies:
+ readable-stream "~1.1.9"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexer@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+
+earcut@^2.0.3:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.1.1.tgz#157634e5f3ebb42224e475016e86a5b6ce556b45"
+
+easy-extender@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.2.tgz#3d3248febe2b159607316d8f9cf491c16648221d"
+ dependencies:
+ lodash "^3.10.1"
+
+eazy-logger@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc"
+ dependencies:
+ tfunk "^3.0.1"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+ejs@^2.5.7:
+ version "2.5.7"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
+
+electron-builder@^19.37.2:
+ version "19.37.2"
+ resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.37.2.tgz#30aaa24cd90b0ba2d8cef74c5ab8e9a1b2a33fb3"
+ dependencies:
+ "7zip-bin" "^2.2.7"
+ app-package-builder "1.2.1"
+ asar-integrity "0.2.2"
+ async-exit-hook "^2.0.1"
+ bluebird-lst "^1.0.4"
+ builder-util "3.0.12"
+ builder-util-runtime "2.1.0"
+ chalk "^2.1.0"
+ chromium-pickle-js "^0.2.0"
+ cuint "^0.2.2"
+ debug "^3.1.0"
+ dmg-builder "2.1.2"
+ ejs "^2.5.7"
+ electron-download-tf "4.3.4"
+ electron-osx-sign "0.4.7"
+ electron-publish "19.37.0"
+ fs-extra-p "^4.4.4"
+ hosted-git-info "^2.5.0"
+ is-ci "^1.0.10"
+ isbinaryfile "^3.0.2"
+ js-yaml "^3.10.0"
+ lazy-val "^1.0.2"
+ minimatch "^3.0.4"
+ normalize-package-data "^2.4.0"
+ plist "^2.1.0"
+ read-config-file "1.2.0"
+ sanitize-filename "^1.6.1"
+ semver "^5.4.1"
+ temp-file "^2.0.3"
+ update-notifier "^2.3.0"
+ yargs "^9.0.1"
+
+electron-devtools-installer@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.0.tgz#9813e6811afcd69ddca3cae5416db72ea7ecfb6a"
+ dependencies:
+ "7zip" "0.0.6"
+ cross-unzip "0.0.2"
+ rimraf "^2.5.2"
+ semver "^5.3.0"
+
+electron-download-tf@4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/electron-download-tf/-/electron-download-tf-4.3.4.tgz#b03740b2885aa2ad3f8784fae74df427f66d5165"
+ dependencies:
+ debug "^3.0.0"
+ env-paths "^1.0.0"
+ fs-extra "^4.0.1"
+ minimist "^1.2.0"
+ nugget "^2.0.1"
+ path-exists "^3.0.0"
+ rc "^1.2.1"
+ semver "^5.4.1"
+ sumchecker "^2.0.2"
+
+electron-download@^3.0.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8"
+ dependencies:
+ debug "^2.2.0"
+ fs-extra "^0.30.0"
+ home-path "^1.0.1"
+ minimist "^1.2.0"
+ nugget "^2.0.0"
+ path-exists "^2.1.0"
+ rc "^1.1.2"
+ semver "^5.3.0"
+ sumchecker "^1.2.0"
+
+electron-log@^2.2.8:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-2.2.8.tgz#2296cccd8da046268a199c1a302dcb8cb16f2b72"
+
+electron-mocha@^3.3.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/electron-mocha/-/electron-mocha-3.4.0.tgz#e4521c323bb9dff4716b969ecafadf6355143c42"
+ dependencies:
+ commander "^2.8.1"
+ electron-window "^0.8.0"
+ fs-extra "^2.1.2"
+ mocha "^3.0.0"
+ which "^1.1.1"
+
+electron-osx-sign@0.4.7:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.7.tgz#1d75647a82748eacd48bea70616ec83ffade3ee5"
+ dependencies:
+ bluebird "^3.5.0"
+ compare-version "^0.1.2"
+ debug "^2.6.8"
+ isbinaryfile "^3.0.2"
+ minimist "^1.2.0"
+ plist "^2.1.0"
+
+electron-publish@19.37.0:
+ version "19.37.0"
+ resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.37.0.tgz#0ae15b4322e9d7fc39540bf7199b12e606be376d"
+ dependencies:
+ bluebird-lst "^1.0.4"
+ builder-util "^3.0.12"
+ builder-util-runtime "^2.0.1"
+ chalk "^2.1.0"
+ fs-extra-p "^4.4.4"
+ mime "^2.0.3"
+
+"electron-sudo@https://github.com/eriklarko/electron-sudo.git":
+ version "4.0.12"
+ resolved "https://github.com/eriklarko/electron-sudo.git#f71134f86541b15359f4813715d721818fb2b1f4"
+ dependencies:
+ babel-runtime "^6.18.0"
+ bluebird "^3.4.6"
+
+electron-window@^0.8.0:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/electron-window/-/electron-window-0.8.1.tgz#16ca187eb4870b0679274fc8299c5960e6ab2c5e"
+ dependencies:
+ is-electron-renderer "^2.0.0"
+
+electron@^1.7.9:
+ version "1.7.9"
+ resolved "https://registry.yarnpkg.com/electron/-/electron-1.7.9.tgz#add54e9f8f83ed02f6519ec10135f698b19336cf"
+ dependencies:
+ "@types/node" "^7.0.18"
+ electron-download "^3.0.1"
+ extract-zip "^1.0.3"
+
+emitter-steward@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64"
+
+encodeurl@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+encoding@^0.1.11:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+ dependencies:
+ iconv-lite "~0.4.13"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
+ dependencies:
+ once "^1.4.0"
+
+engine.io-client@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c"
+ dependencies:
+ component-emitter "1.2.1"
+ component-inherit "0.0.3"
+ debug "2.3.3"
+ engine.io-parser "1.3.1"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parsejson "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "1.1.1"
+ xmlhttprequest-ssl "1.5.3"
+ yeast "0.1.2"
+
+engine.io-parser@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf"
+ dependencies:
+ after "0.8.1"
+ arraybuffer.slice "0.0.6"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.4"
+ has-binary "0.1.6"
+ wtf-8 "1.0.0"
+
+engine.io@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa"
+ dependencies:
+ accepts "1.3.3"
+ base64id "0.1.0"
+ cookie "0.3.1"
+ debug "2.3.3"
+ engine.io-parser "1.3.1"
+ ws "1.1.1"
+
+entities@^1.1.1, entities@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+env-paths@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
+
+enzyme@^2.9.1:
+ version "2.9.1"
+ resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.9.1.tgz#07d5ce691241240fb817bf2c4b18d6e530240df6"
+ dependencies:
+ cheerio "^0.22.0"
+ function.prototype.name "^1.0.0"
+ is-subset "^0.1.1"
+ lodash "^4.17.4"
+ object-is "^1.0.1"
+ object.assign "^4.0.4"
+ object.entries "^1.0.4"
+ object.values "^1.0.4"
+ prop-types "^15.5.10"
+ uuid "^3.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.4.3, es-abstract@^1.6.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.0"
+ is-callable "^1.1.3"
+ is-regex "^1.0.3"
+
+es-to-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+ dependencies:
+ is-callable "^1.1.1"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.1"
+
+es6-promise@^4.0.5:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.0.tgz#dda03ca8f9f89bc597e689842929de7ba8cebdf0"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.6.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+ dependencies:
+ esprima "^2.7.1"
+ estraverse "^1.9.1"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.2.0"
+
+escodegen@~0.0.24:
+ version "0.0.28"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.28.tgz#0e4ff1715f328775d6cab51ac44a406cd7abffd3"
+ dependencies:
+ esprima "~1.0.2"
+ estraverse "~1.3.0"
+ optionalDependencies:
+ source-map ">= 0.1.2"
+
+escodegen@~1.3.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.3.3.tgz#f024016f5a88e046fd12005055e939802e6c5f23"
+ dependencies:
+ esprima "~1.1.1"
+ estraverse "~1.5.0"
+ esutils "~1.0.0"
+ optionalDependencies:
+ source-map "~0.1.33"
+
+eslint-plugin-flowtype@^2.34.1:
+ version "2.34.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.1.tgz#ea109175645b05d37baeac53b9b65066d79b9446"
+ dependencies:
+ lodash "^4.15.0"
+
+eslint-plugin-react@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz#27770acf39f5fd49cd0af4083ce58104eb390d4c"
+ dependencies:
+ doctrine "^2.0.0"
+ has "^1.0.1"
+ jsx-ast-utils "^1.4.1"
+
+eslint-scope@^3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.1.1.tgz#facbdfcfe3e0facd3a8b80dc98c4e6c13ae582df"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ chalk "^1.1.3"
+ concat-stream "^1.6.0"
+ debug "^2.6.8"
+ doctrine "^2.0.0"
+ eslint-scope "^3.7.1"
+ espree "^3.4.3"
+ esquery "^1.0.0"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ glob "^7.1.2"
+ globals "^9.17.0"
+ ignore "^3.3.3"
+ imurmurhash "^0.1.4"
+ inquirer "^3.0.6"
+ is-my-json-valid "^2.16.0"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.8.4"
+ json-stable-stringify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.4"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ pluralize "^4.0.0"
+ progress "^2.0.0"
+ require-uncached "^1.0.3"
+ strip-json-comments "~2.0.1"
+ table "^4.0.1"
+ text-table "~0.2.0"
+
+espree@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374"
+ dependencies:
+ acorn "^5.0.1"
+ acorn-jsx "^3.0.0"
+
+esprima@^2.6.0, esprima@^2.7.1:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esprima@~1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad"
+
+esprima@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549"
+
+espurify@^1.3.0, espurify@^1.6.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.7.0.tgz#1c5cf6cbccc32e6f639380bd4f991fab9ba9d226"
+ dependencies:
+ core-js "^2.0.0"
+
+esquery@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220"
+ dependencies:
+ estraverse "~4.1.0"
+ object-assign "^4.0.1"
+
+estraverse@^1.9.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estraverse@~1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.3.2.tgz#37c2b893ef13d723f276d878d60d8535152a6c42"
+
+estraverse@~1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71"
+
+estraverse@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2"
+
+esutils@^2.0.0, esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+esutils@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570"
+
+etag@^1.7.0, etag@~1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
+
+event-stream@~3.3.0:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
+ dependencies:
+ duplexer "~0.1.1"
+ from "~0"
+ map-stream "~0.1.0"
+ pause-stream "0.0.11"
+ split "0.3"
+ stream-combiner "~0.0.4"
+ through "~2.3.1"
+
+eventemitter3@1.x.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+execa@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36"
+ dependencies:
+ cross-spawn "^4.0.0"
+ get-stream "^2.2.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+expand-template@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc"
+
+express@2.5.x:
+ version "2.5.11"
+ resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0"
+ dependencies:
+ connect "1.x"
+ mime "1.2.4"
+ mkdirp "0.3.0"
+ qs "0.4.x"
+
+extend@3, extend@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972"
+ dependencies:
+ iconv-lite "^0.4.17"
+ jschardet "^1.4.2"
+ tmp "^0.0.31"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extract-zip@^1.0.3:
+ version "1.6.5"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440"
+ dependencies:
+ concat-stream "1.6.0"
+ debug "2.2.0"
+ mkdirp "0.5.0"
+ yauzl "2.4.1"
+
+extsprintf@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+falafel@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/falafel/-/falafel-1.2.0.tgz#c18d24ef5091174a497f318cd24b026a25cddab4"
+ dependencies:
+ acorn "^1.0.3"
+ foreach "^2.0.5"
+ isarray "0.0.1"
+ object-keys "^1.0.6"
+
+fast-deep-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fbjs@^0.8.9:
+ version "0.8.12"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04"
+ dependencies:
+ core-js "^1.0.0"
+ isomorphic-fetch "^2.1.1"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.9"
+
+fd-slicer@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
+ dependencies:
+ pend "~1.2.0"
+
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+finalhandler@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7"
+ dependencies:
+ debug "~2.2.0"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ statuses "~1.3.0"
+ unpipe "~1.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+flat-cache@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
+ dependencies:
+ circular-json "^0.3.1"
+ del "^2.0.2"
+ graceful-fs "^4.1.2"
+ write "^0.2.1"
+
+flow-bin@^0.50.0:
+ version "0.50.0"
+ resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.50.0.tgz#d4cdb2430dee1a3599f0eb6fe551146e3027256a"
+
+flow-remove-types@^1.1.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-1.2.1.tgz#58e261bf8b842bd234c86cafb982a1213aff0edb"
+ dependencies:
+ babylon "^6.15.0"
+ vlq "^0.2.1"
+
+flow-typed@^2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.1.5.tgz#c96912807a286357340042783c9369360f384bbd"
+ dependencies:
+ babel-polyfill "^6.23.0"
+ colors "^1.1.2"
+ fs-extra "^4.0.0"
+ github "^9.2.0"
+ glob "^7.1.2"
+ got "^7.1.0"
+ md5 "^2.1.0"
+ mkdirp "^0.5.1"
+ request "^2.81.0"
+ rimraf "^2.6.1"
+ semver "^5.1.0"
+ table "^4.0.1"
+ through "^2.3.8"
+ unzip "^0.1.11"
+ which "^1.2.14"
+ yargs "^4.2.0"
+
+follow-redirects@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-0.0.7.tgz#34b90bab2a911aa347571da90f22bd36ecd8a919"
+ dependencies:
+ debug "^2.2.0"
+ stream-consume "^0.1.0"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+formatio@1.2.0, formatio@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb"
+ dependencies:
+ samsam "1.x"
+
+formidable@1.0.x:
+ version "1.0.17"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559"
+
+fresh@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
+
+fresh@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
+
+from@~0:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
+
+fs-extra-p@^4.4.0:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.4.2.tgz#b6abd882a9b89f41b977771d3da788ce38f085f3"
+ dependencies:
+ bluebird-lst "^1.0.2"
+ fs-extra "^4.0.2"
+
+fs-extra-p@^4.4.3, fs-extra-p@^4.4.4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.4.4.tgz#396ad6f914eb2954e1700fd0e18288301ed45f04"
+ dependencies:
+ bluebird-lst "^1.0.4"
+ fs-extra "^4.0.2"
+
+fs-extra@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^3.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+
+fs-extra@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.0.tgz#414fb4ca2d2170ba0014159d3a8aec3303418d9e"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^3.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^4.0.1, fs-extra@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-readdir-recursive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
+ dependencies:
+ nan "^2.3.0"
+ node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+ dependencies:
+ fstream "^1.0.0"
+ inherits "2"
+ minimatch "^3.0.0"
+
+"fstream@>= 0.1.30 < 1":
+ version "0.1.31"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988"
+ dependencies:
+ graceful-fs "~3.0.2"
+ inherits "~2.0.0"
+ mkdirp "0.5"
+ rimraf "2"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.0.2, function-bind@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
+
+function.prototype.name@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.3.tgz#0099ae5572e9dd6f03c97d023fd92bcc5e639eac"
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.0"
+ is-callable "^1.1.3"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+generate-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+ dependencies:
+ is-property "^1.0.0"
+
+geojson-area@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/geojson-area/-/geojson-area-0.1.0.tgz#d48d807082cfadf4a78df1349be50f38bf1894ae"
+ dependencies:
+ wgs84 "0.0.0"
+
+geojson-rewind@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/geojson-rewind/-/geojson-rewind-0.1.0.tgz#57022a054b196660d755354fe5d26684d90cd019"
+ dependencies:
+ concat-stream "~1.2.1"
+ geojson-area "0.1.0"
+ minimist "0.0.5"
+
+geojson-vt@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-2.4.0.tgz#3c1cf44493f35eb4d2c70c95da6550de66072c05"
+
+get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ dependencies:
+ assert-plus "^1.0.0"
+
+github-from-package@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+
+github@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/github/-/github-9.2.0.tgz#8a886dc40dd63636707dcaf99df3df26c59f16fc"
+ dependencies:
+ follow-redirects "0.0.7"
+ https-proxy-agent "^1.0.0"
+ mime "^1.2.11"
+ netrc "^0.1.4"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global-dirs@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f"
+ dependencies:
+ ini "^1.3.4"
+
+globals@^9.0.0, globals@^9.17.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+got@^6.7.1:
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+ dependencies:
+ create-error-class "^3.0.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-redirect "^1.0.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ lowercase-keys "^1.0.0"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ unzip-response "^2.0.1"
+ url-parse-lax "^1.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ dependencies:
+ decompress-response "^3.2.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-plain-obj "^1.1.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ p-cancelable "^0.3.0"
+ p-timeout "^1.1.1"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ url-parse-lax "^1.0.0"
+ url-to-options "^1.0.1"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+graceful-fs@~3.0.2:
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
+ dependencies:
+ natives "^1.1.0"
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+grid-index@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.0.0.tgz#ad2c5d54ce5b35437faff1d70a9aeb3d1d261110"
+
+growl@1.9.2:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
+
+har-schema@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+ dependencies:
+ chalk "^1.1.1"
+ commander "^2.9.0"
+ is-my-json-valid "^2.12.4"
+ pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+ dependencies:
+ ajv "^4.9.1"
+ har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-binary@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10"
+ dependencies:
+ isarray "0.0.1"
+
+has-binary@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
+ dependencies:
+ isarray "0.0.1"
+
+has-cors@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-symbol-support-x@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.0.tgz#442d89b1d0ac6cf5ff2f7b916ee539869b93a256"
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.0.tgz#49d7bcde85c2409be38ac327e3e119a451657c7b"
+ dependencies:
+ has-symbol-support-x "^1.4.0"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.0, has@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+ dependencies:
+ function-bind "^1.0.2"
+
+hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+history@^4.5.1, history@^4.6.0, history@^4.6.1:
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/history/-/history-4.6.1.tgz#911cf8eb65728555a94f2b12780a0c531a14d2fd"
+ dependencies:
+ invariant "^2.2.1"
+ loose-envify "^1.2.0"
+ resolve-pathname "^2.0.0"
+ value-equal "^0.2.0"
+ warning "^3.0.0"
+
+hoek@2.x.x:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoist-non-react-statics@^1.0.3, hoist-non-react-statics@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+home-path@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+htmlparser2@^3.9.1:
+ version "3.9.2"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+ dependencies:
+ domelementtype "^1.3.0"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+http-errors@~1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750"
+ dependencies:
+ inherits "2.0.3"
+ setprototypeof "1.0.2"
+ statuses ">= 1.3.1 < 2"
+
+http-errors@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
+ dependencies:
+ depd "1.1.0"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+http-proxy@1.15.2:
+ version "1.15.2"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31"
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "1.x.x"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+ dependencies:
+ agent-base "2"
+ debug "2"
+ extend "3"
+
+iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@~0.4.13:
+ version "0.4.19"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+ieee754@^1.1.6:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+ignore@^3.3.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
+
+immutable@3.8.1, immutable@^3.7.6:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2"
+
+import-lazy@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ dependencies:
+ repeating "^2.0.0"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inquirer@^3.0.6:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534"
+ dependencies:
+ ansi-escapes "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.4"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx-lite "^4.0.8"
+ rx-lite-aggregates "^4.0.8"
+ string-width "^2.0.0"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+int64-buffer@^0.1.9:
+ version "0.1.9"
+ resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.9.tgz#9e039da043b24f78b196b283e04653ef5e990f61"
+
+invariant@^2.0.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5, is-buffer@~1.1.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-ci@^1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
+ dependencies:
+ ci-info "^1.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-electron-renderer@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz#a469d056f975697c58c98c6023eb0aa79af895a2"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-installed-globally@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
+ dependencies:
+ global-dirs "^0.1.0"
+ is-path-inside "^1.0.0"
+
+is-my-json-valid@^2.12.4, is-my-json-valid@^2.16.0:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
+ dependencies:
+ generate-function "^2.0.0"
+ generate-object-property "^1.1.0"
+ jsonpointer "^4.0.0"
+ xtend "^4.0.0"
+
+is-npm@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+
+is-number-like@^1.0.3:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.7.tgz#a38d6b0fd2cd4282449128859eed86c03fd23552"
+ dependencies:
+ bubleify "^0.5.1"
+ lodash.isfinite "^3.3.2"
+
+is-number@^2.0.2, is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+
+is-path-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-property@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-redirect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-regex@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ dependencies:
+ has "^1.0.1"
+
+is-resolvable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
+ dependencies:
+ tryit "^1.0.1"
+
+is-retry-allowed@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-subset@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isbinaryfile@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isomorphic-fetch@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+ dependencies:
+ node-fetch "^1.0.1"
+ whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+js-tokens@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
+
+js-yaml@^3.10.0, js-yaml@^3.8.4:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@~3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^2.6.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jschardet@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-schema-traverse@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json3@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.0.tgz#92e7c7444e5ffd5fa32e6a9ae8b85034df8347d0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonpointer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsonrpc-lite@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/jsonrpc-lite/-/jsonrpc-lite-1.2.3.tgz#2556de9a5a42879c65f19b2f23803241e782deba"
+
+jsprim@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.0.2"
+ json-schema "0.2.3"
+ verror "1.3.6"
+
+jsx-ast-utils@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
+
+just-extend@^1.1.22:
+ version "1.1.22"
+ resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.22.tgz#3330af756cab6a542700c64b2e4e4aa062d52fff"
+
+kdbush@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-1.0.1.tgz#3cbd03e9dead9c0f6f66ccdb96450e5cecc640e0"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+latest-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
+ dependencies:
+ package-json "^4.0.0"
+
+lazy-val@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.2.tgz#d9b07fb1fce54cbc99b3c611de431b83249369b6"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+levenshtein-edit-distance@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/levenshtein-edit-distance/-/levenshtein-edit-distance-1.0.0.tgz#895baf478cce8b5c1a0d27e45d7c1d978a661e49"
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+limiter@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.0.tgz#6e2bd12ca3fcdaa11f224e2e53c896df3f08d913"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+localtunnel@1.8.2:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.2.tgz#913051e8328b51f75ad8a22ad1f5c5b8c599a359"
+ dependencies:
+ debug "2.2.0"
+ openurl "1.1.0"
+ request "2.78.0"
+ yargs "3.29.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash-es@^4.2.0, lodash-es@^4.2.1:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7"
+
+lodash._baseassign@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+ dependencies:
+ lodash._basecopy "^3.0.0"
+ lodash.keys "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basecreate@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+
+lodash.assignin@^4.0.9:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
+
+lodash.bind@^4.1.4:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
+
+lodash.create@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
+ dependencies:
+ lodash._baseassign "^3.0.0"
+ lodash._basecreate "^3.0.0"
+ lodash._isiterateecall "^3.0.0"
+
+lodash.defaults@^4.0.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.filter@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
+
+lodash.flatten@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+
+lodash.foreach@^4.3.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isfinite@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3"
+
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
+lodash.map@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
+
+lodash.merge@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
+
+lodash.pick@^4.2.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+
+lodash.reduce@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
+
+lodash.reject@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
+
+lodash.some@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+
+lodash.toarray@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
+
+lodash@^3.10.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+lolex@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6"
+
+lolex@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.1.2.tgz#2694b953c9ea4d013e5b8bfba891c991025b2629"
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+ dependencies:
+ js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lowercase-keys@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lru-cache@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.0.tgz#59be49a683b8d986a939f1ca60fdb6989f4b2046"
+ dependencies:
+ pseudomap "^1.0.1"
+ yallist "^2.0.0"
+
+magic-string@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.14.0.tgz#57224aef1701caeed273b17a39a956e72b172462"
+ dependencies:
+ vlq "^0.2.1"
+
+make-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978"
+ dependencies:
+ pify "^2.3.0"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+map-stream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
+
+mapbox-gl-supported@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mapbox-gl-supported/-/mapbox-gl-supported-1.2.0.tgz#cbd34df894206cadda9a33c8d9a4609f26bb1989"
+
+mapbox-gl@^0.37.0:
+ version "0.37.0"
+ resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-0.37.0.tgz#20103b0ae73a0e77fe9405439749318b87c04f10"
+ dependencies:
+ "@mapbox/gl-matrix" "^0.0.1"
+ "@mapbox/shelf-pack" "^3.0.0"
+ "@mapbox/unitbezier" "^0.0.0"
+ "@mapbox/whoots-js" "^3.0.0"
+ brfs "^1.4.0"
+ bubleify "^0.7.0"
+ earcut "^2.0.3"
+ geojson-rewind "^0.1.0"
+ geojson-vt "^2.4.0"
+ grid-index "^1.0.0"
+ mapbox-gl-supported "^1.2.0"
+ package-json-versionify "^1.0.2"
+ pbf "^1.3.2"
+ point-geometry "^0.0.0"
+ quickselect "^1.0.0"
+ supercluster "^2.0.1"
+ through2 "^2.0.3"
+ tinyqueue "^1.1.0"
+ unassertify "^2.0.0"
+ unflowify "^1.0.0"
+ vector-tile "^1.3.0"
+ vt-pbf "^2.0.2"
+ webworkify "^1.4.0"
+
+"match-stream@>= 0.0.2 < 1":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf"
+ dependencies:
+ buffers "~0.1.1"
+ readable-stream "~1.0.0"
+
+md5@^2.1.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
+ dependencies:
+ charenc "~0.0.1"
+ crypt "~0.0.1"
+ is-buffer "~1.1.1"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+meow@^3.1.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+micromatch@2.3.11, micromatch@^2.1.5:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+mime-db@~1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.7:
+ version "2.1.15"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
+ dependencies:
+ mime-db "~1.27.0"
+
+mime@1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7"
+
+mime@1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+"mime@>= 0.0.1":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.0.2.tgz#097fd2c88c652eae48b2702d7cbf54c08d8ef50a"
+
+mime@^1.2.11:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0"
+
+mime@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.0.3.tgz#4353337854747c48ea498330dc034f9f4bbbcc0b"
+
+mimic-fn@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
+
+mimic-response@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mkdirp@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
+
+mkdirp@0.5, mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+mkdirp@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
+ dependencies:
+ minimist "0.0.8"
+
+mocha@^3.0.0:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594"
+ dependencies:
+ browser-stdout "1.3.0"
+ commander "2.9.0"
+ debug "2.6.0"
+ diff "3.2.0"
+ escape-string-regexp "1.0.5"
+ glob "7.1.1"
+ growl "1.9.2"
+ json3 "3.3.2"
+ lodash.create "3.1.1"
+ mkdirp "0.5.1"
+ supports-color "3.1.2"
+
+moment@^2.17.1:
+ version "2.18.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
+
+ms@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+
+ms@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
+
+ms@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-1.0.0.tgz#59adcd22edc543f7b5381862d31387b1f4bc9473"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+multi-stage-sourcemap@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz#b09fc8586eaa17f81d575c4ad02e0f7a3f6b1105"
+ dependencies:
+ source-map "^0.1.34"
+
+mute-stream@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.3.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
+
+nan@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
+
+native-promise-only@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11"
+
+natives@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+netrc@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444"
+
+nise@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/nise/-/nise-1.0.1.tgz#0da92b10a854e97c0f496f6c2845a301280b3eef"
+ dependencies:
+ formatio "^1.2.0"
+ just-extend "^1.1.22"
+ lolex "^1.6.0"
+ path-to-regexp "^1.7.0"
+
+node-abi@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.1.tgz#c9cda256ec8aa99bcab2f6446db38af143338b2a"
+
+node-emoji@^1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826"
+ dependencies:
+ lodash.toarray "^4.4.0"
+
+node-fetch@^1.0.1:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5"
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-pre-gyp@^0.6.29:
+ version "0.6.36"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
+ dependencies:
+ mkdirp "^0.5.1"
+ nopt "^4.0.1"
+ npmlog "^4.0.2"
+ rc "^1.1.7"
+ request "^2.81.0"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^2.2.1"
+ tar-pack "^3.4.0"
+
+node-uuid@~1.4.7:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
+
+noop-logger@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
+
+nopt@3.0.x:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ dependencies:
+ abbrev "1"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-run-all@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.0.2.tgz#a84669348e6db6ccbe052200b4cdb6bfe034a4fe"
+ dependencies:
+ chalk "^1.1.3"
+ cross-spawn "^5.0.1"
+ minimatch "^3.0.2"
+ ps-tree "^1.0.1"
+ read-pkg "^2.0.0"
+ shell-quote "^1.6.1"
+ string.prototype.padend "^3.0.0"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+"nseventmonitor@git+https://github.com/pronebird/NSEventMonitor.git":
+ version "0.0.3"
+ resolved "git+https://github.com/pronebird/NSEventMonitor.git#2707370d46748c2e4de99f0f762daf6d3b28b431"
+ dependencies:
+ bindings "^1.2.1"
+
+nth-check@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+ dependencies:
+ boolbase "~1.0.0"
+
+nugget@^2.0.0, nugget@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0"
+ dependencies:
+ debug "^2.1.3"
+ minimist "^1.1.0"
+ pretty-bytes "^1.0.2"
+ progress-stream "^1.1.0"
+ request "^2.45.0"
+ single-line-log "^1.1.2"
+ throttleit "0.0.2"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-component@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+
+object-inspect@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec"
+
+object-is@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6"
+
+object-keys@^1.0.10, object-keys@^1.0.6, object-keys@^1.0.8:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
+object-path@^0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"
+
+object.assign@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc"
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.0"
+ object-keys "^1.0.10"
+
+object.entries@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.6.1"
+ function-bind "^1.1.0"
+ has "^1.0.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.values@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.6.1"
+ function-bind "^1.1.0"
+ has "^1.0.1"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+openurl@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.0.tgz#e2f2189d999c04823201f083f0f1a7cd8903187a"
+
+opn@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+optionator@^0.8.1, optionator@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+options@>=0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ dependencies:
+ lcid "^1.0.0"
+
+os-locale@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.0.0.tgz#15918ded510522b81ee7ae5a309d54f639fc39a4"
+ dependencies:
+ execa "^0.5.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+output-file-sync@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
+ dependencies:
+ graceful-fs "^4.1.4"
+ mkdirp "^0.5.1"
+ object-assign "^4.1.0"
+
+"over@>= 0.0.5 < 1":
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708"
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-timeout@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.0.tgz#9820f99434c5817868b4f34809ee5291660d5b6c"
+ dependencies:
+ p-finally "^1.0.0"
+
+package-json-versionify@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17"
+ dependencies:
+ browserify-package-json "^1.0.0"
+
+package-json@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
+ dependencies:
+ got "^6.7.1"
+ registry-auth-token "^3.0.1"
+ registry-url "^3.0.3"
+ semver "^5.1.0"
+
+parse-color@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619"
+ dependencies:
+ color-convert "~0.5.0"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+parsejson@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
+ dependencies:
+ better-assert "~1.0.0"
+
+parseqs@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+ dependencies:
+ better-assert "~1.0.0"
+
+parseuri@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+ dependencies:
+ better-assert "~1.0.0"
+
+parseurl@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
+
+path-exists@^2.0.0, path-exists@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-to-regexp@^1.5.3, path-to-regexp@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
+ dependencies:
+ isarray "0.0.1"
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+pathval@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
+
+pause-stream@0.0.11:
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
+ dependencies:
+ through "~2.3"
+
+pbf@^1.3.2:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/pbf/-/pbf-1.3.7.tgz#1e3d047ba3cbe8086ae854a25503ab4537d4335d"
+ dependencies:
+ ieee754 "^1.1.6"
+ resolve-protobuf-schema "^2.0.0"
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+plist@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025"
+ dependencies:
+ base64-js "1.2.0"
+ xmlbuilder "8.2.2"
+ xmldom "0.1.x"
+
+pluralize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762"
+
+point-geometry@0.0.0, point-geometry@^0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/point-geometry/-/point-geometry-0.0.0.tgz#6fcbcad7a803b6418247dd6e49c2853c584daff7"
+
+portscanner@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96"
+ dependencies:
+ async "1.5.2"
+ is-number-like "^1.0.3"
+
+prebuild-install@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.3.0.tgz#19481247df728b854ab57b187ce234211311b485"
+ dependencies:
+ expand-template "^1.0.2"
+ github-from-package "0.0.0"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ node-abi "^2.1.1"
+ noop-logger "^0.1.1"
+ npmlog "^4.0.1"
+ os-homedir "^1.0.1"
+ pump "^1.0.1"
+ rc "^1.1.6"
+ simple-get "^1.4.2"
+ tar-fs "^1.13.0"
+ tunnel-agent "^0.6.0"
+ xtend "4.0.1"
+
+prefix-style@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-bytes@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84"
+ dependencies:
+ get-stdin "^4.0.1"
+ meow "^3.1.0"
+
+private@^0.1.6:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+progress-stream@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77"
+ dependencies:
+ speedometer "~0.1.2"
+ through2 "~0.2.3"
+
+progress@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+promise@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6:
+ version "15.5.10"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
+ dependencies:
+ fbjs "^0.8.9"
+ loose-envify "^1.3.1"
+
+protocol-buffers-schema@^2.0.2:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-2.2.0.tgz#d29c6cd73fb655978fb6989691180db844119f61"
+
+ps-tree@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014"
+ dependencies:
+ event-stream "~3.3.0"
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+"pullstream@>= 0.4.1 < 1":
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314"
+ dependencies:
+ over ">= 0.0.5 < 1"
+ readable-stream "~1.0.31"
+ setimmediate ">= 1.0.2 < 2"
+ slice-stream ">= 1.0.0 < 2"
+
+pump@^1.0.0, pump@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51"
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@^1.1.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
+
+qs@0.4.x:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f"
+
+qs@6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625"
+
+"qs@>= 0.4.0", qs@~6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+qs@~6.3.0:
+ version "6.3.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+
+quickselect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.0.0.tgz#02630818f9aae4ecab26f0103f98d061c17c58f3"
+
+quote-stream@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2"
+ dependencies:
+ buffer-equal "0.0.1"
+ minimist "^1.1.3"
+ through2 "^2.0.0"
+
+quote-stream@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-0.0.0.tgz#cde29e94c409b16e19dc7098b89b6658f9721d3b"
+ dependencies:
+ minimist "0.0.8"
+ through2 "~0.4.1"
+
+rabin-bindings@~1.7.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/rabin-bindings/-/rabin-bindings-1.7.3.tgz#fb6ae9dbf897988bc2504ccf4832ee4f0546d32a"
+ dependencies:
+ bindings "^1.3.0"
+ nan "^2.7.0"
+ prebuild-install "^2.3.0"
+
+raf@^3.1.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/raf/-/raf-3.3.2.tgz#0c13be0b5b49b46f76d6669248d527cf2b02fe27"
+ dependencies:
+ performance-now "^2.1.0"
+
+randomatic@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
+ dependencies:
+ is-number "^2.0.2"
+ kind-of "^3.0.2"
+
+range-parser@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7, rc@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
+ dependencies:
+ deep-extend "~0.4.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-custom-scrollbars@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/react-custom-scrollbars/-/react-custom-scrollbars-4.1.2.tgz#0e60c4a46c4a61f9e4994a7663e2b9cbbc5187a3"
+ dependencies:
+ dom-css "^2.0.0"
+ prop-types "^15.5.10"
+ raf "^3.1.0"
+
+react-dom@^15.6.1:
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470"
+ dependencies:
+ fbjs "^0.8.9"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+ prop-types "^15.5.10"
+
+react-if@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/react-if/-/react-if-2.2.1.tgz#b6a2a3a15d6f80fa4db43ed6d18ece6e9d12a11c"
+
+react-mapbox-gl@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/react-mapbox-gl/-/react-mapbox-gl-2.1.0.tgz#415937900f90f36dfa58a6873c84c7e1e3783c07"
+ dependencies:
+ "@turf/bbox" "^4.4.0"
+ "@turf/helpers" "^4.4.0"
+ deep-equal "^1.0.1"
+ supercluster "^2.3.0"
+
+react-redux@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.5.tgz#f8e8c7b239422576e52d6b7db06439469be9846a"
+ dependencies:
+ create-react-class "^15.5.3"
+ hoist-non-react-statics "^1.0.3"
+ invariant "^2.0.0"
+ lodash "^4.2.0"
+ lodash-es "^4.2.0"
+ loose-envify "^1.1.0"
+ prop-types "^15.5.10"
+
+react-router-redux@5.0.0-alpha.6:
+ version "5.0.0-alpha.6"
+ resolved "https://registry.yarnpkg.com/react-router-redux/-/react-router-redux-5.0.0-alpha.6.tgz#7418663c2ecd3c51be856fcf28f3d1deecc1a576"
+ dependencies:
+ history "^4.5.1"
+ prop-types "^15.5.4"
+ react-router "^4.1.1"
+
+react-router@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.1.1.tgz#d448f3b7c1b429a6fbb03395099949c606b1fe95"
+ dependencies:
+ history "^4.6.0"
+ hoist-non-react-statics "^1.2.0"
+ invariant "^2.2.2"
+ loose-envify "^1.3.1"
+ path-to-regexp "^1.5.3"
+ prop-types "^15.5.4"
+ warning "^3.0.0"
+
+react-test-renderer@^15.6.1:
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.1.tgz#026f4a5bb5552661fd2cc4bbcd0d4bc8a35ebf7e"
+ dependencies:
+ fbjs "^0.8.9"
+ object-assign "^4.1.0"
+
+react-transition-group@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.0.tgz#b51fc921b0c3835a7ef7c571c79fc82c73e9204f"
+ dependencies:
+ chain-function "^1.0.0"
+ dom-helpers "^3.2.0"
+ loose-envify "^1.3.1"
+ prop-types "^15.5.6"
+ warning "^3.0.0"
+
+react@^15.6.1:
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df"
+ dependencies:
+ create-react-class "^15.6.0"
+ fbjs "^0.8.9"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+ prop-types "^15.5.10"
+
+read-config-file@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-1.2.0.tgz#1fd7dc8ccdad838cac9f686182625290fc94f456"
+ dependencies:
+ ajv "^5.2.3"
+ ajv-keywords "^2.1.0"
+ bluebird-lst "^1.0.4"
+ dotenv "^4.0.0"
+ dotenv-expand "^4.0.1"
+ fs-extra-p "^4.4.4"
+ js-yaml "^3.10.0"
+ json5 "^0.5.1"
+ lazy-val "^1.0.2"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.0.3"
+ util-deprecate "~1.0.1"
+
+readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2:
+ version "2.2.11"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ safe-buffer "~5.0.1"
+ string_decoder "~1.0.0"
+ util-deprecate "~1.0.1"
+
+readable-stream@~1.0.0, readable-stream@~1.0.17, readable-stream@~1.0.27-1, readable-stream@~1.0.31:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@~1.1.9:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+redux-mock-store@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.2.3.tgz#1b3ad299da91cb41ba30d68e3b6f024475fb9e1b"
+
+redux-thunk@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5"
+
+redux@^3.0.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-3.6.0.tgz#887c2b3d0b9bd86eca2be70571c27654c19e188d"
+ dependencies:
+ lodash "^4.2.1"
+ lodash-es "^4.2.1"
+ loose-envify "^1.1.0"
+ symbol-observable "^1.0.2"
+
+regenerate@^1.2.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
+
+regenerator-runtime@^0.10.0:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-transform@0.9.11:
+ version "0.9.11"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+ is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+registry-auth-token@^3.0.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006"
+ dependencies:
+ rc "^1.1.6"
+ safe-buffer "^5.0.1"
+
+registry-url@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
+ dependencies:
+ rc "^1.0.1"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+request@2.78.0:
+ version "2.78.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.11.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~2.0.6"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ node-uuid "~1.4.7"
+ oauth-sign "~0.8.1"
+ qs "~6.3.0"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "~0.4.1"
+
+request@^2.45.0, request@^2.81.0:
+ version "2.81.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~4.2.1"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ performance-now "^0.2.0"
+ qs "~6.4.0"
+ safe-buffer "^5.0.1"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+requires-port@1.x.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-from@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
+
+resolve-pathname@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.1.0.tgz#e8358801b86b83b17560d4e3c382d7aef2100944"
+
+resolve-protobuf-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.0.0.tgz#e67b062a67f02d11bd6886e70efda788407e0fb4"
+ dependencies:
+ protocol-buffers-schema "^2.0.2"
+
+resolve@^1.1.5:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
+ dependencies:
+ path-parse "^1.0.5"
+
+resp-modifier@6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f"
+ dependencies:
+ debug "^2.2.0"
+ minimatch "^3.0.2"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
+ dependencies:
+ glob "^7.0.5"
+
+run-async@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+ dependencies:
+ is-promise "^2.1.0"
+
+rx-lite-aggregates@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+ dependencies:
+ rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+rx@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
+safe-buffer@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.0.tgz#fe4c8460397f9eaaaa58e73be46273408a45e223"
+
+safe-buffer@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+samsam@1.x, samsam@^1.1.3:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67"
+
+sanitize-filename@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a"
+ dependencies:
+ truncate-utf8-bytes "^1.0.0"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+sax@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
+
+semver-diff@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
+ dependencies:
+ semver "^5.0.3"
+
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+
+semver@~5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
+
+send@0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.15.2.tgz#f91fab4403bcf87e716f70ceb5db2f578bdc17d6"
+ dependencies:
+ debug "2.6.4"
+ depd "~1.1.0"
+ destroy "~1.0.4"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.8.0"
+ fresh "0.5.0"
+ http-errors "~1.6.1"
+ mime "1.3.4"
+ ms "1.0.0"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.3.1"
+
+serve-index@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b"
+ dependencies:
+ accepts "~1.3.3"
+ batch "0.5.3"
+ debug "~2.2.0"
+ escape-html "~1.0.3"
+ http-errors "~1.5.0"
+ mime-types "~2.1.11"
+ parseurl "~1.3.1"
+
+serve-static@1.12.2:
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.2.tgz#e546e2726081b81b4bcec8e90808ebcdd323afba"
+ dependencies:
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ parseurl "~1.3.1"
+ send "0.15.2"
+
+server-destroy@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08"
+
+setprototypeof@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+shallow-copy@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-escape@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/shell-escape/-/shell-escape-0.2.0.tgz#68fd025eb0490b4f567a027f0bf22480b5f84133"
+
+shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+simple-get@^1.4.2:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb"
+ dependencies:
+ once "^1.3.1"
+ unzip-response "^1.0.0"
+ xtend "^4.0.0"
+
+single-line-log@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364"
+ dependencies:
+ string-width "^1.0.1"
+
+sinon@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/sinon/-/sinon-3.2.1.tgz#d8adabd900730fd497788a027049c64b08be91c2"
+ dependencies:
+ diff "^3.1.0"
+ formatio "1.2.0"
+ lolex "^2.1.2"
+ native-promise-only "^0.8.1"
+ nise "^1.0.1"
+ path-to-regexp "^1.7.0"
+ samsam "^1.1.3"
+ text-encoding "0.6.4"
+ type-detect "^4.0.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
+"slice-stream@>= 1.0.0 < 2":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0"
+ dependencies:
+ readable-stream "~1.0.31"
+
+slide@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+sntp@1.x.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+ dependencies:
+ hoek "2.x.x"
+
+socket.io-adapter@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b"
+ dependencies:
+ debug "2.3.3"
+ socket.io-parser "2.3.1"
+
+socket.io-client@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853"
+ dependencies:
+ backo2 "1.0.2"
+ component-bind "1.0.0"
+ component-emitter "1.2.1"
+ debug "2.3.3"
+ engine.io-client "1.8.0"
+ has-binary "0.1.7"
+ indexof "0.0.1"
+ object-component "0.0.3"
+ parseuri "0.0.5"
+ socket.io-parser "2.3.1"
+ to-array "0.1.4"
+
+socket.io-parser@2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0"
+ dependencies:
+ component-emitter "1.1.2"
+ debug "2.2.0"
+ isarray "0.0.1"
+ json3 "3.3.2"
+
+socket.io@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1"
+ dependencies:
+ debug "2.3.3"
+ engine.io "1.8.0"
+ has-binary "0.1.7"
+ object-assign "4.1.0"
+ socket.io-adapter "0.5.0"
+ socket.io-client "1.6.0"
+ socket.io-parser "2.3.1"
+
+source-map-support@^0.4.2:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab"
+ dependencies:
+ source-map "^0.6.0"
+
+"source-map@>= 0.1.2", source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
+source-map@^0.1.34, source-map@~0.1.33:
+ version "0.1.43"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+source-map@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+ dependencies:
+ amdefine ">=0.0.4"
+
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+speedometer@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d"
+
+split@0.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
+ dependencies:
+ through "2"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+stat-mode@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502"
+
+static-eval@~0.2.0:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-0.2.4.tgz#b7d34d838937b969f9641ca07d48f8ede263ea7b"
+ dependencies:
+ escodegen "~0.0.24"
+
+static-module@^1.1.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/static-module/-/static-module-1.3.2.tgz#329fb9f223a566266bda71843b7d932c767174f3"
+ dependencies:
+ concat-stream "~1.6.0"
+ duplexer2 "~0.0.2"
+ escodegen "~1.3.2"
+ falafel "^1.0.0"
+ has "^1.0.0"
+ object-inspect "~0.4.0"
+ quote-stream "~0.0.0"
+ readable-stream "~1.0.27-1"
+ shallow-copy "~0.0.1"
+ static-eval "~0.2.0"
+ through2 "~0.4.1"
+
+"statuses@>= 1.3.1 < 2", statuses@~1.3.0, statuses@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stream-combiner@~0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+ dependencies:
+ duplexer "~0.1.1"
+
+stream-consume@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f"
+
+stream-throttle@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3"
+ dependencies:
+ commander "^2.2.0"
+ limiter "^1.0.5"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string-width@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^3.0.0"
+
+string.prototype.padend@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.4.3"
+ function-bind "^1.0.2"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179"
+ dependencies:
+ safe-buffer "~5.0.1"
+
+string_decoder@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringstream@~0.0.4:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ dependencies:
+ get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+sumchecker@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d"
+ dependencies:
+ debug "^2.2.0"
+ es6-promise "^4.0.5"
+
+sumchecker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e"
+ dependencies:
+ debug "^2.2.0"
+
+supercluster@^2.0.1, supercluster@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-2.3.0.tgz#87ab56081bbea9a1d724df5351ee9e8c3af2f48b"
+ dependencies:
+ kdbush "^1.0.1"
+
+supports-color@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.1.0.tgz#92cc14bb3dad8928ca5656c33e19a19f20af5c7a"
+ dependencies:
+ has-flag "^2.0.0"
+
+svgo@^0.7.0:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+ dependencies:
+ coa "~1.0.1"
+ colors "~1.1.2"
+ csso "~2.3.1"
+ js-yaml "~3.7.0"
+ mkdirp "~0.5.1"
+ sax "~1.2.1"
+ whet.extend "~0.9.9"
+
+symbol-observable@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
+
+table@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435"
+ dependencies:
+ ajv "^4.7.0"
+ ajv-keywords "^1.0.0"
+ chalk "^1.1.1"
+ lodash "^4.0.0"
+ slice-ansi "0.0.4"
+ string-width "^2.0.0"
+
+tar-fs@^1.13.0:
+ version "1.16.0"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896"
+ dependencies:
+ chownr "^1.0.1"
+ mkdirp "^0.5.1"
+ pump "^1.0.0"
+ tar-stream "^1.1.2"
+
+tar-pack@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
+ dependencies:
+ debug "^2.2.0"
+ fstream "^1.0.10"
+ fstream-ignore "^1.0.5"
+ once "^1.3.3"
+ readable-stream "^2.1.4"
+ rimraf "^2.5.1"
+ tar "^2.2.1"
+ uid-number "^0.0.6"
+
+tar-stream@^1.1.2:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016"
+ dependencies:
+ bl "^1.0.0"
+ end-of-stream "^1.0.0"
+ readable-stream "^2.0.0"
+ xtend "^4.0.0"
+
+tar@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.2"
+ inherits "2"
+
+temp-file@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-2.0.3.tgz#0de2540629fc77a6406ca56f50214d1f224947ac"
+ dependencies:
+ async-exit-hook "^2.0.1"
+ bluebird-lst "^1.0.3"
+ fs-extra-p "^4.4.0"
+ lazy-val "^1.0.2"
+
+term-size@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
+ dependencies:
+ execa "^0.7.0"
+
+text-encoding@0.6.4:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19"
+
+text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+tfunk@^3.0.1:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b"
+ dependencies:
+ chalk "^1.1.1"
+ object-path "^0.9.0"
+
+throttleit@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf"
+
+through2@^2.0.0, through2@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+through2@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f"
+ dependencies:
+ readable-stream "~1.1.9"
+ xtend "~2.1.1"
+
+through2@~0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
+ dependencies:
+ readable-stream "~1.0.17"
+ xtend "~2.1.1"
+
+through@2, through@^2.3.6, through@^2.3.7, through@^2.3.8, through@~2.3, through@~2.3.1:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+timed-out@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+tinyqueue@^1.1.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-1.2.2.tgz#947229e5e4197aba988acd27751dcc582e6728ff"
+
+tmp@^0.0.31:
+ version "0.0.31"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
+ dependencies:
+ os-tmpdir "~1.0.1"
+
+to-array@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+
+to-camel-case@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-camel-case/-/to-camel-case-1.0.0.tgz#1a56054b2f9d696298ce66a60897322b6f423e46"
+ dependencies:
+ to-space-case "^1.0.0"
+
+to-fast-properties@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-no-case@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a"
+
+to-space-case@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17"
+ dependencies:
+ to-no-case "^1.0.0"
+
+to-utf8@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852"
+
+tough-cookie@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
+ dependencies:
+ punycode "^1.4.1"
+
+"traverse@>=0.3.0 <0.4":
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+truncate-utf8-bytes@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+ dependencies:
+ utf8-byte-length "^1.0.1"
+
+tryit@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tunnel-agent@~0.4.1:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55"
+
+type-detect@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+ua-parser-js@0.7.12, ua-parser-js@^0.7.9:
+ version "0.7.12"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
+
+uid-number@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+ultron@1.0.x:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+
+unassert@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/unassert/-/unassert-1.5.1.tgz#cbc88ec387417c5a5e4c02d3cd07be98bd75ff76"
+ dependencies:
+ acorn "^4.0.0"
+ call-matcher "^1.0.1"
+ deep-equal "^1.0.0"
+ espurify "^1.3.0"
+ estraverse "^4.1.0"
+ esutils "^2.0.2"
+ object-assign "^4.1.0"
+
+unassertify@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/unassertify/-/unassertify-2.0.4.tgz#b3ca2ba5f29b4836e35a6dd77e5b20f6dbbf8e52"
+ dependencies:
+ acorn "^4.0.0"
+ convert-source-map "^1.1.1"
+ escodegen "^1.6.1"
+ multi-stage-sourcemap "^0.2.1"
+ through "^2.3.7"
+ unassert "^1.3.1"
+
+underscore@1.7.x:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209"
+
+unflowify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unflowify/-/unflowify-1.0.1.tgz#a2ea0d25c0affcc46955e6473575f7c5a1f4a696"
+ dependencies:
+ flow-remove-types "^1.1.2"
+ through "^2.3.8"
+
+unique-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
+ dependencies:
+ crypto-random-string "^1.0.0"
+
+universalify@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778"
+
+unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unzip-response@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
+
+unzip-response@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
+
+unzip@^0.1.11:
+ version "0.1.11"
+ resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0"
+ dependencies:
+ binary ">= 0.3.0 < 1"
+ fstream ">= 0.1.30 < 1"
+ match-stream ">= 0.0.2 < 1"
+ pullstream ">= 0.4.1 < 1"
+ readable-stream "~1.0.31"
+ setimmediate ">= 1.0.1 < 2"
+
+update-notifier@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451"
+ dependencies:
+ boxen "^1.2.1"
+ chalk "^2.0.1"
+ configstore "^3.0.0"
+ import-lazy "^2.1.0"
+ is-installed-globally "^0.1.0"
+ is-npm "^1.0.0"
+ latest-version "^3.0.0"
+ semver-diff "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+
+user-home@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+
+utf8-byte-length@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+utils-merge@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
+
+uuid@^3.0.0, uuid@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+v8flags@^2.0.10:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
+ dependencies:
+ user-home "^1.1.1"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
+validated@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/validated/-/validated-1.1.0.tgz#2f2a7a12a2cdcfe002aaa75f950ad40100a559e2"
+ dependencies:
+ commander "^2.9.0"
+ custom-error-instance "^2.1.1"
+ indent-string "^2.1.0"
+ invariant "^2.2.2"
+ levenshtein-edit-distance "^1.0.0"
+
+value-equal@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.2.1.tgz#c220a304361fce6994dbbedaa3c7e1a1b895871d"
+
+vector-tile@^1.1.3, vector-tile@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/vector-tile/-/vector-tile-1.3.0.tgz#06d516a83b063f04c82ef539cf1bb1aebeb696b4"
+ dependencies:
+ point-geometry "0.0.0"
+
+verror@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
+ dependencies:
+ extsprintf "1.0.2"
+
+vlq@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1"
+
+vt-pbf@^2.0.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-2.1.2.tgz#75409fded5f6c3910073a64c3e575cdeba387f01"
+ dependencies:
+ pbf "^1.3.2"
+ point-geometry "0.0.0"
+ vector-tile "^1.1.3"
+
+warning@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
+ dependencies:
+ loose-envify "^1.0.0"
+
+webworkify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.4.0.tgz#71245d1e34cacf54e426bd955f8cc6ee12d024c2"
+
+weinre@^2.0.0-pre-I0Z7U9OV:
+ version "2.0.0-pre-I0Z7U9OV"
+ resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813"
+ dependencies:
+ express "2.5.x"
+ nopt "3.0.x"
+ underscore "1.7.x"
+
+wgs84@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76"
+
+whatwg-fetch@>=0.10.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
+
+whet.extend@~0.9.9:
+ version "0.9.9"
+ resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.1.1, which@^1.2.14, which@^1.2.9:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+ dependencies:
+ string-width "^1.0.2"
+
+widest-line@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c"
+ dependencies:
+ string-width "^1.0.1"
+
+window-size@^0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ slide "^1.1.5"
+
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018"
+ dependencies:
+ options ">=0.0.5"
+ ultron "1.0.x"
+
+wtf-8@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
+
+xdg-basedir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+
+xmlbuilder@8.2.2:
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
+
+xmldom@0.1.x:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+
+xmlhttprequest-ssl@1.5.3:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
+
+xtend@4.0.1, xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.0, y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-parser@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs-parser@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@3.29.0:
+ version "3.29.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c"
+ dependencies:
+ camelcase "^1.2.1"
+ cliui "^3.0.3"
+ decamelize "^1.0.0"
+ os-locale "^1.4.0"
+ window-size "^0.1.2"
+ y18n "^3.2.0"
+
+yargs@6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4"
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ window-size "^0.2.0"
+ y18n "^3.2.1"
+ yargs-parser "^4.1.0"
+
+yargs@^4.2.0:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+ dependencies:
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ lodash.assign "^4.0.3"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.1"
+ which-module "^1.0.0"
+ window-size "^0.2.0"
+ y18n "^3.2.1"
+ yargs-parser "^2.4.1"
+
+yargs@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c"
+ dependencies:
+ camelcase "^4.1.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ read-pkg-up "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^7.0.0"
+
+yauzl@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
+ dependencies:
+ fd-slicer "~1.0.1"
+
+yeast@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"